vagrant-softlayer 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,74 +1,74 @@
1
- module VagrantPlugins
2
- module SoftLayer
3
- module Action
4
- # This creates a new instance.
5
- class CreateInstance
6
- include Util::Network
7
- include Util::Warden
8
-
9
- def initialize(app, env)
10
- @app = app
11
- end
12
-
13
- def call(env)
14
- @env = env
15
-
16
- @env[:ui].info I18n.t("vagrant_softlayer.vm.creating")
17
-
18
- sl_warden { env[:sl_product_order].verifyOrder(env[:sl_virtual_guest].generateOrderTemplate(order_template)) }
19
-
20
- result = sl_warden { env[:sl_virtual_guest].createObject(order_template) }
21
- @env[:machine].id = result["id"].to_s
22
-
23
- @app.call(@env)
24
- end
25
-
26
- def get_hostname
27
- @env[:machine].provider_config.hostname || @env[:machine].config.vm.hostname
28
- end
29
-
30
- def get_vlan_id(vlan_name, vlan_space)
31
- return vlan_name unless vlan_name.kind_of?(String)
32
-
33
- routers = @env[:sl_account].object_mask("mask[routers,routers.datacenter,routers.networkVlans,routers.networkVlans.networkSpace,routers.networkVlans.type]").getObject["routers"]
34
-
35
- routers.each do |router|
36
- next if @env[:machine].provider_config.datacenter && router["datacenter"]["name"] != @env[:machine].provider_config.datacenter
37
- router["networkVlans"].each do |vlan|
38
- vlan_qualified_name = [ router["hostname"].split('.').reverse.join('.'), vlan["vlanNumber"] ].join('.')
39
- return vlan["id"] if vlan.has_key?("name") && vlan["type"]["keyName"] == "STANDARD" && vlan["networkSpace"] == vlan_space.to_s.upcase && (vlan["name"] == vlan_name || vlan_qualified_name == vlan_name)
40
- end
41
- end
42
-
43
- raise Errors::SLVlanIdNotFound, :vlan_space => vlan_space.to_s, :vlan_name => vlan_name.inspect
44
- end
45
-
46
- def order_template
47
- template = {
48
- "dedicatedAccountHostOnlyFlag" => @env[:machine].provider_config.dedicated,
49
- "domain" => @env[:machine].provider_config.domain,
50
- "hostname" => get_hostname,
51
- "hourlyBillingFlag" => @env[:machine].provider_config.hourly_billing,
52
- "localDiskFlag" => @env[:machine].provider_config.local_disk,
53
- "maxMemory" => @env[:machine].provider_config.max_memory,
54
- "networkComponents" => [ { :maxSpeed => @env[:machine].provider_config.network_speed } ],
55
- "privateNetworkOnlyFlag" => @env[:machine].provider_config.private_only,
56
- "sshKeys" => ssh_keys(@env),
57
- "startCpus" => @env[:machine].provider_config.start_cpus
58
- }
59
-
60
- template["blockDevices"] = @env[:machine].provider_config.disk_capacity.map{ |key,value| { "device"=> key.to_s, "diskImage" => { "capacity" => value.to_s } } } if @env[:machine].provider_config.disk_capacity
61
- template["blockDeviceTemplateGroup"] = { :globalIdentifier => @env[:machine].provider_config.image_guid } if @env[:machine].provider_config.image_guid
62
- template["datacenter"] = { :name => @env[:machine].provider_config.datacenter } if @env[:machine].provider_config.datacenter
63
- template["operatingSystemReferenceCode"] = @env[:machine].provider_config.operating_system if !@env[:machine].provider_config.image_guid
64
- template["postInstallScriptUri"] = @env[:machine].provider_config.post_install if @env[:machine].provider_config.post_install
65
- template["primaryBackendNetworkComponent"] = { :networkVlan => { :id => get_vlan_id(@env[:machine].provider_config.vlan_private, :private) } } if @env[:machine].provider_config.vlan_private
66
- template["primaryNetworkComponent"] = { :networkVlan => { :id => get_vlan_id(@env[:machine].provider_config.vlan_public, :public) } } if @env[:machine].provider_config.vlan_public
67
- template["userData"] = [ { :value => @env[:machine].provider_config.user_data } ] if @env[:machine].provider_config.user_data
68
-
69
- return template
70
- end
71
- end
72
- end
73
- end
74
- end
1
+ module VagrantPlugins
2
+ module SoftLayer
3
+ module Action
4
+ # This creates a new instance.
5
+ class CreateInstance
6
+ include Util::Network
7
+ include Util::Warden
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ end
12
+
13
+ def call(env)
14
+ @env = env
15
+
16
+ @env[:ui].info I18n.t("vagrant_softlayer.vm.creating")
17
+
18
+ sl_warden { env[:sl_client]["SoftLayer_Product_Order"].verifyOrder(env[:sl_client]["SoftLayer_Virtual_Guest"].generateOrderTemplate(order_template)) }
19
+
20
+ result = sl_warden { env[:sl_client]["SoftLayer_Virtual_Guest"].createObject(order_template) }
21
+ @env[:machine].id = result["id"].to_s
22
+
23
+ @app.call(@env)
24
+ end
25
+
26
+ def get_hostname
27
+ @env[:machine].provider_config.hostname || @env[:machine].config.vm.hostname
28
+ end
29
+
30
+ def get_vlan_id(vlan_name, vlan_space)
31
+ return vlan_name unless vlan_name.kind_of?(String)
32
+
33
+ routers = @env[:sl_client]["SoftLayer_Account"].object_mask("mask[routers,routers.datacenter,routers.networkVlans,routers.networkVlans.networkSpace,routers.networkVlans.type]").getObject["routers"]
34
+
35
+ routers.each do |router|
36
+ next if @env[:machine].provider_config.datacenter && router["datacenter"]["name"] != @env[:machine].provider_config.datacenter
37
+ router["networkVlans"].each do |vlan|
38
+ vlan_qualified_name = [ router["hostname"].split('.').reverse.join('.'), vlan["vlanNumber"] ].join('.')
39
+ return vlan["id"] if vlan.has_key?("name") && vlan["type"]["keyName"] == "STANDARD" && vlan["networkSpace"] == vlan_space.to_s.upcase && (vlan["name"] == vlan_name || vlan_qualified_name == vlan_name)
40
+ end
41
+ end
42
+
43
+ raise Errors::SLVlanIdNotFound, :vlan_space => vlan_space.to_s, :vlan_name => vlan_name.inspect
44
+ end
45
+
46
+ def order_template
47
+ template = {
48
+ "dedicatedAccountHostOnlyFlag" => @env[:machine].provider_config.dedicated,
49
+ "domain" => @env[:machine].provider_config.domain,
50
+ "hostname" => get_hostname,
51
+ "hourlyBillingFlag" => @env[:machine].provider_config.hourly_billing,
52
+ "localDiskFlag" => @env[:machine].provider_config.local_disk,
53
+ "maxMemory" => @env[:machine].provider_config.max_memory,
54
+ "networkComponents" => [ { :maxSpeed => @env[:machine].provider_config.network_speed } ],
55
+ "privateNetworkOnlyFlag" => @env[:machine].provider_config.private_only,
56
+ "sshKeys" => ssh_keys(@env),
57
+ "startCpus" => @env[:machine].provider_config.start_cpus
58
+ }
59
+
60
+ template["blockDevices"] = @env[:machine].provider_config.disk_capacity.map{ |key,value| { "device"=> key.to_s, "diskImage" => { "capacity" => value.to_s } } } if @env[:machine].provider_config.disk_capacity
61
+ template["blockDeviceTemplateGroup"] = { :globalIdentifier => @env[:machine].provider_config.image_guid } if @env[:machine].provider_config.image_guid
62
+ template["datacenter"] = { :name => @env[:machine].provider_config.datacenter } if @env[:machine].provider_config.datacenter
63
+ template["operatingSystemReferenceCode"] = @env[:machine].provider_config.operating_system if !@env[:machine].provider_config.image_guid
64
+ template["postInstallScriptUri"] = @env[:machine].provider_config.post_install if @env[:machine].provider_config.post_install
65
+ template["primaryBackendNetworkComponent"] = { :networkVlan => { :id => get_vlan_id(@env[:machine].provider_config.vlan_private, :private) } } if @env[:machine].provider_config.vlan_private
66
+ template["primaryNetworkComponent"] = { :networkVlan => { :id => get_vlan_id(@env[:machine].provider_config.vlan_public, :public) } } if @env[:machine].provider_config.vlan_public
67
+ template["userData"] = [ { :value => @env[:machine].provider_config.user_data } ] if @env[:machine].provider_config.user_data
68
+
69
+ return template
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -1,39 +1,39 @@
1
- require "log4r"
2
-
3
- module VagrantPlugins
4
- module SoftLayer
5
- module Action
6
- # This action creates the SoftLayer service objects and
7
- # puts them into keys in the environment.
8
- # Also, if a machine id is found, another key called
9
- # `:sl_machine` and containing the masked object is created.
10
- class SetupSoftLayer
11
- def initialize(app, env)
12
- @app = app
13
- @logger = Log4r::Logger.new("vagrant_softlayer::action::connect_softlayer")
14
- end
15
-
16
- def call(env)
17
- @logger.info("Creating the SoftLayer service objects...")
18
-
19
- env[:sl_credentials] = {
20
- :api_key => env[:machine].provider_config.api_key,
21
- :endpoint_url => env[:machine].provider_config.endpoint_url,
22
- :username => env[:machine].provider_config.username
23
- }
24
-
25
- env[:sl_account] = ::SoftLayer::Service.new("SoftLayer_Account", env[:sl_credentials])
26
- env[:sl_product_order] = ::SoftLayer::Service.new("SoftLayer_Product_Order", env[:sl_credentials])
27
- env[:sl_virtual_guest] = ::SoftLayer::Service.new("SoftLayer_Virtual_Guest", env[:sl_credentials])
28
-
29
- unless env[:machine].id.nil? || env[:machine].id.empty?
30
- env[:sl_machine] = env[:sl_virtual_guest].object_with_id(env[:machine].id.to_i)
31
- end
32
-
33
- # Carry on
34
- @app.call(env)
35
- end
36
- end
37
- end
38
- end
39
- end
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module SoftLayer
5
+ module Action
6
+ # This action creates the SoftLayer service objects and
7
+ # puts them into keys in the environment.
8
+ # Also, if a machine id is found, another key called
9
+ # `:sl_machine` and containing the masked object is created.
10
+ class SetupSoftLayer
11
+ def initialize(app, env)
12
+ @app = app
13
+ @logger = Log4r::Logger.new("vagrant_softlayer::action::connect_softlayer")
14
+ end
15
+
16
+ def call(env)
17
+ @logger.info("Creating the SoftLayer service objects...")
18
+
19
+ env[:sl_credentials] = {
20
+ :api_key => env[:machine].provider_config.api_key,
21
+ :endpoint_url => env[:machine].provider_config.endpoint_url,
22
+ :timeout => env[:machine].provider_config.api_timeout,
23
+ :user_agent => "vagrant-softlayer",
24
+ :username => env[:machine].provider_config.username
25
+ }
26
+
27
+ env[:sl_client] = ::SoftLayer::Client.new(env[:sl_credentials])
28
+
29
+ unless env[:machine].id.nil? || env[:machine].id.empty?
30
+ env[:sl_machine] = env[:sl_client]["SoftLayer_Virtual_Guest"].object_with_id(env[:machine].id.to_i)
31
+ end
32
+
33
+ # Carry on
34
+ @app.call(env)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,94 +1,94 @@
1
- module VagrantPlugins
2
- module SoftLayer
3
- module Action
4
- # Look for the DNS zone relative to the configured domain and,
5
- # on return path, perform an API call to add or remove the A
6
- # resource record for the host.
7
- class UpdateDNS
8
- include Util::Network
9
- include Util::Warden
10
-
11
- def initialize(app, env)
12
- @app = app
13
- @logger = Log4r::Logger.new("vagrant_softlayer::action::update_dns")
14
- end
15
-
16
- def call(env)
17
- @env = env
18
-
19
- update_dns
20
-
21
- @app.call(@env)
22
- end
23
-
24
- def add_record
25
- template = {
26
- "data" => ip_address(@env),
27
- "domainId" => @dns_zone["id"],
28
- "host" => hostname(@env),
29
- "ttl" => 86400,
30
- "type" => "a"
31
- }
32
- @env[:ui].info I18n.t("vagrant_softlayer.vm.creating_dns_record")
33
- @logger.debug("Creating DNS A record for #{template['host']}.#{@dns_zone[:name]} (IP address #{template['data']}).")
34
- resource = sl_warden { @resource.createObject(template) }
35
- self.dns_id = resource["id"]
36
- end
37
-
38
- def delete_record
39
- @env[:ui].info I18n.t("vagrant_softlayer.vm.deleting_dns_record")
40
- @logger.debug("Deleting stored DNS A record (ID #{self.dns_id}).")
41
- warn_msg = lambda { @env[:ui].warn I18n.t("vagrant_softlayer.errors.dns_record_not_found") }
42
- sl_warden(warn_msg) { @resource.object_with_id(self.dns_id).deleteObject }
43
- end
44
-
45
- def dns_id
46
- id = nil
47
- id_file = @env[:machine].data_dir.join("dns_id")
48
- id = id_file.read.chomp.to_i if id_file.file?
49
- return id
50
- end
51
-
52
- def dns_id=(value)
53
- @logger.info("New machine DNS ID: #{value.inspect}")
54
-
55
- # The file that will store the id if we have one. This allows the
56
- # ID to persist across Vagrant runs.
57
- id_file = @env[:machine].data_dir.join("dns_id")
58
-
59
- if value
60
- # Write the "id" file with the id given.
61
- id_file.open("w+") do |f|
62
- f.write(value)
63
- end
64
- end
65
- end
66
-
67
- def update_dns
68
- unless @env[:machine].provider_config.manage_dns
69
- @logger.debug("Not managing DNS. Going ahead.")
70
- return
71
- end
72
-
73
- # Lookup the DNS zone
74
- zone = ::SoftLayer::Service.new("SoftLayer_Dns_Domain", @env[:sl_credentials])
75
- domain = @env[:machine].provider_config.domain
76
-
77
- @logger.debug("Looking for #{domain} zone into the SoftLayer zone list.")
78
- @dns_zone = sl_warden { zone.getByDomainName(domain).first }
79
- raise Errors::SLDNSZoneNotFound, :zone => domain unless @dns_zone
80
- @logger.debug("Found DNS zone: #{@dns_zone.inspect}")
81
-
82
- # Add or remove the resource record
83
- @resource = ::SoftLayer::Service.new("SoftLayer_Dns_Domain_ResourceRecord", @env[:sl_credentials])
84
- case @env[:machine_action]
85
- when :up
86
- add_record unless self.dns_id
87
- when :destroy
88
- delete_record
89
- end
90
- end
91
- end
92
- end
93
- end
94
- end
1
+ module VagrantPlugins
2
+ module SoftLayer
3
+ module Action
4
+ # Look for the DNS zone relative to the configured domain and,
5
+ # on return path, perform an API call to add or remove the A
6
+ # resource record for the host.
7
+ class UpdateDNS
8
+ include Util::Network
9
+ include Util::Warden
10
+
11
+ def initialize(app, env)
12
+ @app = app
13
+ @logger = Log4r::Logger.new("vagrant_softlayer::action::update_dns")
14
+ end
15
+
16
+ def call(env)
17
+ @env = env
18
+
19
+ update_dns
20
+
21
+ @app.call(@env)
22
+ end
23
+
24
+ def add_record
25
+ template = {
26
+ "data" => ip_address(@env),
27
+ "domainId" => @dns_zone["id"],
28
+ "host" => hostname(@env),
29
+ "ttl" => 86400,
30
+ "type" => "a"
31
+ }
32
+ @env[:ui].info I18n.t("vagrant_softlayer.vm.creating_dns_record")
33
+ @logger.debug("Creating DNS A record for #{template['host']}.#{@dns_zone[:name]} (IP address #{template['data']}).")
34
+ resource = sl_warden { @resource.createObject(template) }
35
+ self.dns_id = resource["id"]
36
+ end
37
+
38
+ def delete_record
39
+ @env[:ui].info I18n.t("vagrant_softlayer.vm.deleting_dns_record")
40
+ @logger.debug("Deleting stored DNS A record (ID #{self.dns_id}).")
41
+ warn_msg = lambda { @env[:ui].warn I18n.t("vagrant_softlayer.errors.dns_record_not_found") }
42
+ sl_warden(warn_msg) { @resource.object_with_id(self.dns_id).deleteObject }
43
+ end
44
+
45
+ def dns_id
46
+ id = nil
47
+ id_file = @env[:machine].data_dir.join("dns_id")
48
+ id = id_file.read.chomp.to_i if id_file.file?
49
+ return id
50
+ end
51
+
52
+ def dns_id=(value)
53
+ @logger.info("New machine DNS ID: #{value.inspect}")
54
+
55
+ # The file that will store the id if we have one. This allows the
56
+ # ID to persist across Vagrant runs.
57
+ id_file = @env[:machine].data_dir.join("dns_id")
58
+
59
+ if value
60
+ # Write the "id" file with the id given.
61
+ id_file.open("w+") do |f|
62
+ f.write(value)
63
+ end
64
+ end
65
+ end
66
+
67
+ def update_dns
68
+ unless @env[:machine].provider_config.manage_dns
69
+ @logger.debug("Not managing DNS. Going ahead.")
70
+ return
71
+ end
72
+
73
+ # Lookup the DNS zone
74
+ zone = @env[:sl_client]["SoftLayer_Dns_Domain"]
75
+ domain = @env[:machine].provider_config.domain
76
+
77
+ @logger.debug("Looking for #{domain} zone into the SoftLayer zone list.")
78
+ @dns_zone = sl_warden { zone.getByDomainName(domain).first }
79
+ raise Errors::SLDNSZoneNotFound, :zone => domain unless @dns_zone
80
+ @logger.debug("Found DNS zone: #{@dns_zone.inspect}")
81
+
82
+ # Add or remove the resource record
83
+ @resource = @env[:sl_client]["SoftLayer_Dns_Domain_ResourceRecord"]
84
+ case @env[:machine_action]
85
+ when :up
86
+ add_record unless self.dns_id
87
+ when :destroy
88
+ delete_record
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -1,40 +1,40 @@
1
- require "log4r"
2
-
3
- module VagrantPlugins
4
- module SoftLayer
5
- module Action
6
- # Waits until the new machine has been provisioned.
7
- class WaitForProvision
8
- include Util::Warden
9
-
10
- def initialize(app, env)
11
- @app = app
12
- @logger = Log4r::Logger.new("vagrant_softlayer::action::wait_for_provision")
13
- end
14
-
15
- def call(env)
16
- env[:ui].info I18n.t("vagrant_softlayer.vm.wait_for_provision")
17
-
18
- env[:sl_machine] = env[:sl_virtual_guest].object_with_id(env[:machine].id.to_i)
19
-
20
- retry_msg = lambda { @logger.debug("Object not found, retrying in 10 seconds.") }
21
-
22
- # Defaults to 20 minutes timeout
23
- Timeout::timeout(env[:machine].provider_config.provision_timeout, Errors::SLProvisionTimeoutError) do
24
- @logger.debug("Checking if the newly ordered machine has been provisioned.")
25
- sl_warden(retry_msg, 10) do
26
- while env[:sl_machine].getPowerState["name"] != "Running" || env[:sl_machine].object_mask( { "provisionDate" => "" } ).getObject == {}
27
- @logger.debug("The machine is still provisioning. Retrying in 10 seconds.")
28
- sleep 10
29
- end
30
- end
31
- end
32
-
33
- env[:ui].info I18n.t("vagrant_softlayer.vm.provisioned")
34
-
35
- @app.call(env)
36
- end
37
- end
38
- end
39
- end
40
- end
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module SoftLayer
5
+ module Action
6
+ # Waits until the new machine has been provisioned.
7
+ class WaitForProvision
8
+ include Util::Warden
9
+
10
+ def initialize(app, env)
11
+ @app = app
12
+ @logger = Log4r::Logger.new("vagrant_softlayer::action::wait_for_provision")
13
+ end
14
+
15
+ def call(env)
16
+ env[:ui].info I18n.t("vagrant_softlayer.vm.wait_for_provision")
17
+
18
+ env[:sl_machine] = env[:sl_client]["SoftLayer_Virtual_Guest"].object_with_id(env[:machine].id.to_i)
19
+
20
+ virtual_server = ::SoftLayer::VirtualServer.server_with_id(env[:machine].id.to_i, :client => env[:sl_client])
21
+
22
+ #Rechecks every 10 sec
23
+ ready = virtual_server.wait_until_ready((env[:machine].provider_config.provision_timeout.to_f/10).ceil, env[:machine].provider_config.transaction_wait, 10) do |server_ready|
24
+ unless server_ready
25
+ provision_status = env[:sl_machine].getActiveTransaction
26
+ provision_status = " Provision status: #{provision_status["transactionStatus"]["friendlyName"]} (#{provision_status["transactionStatus"]["name"]})." if provision_status && ! provision_status.empty?
27
+ @logger.info("#{env[:machine].provider_config.hostname} is still provisioning. Retrying in 10 seconds.#{provision_status}")
28
+ end
29
+ end
30
+
31
+ raise Errors::SLProvisionTimeoutError unless ready
32
+
33
+ env[:ui].info I18n.t("vagrant_softlayer.vm.provisioned")
34
+
35
+ @app.call(env)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end