import * as gcp from "@pulumi/gcp"; import * as pulumi from "@pulumi/pulumi"; interface SingleServiceInstanceArgs { config?: string; databaseAdminAccounts: Array; databaseAliases?: pulumi.Input[]; databaseUserAccounts: gcp.serviceaccount.Account[]; displayName?: string; instanceAliases?: pulumi.Input[]; name: string; processingUnits?: number; project: string; } export class SingleServiceInstance extends pulumi.ComponentResource { public readonly instance: gcp.spanner.Instance; public readonly database: gcp.spanner.Database; public readonly backupSchedule: gcp.spanner.BackupSchedule; constructor( name: string, args: SingleServiceInstanceArgs, opts?: pulumi.ComponentResourceOptions, ) { super("scout:spanner:SingleServiceInstance", name, {}, opts); this.instance = new gcp.spanner.Instance( `${name}-instance`, { config: args.config || "regional-us-east1", displayName: args.displayName || name, labels: { service: args.name, }, name: args.name, processingUnits: args.processingUnits || 100, project: args.project, }, { aliases: args.instanceAliases, parent: this, }, ); this.database = new gcp.spanner.Database( `${name}-database`, { databaseDialect: "GOOGLE_STANDARD_SQL", instance: this.instance.name, name: args.name, project: args.project, }, { aliases: args.databaseAliases, parent: this, }, ); this.backupSchedule = new gcp.spanner.BackupSchedule( `${name}-backup-schedule-default`, { database: this.database.name, fullBackupSpec: {}, instance: this.instance.name, name: "default", project: args.project, spec: { cronSpec: { text: "0 0,12 * * *", }, }, retentionDuration: "604800s", }, { parent: this, }, ); const databasePolicyBindings: { members: Array | string>, role: string }[] = []; if (args.databaseAdminAccounts.length > 0) { databasePolicyBindings.push({ members: args.databaseAdminAccounts.map(a => { if (a instanceof gcp.serviceaccount.Account) { return a.member; } else { return a as string; } }), role: "roles/spanner.databaseAdmin", }); } if (args.databaseUserAccounts.length > 0) { databasePolicyBindings.push({ members: args.databaseUserAccounts.map(a => a.member), role: "roles/spanner.databaseUser", }); } new gcp.spanner.DatabaseIAMPolicy( `${name}-database-user-iam-policy`, { database: this.database.name, instance: this.instance.name, policyData: pulumi.jsonStringify({ bindings: databasePolicyBindings, }), project: args.project, }, { parent: this, }, ); } }