Skip to content

Instantly share code, notes, and snippets.

@wolfoo2931
Created December 21, 2018 14:51
Show Gist options
  • Save wolfoo2931/70649702dc7870992749ea1f925b1e3e to your computer and use it in GitHub Desktop.
Save wolfoo2931/70649702dc7870992749ea1f925b1e3e to your computer and use it in GitHub Desktop.
#!/var/vcap/packages/ruby/bin/ruby
require 'tempfile'
class CleanerCommand
attr_reader :deployment_list_filename
def self.run!(deployment_list_filename)
new(deployment_list_filename).execute!
end
def initialize(deployment_list_filename)
@deployment_list_filename = deployment_list_filename
end
def execute!
parse_control_script
execute_rails_command
end
private
def parse_control_script
ctl_script_file = "/var/vcap/jobs/anynines-bosh-deployer/bin/anynines_bosh_deployer_ctl"
multi_line = false
File.readlines(ctl_script_file).each do |line|
if multi_line || line.start_with?("export")
multi_line = true if line =~ /="/ && line !~ /=".*"/
multi_line = false if multi_line && line !~ /="/ && line =~ /"/
exports_file.write(line)
end
end
exports_file.flush
end
def exports_file
@exports_file ||= Tempfile.new("exports.sh")
end
def execute_rails_command
package_dir = "/var/vcap/packages/anynines-bosh-deployer"
self_filename = File.basename(__FILE__)
self_dir = __dir__
system(". #{exports_file.path} && cd #{package_dir} && bundle exec rails r \"require_relative '#{self_dir}/#{self_filename}'; Cleaner.run!('#{deployment_list_filename}')\"")
end
end
class Cleaner
attr_reader :deployment_list_filename
def self.run!(deployment_list_filename)
new(deployment_list_filename).execute!
end
def initialize(deployment_list_filename)
@deployment_list_filename = deployment_list_filename
end
def execute!
puts "Clean up deployments: #{deployment_names}"
Deployment.where(name: deployment_names).all.each do |deployment|
if bosh_deployments.include?(deployment.name)
deleted = delete_bosh_deployment(deployment)
else
deployment.mark_as_not_deployed
deleted = true
end
if deleted
puts "Delete deployment: ##{deployment.id} #{deployment.name}"
deployment.destroy!
else
puts "Could not delete BOSH deployment #{deployment.name}."
end
end
end
private
def deployment_names
@deployment_names ||= [].tap do |deployment_names|
File.readlines(deployment_list_filename).each do |line|
deployment_names << line.strip
end
end
end
def delete_bosh_deployment(deployment)
puts "Delete BOSH deployment: #{deployment.name}"
task_id = Bosh::Cli.delete_deployment(deployment.name)
deployment.mark_as_deleting(task_id)
60.times do
status = Bosh::Cli.task_state(deployment.name, deployment.active_task).to_sym
case status
when :done
deployment.mark_as_not_deployed
return true
when :timeout
deployment.mark_as_failed("A timeout error occured during the deployment of the changes. Administration will be notified.")
return false
when :error
deployment.mark_as_failed("An error occured during the deployment of the changes. Administration will be notified.")
return false
when :cancelled
deployment.mark_as_failed("Deployment got cancelled, administration will be notified")
return false
end
sleep 10
end
return false
end
def bosh_deployments
@bosh_deployments ||= Bosh::Cli.list_deployments
end
end
if __FILE__ == $0
raise "Please provide a list with deployments to clean up." unless ARGV[0]
deployment_list_filename = File.expand_path(ARGV[0], __dir__)
CleanerCommand.run!(deployment_list_filename)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment