Skip to content

Commit

Permalink
Cleanup the code and add a test
Browse files Browse the repository at this point in the history
Signed-off-by: Mikayla Thompson <thomika@amazon.com>
  • Loading branch information
mikaylathompson committed Nov 13, 2023
1 parent 0b7c87d commit 54c262d
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 80 deletions.
Original file line number Diff line number Diff line change
@@ -1,58 +1,26 @@
import {Stack} from "aws-cdk-lib";
import {StackPropsExt} from "../stack-composer";
import {
BastionHostLinux,
BlockDeviceVolume,
MachineImage,
Peer,
Port,
SecurityGroup,
IVpc,
} from "aws-cdk-lib/aws-ec2";
import {MountPoint, PortMapping, Protocol, ServiceConnectService, Volume} from "aws-cdk-lib/aws-ecs";
import {PortMapping, Protocol, ServiceConnectService} from "aws-cdk-lib/aws-ecs";
import {Construct} from "constructs";
import {join} from "path";
import {MigrationServiceCore} from "./migration-service-core";
import {StringParameter} from "aws-cdk-lib/aws-ssm";
import {OpenSearchDomainStack} from "../opensearch-domain-stack";
import {EngineVersion} from "aws-cdk-lib/aws-opensearchservice";
import {EbsDeviceVolumeType} from "aws-cdk-lib/aws-ec2";
import {AnyPrincipal, Effect, PolicyStatement} from "aws-cdk-lib/aws-iam";

export interface MigrationAnalyticsProps extends StackPropsExt {
readonly vpc: IVpc,
readonly vpcSubnetIds?: string[],
readonly vpcSecurityGroupIds?: string[],
readonly availabilityZoneCount?: number,

readonly extraArgs?: string,
readonly engineVersion: EngineVersion,
readonly dataNodeInstanceType?: string,
readonly dataNodes?: number,
readonly dedicatedManagerNodeType?: string,
readonly dedicatedManagerNodeCount?: number,
readonly warmInstanceType?: string,
readonly warmNodes?: number,
readonly enforceHTTPS?: boolean,
readonly ebsEnabled?: boolean,
readonly ebsIops?: number,
readonly ebsVolumeSize?: number,
readonly ebsVolumeType?: EbsDeviceVolumeType,
readonly encryptionAtRestEnabled?: boolean,
readonly encryptionAtRestKmsKeyARN?: string,
readonly appLogEnabled?: boolean,
readonly appLogGroup?: string,
readonly nodeToNodeEncryptionEnabled?: boolean,
}

const domainName = "migration-analytics-domain"

