395 lines
13 KiB
Plaintext
395 lines
13 KiB
Plaintext
module Dalmatian
|
|
class Cluster
|
|
def initialize(description, helper: Helper, logger: Logger)
|
|
properties = description.last
|
|
@id = description.first
|
|
@account_id = properties["account_id"]
|
|
@environments = properties["environments"]
|
|
@properties = properties["cluster"]
|
|
@logger = logger
|
|
@helper = helper
|
|
@hosted_zones = build_hosted_zones(properties["hosted_zones"])
|
|
@s3s = build_s3s(properties["s3"])
|
|
@vpn_customer_gateways = build_vpn_customer_gateways(properties["vpn_customer_gateway"])
|
|
@sources = build_sources(properties["dalmatian_config_source"])
|
|
@services = build_services(properties["services"])
|
|
@wafs = build_wafs(properties["waf"])
|
|
@rdss = build_rdss(properties["rds"])
|
|
@auroras = build_auroras(properties["aurora"])
|
|
@elasticache_clusters = build_elasticache_clusters(properties["elasticache_cluster"])
|
|
@opensearch_clusters = build_opensearch_clusters(properties["opensearch_cluster"])
|
|
@shared_loadbalancers = build_shared_loadbalancers(properties["shared_loadbalancer"])
|
|
end
|
|
|
|
attr_reader :hosted_zones, :s3s, :vpn_customer_gateways, :sources, :services, :wafs, :rdss, :auroras, :elasticache_clusters,
|
|
:opensearch_clusters, :shared_loadbalancers, :environments, :properties, :account_id, :id
|
|
|
|
def name
|
|
properties["name"] || id
|
|
end
|
|
|
|
def fetch(infrastructure_name: "all")
|
|
sources.each do |source|
|
|
next unless ["all", source.cluster_id].include? infrastructure_name
|
|
|
|
return verify_source_path(source) unless remotely_held?(source)
|
|
|
|
destination = "#{Infrastructure::PATH}/#{source.name}.config"
|
|
fetch_source(source, destination)
|
|
end
|
|
end
|
|
|
|
def deploy(environment_name: "all", service_name: "all", skip_deployments: "", test: false, auto_approve: false, plan: false, destroy: false, verbose: false)
|
|
skip_deployments = skip_deployments.split(/\s*,\s*/)
|
|
hosted_zones.each do |hosted_zone|
|
|
unless skip_deployments.include?("hosted-zone")
|
|
deploy_hosted_zone(hosted_zone, test, auto_approve, plan, destroy, verbose)
|
|
end
|
|
end
|
|
s3s.each do |s3|
|
|
unless skip_deployments.include?("s3")
|
|
deploy_s3(s3, test, auto_approve, plan, destroy, verbose)
|
|
end
|
|
end
|
|
vpn_customer_gateways.each do |vpn_customer_gateway|
|
|
unless skip_deployments.include?("vpn-customer-gateway")
|
|
deploy_vpn_customer_gateway(vpn_customer_gateway, test, auto_approve, plan, destroy, verbose)
|
|
end
|
|
end
|
|
environments.each do |name, details|
|
|
next unless ["all", name].include?(environment_name)
|
|
environment = {name: name, details: details}
|
|
deploy_cluster(environment, test, auto_approve, plan, destroy, verbose) if create? && !skip_deployments.include?("ecs")
|
|
wafs.each do |waf|
|
|
unless skip_deployments.include?("waf")
|
|
deploy_waf(waf, environment, test, auto_approve, plan, destroy, verbose)
|
|
end
|
|
end
|
|
rdss.each do |rds|
|
|
unless skip_deployments.include?("rds")
|
|
deploy_rds(rds, environment, test, auto_approve, plan, destroy, verbose)
|
|
end
|
|
end
|
|
auroras.each do |aurora|
|
|
unless skip_deployments.include?("aurora")
|
|
deploy_aurora(aurora, environment, test, auto_approve, plan, destroy, verbose)
|
|
end
|
|
end
|
|
elasticache_clusters.each do |elasticache_cluster|
|
|
unless skip_deployments.include?("elasticache-cluster")
|
|
deploy_elasticache_cluster(elasticache_cluster, environment, test, auto_approve, plan, destroy, verbose)
|
|
end
|
|
end
|
|
opensearch_clusters.each do |opensearch_cluster|
|
|
unless skip_deployments.include?("opensearch-cluster")
|
|
deploy_opensearch_cluster(opensearch_cluster, environment, test, auto_approve, plan, destroy, verbose)
|
|
end
|
|
end
|
|
services.each do |service|
|
|
next unless service.to_params["launch_on"].include?(name)
|
|
if [service.to_params["name"], "all"].include?(service_name) && !skip_deployments.include?("ecs-services")
|
|
deploy_service(service, environment, test, auto_approve, plan, destroy, verbose)
|
|
end
|
|
end
|
|
shared_loadbalancers.each do |shared_loadbalancer|
|
|
unless skip_deployments.include?("shared-loadbalancer")
|
|
deploy_shared_loadbalancer(shared_loadbalancer, environment, test, auto_approve, plan, destroy, verbose)
|
|
end
|
|
end
|
|
sources.each do |source|
|
|
deploy_source(source, environment, test, auto_approve, plan, destroy, verbose)
|
|
end
|
|
end
|
|
end
|
|
|
|
def target_directory
|
|
File.join(Infrastructure::APP_ROOT, Infrastructure::PATH, "ecs")
|
|
end
|
|
|
|
private
|
|
|
|
attr_reader :logger, :helper
|
|
|
|
def build_hosted_zones(hosted_zones_references)
|
|
(hosted_zones_references || []).map do |reference|
|
|
HostedZone.new(cluster: self, reference: reference)
|
|
end
|
|
end
|
|
|
|
def build_s3s(s3_references)
|
|
(s3_references || []).map do |reference|
|
|
S3.new(cluster: self, reference: reference)
|
|
end
|
|
end
|
|
|
|
def build_vpn_customer_gateways(vpn_customer_gateway_references)
|
|
(vpn_customer_gateway_references || []).map do |reference|
|
|
VpnCustomerGateway.new(cluster: self, reference: reference)
|
|
end
|
|
end
|
|
|
|
def build_sources(source_references)
|
|
(source_references || []).map do |reference|
|
|
Source.new(cluster: self, reference: reference)
|
|
end
|
|
end
|
|
|
|
def build_services(service_references)
|
|
(service_references || []).map do |reference|
|
|
Service.new(cluster: self, reference: reference)
|
|
end
|
|
end
|
|
|
|
def build_elasticache_clusters(elasticache_references)
|
|
(elasticache_references || []).map do |reference|
|
|
ElasticacheCluster.new(cluster: self, reference: reference)
|
|
end
|
|
end
|
|
|
|
def build_opensearch_clusters(opensearch_references)
|
|
(opensearch_references || []).map do |reference|
|
|
OpensearchCluster.new(cluster: self, reference: reference)
|
|
end
|
|
end
|
|
|
|
def build_wafs(waf_references)
|
|
(waf_references || []).map do |reference|
|
|
WAF.new(cluster: self, reference: reference)
|
|
end
|
|
end
|
|
|
|
def build_rdss(rds_references)
|
|
(rds_references || []).map do |reference|
|
|
Rds.new(cluster: self, reference: reference)
|
|
end
|
|
end
|
|
|
|
def build_auroras(aurora_references)
|
|
(aurora_references || []).map do |reference|
|
|
Aurora.new(cluster: self, reference: reference)
|
|
end
|
|
end
|
|
|
|
def build_shared_loadbalancers(shared_loadbalancer_references)
|
|
(shared_loadbalancer_references || []).map do |reference|
|
|
SharedLoadbalancer.new(cluster: self, reference: reference)
|
|
end
|
|
end
|
|
|
|
def deploy_hosted_zone(hosted_zone, test, auto_approve, plan, destroy, verbose)
|
|
test_hosted_zone(hosted_zone) if test
|
|
HostedZoneDeployment.new(
|
|
hosted_zone: hosted_zone,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def deploy_s3(s3, test, auto_approve, plan, destroy, verbose)
|
|
test_s3(s3) if test
|
|
S3Deployment.new(
|
|
s3: s3,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def deploy_vpn_customer_gateway(vpn_customer_gateway, test, auto_approve, plan, destroy, verbose)
|
|
test_vpn_customer_gateway(vpn_customer_gateway) if test
|
|
VpnCustomerGatewayDeployment.new(
|
|
vpn_customer_gateway: vpn_customer_gateway,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def deploy_source(source, env, test, auto_approve, plan, destroy, verbose)
|
|
test_source(source, env) if test
|
|
SourceDeployment.new(
|
|
source: source,
|
|
env: env,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def deploy_cluster(env, test, auto_approve, plan, destroy, verbose)
|
|
test_cluster(env) if test
|
|
ClusterDeployment.new(
|
|
cluster: self,
|
|
env: env,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def deploy_service(service, env, test, auto_approve, plan, destroy, verbose)
|
|
test_service(service, env) if test
|
|
ServiceDeployment.new(
|
|
service: service,
|
|
env: env,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def deploy_waf(waf, env, test, auto_approve, plan, destroy, verbose)
|
|
test_waf(waf, env) if test
|
|
WAFDeployment.new(
|
|
waf: waf,
|
|
env: env,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def deploy_rds(rds, env, test, auto_approve, plan, destroy, verbose)
|
|
test_rds(rds, env) if test
|
|
RdsDeployment.new(
|
|
rds: rds,
|
|
env: env,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def deploy_aurora(aurora, env, test, auto_approve, plan, destroy, verbose)
|
|
test_aurora(aurora, env) if test
|
|
AuroraDeployment.new(
|
|
aurora: aurora,
|
|
env: env,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def deploy_elasticache_cluster(elasticache_cluster, env, test, auto_approve, plan, destroy, verbose)
|
|
test_elasticache_cluster(elasticache_cluster, env) if test
|
|
ElasticacheClusterDeployment.new(
|
|
elasticache_cluster: elasticache_cluster,
|
|
env: env,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def deploy_opensearch_cluster(opensearch_cluster, env, test, auto_approve, plan, destroy, verbose)
|
|
test_opensearch_cluster(opensearch_cluster, env) if test
|
|
OpensearchClusterDeployment.new(
|
|
opensearch_cluster: opensearch_cluster,
|
|
env: env,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def deploy_shared_loadbalancer(shared_loadbalancer, env, test, auto_approve, plan, destroy, verbose)
|
|
test_shared_loadbalancer(shared_loadbalancer, env) if test
|
|
SharedLoadbalancerDeployment.new(
|
|
shared_loadbalancer: shared_loadbalancer,
|
|
env: env,
|
|
plan: plan,
|
|
auto_approve: auto_approve,
|
|
destroy: destroy,
|
|
verbose: verbose
|
|
).call
|
|
end
|
|
|
|
def create?
|
|
properties["create"]
|
|
end
|
|
|
|
def test_hosted_zone(hosted_zone)
|
|
HostedZoneTest.new(hosted_zone: hosted_zone).call
|
|
end
|
|
|
|
def test_s3(s3)
|
|
S3Test.new(s3: s3).call
|
|
end
|
|
|
|
def test_vpn_customer_gateway(vpn_customer_gateway)
|
|
VpnCustomerGatewayTest.new(vpn_customer_gateway: vpn_customer_gateway).call
|
|
end
|
|
|
|
def test_cluster(env)
|
|
ClusterTest.new(cluster: self, env: env).call
|
|
end
|
|
|
|
def test_source(source, env)
|
|
SourceTest.new(source: source, env: env).call
|
|
end
|
|
|
|
def test_service(service, env)
|
|
ServiceTest.new(service: service, env: env).call
|
|
end
|
|
|
|
def test_waf(waf, env)
|
|
WAFTest.new(waf: waf, env: env).call
|
|
end
|
|
|
|
def test_rds(rds, env)
|
|
RdsTest.new(rds: rds, env: env).call
|
|
end
|
|
|
|
def test_aurora(aurora, env)
|
|
puts "debug Testing Aurora"
|
|
AuroraTest.new(aurora: aurora, env: env).call
|
|
end
|
|
|
|
def test_elasticache_cluster(elasticache_cluster, env)
|
|
ElasticacheClusterTest.new(elasticache_cluster: elasticache_cluster, env: env).call
|
|
end
|
|
|
|
def test_opensearch_cluster(opensearch_cluster, env)
|
|
OpensearchClusterTest.new(opensearch_cluster: opensearch_cluster, env: env).call
|
|
end
|
|
|
|
def test_shared_loadbalancer(shared_loadbalancer, env)
|
|
SharedLoadbalancerTest.new(shared_loadbalancer: shared_loadbalancer, env: env).call
|
|
end
|
|
|
|
def fetch_source(source, destination)
|
|
logger.info("Cloning #{source.reference} ...")
|
|
helper.remove(destination)
|
|
helper.git_clone(source.reference, destination)
|
|
helper.change_to(destination)
|
|
helper.terrafile
|
|
helper.change_to(Infrastructure::APP_ROOT)
|
|
end
|
|
|
|
def verify_source_path(source)
|
|
if File.directory?(source.reference)
|
|
logger.info "Found #{source.reference}"
|
|
else
|
|
logger.error "#{source.reference} does not exist"
|
|
end
|
|
end
|
|
|
|
def remotely_held?(source)
|
|
source.reference.start_with?("https://", "git@", "git://", "git+ssh://")
|
|
end
|
|
end
|
|
end
|