use of com.sequenceiq.cloudbreak.cloud.aws.CloudFormationTemplateBuilder.RDSModelContext in project cloudbreak by hortonworks.
the class AwsRdsLaunchService method launch.
public List<CloudResourceStatus> launch(AuthenticatedContext ac, DatabaseStack stack, PersistenceNotifier resourceNotifier) {
String cFStackName = cfStackUtil.getCfStackName(ac);
AwsCredentialView credentialView = new AwsCredentialView(ac.getCloudCredential());
String regionName = ac.getCloudContext().getLocation().getRegion().value();
AmazonCloudFormationClient cfClient = awsClient.createCloudFormationClient(credentialView, regionName);
AwsNetworkView awsNetworkView = new AwsNetworkView(stack.getNetwork());
DescribeStacksRequest describeStacksRequest = new DescribeStacksRequest().withStackName(cFStackName);
DatabaseServer databaseServer = stack.getDatabaseServer();
boolean useSslEnforcement = databaseServer.isUseSslEnforcement();
try {
cfClient.describeStacks(describeStacksRequest);
LOGGER.debug("Stack already exists: {}", cFStackName);
} catch (AmazonServiceException exception) {
// all subnets desired for DB subnet group are in the stack
boolean existingSubnet = awsNetworkView.isExistingSubnet();
LOGGER.warn("API call failed with this error:", exception);
if (!existingSubnet) {
throw new CloudConnectorException("Can only create RDS instance with existing subnets", exception);
}
CloudResource cloudFormationStack = new Builder().type(ResourceType.CLOUDFORMATION_STACK).name(cFStackName).availabilityZone(ac.getCloudContext().getLocation().getAvailabilityZone().value()).build();
resourceNotifier.notifyAllocation(cloudFormationStack, ac.getCloudContext());
RDSModelContext rdsModelContext = new RDSModelContext().withTemplate(stack.getTemplate()).withNetworkCidrs(awsNetworkView.getExistingVpcCidrs()).withHasPort(databaseServer.getPort() != null).withUseSslEnforcement(useSslEnforcement).withSslCertificateIdentifierDefined(new AwsRdsInstanceView(databaseServer).isSslCertificateIdentifierDefined()).withHasSecurityGroup(!databaseServer.getSecurity().getCloudSecurityIds().isEmpty()).withIsKmsCustom(stack.getDatabaseServer().getParameters().containsKey("key")).withGetKmsKey(getKmsKey(stack));
String cfTemplate = cloudFormationTemplateBuilder.build(rdsModelContext);
LOGGER.debug("CloudFormationTemplate: {}", cfTemplate);
cfClient.createStack(awsStackRequestHelper.createCreateStackRequest(ac, stack, cFStackName, cfTemplate));
}
LOGGER.debug("CloudFormation stack creation request sent with stack name: '{}' for stack: '{}'", cFStackName, ac.getCloudContext().getId());
Waiter<DescribeStacksRequest> creationWaiter = cfClient.waiters().stackCreateComplete();
StackCancellationCheck stackCancellationCheck = new StackCancellationCheck(ac.getCloudContext().getId());
run(creationWaiter, describeStacksRequest, stackCancellationCheck, String.format("RDS CloudFormation stack %s creation failed", cFStackName), () -> awsCloudFormationErrorMessageProvider.getErrorReason(ac, cFStackName, CREATE_FAILED));
List<CloudResource> databaseResources = getCreatedOutputs(ac, stack, cFStackName, cfClient, resourceNotifier, useSslEnforcement);
databaseResources.forEach(dbr -> resourceNotifier.notifyAllocation(dbr, ac.getCloudContext()));
// FIXME: For now, just return everything wrapped in a status object
return databaseResources.stream().map(resource -> new CloudResourceStatus(resource, ResourceStatus.CREATED)).collect(Collectors.toList());
// FIXME check does nothing?!
// return awsResourceConnector.check(ac, databaseResources);
}
use of com.sequenceiq.cloudbreak.cloud.aws.CloudFormationTemplateBuilder.RDSModelContext in project cloudbreak by hortonworks.
the class CloudFormationTemplateBuilderDBTest method buildTestWhenKmsKeyIdPresent.
@ParameterizedTest(name = "{0}")
@MethodSource("templatesPathDataProvider")
void buildTestWhenKmsKeyIdPresent(String templatePath) throws IOException {
// GIVEN
String awsCloudFormationTemplate = factoryBean.getObject().getTemplate(templatePath, "UTF-8").toString();
// WHEN
RDSModelContext modelContext = new RDSModelContext().withIsKmsCustom(true).withGetKmsKey("dummyKeyArn").withTemplate(awsCloudFormationTemplate);
String result = cloudFormationTemplateBuilder.build(modelContext);
assertThat(JsonUtil.isValid(result)).overridingErrorMessage("Invalid JSON: " + result).isTrue();
assertThat(result).contains("\"StorageEncrypted\": true");
assertThat(result).contains("\"KmsKeyId\" : \"dummyKeyArn\"");
}
use of com.sequenceiq.cloudbreak.cloud.aws.CloudFormationTemplateBuilder.RDSModelContext in project cloudbreak by hortonworks.
the class CloudFormationTemplateBuilderDBTest method buildTestWhenNoSecurityGroupAndHavingPortAndMultipleCidr.
@ParameterizedTest(name = "{0}")
@MethodSource("templatesPathDataProvider")
void buildTestWhenNoSecurityGroupAndHavingPortAndMultipleCidr(String templatePath) throws IOException {
// GIVEN
String awsCloudFormationTemplate = factoryBean.getObject().getTemplate(templatePath, "UTF-8").toString();
// WHEN
RDSModelContext modelContext = new RDSModelContext().withHasPort(true).withNetworkCidrs(List.of(CIDR_1, CIDR_2)).withTemplate(awsCloudFormationTemplate);
String result = cloudFormationTemplateBuilder.build(modelContext);
// THEN
assertThat(JsonUtil.isValid(result)).overridingErrorMessage("Invalid JSON: " + result).isTrue();
assertThat(result).contains("\"PortParameter\": {");
assertThat(result).doesNotContain("\"DBParameterGroupNameParameter\": {");
assertThat(result).doesNotContain("\"DBParameterGroupFamilyParameter\": {");
assertThat(result).doesNotContain("\"VPCSecurityGroupsParameter\": {");
assertThat(result).contains("\"DBSecurityGroupNameParameter\": {");
assertThat(result).contains("\"VPCIdParameter\": {");
assertThat(result).contains("\"VPCSecurityGroup\": {");
assertThat(result).doesNotContain("\"FromPort\": 5432,");
assertThat(result).doesNotContain("\"ToPort\" : 5432,");
assertThat(result).contains("\"FromPort\": { \"Ref\": \"PortParameter\" },");
assertThat(result).contains("\"ToPort\" : { \"Ref\": \"PortParameter\" },");
assertThat(result).contains(String.format("\"CidrIp\" : \"%s\"", CIDR_1));
assertThat(result).contains(String.format("\"CidrIp\" : \"%s\"", CIDR_2));
assertThat(result).doesNotContain("\"DBParameterGroup\": {");
assertThat(result).doesNotContain("\"DBParameterGroupName\": { \"Ref\": \"DBParameterGroup\" },");
assertThat(result).contains("\"Port\": { \"Ref\": \"PortParameter\" },");
assertThat(result).doesNotContain("\"VPCSecurityGroups\": { \"Ref\": \"VPCSecurityGroupsParameter\" }");
assertThat(result).contains("\"VPCSecurityGroups\": [{ \"Ref\": \"VPCSecurityGroup\" }]");
assertThat(result).doesNotContain("\"CreatedDBParameterGroup\": { \"Value\": { \"Ref\": \"DBParameterGroup\" } },");
}
use of com.sequenceiq.cloudbreak.cloud.aws.CloudFormationTemplateBuilder.RDSModelContext in project cloudbreak by hortonworks.
the class CloudFormationTemplateBuilderDBTest method buildTestWhenHavingSecurityGroupAndNoPortAndNoSslEnforcementAndWithSslCertificateIdentifier.
@ParameterizedTest(name = "{0}")
@MethodSource("templatesPathDataProvider")
void buildTestWhenHavingSecurityGroupAndNoPortAndNoSslEnforcementAndWithSslCertificateIdentifier(String templatePath) throws IOException {
// GIVEN
String awsCloudFormationTemplate = factoryBean.getObject().getTemplate(templatePath, "UTF-8").toString();
// WHEN
RDSModelContext modelContext = new RDSModelContext().withHasSecurityGroup(true).withUseSslEnforcement(false).withSslCertificateIdentifierDefined(true).withTemplate(awsCloudFormationTemplate);
String result = cloudFormationTemplateBuilder.build(modelContext);
// THEN
assertThat(JsonUtil.isValid(result)).overridingErrorMessage("Invalid JSON: " + result).isTrue();
assertThat(result).doesNotContain("\"PortParameter\": {");
assertThat(result).doesNotContain("\"DBParameterGroupNameParameter\": {");
assertThat(result).doesNotContain("\"DBParameterGroupFamilyParameter\": {");
assertThat(result).doesNotContain("\"SslCertificateIdentifierParameter\": {");
assertThat(result).contains("\"VPCSecurityGroupsParameter\": {");
assertThat(result).doesNotContain("\"DBSecurityGroupNameParameter\": {");
assertThat(result).doesNotContain("\"VPCIdParameter\": {");
assertThat(result).doesNotContain("\"VPCSecurityGroup\": {");
assertThat(result).doesNotContain("\"FromPort\"");
assertThat(result).doesNotContain("\"ToPort\"");
assertThat(result).doesNotContain("\"CidrIp\" :");
assertThat(result).doesNotContain("\"DBParameterGroup\": {");
assertThat(result).doesNotContain("\"DBParameterGroupName\": { \"Ref\": \"DBParameterGroup\" },");
assertThat(result).doesNotContain("\"CACertificateIdentifier\": { \"Ref\": \"SslCertificateIdentifierParameter\" },");
assertThat(result).doesNotContain("\"Port\": { \"Ref\": \"PortParameter\" },");
assertThat(result).contains("\"VPCSecurityGroups\": { \"Ref\": \"VPCSecurityGroupsParameter\" }");
assertThat(result).doesNotContain("\"VPCSecurityGroups\": [{ \"Ref\": \"VPCSecurityGroup\" }]");
assertThat(result).doesNotContain("\"CreatedDBParameterGroup\": { \"Value\": { \"Ref\": \"DBParameterGroup\" } },");
}
use of com.sequenceiq.cloudbreak.cloud.aws.CloudFormationTemplateBuilder.RDSModelContext in project cloudbreak by hortonworks.
the class CloudFormationTemplateBuilderDBTest method buildTestWhenNoSecurityGroupAndNoPortAndSingleCidr.
@ParameterizedTest(name = "{0}")
@MethodSource("templatesPathDataProvider")
void buildTestWhenNoSecurityGroupAndNoPortAndSingleCidr(String templatePath) throws IOException {
// GIVEN
String awsCloudFormationTemplate = factoryBean.getObject().getTemplate(templatePath, "UTF-8").toString();
// WHEN
RDSModelContext modelContext = new RDSModelContext().withNetworkCidrs(List.of(CIDR_1)).withTemplate(awsCloudFormationTemplate);
String result = cloudFormationTemplateBuilder.build(modelContext);
// THEN
assertThat(JsonUtil.isValid(result)).overridingErrorMessage("Invalid JSON: " + result).isTrue();
assertThat(result).doesNotContain("\"PortParameter\": {");
assertThat(result).doesNotContain("\"DBParameterGroupNameParameter\": {");
assertThat(result).doesNotContain("\"DBParameterGroupFamilyParameter\": {");
assertThat(result).doesNotContain("\"VPCSecurityGroupsParameter\": {");
assertThat(result).contains("\"DBSecurityGroupNameParameter\": {");
assertThat(result).contains("\"VPCIdParameter\": {");
assertThat(result).contains("\"VPCSecurityGroup\": {");
assertThat(result).contains("\"FromPort\": 5432,");
assertThat(result).contains("\"ToPort\" : 5432,");
assertThat(result).doesNotContain("\"FromPort\": { \"Ref\": \"PortParameter\" },");
assertThat(result).doesNotContain("\"ToPort\" : { \"Ref\": \"PortParameter\" },");
assertThat(result).contains(String.format("\"CidrIp\" : \"%s\"", CIDR_1));
assertThat(result).doesNotContain("\"DBParameterGroup\": {");
assertThat(result).doesNotContain("\"DBParameterGroupName\": { \"Ref\": \"DBParameterGroup\" },");
assertThat(result).doesNotContain("\"Port\": { \"Ref\": \"PortParameter\" },");
assertThat(result).doesNotContain("\"VPCSecurityGroups\": { \"Ref\": \"VPCSecurityGroupsParameter\" }");
assertThat(result).contains("\"VPCSecurityGroups\": [{ \"Ref\": \"VPCSecurityGroup\" }]");
assertThat(result).doesNotContain("\"CreatedDBParameterGroup\": { \"Value\": { \"Ref\": \"DBParameterGroup\" } },");
}
Aggregations