class Biosphere::CLI::RenameDeployment

Public Class Methods

renamedeployment(suite, s3, build_dir, deployment, new_name, terraform: Biosphere::CLI::TerraformUtils.new(), localmode: false, force: false) click to toggle source
# File lib/biosphere/cli/renamedeployment.rb, line 11
def self.renamedeployment(suite, s3, build_dir, deployment, new_name, terraform: Biosphere::CLI::TerraformUtils.new(), localmode: false, force: false)

    if !suite.kind_of?(::Biosphere::Suite)
        raise ArgumentError, "RenameDeployment needs a proper suite as the first argument"
    end

    if !s3.kind_of?(S3)
        raise ArgumentError, "RenameDeployment requires an s3 client as the second argument"
    end

    localmode = suite.biosphere_settings[:local] || localmode

    if !deployment
        puts "Please specify deployment name as the second parameter."
        puts "Available deployments:"
        suite.deployments.each do |name, deployment|
            puts "\t#{name}"
        end
        exit(-1)
    end

    if !new_name
        puts "Please specify the new name as the third parameter."
        exit(-1)
    end

    if !suite.deployments[deployment]
        puts "Deployment #{deployment} doesn't exist in the current suite".colorize(:red)
        exit(-1)
    elsif suite.deployments[new_name]
        puts "The current suite already contains a deployment called #{new_name}".colorize(:red)
        exit(-1)
    end

    puts "Renaming #{deployment} to #{new_name}"

    suite.deployments[deployment].all_resources.each do |r|
        r[:new_name] = r[:name].sub(deployment,new_name)
    end

    state_file = "#{build_dir}/#{deployment}.tfstate"
    suite.deployments[deployment].all_resources.each do |r|
        terraform.move(state_file, r[:type], r[:name], r[:new_name])
        r[:name] = r[:new_name]
        r.delete(:new_name)
    end
    suite.state.node[:deployments][new_name] = suite.state.node[:deployments].delete(deployment)

    puts "State renaming done!".colorize(:green)
    puts "Remember to change the deployment name in the deployment specifications too!".colorize(:yellow)

    count = 0
    suite.write_json_to(build_dir) do |file_name, destination, str, suite_deployment|
        puts "Wrote #{str.length} bytes from #{file_name} to #{destination} (#{suite_deployment.export["resource"].length} resources)"
        count = count + 1
    end

    puts "Wrote #{count} files under #{build_dir}"

    unless suite.state.node[:biosphere].nil?
        suite.state.node[:biosphere][:last_build_time] = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
    end

    FileUtils.mv("#{build_dir}/#{deployment}.tfstate", "#{build_dir}/#{new_name}.tfstate")
    suite.state.save()
    s3.save("#{build_dir}/state.node") unless localmode
    s3.delete_object("#{build_dir}/#{deployment}.tfstate") unless localmode
    s3.save("#{build_dir}/#{new_name}.tfstate") unless localmode
end