use of com.github.ambry.account.Account in project ambry by linkedin.
the class FrontendIntegrationTest method verifyGetAccountsAndContainer.
/**
* Call the {@code GET /accounts} and {@code Get /accounts/containers} API and verify the response for all accounts
* managed by {@link #ACCOUNT_SERVICE}.
*/
private void verifyGetAccountsAndContainer() throws Exception {
Collection<Account> expectedAccounts = ACCOUNT_SERVICE.getAllAccounts();
// fetch snapshot of all accounts
assertEquals("GET /accounts returned wrong result", new HashSet<>(expectedAccounts), getAccounts(null, null));
// fetch accounts one by one
for (Account account : expectedAccounts) {
assertEquals("Fetching of single account by name failed", Collections.singleton(account), getAccounts(account.getName(), null));
assertEquals("Fetching of single account by id failed", Collections.singleton(account), getAccounts(null, account.getId()));
}
// fetch container one by one from specific account
Account account = expectedAccounts.iterator().next();
for (Container container : account.getAllContainers()) {
assertEquals("Mismatch in container", container, getContainer(account.getName(), container.getName()));
}
}
use of com.github.ambry.account.Account in project ambry by linkedin.
the class FrontendTestUrlSigningServiceFactory method injectAccountAndContainerForPostAndVerify.
/**
* Puts blobs and verify injected target {@link Account} and {@link Container}.
* @param container the {@link Container} to use.
* @param shouldAllowServiceIdBasedPut {@code true} if PUT requests with serviceId parsed as {@link Account} name is
* allowed; {@code false} otherwise.
* @throws Exception
*/
private void injectAccountAndContainerForPostAndVerify(Container container, boolean shouldAllowServiceIdBasedPut) throws Exception {
configProps.setProperty("frontend.allow.service.id.based.post.request", String.valueOf(shouldAllowServiceIdBasedPut));
verifiableProperties = new VerifiableProperties(configProps);
frontendConfig = new FrontendConfig(verifiableProperties);
accountAndContainerInjector = new AccountAndContainerInjector(accountService, frontendMetrics, frontendConfig);
frontendRestRequestService = getFrontendRestRequestService();
frontendRestRequestService.start();
populateAccountService();
// should succeed when serviceId-based PUT requests are allowed.
postBlobAndVerifyWithAccountAndContainer(null, null, "serviceId", !container.isCacheable(), shouldAllowServiceIdBasedPut ? InMemAccountService.UNKNOWN_ACCOUNT : null, shouldAllowServiceIdBasedPut ? (container.isCacheable() ? Container.DEFAULT_PUBLIC_CONTAINER : Container.DEFAULT_PRIVATE_CONTAINER) : null, shouldAllowServiceIdBasedPut ? null : RestServiceErrorCode.BadRequest);
// should fail, because accountName needs to be specified.
postBlobAndVerifyWithAccountAndContainer(null, "dummyContainerName", "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.MissingArgs);
// should fail, because account name from serviceId could not be located in account service.
postBlobAndVerifyWithAccountAndContainer(null, Container.UNKNOWN_CONTAINER_NAME, "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.InvalidContainer);
// should fail, because accountName needs to be specified.
postBlobAndVerifyWithAccountAndContainer(null, refContainer.getName(), "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.MissingArgs);
// should fail, because accountName is not allowed.
postBlobAndVerifyWithAccountAndContainer(Account.UNKNOWN_ACCOUNT_NAME, null, "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.InvalidAccount);
// should fail, because accountName is not allowed.
postBlobAndVerifyWithAccountAndContainer(Account.UNKNOWN_ACCOUNT_NAME, "dummyContainerName", "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.InvalidAccount);
// should fail, because accountName is not allowed.
postBlobAndVerifyWithAccountAndContainer(Account.UNKNOWN_ACCOUNT_NAME, Container.UNKNOWN_CONTAINER_NAME, "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.InvalidAccount);
// should fail, because accountName is not allowed.
postBlobAndVerifyWithAccountAndContainer(Account.UNKNOWN_ACCOUNT_NAME, refContainer.getName(), "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.InvalidAccount);
// should fail, because container name needs to be specified
postBlobAndVerifyWithAccountAndContainer(refAccount.getName(), null, "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.MissingArgs);
// should fail, because containerName does not exist.
postBlobAndVerifyWithAccountAndContainer(refAccount.getName(), "dummyContainerName", "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.InvalidContainer);
// should fail, because containerName is not allowed.
postBlobAndVerifyWithAccountAndContainer(refAccount.getName(), Container.UNKNOWN_CONTAINER_NAME, "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.InvalidContainer);
// should succeed.
String blobIdStr = postBlobAndVerifyWithAccountAndContainer(refAccount.getName(), refContainer.getName(), "serviceId", !container.isCacheable(), refAccount, refContainer, null);
// should succeed.
verifyAccountAndContainerFromBlobId(blobIdStr, refAccount, refContainer, null);
// should fail, because containerName needs to be specified.
postBlobAndVerifyWithAccountAndContainer("dummyAccountName", null, "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.MissingArgs);
// should fail, because accountName does not exist.
postBlobAndVerifyWithAccountAndContainer("dummyAccountName", "dummyContainerName", "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.InvalidAccount);
// should fail, because container name is now allowed.
postBlobAndVerifyWithAccountAndContainer("dummyAccountName", Container.UNKNOWN_CONTAINER_NAME, "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.InvalidContainer);
// should fail, because accountName does not exist.
postBlobAndVerifyWithAccountAndContainer("dummyAccountName", refContainer.getName(), "serviceId", !container.isCacheable(), null, null, RestServiceErrorCode.InvalidAccount);
// should fail, because accountName implicitly set by serviceId is not allowed.
postBlobAndVerifyWithAccountAndContainer(null, null, Account.UNKNOWN_ACCOUNT_NAME, !container.isCacheable(), null, null, RestServiceErrorCode.InvalidAccount);
// should fail, because accountName implicitly set by serviceId is not allowed.
postBlobAndVerifyWithAccountAndContainer(null, "dummyContainerName", Account.UNKNOWN_ACCOUNT_NAME, !container.isCacheable(), null, null, RestServiceErrorCode.InvalidAccount);
// should fail, because accountName implicitly set by serviceId is not allowed.
postBlobAndVerifyWithAccountAndContainer(null, Container.UNKNOWN_CONTAINER_NAME, Account.UNKNOWN_ACCOUNT_NAME, !container.isCacheable(), null, null, RestServiceErrorCode.InvalidAccount);
// should fail, because accountName implicitly set by serviceId is not allowed.
postBlobAndVerifyWithAccountAndContainer(null, refContainer.getName(), Account.UNKNOWN_ACCOUNT_NAME, !container.isCacheable(), null, null, RestServiceErrorCode.InvalidAccount);
// should succeed if the serviceId-based PUT requests are allowed, but this is a special case that account is
// created without the legacy containers for public and private put.
postBlobAndVerifyWithAccountAndContainer(null, null, refAccount.getName(), !container.isCacheable(), shouldAllowServiceIdBasedPut ? refAccount : null, shouldAllowServiceIdBasedPut ? (container.isCacheable() ? refDefaultPublicContainer : refDefaultPrivateContainer) : null, shouldAllowServiceIdBasedPut ? null : RestServiceErrorCode.BadRequest);
// should fail, because accountName needs to be specified.
postBlobAndVerifyWithAccountAndContainer(null, "dummyContainerName", refAccount.getName(), !container.isCacheable(), null, null, RestServiceErrorCode.MissingArgs);
// should fail, because accountName implicitly set by serviceId does not have the default container.
postBlobAndVerifyWithAccountAndContainer(null, Container.UNKNOWN_CONTAINER_NAME, refAccount.getName(), !container.isCacheable(), null, null, RestServiceErrorCode.InvalidContainer);
// should fail, because accountName needs to be specified.
postBlobAndVerifyWithAccountAndContainer(null, refContainer.getName(), refAccount.getName(), !container.isCacheable(), null, null, RestServiceErrorCode.MissingArgs);
Container legacyContainerForPublicBlob = new ContainerBuilder(Container.DEFAULT_PUBLIC_CONTAINER_ID, "containerForLegacyPublicPut", Container.ContainerStatus.ACTIVE, "This is a container for putting legacy public blob", refAccount.getId()).build();
Container legacyContainerForPrivateBlob = new ContainerBuilder(Container.DEFAULT_PRIVATE_CONTAINER_ID, "containerForLegacyPrivatePut", Container.ContainerStatus.ACTIVE, "This is a container for putting legacy private blob", refAccount.getId()).setCacheable(false).build();
Account accountWithTwoDefaultContainers = new AccountBuilder(refAccount).addOrUpdateContainer(legacyContainerForPrivateBlob).addOrUpdateContainer(legacyContainerForPublicBlob).build();
accountService.updateAccounts(Collections.singletonList(accountWithTwoDefaultContainers));
if (!container.isCacheable()) {
// should succeed if serviceId-based PUT requests are allowed.
postBlobAndVerifyWithAccountAndContainer(null, null, accountWithTwoDefaultContainers.getName(), !container.isCacheable(), shouldAllowServiceIdBasedPut ? accountWithTwoDefaultContainers : null, shouldAllowServiceIdBasedPut ? accountWithTwoDefaultContainers.getContainerById(Container.DEFAULT_PRIVATE_CONTAINER_ID) : null, shouldAllowServiceIdBasedPut ? null : RestServiceErrorCode.BadRequest);
// should fail, because accountName needs to be specified.
postBlobAndVerifyWithAccountAndContainer(null, "dummyContainerName", accountWithTwoDefaultContainers.getName(), !container.isCacheable(), null, null, RestServiceErrorCode.MissingArgs);
} else {
// should succeed if serviceId-based PUT requests are allowed.
postBlobAndVerifyWithAccountAndContainer(null, null, accountWithTwoDefaultContainers.getName(), !container.isCacheable(), shouldAllowServiceIdBasedPut ? accountWithTwoDefaultContainers : null, shouldAllowServiceIdBasedPut ? accountWithTwoDefaultContainers.getContainerById(Container.DEFAULT_PUBLIC_CONTAINER_ID) : null, shouldAllowServiceIdBasedPut ? null : RestServiceErrorCode.BadRequest);
// should fail, because accountName needs to be specified.
postBlobAndVerifyWithAccountAndContainer(null, "dummyContainerName", accountWithTwoDefaultContainers.getName(), !container.isCacheable(), null, null, RestServiceErrorCode.MissingArgs);
}
}
use of com.github.ambry.account.Account in project ambry by linkedin.
the class FrontendTestUrlSigningServiceFactory method postGetHeadUpdateDeleteUndeleteTest.
/**
* Tests blob POST, GET, HEAD, TTL update and DELETE operations.
* @throws Exception
*/
@Test
public void postGetHeadUpdateDeleteUndeleteTest() throws Exception {
// add another account
accountService.createAndAddRandomAccount();
// valid account and container names passed as part of POST
for (Account testAccount : accountService.getAllAccounts()) {
if (testAccount.getId() != Account.UNKNOWN_ACCOUNT_ID) {
for (Container container : testAccount.getAllContainers()) {
doPostGetHeadUpdateDeleteUndeleteTest(testAccount, container, testAccount.getName(), !container.isCacheable(), testAccount, container);
doConditionalUpdateAndDeleteTest(testAccount, container, testAccount.getName());
}
}
}
// valid account and container names but only serviceId passed as part of POST
doPostGetHeadUpdateDeleteUndeleteTest(null, null, refAccount.getName(), false, refAccount, refDefaultPublicContainer);
doPostGetHeadUpdateDeleteUndeleteTest(null, null, refAccount.getName(), true, refAccount, refDefaultPrivateContainer);
// unrecognized serviceId
doPostGetHeadUpdateDeleteUndeleteTest(null, null, "unknown_service_id", false, InMemAccountService.UNKNOWN_ACCOUNT, Container.DEFAULT_PUBLIC_CONTAINER);
doPostGetHeadUpdateDeleteUndeleteTest(null, null, "unknown_service_id", true, InMemAccountService.UNKNOWN_ACCOUNT, Container.DEFAULT_PRIVATE_CONTAINER);
}
use of com.github.ambry.account.Account in project ambry by linkedin.
the class FrontendTestUrlSigningServiceFactory method postAccountsTest.
/**
* Tests the handling of {@link Operations#ACCOUNTS} post requests.
* @throws Exception
*/
@Test
public void postAccountsTest() throws Exception {
Account accountToAdd = accountService.generateRandomAccount();
List<ByteBuffer> body = new LinkedList<>();
body.add(ByteBuffer.wrap(AccountCollectionSerde.serializeAccountsInJson(Collections.singleton(accountToAdd))));
body.add(null);
RestRequest restRequest = createRestRequest(RestMethod.POST, Operations.ACCOUNTS, null, body);
MockRestResponseChannel restResponseChannel = new MockRestResponseChannel();
doOperation(restRequest, restResponseChannel);
assertEquals("Account not created correctly", accountToAdd, accountService.getAccountById(accountToAdd.getId()));
// test an invalid request case to ensure that it goes through the exception path
body = new LinkedList<>();
body.add(ByteBuffer.wrap("abcdefghijk".toString().getBytes(StandardCharsets.UTF_8)));
body.add(null);
restRequest = createRestRequest(RestMethod.POST, Operations.ACCOUNTS, null, body);
try {
doOperation(restRequest, new MockRestResponseChannel());
fail("Operation should have failed");
} catch (RestServiceException e) {
assertEquals("Error code not as expected", RestServiceErrorCode.BadRequest, e.getErrorCode());
}
}
use of com.github.ambry.account.Account in project ambry by linkedin.
the class GetAccountsHandlerTest method validRequestsTest.
/**
* Test valid request cases.
* @throws Exception
*/
@Test
public void validRequestsTest() throws Exception {
Account account = accountService.createAndAddRandomAccount();
ThrowingBiConsumer<RestRequest, Collection<Account>> testAction = (request, expectedAccounts) -> {
RestResponseChannel restResponseChannel = new MockRestResponseChannel();
ReadableStreamChannel channel = sendRequestGetResponse(request, restResponseChannel);
assertNotNull("There should be a response", channel);
Assert.assertNotNull("Date has not been set", restResponseChannel.getHeader(RestUtils.Headers.DATE));
assertEquals("Content-type is not as expected", RestUtils.JSON_CONTENT_TYPE, restResponseChannel.getHeader(RestUtils.Headers.CONTENT_TYPE));
assertEquals("Content-length is not as expected", channel.getSize(), Integer.parseInt((String) restResponseChannel.getHeader(RestUtils.Headers.CONTENT_LENGTH)));
RetainingAsyncWritableChannel asyncWritableChannel = new RetainingAsyncWritableChannel((int) channel.getSize());
channel.readInto(asyncWritableChannel, null).get();
assertEquals("Accounts do not match", new HashSet<>(expectedAccounts), new HashSet<>(AccountCollectionSerde.accountsFromInputStreamInJson(asyncWritableChannel.consumeContentAsInputStream())));
};
testAction.accept(createRestRequest(null, null, null, Operations.ACCOUNTS), accountService.getAllAccounts());
testAction.accept(createRestRequest(account.getName(), null, null, Operations.ACCOUNTS), Collections.singleton(account));
testAction.accept(createRestRequest(null, Short.toString(account.getId()), null, Operations.ACCOUNTS), Collections.singleton(account));
}
Aggregations