sparse-intern-71089
12/08/2023, 5:32 PMsalmon-account-74572
12/08/2023, 8:49 PMfew-electrician-82432
12/08/2023, 8:54 PM├── client-platform
│ ├── Pulumi.summa-development.yaml
│ ├── Pulumi.yaml
│ ├── database.ts
│ ├── index.ts
│ ├── package.json
│ ├── tsconfig.json
│ └── yarn.lock
└── server
├── Pulumi.yaml
├── index.ts
├── package.json
└── yarn.lock
8 directories, 42 files
few-electrician-82432
12/08/2023, 8:56 PMimport {
LocalWorkspace,
ConcurrentUpdateError,
StackAlreadyExistsError,
StackNotFoundError, InlineProgramArgs, ProjectSettings
} from '@pulumi/pulumi/automation'
import express from "express";
import { DB } from '../client-platform/database'
const projectName = 'summa-development'
const workDir = './'; // Path to your server directory
const createPulumiProgram = (content: string) => async () => {
const DatabaseParameters = {
name: 'summa-test-primary',
region: 'us-east1',
environment: 'production',
diskSize: 25,
tier: 'db-f1-micro',
replica: true,
secondaryRegion: 'us-central1',
secondaryName: 'summa-test-secondary',
}
const db = new DB(DatabaseParameters)
return db;
}
const createHandler: express.RequestHandler = async (req, res) => {
const stackName = 'automation-api'
const content = req.body.content as string
const db = createPulumiProgram(content)
const args: InlineProgramArgs = {
stackName: stackName,
projectName: projectName,
program: db,
};
const projectSettings: ProjectSettings = {
name: projectName,
runtime: "nodejs",
backend: {
url: '<gs://client-platform-pulumi-state>',
},
};
try {
const stack = await LocalWorkspace.createOrSelectStack(args, {
projectSettings,
secretsProvider,
stackSettings: {
[stackName]: {
secretsProvider,
},
},
})
const upRes = await stack.up({ onOutput: console.info })
res.json({ id: stackName })
} catch (e) {
if (e instanceof StackAlreadyExistsError) {
res.status(409).send(`stack "${stackName}" already exists`)
} else {
res.status(500).send(e)
}
}
}
// deletes a site
const deleteHandler: express.RequestHandler = async (req, res) => {
const stackName = req.params.id
try {
// select the existing stack
const stack = await LocalWorkspace.selectStack({
stackName,
projectName,
// don't need a program for destroy
program: async () => { },
})
// deploy the stack, tailing the logs to console
await stack.destroy({ onOutput: console.info })
await stack.workspace.removeStack(stackName)
res.status(200).end()
} catch (e) {
if (e instanceof StackNotFoundError) {
res.status(404).send(`stack "${stackName}" does not exist`)
} else if (e instanceof ConcurrentUpdateError) {
res
.status(409)
.send(`stack "${stackName}" already has update in progress`)
} else {
res.status(500).send(e)
}
}
}
const ensurePlugins = async () => {
const ws = await LocalWorkspace.create({
workDir: workDir,
})
await ws.installPlugin('gcp', '6.0.0')
}
// install necessary plugins once upon boot
// ensurePlugins()
const app = express()
app.use(express.json())
app.post('/', createHandler)
app.delete('/:id', deleteHandler)
app.listen(1337, () => console.info('server running on :1337'))
few-electrician-82432
12/08/2023, 8:56 PMsalmon-account-74572
12/08/2023, 8:57 PMPulumi.yaml
. Try removing that and see if it helps.few-electrician-82432
12/08/2023, 8:57 PMsalmon-account-74572
12/08/2023, 8:58 PMfew-electrician-82432
12/08/2023, 8:59 PMsalmon-account-74572
12/08/2023, 9:00 PMfew-electrician-82432
12/08/2023, 9:00 PMfew-electrician-82432
12/08/2023, 9:01 PMUpdating (automation-api):
pulumi:pulumi:Stack summa-development-automation-api running
pulumi:pulumi:Stack summa-development-automation-api
Resources:
+ 1 created
Duration: 3s
which we cannot find in our cloud project anywheresalmon-account-74572
12/08/2023, 9:02 PMfew-electrician-82432
12/08/2023, 9:03 PMworkdir
? if I log the stack, I get this output
Stack {
name: 'automation-api',
workspace: LocalWorkspace {
pulumiHome: undefined,
program: [AsyncFunction (anonymous)],
secretsProvider: undefined,
remote: undefined,
remoteGitProgramArgs: undefined,
remotePreRunCommands: undefined,
remoteEnvVars: {},
remoteSkipInstallDependencies: undefined,
workDir: '/var/folders/89/x36p7wgx681f21zfzv45h_gh0000gn/T/automation-2zfOxa',
envVars: {},
ready: Promise { [Array] },
_pulumiVersion: SemVer {
options: {},
loose: false,
includePrerelease: false,
raw: 'v3.94.2',
major: 3,
minor: 94,
patch: 2,
prerelease: [],
build: [],
version: '3.94.2'
}
},
ready: Promise { undefined }
}
salmon-account-74572
12/08/2023, 9:32 PMfew-electrician-82432
12/08/2023, 9:32 PMred-match-15116
12/09/2023, 2:41 AMDB
a pulumi component where the resources are defined? It seems like we are creating a stack,few-electrician-82432
12/11/2023, 3:02 PMlimited-rainbow-51650
01/04/2024, 9:02 AM./client-platform/database.ts
only contains a function or a component class setting up the database, but the instantiation happens in ./client-platform/index.ts
, then nothing will be created in your current setup.
Rather than using an inline program (InlineProgramArgs
), try to use a local program (LocalProgramArgs
) and pass a relative path from the automation api workdir to the the Pulumi CLI program:
const args: LocalProgramArgs = {
stackName: "automation-api",
workDir: upath.joinSafe(__dirname, "..", "client-platform"),
};
So the gist is to point to the full working Pulumi program and as Scott mentioned, at that moment the language you use for the infrastructure code and your automation program may differ.
Example: https://github.com/pulumi/automation-api-examples/blob/main/nodejs/localProgram-tsnode/automation/index.ts#L17-L20
If you want to use an inline program, you only have a single program and programming language, containing both. Here is an example of an inline program in TS:
https://github.com/pulumi/automation-api-examples/tree/main/nodejs/inlineProgram-ts