// The MigrationAnalyticsStack consists of the OpenTelemetry Collector ECS container & an
// OpenSearch cluster with dashboard.
// Bastion host to allow access to the opensearch dashboard.
export class MigrationAnalyticsStack extends MigrationServiceCore {

// openSearchAnalyticsStack: Stack

constructor(scope: Construct, id: string, props: MigrationAnalyticsProps) {
super(scope, id, props)

Expand Down
66 changes: 20 additions & 46 deletions deployment/cdk/opensearch-service-migration/lib/stack-composer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,19 +172,13 @@ export class StackComposer {
const sourceClusterEndpoint = this.getContextForType('sourceClusterEndpoint', 'string', defaultValues, contextJSON)

const migrationAnalyticsServiceEnabled = this.getContextForType('migrationAnalyticsServiceEnabled', 'boolean', defaultValues, contextJSON)
const otelConfigFilePath = this.getContextForType('otelConfigFilePath', 'string', defaultValues, contextJSON)

const analyticsDomainEngineVersion = this.getContextForType('analyticsDomainEngineVersion', 'string', defaultValues, contextJSON)
const analyticsDomainDataNodeType = this.getContextForType('analyticsDomainDataNodeType', 'string', defaultValues, contextJSON)
const analyticsDomainDataNodeCount = this.getContextForType('analyticsDomainDataNodeCount', 'number', defaultValues, contextJSON)
const analyticsDomainDedicatedManagerNodeType = this.getContextForType('analyticsDomainDedicatedManagerNodeType', 'string', defaultValues, contextJSON)
const analyticsDomainDedicatedManagerNodeCount = this.getContextForType('analyticsDomainDedicatedManagerNodeCount', 'number', defaultValues, contextJSON)
const analyticsDomainWarmNodeType = this.getContextForType('analyticsDomainWarmNodeType', 'string', defaultValues, contextJSON)
const analyticsDomainWarmNodeCount = this.getContextForType('analyticsDomainWarmNodeCount', 'number', defaultValues, contextJSON)
// const analyticsDomainUseUnsignedBasicAuth = this.getContextForType('analyticsDomainUseUnsignedBasicAuth', 'boolean')
// const analyticsDomainFineGrainedManagerUserARN = this.getContextForType('analyticsDomainFineGrainedManagerUserARN', 'string')
// const analyticsDomainFineGrainedManagerUserName = this.getContextForType('analyticsDomainFineGrainedManagerUserName', 'string')
// const analyticsDomainFineGrainedManagerUserSecretManagerKeyARN = this.getContextForType('analyticsDomainFineGrainedManagerUserSecretManagerKeyARN', 'string')
const analyticsDomainEnforceHTTPS = this.getContextForType('analyticsDomainEnforceHTTPS', 'boolean', defaultValues, contextJSON)
const analyticsDomainEbsEnabled = this.getContextForType('analyticsDomainEbsEnabled', 'boolean', defaultValues, contextJSON)
const analyticsDomainEbsIops = this.getContextForType('analyticsDomainEbsIops', 'number', defaultValues, contextJSON)
Expand Down Expand Up @@ -344,7 +338,7 @@ export class StackComposer {
let migrationAnalyticsStack;
let analyticsDomainStack;
if (migrationAnalyticsServiceEnabled && networkStack) {
const analyticsDomainName = "migration-analytics-domain-2"
const analyticsDomainName = "migration-analytics-domain"
const openAccessPolicy = new PolicyStatement({
effect: Effect.ALLOW,
principals: [new AnyPrincipal()],
Expand All @@ -355,59 +349,39 @@ export class StackComposer {
{
stackName: `OSMigrations-${stage}-${region}-AnalyticsDomain`,
description: "This stack prepares the Migration Analytics OS Domain",
version: this.getEngineVersion(analyticsDomainEngineVersion ?? engineVersion),
domainName: analyticsDomainName,
// dataNodeInstanceType: props.dataNodeInstanceType,
dataNodes: analyticsDomainDataNodeCount ?? availabilityZoneCount,
// dedicatedManagerNodeType: props.dedicatedManagerNodeType,
// dedicatedManagerNodeCount: props.dedicatedManagerNodeCount,
// warmInstanceType: props.warmInstanceType,
enableDemoAdmin: false,
enforceHTTPS: true,
nodeToNodeEncryptionEnabled: true,
encryptionAtRestEnabled: true,
// ebsEnabled: props.ebsEnabled,
// ebsIops: props.ebsIops,
// ebsVolumeSize: props.ebsVolumeSize,
// ebsVolumeType: props.ebsVolumeType,
// encryptionAtRestKmsKeyARN: props.encryptionAtRestKmsKeyARN,
// appLogEnabled: props.appLogEnabled,
// appLogGroup: props.appLogGroup,
vpc: networkStack.vpc,
vpcSubnetIds: vpcSubnetIds,
vpcSecurityGroupIds: vpcSecurityGroupIds,
availabilityZoneCount: availabilityZoneCount,
domainAccessSecurityGroupParameter: "analyticsDomainSGId",
endpointParameterName: "analyticsDomainEndpoint",
stage: stage,
defaultDeployId: defaultDeployId,
accessPolicies: [openAccessPolicy],
...props
})
migrationAnalyticsStack = new MigrationAnalyticsStack(scope, "migration-analytics", {
vpc:networkStack.vpc,
version: this.getEngineVersion(analyticsDomainEngineVersion ?? engineVersion), // If no analytics version is specified, use the same as the target cluster
domainName: analyticsDomainName,
vpc: networkStack.vpc,
vpcSubnetIds: vpcSubnetIds,
vpcSecurityGroupIds: vpcSecurityGroupIds,
availabilityZoneCount: availabilityZoneCount,
stackName: `OSMigrations-${stage}-${region}-MigrationAnalytics`,
description: "This stack contains resources for the Open Telemetry Collector and Analytics OS Cluster",
engineVersion: this.getEngineVersion(analyticsDomainEngineVersion ?? engineVersion), // if no analytics version is specified, use the same as the target cluster
dataNodeInstanceType: analyticsDomainDataNodeType,
dataNodes: analyticsDomainDataNodeCount ?? availabilityZoneCount, // There's probably a better way to do this, but the node count must be >= the zone count, and possibly must be the same even/odd as zone count
dataNodes: analyticsDomainDataNodeCount ?? availabilityZoneCount, // There's probably a better way to do this, but the node count must be >= the zone count, and possibly must be the same even/odd as zone count
dedicatedManagerNodeType: analyticsDomainDedicatedManagerNodeType,
dedicatedManagerNodeCount: analyticsDomainDedicatedManagerNodeCount,
warmInstanceType: analyticsDomainWarmNodeType,
warmNodes: analyticsDomainWarmNodeCount,
enforceHTTPS: analyticsDomainEnforceHTTPS,
enableDemoAdmin: false,
enforceHTTPS: true,
nodeToNodeEncryptionEnabled: true,
encryptionAtRestEnabled: true,
encryptionAtRestKmsKeyARN: analyticsDomainEncryptionAtRestKmsKeyARN,
appLogEnabled: analyticsDomainLoggingAppLogEnabled,
appLogGroup: analyticsDomainLoggingAppLogGroupARN,
ebsEnabled: analyticsDomainEbsEnabled,
ebsIops: analyticsDomainEbsIops,
ebsVolumeSize: analyticsDomainEbsVolumeSize,
ebsVolumeType: analyticsDomainEbsVolumeType,
encryptionAtRestEnabled: analyticsDomainEncryptionAtRestEnabled,
encryptionAtRestKmsKeyARN: analyticsDomainEncryptionAtRestKmsKeyARN,
appLogEnabled: analyticsDomainLoggingAppLogEnabled,
appLogGroup: analyticsDomainLoggingAppLogGroupARN,
nodeToNodeEncryptionEnabled: analyticsDomainNoneToNodeEncryptionEnabled,
stage: stage,
defaultDeployId: defaultDeployId,
accessPolicies: [openAccessPolicy],
...props
})
migrationAnalyticsStack = new MigrationAnalyticsStack(scope, "migration-analytics", {
stackName: `OSMigrations-${stage}-${region}-MigrationAnalytics`,
vpc:networkStack.vpc,
stage: stage,
defaultDeployId: defaultDeployId,
...props,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,3 +208,17 @@ test('Test that app registry association is created when migrationsAppRegistryAR
const domainTemplate = Template.fromStack(domainStack)
domainTemplate.resourceCountIs("AWS::ServiceCatalogAppRegistry::ResourceAssociation", 1)
})

test('Test that with analytics and assistance stacks enabled, creates two opensearch domains', () => {

const contextOptions = {
migrationAnalyticsServiceEnabled: true,
migrationAssistanceEnabled: true,
vpcEnabled: true,
migrationConsoleServiceEnabled: true,
}

const openSearchStacks = createStackComposer(contextOptions)
const domainStacks = openSearchStacks.stacks.filter((s) => s instanceof OpenSearchDomainStack)
domainStacks.length == 2
})

0 comments on commit 54c262d

Please sign in to comment.