@catladder/cli
Version:
Panter cli tool for cloud CI/CD and DevOps
70 lines (69 loc) • 4.35 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;