use of com.github.ambry.account.Container in project ambry by linkedin.
the class AccountDao method convertContainersResultSet.
/**
* Convert a query result set to a list of containers.
* @param resultSet the result set.
* @return a list of {@link Container}s.
* @throws SQLException
*/
private List<Container> convertContainersResultSet(ResultSet resultSet) throws SQLException {
List<Container> containers = new ArrayList<>();
while (resultSet.next()) {
int accountId = resultSet.getInt(ACCOUNT_ID);
String containerJson = resultSet.getString(CONTAINER_INFO);
Timestamp lastModifiedTime = resultSet.getTimestamp(LAST_MODIFIED_TIME);
int version = resultSet.getInt(VERSION);
try {
Container deserialized = objectMapper.readValue(containerJson, Container.class);
Container container = new ContainerBuilder(deserialized).setParentAccountId((short) accountId).setLastModifiedTime(lastModifiedTime.getTime()).setSnapshotVersion(version).build();
containers.add(container);
} catch (IOException e) {
throw new SQLException(e);
}
}
return containers;
}
use of com.github.ambry.account.Container in project ambry by linkedin.
the class AccountDao method getNewContainers.
/**
* Gets all containers that have been created or modified since the specified time.
* @param updatedSince the last modified time used to filter.
* @return a list of {@link Container}s.
* @throws SQLException
*/
public synchronized List<Container> getNewContainers(long updatedSince) throws SQLException {
long startTimeMs = System.currentTimeMillis();
Timestamp sinceTime = new Timestamp(updatedSince);
ResultSet rs = null;
try {
PreparedStatement getSinceStatement = dataAccessor.getPreparedStatement(getContainersSinceSql, false);
getSinceStatement.setTimestamp(1, sinceTime);
rs = getSinceStatement.executeQuery();
List<Container> containers = convertContainersResultSet(rs);
dataAccessor.onSuccess(Read, System.currentTimeMillis() - startTimeMs);
return containers;
} catch (SQLException e) {
dataAccessor.onException(e, Read);
throw e;
} finally {
closeQuietly(rs);
}
}
use of com.github.ambry.account.Container in project ambry by linkedin.
the class FrontendTestUrlSigningServiceFactory method injectAccountAndContainerForPutAndVerify.
/**
* 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 injectAccountAndContainerForPutAndVerify(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);
ambryBlobStorageService = getAmbryBlobStorageService();
ambryBlobStorageService.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", false, false, false, false, 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", false, false, true, false, refAccount.getId()).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.Container in project ambry by linkedin.
the class FrontendTestUrlSigningServiceFactory method postGetHeadDeleteTest.
/**
* Tests blob POST, GET, HEAD and DELETE operations.
* @throws Exception
*/
@Test
public void postGetHeadDeleteTest() 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()) {
doPostGetHeadDeleteTest(testAccount, container, testAccount.getName(), !container.isCacheable(), testAccount, container);
doConditionalDeleteTest(testAccount, container, testAccount.getName(), !container.isCacheable(), testAccount, container);
}
}
}
// valid account and container names but only serviceId passed as part of POST
doPostGetHeadDeleteTest(null, null, refAccount.getName(), false, refAccount, refDefaultPublicContainer);
doPostGetHeadDeleteTest(null, null, refAccount.getName(), true, refAccount, refDefaultPrivateContainer);
// unrecognized serviceId
doPostGetHeadDeleteTest(null, null, "unknown_service_id", false, InMemAccountService.UNKNOWN_ACCOUNT, Container.DEFAULT_PUBLIC_CONTAINER);
doPostGetHeadDeleteTest(null, null, "unknown_service_id", true, InMemAccountService.UNKNOWN_ACCOUNT, Container.DEFAULT_PRIVATE_CONTAINER);
}
use of com.github.ambry.account.Container 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;
}
Aggregations