class SakurraForm::Plan
Public Class Methods
source_root()
click to toggle source
# File lib/sakurraform/cli/plan.rb, line 6 def self.source_root File.expand_path("../../", __FILE__) end
Public Instance Methods
apply()
click to toggle source
# File lib/sakurraform/cli/plan.rb, line 20 def apply ## Prepare Network col_networks = SakurraForm::Collection.new('network') col_networks.collection_resources network = Fog::Network[:sakuracloud] col_networks.resources.each do |net| unless net.resource_id net.resource_id = name_plus_uuid(net.name) options = net.configuration.merge({'name' => net.resource_id}) say("Create new #{net.mode} #{net.name}") case net.mode when 'router' router = network.routers.create(options) switch = network.switches.find {|s| s.internet['ID'] == router.id} when 'switch' switch = network.switches.create(options) else raise "Not supported mode #{net.mode}..." end create_file "state/network/#{net.resource_id}.yml", switch.all_attributes.to_yaml else say("#{net.name} already available as #{net.resource_id}") end end col_networks = SakurraForm::Collection.new('network') col_networks.collection_resources(true) col_servers = SakurraForm::Collection.new('server') col_servers.collection_resources compute = Fog::Compute[:sakuracloud] volume = Fog::Volume[:sakuracloud] col_servers.resources.each do |sv| unless sv.resource_id sv.resource_id = name_plus_uuid(sv.name) switch_id = resolve_sakura_id_by_combined(sv.configuration["switch"]) options = sv.configuration.merge( { "name" => sv.resource_id, "switch" => switch_id } ) say("Create new server #{sv.name}") server = compute.servers.create(options) sv_network = (col_networks.resources.find {|n| n.cached_state[:id] == switch_id}).cached_state[:subnets].first sv_ipaddress = get_offset_address(sv_network["DefaultRoute"], sv.configuration["meta"]["network_offset"]) subnet ={ :ipaddress => sv_ipaddress, :networkmasklen => sv_network["NetworkMaskLen"], :defaultroute => sv_network["DefaultRoute"] } disk_id = server.disks.first['ID'] say("Associate #{sv_ipaddress} to #{sv.name}") volume.associate_ip_to_disk(disk_id, subnet) say("Carve #{sv.name} as Hostname...") volume.carve_hostname_on_disk(disk_id, sv.name) ## Regist Interfaces if sv.configuration["interfaces"] ifs = sv.configuration["interfaces"] c_switches = ifs.map do |target_sw| say("Creating interface connected to #{target_sw}...") resolve_sakura_id_by_combined(target_sw) end c_switches.map do |t_sw| new_if = network.interfaces.regist_onto_server(server.id) network.interfaces.connect_to_switch(new_if.id, t_sw) end end server.boot create_file "state/server/#{sv.resource_id}.yml", server.all_attributes.to_yaml else say("#{sv.name} already available as #{sv.resource_id}") end end end
destroy()
click to toggle source
# File lib/sakurraform/cli/plan.rb, line 103 def destroy ## Show resources before destroy. SakurraForm::CLI.new.status say("This operation removes all resources from Sakura no Cloud.") answer = ask("Are you sure (Type 'Yes')? ") exit unless answer == "Yes" ## Destroy Servers col_servers = SakurraForm::Collection.new('server') col_servers.collection_resources(true) compute = Fog::Compute[:sakuracloud] col_servers.resources.each do |sv| if sv.remote_state # puts sv.remote_state say("Send stop to #{sv.resource_id}") server = compute.servers.get(sv.remote_state[:id]) server.stop(true) server.reload say("Waiting #{sv.resource_id} until down ... (in 15 sec)") 3.times do break if server.instance["Status"] == "down" sleep 5 say(".") server.reload end say("Deleting #{sv.resource_id} and Disks...") server.delete( true, server.disks.map {|d| d["ID"]} ) else say("Server #{sv.name} not found.") end sv.flush_cached_state("server") end ## Destroy Network col_networks = SakurraForm::Collection.new('network') col_networks.collection_resources(true) network = Fog::Network[:sakuracloud] col_networks.resources.each do |net| if net.remote_state # puts net.remote_state if net.remote_state[:internet] && net.remote_state[:internet].any? say("Deleting Router #{net.resource_id} ...") network.delete_router(net.remote_state[:internet]["ID"]) else say("Deleting Switch #{net.resource_id} ...") network.delete_switch(net.remote_state[:id]) end else say("Router/Switch #{net.name} not found.") end net.flush_cached_state("network") end end
generate()
click to toggle source
# File lib/sakurraform/cli/plan.rb, line 11 def generate empty_directory('state') empty_directory('state/network') empty_directory('state/server') template('templates/network.tt', "plan/network.yml") copy_file('templates/server.tt', "plan/server.yml") end