lib/rubber/recipes/rubber/static_ips.rb in nirvdrum-rubber-1.1.7 vs lib/rubber/recipes/rubber/static_ips.rb in nirvdrum-rubber-2.0.0.rails3.beta6

- old
+ new

@@ -78,9 +78,92 @@ required_task :destroy_static_ip do ip = get_env('IP', "Static IP (run rubber:describe_static_ips for a list)", true) destroy_static_ip(ip) end + desc 'Move a static IP address from DONOR machine to RECEIVER machine.' + task :move_static_ip do + donor_alias = get_env 'DONOR', 'Instance alias to get the IP from (e.g., web01)', true + receiver_alias = get_env 'RECEIVER', 'Instance alias to assign the IP to (e.g., web02)', true + + # Sanity checks + donor = rubber_instances[donor_alias] + fatal "Instance does not exist: #{donor_alias}" unless donor + + static_ip = donor.static_ip + fatal 'No static IP address to move exists' unless static_ip && static_ip != '' + + receiver = rubber_instances[receiver_alias] + fatal "Instance does not exist: #{receiver_alias}" unless receiver + + # Temporary removal of the instances. + old_donor = rubber_instances.remove(donor_alias) + old_receiver = rubber_instances.remove(receiver_alias) + + rubber_instances.save + + # Getting rid of alias->IP mappings and SSH's known_hosts records. + load_roles + setup_aliases + cleanup_known_hosts(old_donor) + cleanup_known_hosts(old_receiver) + + # Detachment of EIPA. + success = cloud.detach_static_ip(static_ip) + fatal "Failed to detach static IP address #{static_ip}" unless success + rubber_instances.artifacts['static_ips'].delete(old_donor.name) + + rubber_instances.save + + # Attachment of EIPA. + success = cloud.attach_static_ip(static_ip, old_receiver.instance_id) + fatal "Failed to associate static IP address #{static_ip}" unless success + + print "Waiting for #{receiver_alias} to get the address" + while true do + print '.' + sleep 3 + instance = cloud.describe_instances(old_receiver.instance_id).first + break if instance[:external_ip] == static_ip + end + + # Partial cleanup of static IP records. + rubber_instances.artifacts['static_ips'][old_receiver.name] = static_ip + + rubber_instances.save + + # First half of the sync. + new_receiver = Rubber::Configuration::InstanceItem.new(old_receiver.name, + old_receiver.domain, old_receiver.roles, old_receiver.instance_id, + old_receiver.security_groups) + new_receiver.static_ip = static_ip + rubber_instances.add(new_receiver) + + rubber_instances.save + + refresh_instance(receiver_alias) + + print "Waiting for #{donor_alias} to get a new address" + while true do + print '.' + sleep 3 + instance = cloud.describe_instances(old_donor.instance_id).first + break if instance[:external_ip] && instance[:external_ip] != '' + end + + # Second half of the sync. + new_donor = Rubber::Configuration::InstanceItem.new(old_donor.name, + old_donor.domain, old_donor.roles, old_donor.instance_id, + old_donor.security_groups) + rubber_instances.add(new_donor) + + rubber_instances.save + + refresh_instance(donor_alias) + + logger.info "Run 'cap rubber:describe_static_ips' to check the allocated ones" + end + def allocate_static_ip() ip = cloud.create_static_ip() fatal "Failed to allocate static ip" if ip.nil? return ip end