in src/main/java/software/aws/chatops_lex_api/resource/Util.java [229:297]
public static void vendAccount(final Map<String, AttributeValue> accountRequest) {
//add date to provisioned product name
LocalDateTime theDay = LocalDateTime.now().with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm");
String yyyyMMdd = theDay.format(formatter);
Collection<ProvisioningParameter> parameters = new ArrayList<>();
parameters.add(ProvisioningParameter.builder().key("SSOUserEmail").value(accountRequest.get("UserEmail").s()).build());
parameters.add(ProvisioningParameter.builder().key("AccountEmail").value(accountRequest.get("RootEmail").s()).build());
parameters.add(ProvisioningParameter.builder().key("SSOUserFirstName").value(accountRequest.get("UserName").s()).build());
parameters.add(ProvisioningParameter.builder().key("SSOUserLastName").value(accountRequest.get("UserLastname").s()).build());
parameters.add(ProvisioningParameter.builder().key("ManagedOrganizationalUnit").value(accountRequest.get("AccountOU").s()).build());
parameters.add(ProvisioningParameter.builder().key("AccountName").value(accountRequest.get("AccountType").s()+"Account."+accountRequest.get("UserEmail").s().substring(0,accountRequest.get("UserEmail").s().indexOf("@")).replaceAll("\\s+","").replace("+", "_")+"."+yyyyMMdd).build());
String productId = null;
//search product
Map<String,Collection<String>> filter = new HashMap<>();
Collection<String> values = new ArrayList<>();
values.add("AWS Control Tower Account Factory");
filter.put("FullTextSearch", values);
SearchProductsAsAdminResponse r = AccountVendor.scClient.searchProductsAsAdmin(SearchProductsAsAdminRequest.builder().filtersWithStrings(filter).build());
if( r.productViewDetails().size() > 0 ) {
productId = r.productViewDetails().get(0).productViewSummary().productId();
logger.info("Found AWS Control Tower Account Factory with productId: "+productId);
}else {
logger.info("Could not find product AWS Control Tower Account Factory in the Service Catalog of the AWS Account");
logger.info("NOT vending new account. Please fix this and create a new request.");
return;
}
//describe product
String artifactId = null;
DescribeProductAsAdminResponse prodResponse = AccountVendor.scClient.describeProductAsAdmin(DescribeProductAsAdminRequest.builder().id(productId).build());
if( prodResponse.provisioningArtifactSummaries().size() > 0) {
//always get the latest because it is the most recent version
artifactId = prodResponse.provisioningArtifactSummaries().get(prodResponse.provisioningArtifactSummaries().size()-1).id();
logger.info("AWS Control Tower Account Factory Artifact Id: "+artifactId);
}else {
logger.info("Could not find artifact id of product id="+productId+" inside Service Catalog of the account");
}
//get Launch Path
String launchPathId = null;
ListLaunchPathsResponse pathResponse = AccountVendor.scClient.listLaunchPaths(ListLaunchPathsRequest.builder().productId(productId).build());
if( pathResponse.launchPathSummaries().size() > 0 ) {
launchPathId = pathResponse.launchPathSummaries().get(0).id();
logger.info("AWS Control Tower Account Factory Launch Path Id: "+launchPathId);
}else {
logger.info("Could not find launch path for product AWS Control Tower Account Factory ProductId: "+productId);
}
//provision product using the product id
ProvisionProductResponse response = AccountVendor.scClient.provisionProduct(ProvisionProductRequest.builder()
// .productName("AWS Control Tower Account Factory")
.productId(productId)
.pathId(launchPathId)
.provisionToken(accountRequest.get("UserId").s())
.provisionedProductName(accountRequest.get("AccountType").s()+".Account."+accountRequest.get("UserEmail").s().substring(0,accountRequest.get("UserEmail").s().indexOf("@")).replace("+", "_")+"."+yyyyMMdd)
.provisioningArtifactId(artifactId)
.provisioningParameters(parameters)
.build());
logger.info("New account vended for user: "+accountRequest.get("UserEmail").s()+" and requestId: "+response.responseMetadata().requestId());
}