vcloud-core 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -1
- data/CHANGELOG.md +12 -0
- data/lib/vcloud/core.rb +2 -1
- data/lib/vcloud/core/api_interface.rb +35 -0
- data/lib/vcloud/core/compute_metadata.rb +1 -1
- data/lib/vcloud/core/edge_gateway.rb +2 -2
- data/lib/vcloud/core/fog.rb +40 -0
- data/lib/vcloud/core/fog/fog_constants.rb +35 -0
- data/lib/vcloud/core/fog/login.rb +40 -0
- data/lib/vcloud/core/fog/model_interface.rb +41 -0
- data/lib/vcloud/core/fog/service_interface.rb +253 -0
- data/lib/vcloud/core/login_cli.rb +1 -1
- data/lib/vcloud/core/metadata_helper.rb +1 -1
- data/lib/vcloud/core/org_vdc_network.rb +3 -3
- data/lib/vcloud/core/query_runner.rb +1 -1
- data/lib/vcloud/core/vapp.rb +6 -6
- data/lib/vcloud/core/vapp_template.rb +1 -1
- data/lib/vcloud/core/vdc.rb +1 -1
- data/lib/vcloud/core/version.rb +1 -1
- data/lib/vcloud/core/vm.rb +9 -9
- data/lib/vcloud/fog.rb +2 -39
- data/lib/vcloud/temporary_fog_classes.rb +11 -0
- data/spec/integration/{fog → core/fog}/login_manual.rb +1 -1
- data/spec/integration/{fog → core/fog}/login_spec.rb +13 -9
- data/spec/integration/core/vm_spec.rb +1 -1
- data/spec/support/integration_helper.rb +1 -1
- data/spec/vcloud/core/edge_gateway_spec.rb +1 -1
- data/spec/vcloud/{fog → core/fog}/fog_model_interface_spec.rb +2 -2
- data/spec/vcloud/{fog → core/fog}/login_spec.rb +4 -4
- data/spec/vcloud/core/fog/service_interface_spec.rb +53 -0
- data/spec/vcloud/{fog_spec.rb → core/fog_spec.rb} +2 -2
- data/spec/vcloud/core/login_cli_spec.rb +6 -6
- data/spec/vcloud/core/org_vdc_network_spec.rb +1 -1
- data/spec/vcloud/core/query_runner_spec.rb +1 -1
- data/spec/vcloud/core/vapp_spec.rb +1 -1
- data/spec/vcloud/core/vapp_template_spec.rb +1 -1
- data/spec/vcloud/core/vdc_spec.rb +1 -1
- data/spec/vcloud/core/vm_spec.rb +1 -1
- metadata +22 -21
- data/jenkins_integration_tests.sh +0 -5
- data/lib/vcloud/fog/content_types.rb +0 -18
- data/lib/vcloud/fog/login.rb +0 -38
- data/lib/vcloud/fog/model_interface.rb +0 -33
- data/lib/vcloud/fog/relation.rb +0 -8
- data/lib/vcloud/fog/service_interface.rb +0 -245
- data/spec/vcloud/fog/service_interface_spec.rb +0 -51
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
## 0.8.0 (2014-08-07)
|
2
|
+
|
3
|
+
API changes:
|
4
|
+
|
5
|
+
- Create new `Vcloud::Core::ApiInterface` that delegates calls to the fog
|
6
|
+
service interface and model interface, so that gems that depend on
|
7
|
+
vCloud Core do not need to know about the inner workings of fog, or
|
8
|
+
about fog at all.
|
9
|
+
- Move fog classes into Core. This API change is not backwards-compatible.
|
10
|
+
- Mark the fog classes `@api private` to clarify that they do not form
|
11
|
+
part of the public API.
|
12
|
+
|
1
13
|
## 0.7.0 (2014-07-28)
|
2
14
|
|
3
15
|
Features:
|
data/lib/vcloud/core.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Vcloud
|
2
|
+
module Core
|
3
|
+
|
4
|
+
# Public interface to allow direct access to the API
|
5
|
+
# if functionality does not exist in Core
|
6
|
+
class ApiInterface
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@fog_service_interface = Vcloud::Core::Fog::ServiceInterface.new
|
10
|
+
@fog_model_interface = Vcloud::Core::Fog::ModelInterface.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_vapp_by_name_and_vdc_name(name, vdc_name)
|
14
|
+
@fog_service_interface.get_vapp_by_name_and_vdc_name(name, vdc_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_vapp(id)
|
18
|
+
@fog_service_interface.get_vapp(id)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_vapp(id)
|
22
|
+
@fog_service_interface.delete_vapp(id)
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete_network(id)
|
26
|
+
@fog_service_interface.delete_network(id)
|
27
|
+
end
|
28
|
+
|
29
|
+
def current_organization
|
30
|
+
@fog_model_interface.current_organization
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -3,7 +3,7 @@ module Vcloud
|
|
3
3
|
module ComputeMetadata
|
4
4
|
|
5
5
|
def get_metadata id
|
6
|
-
vcloud_compute_metadata = Vcloud::Fog::ServiceInterface.new.get_vapp_metadata(id)
|
6
|
+
vcloud_compute_metadata = Vcloud::Core::Fog::ServiceInterface.new.get_vapp_metadata(id)
|
7
7
|
MetadataHelper.extract_metadata(vcloud_compute_metadata[:MetadataEntry])
|
8
8
|
end
|
9
9
|
|
@@ -21,7 +21,7 @@ module Vcloud
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def update_configuration(config)
|
24
|
-
fsi = Vcloud::Fog::ServiceInterface.new
|
24
|
+
fsi = Vcloud::Core::Fog::ServiceInterface.new
|
25
25
|
fsi.post_configure_edge_gateway_services(id, config)
|
26
26
|
end
|
27
27
|
|
@@ -42,7 +42,7 @@ module Vcloud
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def vcloud_attributes
|
45
|
-
fsi = Vcloud::Fog::ServiceInterface.new
|
45
|
+
fsi = Vcloud::Core::Fog::ServiceInterface.new
|
46
46
|
fsi.get_edge_gateway(id)
|
47
47
|
end
|
48
48
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'fog'
|
2
|
+
require 'vcloud/core/fog/fog_constants'
|
3
|
+
require 'vcloud/core/fog/login'
|
4
|
+
require 'vcloud/core/fog/service_interface'
|
5
|
+
require 'vcloud/core/fog/model_interface'
|
6
|
+
|
7
|
+
module Vcloud
|
8
|
+
module Core
|
9
|
+
module Fog
|
10
|
+
TOKEN_ENV_VAR_NAME = 'FOG_VCLOUD_TOKEN'
|
11
|
+
FOG_CREDS_PASS_NAME = :vcloud_director_password
|
12
|
+
|
13
|
+
def self.check_credentials
|
14
|
+
pass = fog_credentials_pass
|
15
|
+
unless pass.nil? or pass.empty?
|
16
|
+
warn <<EOF
|
17
|
+
[WARNING] Storing :vcloud_director_password in your plaintext FOG_RC file is
|
18
|
+
insecure. Future releases of vcloud-core (and tools that depend on
|
19
|
+
it) will prevent you from doing this. Please use vcloud-login to
|
20
|
+
get a session token instead.
|
21
|
+
EOF
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.fog_credentials_pass
|
26
|
+
begin
|
27
|
+
pass = ::Fog.credentials[FOG_CREDS_PASS_NAME]
|
28
|
+
rescue ::Fog::Errors::LoadError
|
29
|
+
# Assume no password if Fog has been unable to load creds.
|
30
|
+
# Suppresses a noisy error about missing credentials.
|
31
|
+
pass = nil
|
32
|
+
end
|
33
|
+
|
34
|
+
pass
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
Vcloud::Core::Fog.check_credentials
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Vcloud
|
2
|
+
module Core
|
3
|
+
module Fog
|
4
|
+
|
5
|
+
# Private helper constants for use with the vCloud API.
|
6
|
+
#
|
7
|
+
# @api private
|
8
|
+
module ContentTypes
|
9
|
+
ORG = 'application/vnd.vmware.vcloud.org+xml'
|
10
|
+
VDC = 'application/vnd.vmware.vcloud.vdc+xml'
|
11
|
+
NETWORK = 'application/vnd.vmware.vcloud.network+xml'
|
12
|
+
METADATA = 'application/vnd.vmware.vcloud.metadata.value+xml'
|
13
|
+
end
|
14
|
+
|
15
|
+
# Private helper constants for use with the vCloud API.
|
16
|
+
#
|
17
|
+
# @api private
|
18
|
+
module MetadataValueType
|
19
|
+
String = 'MetadataStringValue'
|
20
|
+
Number = 'MetadataNumberValue'
|
21
|
+
DateTime = 'MetadataDateTimeValue'
|
22
|
+
Boolean = 'MetadataBooleanValue'
|
23
|
+
end
|
24
|
+
|
25
|
+
# Private helper constants for use with the vCloud API.
|
26
|
+
#
|
27
|
+
# @api private
|
28
|
+
module RELATION
|
29
|
+
PARENT = 'up'
|
30
|
+
CHILD = 'down'
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'fog'
|
2
|
+
|
3
|
+
module Vcloud
|
4
|
+
module Core
|
5
|
+
module Fog
|
6
|
+
module Login
|
7
|
+
class << self
|
8
|
+
def token(pass)
|
9
|
+
check_plaintext_pass
|
10
|
+
token = get_token(pass)
|
11
|
+
|
12
|
+
return token
|
13
|
+
end
|
14
|
+
|
15
|
+
def token_export(*args)
|
16
|
+
return "export #{Vcloud::Core::Fog::TOKEN_ENV_VAR_NAME}=#{token(*args)}"
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def check_plaintext_pass
|
22
|
+
pass = Vcloud::Core::Fog::fog_credentials_pass
|
23
|
+
unless pass.nil? || pass.empty?
|
24
|
+
raise "Found plaintext #{Vcloud::Core::Fog::FOG_CREDS_PASS_NAME} entry. Please set it to an empty string"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_token(pass)
|
29
|
+
ENV.delete(Vcloud::Core::Fog::TOKEN_ENV_VAR_NAME)
|
30
|
+
vcloud = ::Fog::Compute::VcloudDirector.new({
|
31
|
+
Vcloud::Core::Fog::FOG_CREDS_PASS_NAME => pass,
|
32
|
+
})
|
33
|
+
|
34
|
+
return vcloud.vcloud_token
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Vcloud
|
2
|
+
module Core
|
3
|
+
module Fog
|
4
|
+
|
5
|
+
# Private interface to the fog model layer.
|
6
|
+
# You should not use this directly. Expose required
|
7
|
+
# functionality in {Vcloud::Core::ApiInterface}
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
class ModelInterface
|
11
|
+
def initialize
|
12
|
+
@vcloud = ::Fog::Compute::VcloudDirector.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def org_name
|
16
|
+
@vcloud.org_name
|
17
|
+
end
|
18
|
+
|
19
|
+
def current_organization
|
20
|
+
@vcloud.organizations.get_by_name org_name
|
21
|
+
end
|
22
|
+
|
23
|
+
def current_vdc vdc_id
|
24
|
+
current_organization.vdcs.detect { |v| v.id == vdc_id }
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_vm_by_href href
|
28
|
+
vm = @vcloud.get_vms_in_lease_from_query(
|
29
|
+
{
|
30
|
+
:filter => "href==#{href}"
|
31
|
+
}).body[:VMRecord].first
|
32
|
+
return nil unless vm
|
33
|
+
vdc = current_vdc(vm[:vdc].split('/').last)
|
34
|
+
vapp = vdc.vapps.get_by_name(vm[:containerName])
|
35
|
+
vapp.vms.first
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,253 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module Vcloud
|
4
|
+
module Core
|
5
|
+
module Fog
|
6
|
+
|
7
|
+
# Private interface to the fog service layer.
|
8
|
+
# You should not use this directly. Expose required
|
9
|
+
# functionality in {Vcloud::Core::ApiInterface}
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
class ServiceInterface
|
13
|
+
extend Forwardable
|
14
|
+
|
15
|
+
def_delegators :@fog, :get_vapp, :organizations, :org_name, :delete_vapp, :vcloud_token, :end_point,
|
16
|
+
:get_execute_query, :get_vapp_metadata, :power_off_vapp, :shutdown_vapp, :session,
|
17
|
+
:post_instantiate_vapp_template, :put_memory, :put_cpu, :power_on_vapp, :put_vapp_metadata_value,
|
18
|
+
:put_vm, :get_edge_gateway, :get_network_complete, :delete_network, :post_create_org_vdc_network,
|
19
|
+
:post_configure_edge_gateway_services, :get_vdc, :post_undeploy_vapp
|
20
|
+
|
21
|
+
#########################
|
22
|
+
# FogFacade Inner class to represent a logic free facade over our interactions with Fog
|
23
|
+
|
24
|
+
class FogFacade
|
25
|
+
def initialize
|
26
|
+
@vcloud = ::Fog::Compute::VcloudDirector.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_vdc(id)
|
30
|
+
@vcloud.get_vdc(id).body
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_organization (id)
|
34
|
+
@vcloud.get_organization(id).body
|
35
|
+
end
|
36
|
+
|
37
|
+
def session
|
38
|
+
@vcloud.get_current_session.body
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_vapps_in_lease_from_query(options)
|
42
|
+
@vcloud.get_vapps_in_lease_from_query(options).body
|
43
|
+
end
|
44
|
+
|
45
|
+
def post_instantiate_vapp_template(vdc, template, name, params)
|
46
|
+
Vcloud::Core.logger.debug("instantiating #{name} vapp in #{vdc[:name]}")
|
47
|
+
vapp = @vcloud.post_instantiate_vapp_template(extract_id(vdc), template, name, params).body
|
48
|
+
@vcloud.process_task(vapp[:Tasks][:Task])
|
49
|
+
@vcloud.get_vapp(extract_id(vapp)).body
|
50
|
+
end
|
51
|
+
|
52
|
+
def put_memory(vm_id, memory)
|
53
|
+
Vcloud::Core.logger.debug("putting #{memory}MB memory into VM #{vm_id}")
|
54
|
+
task = @vcloud.put_memory(vm_id, memory).body
|
55
|
+
@vcloud.process_task(task)
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_vapp(id)
|
59
|
+
@vcloud.get_vapp(id).body
|
60
|
+
end
|
61
|
+
|
62
|
+
def put_network_connection_system_section_vapp(vm_id, section)
|
63
|
+
task = @vcloud.put_network_connection_system_section_vapp(vm_id, section).body
|
64
|
+
@vcloud.process_task(task)
|
65
|
+
end
|
66
|
+
|
67
|
+
def put_cpu(vm_id, cpu)
|
68
|
+
Vcloud::Core.logger.debug("putting #{cpu} CPU(s) into VM #{vm_id}")
|
69
|
+
task = @vcloud.put_cpu(vm_id, cpu).body
|
70
|
+
@vcloud.process_task(task)
|
71
|
+
end
|
72
|
+
|
73
|
+
def put_vm(id, name, options={})
|
74
|
+
Vcloud::Core.logger.debug("updating name : #{name}, :options => #{options} in vm : #{id}")
|
75
|
+
task = @vcloud.put_vm(id, name, options).body
|
76
|
+
@vcloud.process_task(task)
|
77
|
+
end
|
78
|
+
|
79
|
+
def vcloud_token
|
80
|
+
@vcloud.vcloud_token
|
81
|
+
end
|
82
|
+
|
83
|
+
def end_point
|
84
|
+
@vcloud.end_point
|
85
|
+
end
|
86
|
+
|
87
|
+
def put_guest_customization_section_vapp(vm_id, customization_req)
|
88
|
+
task = @vcloud.put_guest_customization_section_vapp(vm_id, customization_req).body
|
89
|
+
@vcloud.process_task(task)
|
90
|
+
end
|
91
|
+
|
92
|
+
def get_execute_query(type=nil, options={})
|
93
|
+
@vcloud.get_execute_query(type, options).body
|
94
|
+
end
|
95
|
+
|
96
|
+
def get_vapp_metadata(id)
|
97
|
+
@vcloud.get_vapp_metadata(id).body
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
def organizations
|
102
|
+
@vcloud.organizations
|
103
|
+
end
|
104
|
+
|
105
|
+
def org_name
|
106
|
+
@vcloud.org_name
|
107
|
+
end
|
108
|
+
|
109
|
+
def post_undeploy_vapp(vapp_id)
|
110
|
+
task = @vcloud.post_undeploy_vapp(vapp_id).body
|
111
|
+
@vcloud.process_task(task)
|
112
|
+
end
|
113
|
+
|
114
|
+
def delete_vapp(vapp_id)
|
115
|
+
task = @vcloud.delete_vapp(vapp_id).body
|
116
|
+
@vcloud.process_task(task)
|
117
|
+
end
|
118
|
+
|
119
|
+
def get_network_complete(id)
|
120
|
+
@vcloud.get_network_complete(id).body
|
121
|
+
end
|
122
|
+
|
123
|
+
def delete_network(id)
|
124
|
+
task = @vcloud.delete_network(id).body
|
125
|
+
@vcloud.process_task(task)
|
126
|
+
end
|
127
|
+
|
128
|
+
def post_create_org_vdc_network(vdc_id, name, options)
|
129
|
+
Vcloud::Core.logger.debug("creating #{options[:fence_mode]} OrgVdcNetwork #{name} in vDC #{vdc_id}")
|
130
|
+
attrs = @vcloud.post_create_org_vdc_network(vdc_id, name, options).body
|
131
|
+
@vcloud.process_task(attrs[:Tasks][:Task])
|
132
|
+
get_network_complete(extract_id(attrs))
|
133
|
+
end
|
134
|
+
|
135
|
+
def post_configure_edge_gateway_services(edgegw_id, config)
|
136
|
+
Vcloud::Core.logger.info("Updating EdgeGateway #{edgegw_id}")
|
137
|
+
begin
|
138
|
+
task = @vcloud.post_configure_edge_gateway_services(edgegw_id, config).body
|
139
|
+
@vcloud.process_task(task)
|
140
|
+
rescue => ex
|
141
|
+
Vcloud::Core.logger.error("Could not update EdgeGateway #{edgegw_id} : #{ex}")
|
142
|
+
raise
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def power_off_vapp(vapp_id)
|
147
|
+
task = @vcloud.post_power_off_vapp(vapp_id).body
|
148
|
+
@vcloud.process_task(task)
|
149
|
+
end
|
150
|
+
|
151
|
+
def power_on_vapp(vapp_id)
|
152
|
+
Vcloud::Core.logger.debug("Powering on vApp #{vapp_id}")
|
153
|
+
task = @vcloud.post_power_on_vapp(vapp_id).body
|
154
|
+
@vcloud.process_task(task)
|
155
|
+
end
|
156
|
+
|
157
|
+
def shutdown_vapp(vapp_id)
|
158
|
+
task = @vcloud.post_shutdown_vapp(vapp_id).body
|
159
|
+
@vcloud.process_task(task)
|
160
|
+
end
|
161
|
+
|
162
|
+
def put_vapp_metadata_value(id, k, v)
|
163
|
+
Vcloud::Core.logger.debug("putting metadata pair '#{k}'=>'#{v}' to #{id}")
|
164
|
+
# need to convert key to_s since Fog 0.17 borks on symbol key
|
165
|
+
task = @vcloud.put_vapp_metadata_item_metadata(id, k.to_s, v).body
|
166
|
+
@vcloud.process_task(task)
|
167
|
+
end
|
168
|
+
|
169
|
+
def get_edge_gateway(id)
|
170
|
+
@vcloud.get_edge_gateway(id).body
|
171
|
+
end
|
172
|
+
|
173
|
+
private
|
174
|
+
def extract_id(link)
|
175
|
+
link[:href].split('/').last
|
176
|
+
end
|
177
|
+
end
|
178
|
+
#
|
179
|
+
#########################
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
def initialize (fog = FogFacade.new)
|
184
|
+
@fog = fog
|
185
|
+
end
|
186
|
+
|
187
|
+
def org
|
188
|
+
link = session[:Link].select { |l| l[:rel] == RELATION::CHILD }.detect do |l|
|
189
|
+
l[:type] == ContentTypes::ORG
|
190
|
+
end
|
191
|
+
@fog.get_organization(link[:href].split('/').last)
|
192
|
+
end
|
193
|
+
|
194
|
+
def get_vapp_by_name_and_vdc_name name, vdc_name
|
195
|
+
response_body = @fog.get_vapps_in_lease_from_query({:filter => "name==#{name}"})
|
196
|
+
response_body[:VAppRecord].detect { |record| record[:vdcName] == vdc_name }
|
197
|
+
end
|
198
|
+
|
199
|
+
def vdc(name)
|
200
|
+
link = org[:Link].select { |l| l[:rel] == RELATION::CHILD }.detect do |l|
|
201
|
+
l[:type] == ContentTypes::VDC && l[:name] == name
|
202
|
+
end
|
203
|
+
raise "vdc #{name} cannot be found" unless link
|
204
|
+
@fog.get_vdc(link[:href].split('/').last)
|
205
|
+
|
206
|
+
end
|
207
|
+
|
208
|
+
def put_network_connection_system_section_vapp(vm_id, section)
|
209
|
+
begin
|
210
|
+
Vcloud::Core.logger.debug("adding NIC into VM #{vm_id}")
|
211
|
+
@fog.put_network_connection_system_section_vapp(vm_id, section)
|
212
|
+
rescue => ex
|
213
|
+
Vcloud::Core.logger.error("failed to put_network_connection_system_section_vapp for vm #{vm_id}: #{ex}")
|
214
|
+
Vcloud::Core.logger.debug("requested network section : #{section.inspect}")
|
215
|
+
raise
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def find_networks(network_names, vdc_name)
|
220
|
+
network_names.collect do |network|
|
221
|
+
vdc(vdc_name)[:AvailableNetworks][:Network].detect do |l|
|
222
|
+
l[:type] == ContentTypes::NETWORK && l[:name] == network
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def put_guest_customization_section(vm_id, vm_name, script)
|
228
|
+
begin
|
229
|
+
Vcloud::Core.logger.debug("configuring guest customization section for vm : #{vm_id}")
|
230
|
+
customization_req = {
|
231
|
+
:Enabled => true,
|
232
|
+
:CustomizationScript => script,
|
233
|
+
:ComputerName => vm_name
|
234
|
+
}
|
235
|
+
@fog.put_guest_customization_section_vapp(vm_id, customization_req)
|
236
|
+
rescue => ex
|
237
|
+
Vcloud::Core.logger.error("Failed to update guest customization section: #{ex}")
|
238
|
+
Vcloud::Core.logger.debug("=== interpolated preamble:")
|
239
|
+
Vcloud::Core.logger.debug(script)
|
240
|
+
raise
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
private
|
245
|
+
def extract_id(link)
|
246
|
+
link[:href].split('/').last
|
247
|
+
end
|
248
|
+
|
249
|
+
end
|
250
|
+
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|