use of com.github.ambry.account.ContainerBuilder in project ambry by linkedin.
the class AzureContainerCompactorIntegrationTest method generateContainers.
/**
* Generate specified number of {@link Container}s.
* @param numContainers number of {@link Container}s to generate.
* @return {@link Set} of {@link Container}s.
*/
private Set<Container> generateContainers(int numContainers) {
Set<Container> containers = new HashSet<>();
long currentTimestamp = System.currentTimeMillis();
AtomicInteger ctr = new AtomicInteger(0);
List<ContainerBuilder> containerBuilders = AccountTestUtils.generateContainerBuilders(numContainers, Utils.getRandomShort(random));
containers.addAll(containerBuilders.stream().map(containerBuilder -> {
containerBuilder.setDeleteTriggerTime(currentTimestamp - numContainers + ctr.getAndIncrement()).setStatus(random.nextBoolean() ? Container.ContainerStatus.DELETE_IN_PROGRESS : Container.ContainerStatus.INACTIVE);
return containerBuilder.build();
}).collect(Collectors.toSet()));
return containers;
}
use of com.github.ambry.account.ContainerBuilder in project ambry by linkedin.
the class AccountDaoTest method testBatchOperations.
@Test
public void testBatchOperations() throws SQLException {
List<AccountUpdateInfo> accountUpdateInfos = new ArrayList<>();
int size = 11;
int batchSize = 5;
// test batch account inserts
for (int i = 1; i <= size; i++) {
Account account = new AccountBuilder((short) i, "test account " + i, Account.AccountStatus.ACTIVE).build();
accountUpdateInfos.add(new AccountUpdateInfo(account, true, false, new ArrayList<>(), new ArrayList<>()));
}
accountDao.updateAccounts(accountUpdateInfos, batchSize);
verify(mockAccountInsertStatement, times(size)).addBatch();
verify(mockAccountInsertStatement, times(size / batchSize + 1)).executeBatch();
// test batch account updates
accountUpdateInfos.clear();
for (int i = 1; i <= size; i++) {
Account account = new AccountBuilder((short) i, "test account " + i, Account.AccountStatus.ACTIVE).snapshotVersion(1).build();
accountUpdateInfos.add(new AccountUpdateInfo(account, false, true, new ArrayList<>(), new ArrayList<>()));
}
accountDao.updateAccounts(accountUpdateInfos, batchSize);
verify(mockAccountUpdateStatement, times(size)).addBatch();
verify(mockAccountUpdateStatement, times(size / batchSize + 1)).executeBatch();
Account account = new AccountBuilder((short) 1, "test account " + 1, Account.AccountStatus.ACTIVE).build();
List<Container> containers = new ArrayList<>();
for (int i = 1; i <= size; i++) {
containers.add(new ContainerBuilder((short) i, "test container " + i, Container.ContainerStatus.ACTIVE, "", (short) 1).build());
}
// test batch container inserts
accountUpdateInfos.clear();
accountUpdateInfos.add(new AccountUpdateInfo(account, false, false, containers, new ArrayList<>()));
accountDao.updateAccounts(accountUpdateInfos, batchSize);
verify(mockContainerInsertStatement, times(size)).addBatch();
// Execute batch should be invoked only once since all containers belong to same account
verify(mockContainerInsertStatement, times(1)).executeBatch();
// test batch container updates
accountUpdateInfos.clear();
accountUpdateInfos.add(new AccountUpdateInfo(account, false, false, new ArrayList<>(), containers));
accountDao.updateAccounts(accountUpdateInfos, batchSize);
verify(mockContainerUpdateStatement, times(size)).addBatch();
// Execute batch should be invoked only once since all containers belong to same account
verify(mockContainerUpdateStatement, times(1)).executeBatch();
}
use of com.github.ambry.account.ContainerBuilder 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.ContainerBuilder in project ambry by linkedin.
the class JsonCUQuotaDataProviderUtilTest method createContainer.
/**
* Create a {@link Container} with the specified containerId.
* @param containerId id of the container.
* @return Container object.
*/
private static Container createContainer(String containerId) {
ContainerBuilder containerBuilder = new ContainerBuilder();
containerBuilder.setId(Short.parseShort(containerId));
containerBuilder.setName(containerId);
containerBuilder.setStatus(Container.ContainerStatus.ACTIVE);
return containerBuilder.build();
}
use of com.github.ambry.account.ContainerBuilder in project ambry by linkedin.
the class StorageQuotaEnforcerTest method testInitStorageUsage.
/**
* Test to initialize the storage usage with non-empty map.
*/
@Test
public void testInitStorageUsage() throws Exception {
Map<String, Map<String, Long>> containerUsage = TestUtils.makeStorageMap(10, 10, 1000, 100);
InMemAccountService accountService = new InMemAccountService(false, false);
Map<QuotaResource, Long> expectedStorageUsages = new HashMap<>();
// Account and container id's base is 1, not 0
for (int i = 1; i <= 10; i++) {
QuotaResourceType resourceType = i <= containerUsage.size() / 2 ? QuotaResourceType.CONTAINER : QuotaResourceType.ACCOUNT;
AccountBuilder accountBuilder = new AccountBuilder((short) i, String.valueOf(i), Account.AccountStatus.ACTIVE, resourceType);
for (int j = 1; j <= 10; j++) {
accountBuilder.addOrUpdateContainer(new ContainerBuilder((short) j, String.valueOf(j), Container.ContainerStatus.ACTIVE, "", (short) i).build());
}
accountService.updateAccounts(Collections.singleton(accountBuilder.build()));
if (resourceType == QuotaResourceType.ACCOUNT) {
expectedStorageUsages.put(QuotaResource.fromAccountId((short) i), containerUsage.get(String.valueOf(i)).values().stream().mapToLong(Long::longValue).sum());
} else {
for (Map.Entry<String, Long> containerEntry : containerUsage.get(String.valueOf(i)).entrySet()) {
expectedStorageUsages.put(QuotaResource.fromContainerId((short) i, Short.valueOf(containerEntry.getKey())), containerEntry.getValue());
}
}
}
StorageQuotaEnforcer enforcer = new StorageQuotaEnforcer(config, new JSONStringStorageQuotaSource(new HashMap<>(), accountService), (StorageUsageRefresher) null);
enforcer.initStorageUsage(containerUsage);
assertEquals(expectedStorageUsages, enforcer.getStorageUsages());
}
Aggregations