diff --git a/src/v2/components/database/builder.ts b/src/v2/components/database/builder.ts new file mode 100644 index 0000000..9cd343c --- /dev/null +++ b/src/v2/components/database/builder.ts @@ -0,0 +1,121 @@ +import { Database } from '.'; +import * as pulumi from '@pulumi/pulumi'; + +export class DatabaseBuilder { + private name: string; + private instanceConfig?: Database.Instance; + private credentialsConfig?: Database.Credentials; + private storageConfig?: Database.Storage; + private vpc?: Database.Args['vpc']; + private enableMonitoring?: Database.Args['enableMonitoring']; + private snapshotIdentifier?: Database.Args['snapshotIdentifier']; + private kmsKeyId?: Database.Args['kmsKeyId']; + private parameterGroupName?: Database.Args['parameterGroupName']; + private tags?: Database.Args['tags']; + + constructor(name: string) { + this.name = name; + } + + public withInstance(instanceConfig: Database.Instance = {}): this { + this.instanceConfig = instanceConfig; + + return this; + } + + public withCredentials(credentialsConfig: Database.Credentials = {}): this { + this.credentialsConfig = credentialsConfig; + + return this; + } + + public withStorage(storageConfig: Database.Storage = {}): this { + this.storageConfig = storageConfig; + + return this; + } + + public withVpc(vpc: Database.Args['vpc']): this { + this.vpc = pulumi.output(vpc); + + return this; + } + + public withMonitoring(): this { + this.enableMonitoring = true; + + return this; + } + + public withSnapshot( + snapshotIdentifier: Database.Args['snapshotIdentifier'], + ): this { + this.snapshotIdentifier = snapshotIdentifier; + + return this; + } + + public withKms(kmsKeyId: Database.Args['kmsKeyId']): this { + this.kmsKeyId = kmsKeyId; + + return this; + } + + public withParameterGroup( + parameterGroupName: Database.Args['parameterGroupName'], + ): this { + this.parameterGroupName = parameterGroupName; + + return this; + } + + public withTags(tags: Database.Args['tags']): this { + this.tags = tags; + + return this; + } + + public build(opts: pulumi.ComponentResourceOptions = {}): Database { + if (!this.snapshotIdentifier && !this.instanceConfig?.dbName) { + throw new Error( + 'DbName not provided. Make sure to call DatabaseBuilder.withInstance() and set dbName.', + ); + } + + if (!this.snapshotIdentifier && !this.credentialsConfig?.username) { + throw new Error( + 'Username not provided. Make sure to call DatabaseBuilder.withCredentials() and set username.', + ); + } + + if (this.snapshotIdentifier && this.instanceConfig?.dbName) { + throw new Error(`You can't set dbName when using snapshotIdentifier.`); + } + + if (this.snapshotIdentifier && this.credentialsConfig?.username) { + throw new Error(`You can't set username when using snapshotIdentifier.`); + } + + if (!this.vpc) { + throw new Error( + 'VPC not provided. Make sure to call DatabaseBuilder.withVpc().', + ); + } + + return new Database( + this.name, + { + ...this.instanceConfig, + ...this.credentialsConfig, + ...this.storageConfig, + vpc: this.vpc, + enableMonitoring: this.enableMonitoring, + snapshotIdentifier: this.snapshotIdentifier, + kmsKeyId: this.kmsKeyId, + parameterGroupName: this.parameterGroupName, + tags: this.tags, + }, + opts, + ); + } +} diff --git a/src/v2/components/database/index.ts b/src/v2/components/database/index.ts index 695d12a..bb97184 100644 --- a/src/v2/components/database/index.ts +++ b/src/v2/components/database/index.ts @@ -13,6 +13,7 @@ export namespace Database { instanceClass?: pulumi.Input; allowMajorVersionUpgrade?: pulumi.Input; autoMinorVersionUpgrade?: pulumi.Input; + applyImmediately?: pulumi.Input; }; export type Credentials = { @@ -23,7 +24,6 @@ export namespace Database { export type Storage = { allocatedStorage?: pulumi.Input; maxAllocatedStorage?: pulumi.Input; - kmsKeyId?: pulumi.Input; }; export type Args = Instance & @@ -31,9 +31,9 @@ export namespace Database { Storage & { vpc: pulumi.Input; enableMonitoring?: pulumi.Input; - applyImmediately?: pulumi.Input; snapshotIdentifier?: pulumi.Input; parameterGroupName?: pulumi.Input; + kmsKeyId?: pulumi.Input; tags?: pulumi.Input<{ [key: string]: pulumi.Input; }>;