UNPKG

@deploystack/docker-to-iac

Version:

Translate docker run and docker compose file to Infrastructure as Code

124 lines (123 loc) 5.55 kB
"use strict"; 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; }