@catladder/cli
Version:
Panter cli tool for cloud CI/CD and DevOps
103 lines • 4.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getDatabaseConnectionString = exports.getPrismaDatabaseConnectionString = exports.getRailsDatabaseConnectionString = exports.getDatabaseJdbcUrl = exports.DEFAULT_DB_VARIABLES_MODE = exports.getDatabaseCreateScript = exports.getDatabaseDeleteScript = void 0;
const bash_1 = require("../../../bash");
const gitlab_1 = require("../../../utils/gitlab");
const getDatabaseDeleteScript = (context, deployConfig) => {
if (!deployConfig.cloudSql || !deployConfig.cloudSql.deleteDatabaseOnStop) {
throw new Error("not possible");
}
const DB_NAME = context.environment.envVars["DB_NAME"];
if (!DB_NAME) {
throw new Error("error: env vars did not specify DB_NAME");
}
const [projectId, region, instanceId] = deployConfig.cloudSql.instanceConnectionName.split(":");
// unfortunatly the database cannot be deleted right after the service has stopped, as it might still have connections
// we have to repeate this process
return [
`echo "deleting database ${DB_NAME}..."`,
`echo "👆 this can take multiple attemps (3-5min), because google cloud run may still have a connection to the database after the cloud run service is shut down"`,
(0, gitlab_1.repeatOnFailure)(`gcloud sql databases delete ${DB_NAME} --instance=${instanceId} --project ${projectId}`, {
pauseInSeconds: 10,
}),
];
};
exports.getDatabaseDeleteScript = getDatabaseDeleteScript;
const getDatabaseCreateScript = (context, deployConfig) => {
if (!deployConfig.cloudSql) {
throw new Error("not possible");
}
const DB_NAME = context.environment.envVars["DB_NAME"];
if (!DB_NAME) {
throw new Error("error: env vars did not specify DB_NAME");
}
const [projectId, region, instanceId] = deployConfig.cloudSql.instanceConnectionName.split(":");
// may fail if it already exists
return (0, gitlab_1.allowFailureInScripts)([
`echo "ensuring Database..."`,
`gcloud sql databases create ${DB_NAME} --instance=${instanceId} --project ${projectId}`,
]);
};
exports.getDatabaseCreateScript = getDatabaseCreateScript;
exports.DEFAULT_DB_VARIABLES_MODE = "legacy";
const getVariableOrValue = (key, variables, mode) => {
return mode === "legacy" ? `$${key}` : variables[key];
};
const getDatabaseJdbcUrl = (variables, mode) => {
const parts = [
"jdbc:postgresql:///",
getVariableOrValue("DB_NAME", variables, mode),
"?cloudSqlInstance=",
getVariableOrValue("CLOUD_SQL_INSTANCE_CONNECTION_NAME", variables, mode),
"&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=",
getVariableOrValue("DB_USER", variables, mode),
"&password=",
getVariableOrValue("DB_PASSWORD", variables, mode),
];
return (0, bash_1.joinBashExpressions)(parts);
};
exports.getDatabaseJdbcUrl = getDatabaseJdbcUrl;
const getRailsDatabaseConnectionString = (variables, mode) => {
const parts = [
"postgresql://",
getVariableOrValue("DB_USER", variables, mode),
":",
getVariableOrValue("DB_PASSWORD", variables, mode),
"@",
encodeURIComponent(`/cloudsql/${variables.CLOUD_SQL_INSTANCE_CONNECTION_NAME}`),
"/",
getVariableOrValue("DB_NAME", variables, mode),
"?",
];
return (0, bash_1.joinBashExpressions)(parts);
};
exports.getRailsDatabaseConnectionString = getRailsDatabaseConnectionString;
const getPrismaDatabaseConnectionString = (variables, mode) => {
const parts = [
"postgresql://",
getVariableOrValue("DB_USER", variables, mode),
":",
getVariableOrValue("DB_PASSWORD", variables, mode),
"@localhost/",
getVariableOrValue("DB_NAME", variables, mode),
"?host=/cloudsql/",
getVariableOrValue("CLOUD_SQL_INSTANCE_CONNECTION_NAME", variables, mode),
];
return (0, bash_1.joinBashExpressions)(parts);
};
exports.getPrismaDatabaseConnectionString = getPrismaDatabaseConnectionString;
const getDatabaseConnectionString = (config, variables) => {
var _a;
const mode = (_a = config.dbConnectionStringVariablesMode) !== null && _a !== void 0 ? _a : exports.DEFAULT_DB_VARIABLES_MODE;
switch (config.dbConnectionStringFormat) {
case "jdbc":
return (0, exports.getDatabaseJdbcUrl)(variables, mode);
case "rails":
return (0, exports.getRailsDatabaseConnectionString)(variables, mode);
default:
// prisma
return (0, exports.getPrismaDatabaseConnectionString)(variables, mode);
}
};
exports.getDatabaseConnectionString = getDatabaseConnectionString;
//# sourceMappingURL=database.js.map