@catladder/cli
Version:
Panter cli tool for cloud CI/CD and DevOps
137 lines (111 loc) • 3.67 kB
text/typescript
import type Vorpal from "vorpal";
import { spawnCopyDb } from "../../../../gcloud/cloudSql/copyDb";
import type { CloudSqlBackgroundProxy } from "../../../../gcloud/cloudSql/startProxy";
import { startCloudSqlProxyInBackground } from "../../../../gcloud/cloudSql/startProxy";
export default async (vorpal: Vorpal) =>
vorpal
.command(
"cloud-sql-restore-db",
"restore a db from one source to another target",
)
.action(async function restoreDb() {
const { sourceInstance } = await this.prompt({
type: "input",
name: "sourceInstance",
message: "Source instance (connection string or 'local')? 🤔 ",
});
let sourceProxy: CloudSqlBackgroundProxy;
let targetProxy: CloudSqlBackgroundProxy;
let sourcePort: number;
let targetPort: number;
if (sourceInstance === "local") {
const { sourceLocalPort } = await this.prompt({
type: "number",
name: "sourceLocalPort",
default: 5432,
message: "Local Port for source? 🤔 ",
});
sourcePort = sourceLocalPort;
} else {
sourcePort = 54399;
sourceProxy = await startCloudSqlProxyInBackground({
instanceName: sourceInstance,
localPort: sourcePort,
});
}
const { sourceUsername } = await this.prompt({
type: "input",
name: "sourceUsername",
default: "postgres",
message: "Source Username? 🤔 ",
});
const { sourcePassword } = await this.prompt({
type: "input",
name: "sourcePassword",
message: "Source Password? 🤔 ",
});
const { sourceDbName } = await this.prompt({
type: "input",
name: "sourceDbName",
message: "Source DB name? 🤔 ",
});
const { targetInstance } = await this.prompt({
type: "input",
name: "targetInstance",
message: "Target INSTANCE (connection string or 'local')? 🤔 ",
});
if (targetInstance === "local") {
const { targetLocalPort } = await this.prompt({
type: "number",
name: "targetLocalPort",
default: 5432,
message: "Local Port for target? 🤔 ",
});
targetPort = targetLocalPort;
} else {
targetPort = 54499;
targetProxy = await startCloudSqlProxyInBackground({
instanceName: targetInstance,
localPort: targetPort,
});
}
const { targetUsername } = await this.prompt({
type: "input",
name: "targetUsername",
default: "postgres",
message: "Target Username? 🤔 ",
});
const { targetPassword } = await this.prompt({
type: "input",
name: "targetPassword",
message: "Target Password? 🤔 ",
});
const { targetDbName } = await this.prompt({
type: "input",
name: "targetDbName",
message: "Target DB name? 🤔 ",
});
const { shouldContinue } = await this.prompt({
type: "confirm",
name: "shouldContinue",
message: `This will drop ${targetInstance}/${targetDbName} and replace it with ${sourceInstance}/${sourceDbName}. Continue? 🤔 `,
});
if (!shouldContinue) {
return;
}
try {
await spawnCopyDb({
targetPassword,
targetPort,
targetUsername,
sourceUsername,
sourcePassword,
sourcePort,
sourceDbName,
targetDbName,
});
} finally {
sourceProxy?.stop();
targetProxy?.stop();
}
});