@deploystack/docker-to-iac
Version:
Translate docker run and docker compose file to Infrastructure as Code
124 lines (123 loc) • 5.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isHelmDatabaseImage = isHelmDatabaseImage;
exports.processHelmDatabaseConfig = processHelmDatabaseConfig;
exports.isDatabaseConnectionVar = isDatabaseConnectionVar;
exports.detectHelmDatabaseConnections = detectHelmDatabaseConnections;
const getImageUrl_1 = require("./getImageUrl");
const constructImageString_1 = require("./constructImageString");
const database_types_1 = require("../config/helm/database-types");
// Common database connection string patterns
const connectionPatterns = [
/postgres(ql)?:\/\/[^:]+:[^@]+@[^:]+:\d+\/\w+/i,
/mysql:\/\/[^:]+:[^@]+@[^:]+:\d+\/\w+/i,
/mongodb:\/\/[^:]+:[^@]+@[^:]+:\d+\/\w+/i,
/redis:\/\/[^:]+:[^@]+@[^:]+:\d+/i
];
// Common database-related environment variable names
const databaseEnvVarPatterns = [
/db_?(uri|url|conn(ection)?(_?string)?)/i,
/(postgres|mysql|mongo|redis)_?(uri|url|conn(ection)?(_?string)?)/i,
/database_?(uri|url|conn(ection)?(_?string)?)/i
];
/**
* Determines if a given Docker image is a supported database image for Helm charts
*/
function isHelmDatabaseImage(image) {
const dbConfig = (0, database_types_1.getDatabaseConfig)((0, getImageUrl_1.getImageUrl)((0, constructImageString_1.constructImageString)(image)));
return dbConfig !== null;
}
/**
* Processes database configuration for Helm charts, including environment variables
* and Helm chart-specific settings
*
* @param serviceName Database service name
* @param serviceConfig Service configuration
* @returns Processed database configuration for Helm values.yaml
*/
function processHelmDatabaseConfig(serviceName, serviceConfig) {
const imageUrl = (0, getImageUrl_1.getImageUrl)((0, constructImageString_1.constructImageString)(serviceConfig.image));
const dbConfig = (0, database_types_1.getDatabaseConfig)(imageUrl);
if (!dbConfig) {
return null;
}
// Start with template values from the database config
const dbValues = { ...dbConfig.valueTemplate };
// Extract environment variables
const env = serviceConfig.environment;
// Apply any environment variables to the template
const variablePattern = /\${([^}]+)}/g;
// Convert the values to a JSON string to easily replace all occurrences
let valuesString = JSON.stringify(dbValues);
// Replace variables with values from environment
valuesString = valuesString.replace(variablePattern, (match, varName) => {
return env[varName] || match; // Keep the original if not found
});
// Parse back to object
return JSON.parse(valuesString);
}
/**
* Determines if an environment variable appears to be a database connection variable
*/
function isDatabaseConnectionVar(varName, varValue) {
// Check for common database variable naming patterns
const isDbVarName = databaseEnvVarPatterns.some(pattern => pattern.test(varName));
// Check for connection string patterns in the value
const isConnectionString = connectionPatterns.some(pattern => pattern.test(varValue));
// Simple check for database components in the name
const dbComponents = ['host', 'port', 'user', 'password', 'database', 'db'];
const hasDbComponent = dbComponents.some(component => varName.toLowerCase().includes(component.toLowerCase()));
return isDbVarName || isConnectionString || hasDbComponent;
}
/**
* Detects potential database connection environment variables and returns their mappings
* This is specific to the Helm chart implementation
*/
function detectHelmDatabaseConnections(config) {
const result = [];
// First, identify all database services
const databaseServices = new Map();
for (const [serviceName, serviceConfig] of Object.entries(config.services)) {
if (isHelmDatabaseImage(serviceConfig.image)) {
databaseServices.set(serviceName, serviceConfig.image);
}
}
// No database services found, nothing to do
if (databaseServices.size === 0) {
return result;
}
// Look for services that might connect to databases
for (const [serviceName, serviceConfig] of Object.entries(config.services)) {
// Skip database services themselves
if (databaseServices.has(serviceName)) {
continue;
}
// Check environment variables for potential database connections
const dbConnections = new Map();
for (const [varName, varValue] of Object.entries(serviceConfig.environment)) {
if (isDatabaseConnectionVar(varName, varValue.toString())) {
// Try to match this variable to a database service
for (const [dbServiceName] of databaseServices) {
// Simple string match in the value (could be enhanced)
if (varValue.toString().includes(dbServiceName)) {
if (!dbConnections.has(dbServiceName)) {
dbConnections.set(dbServiceName, []);
}
dbConnections.get(dbServiceName).push(varName);
}
}
}
}
// Add detected connections to the result
for (const [dbServiceName, variables] of dbConnections) {
if (variables.length > 0) {
result.push({
fromService: serviceName,
toService: dbServiceName,
environmentVariables: variables
});
}
}
}
return result;
}