chef-vpc-toolkit 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +14 -0
- data/COPYING +1 -1
- data/README.rdoc +29 -7
- data/VERSION +1 -1
- data/config/server_group.json +2 -2
- data/lib/chef-vpc-toolkit.rb +7 -2
- data/lib/chef-vpc-toolkit/chef-0.9.bash +1 -0
- data/lib/chef-vpc-toolkit/chef_bootstrap/fedora.bash +3 -3
- data/lib/chef-vpc-toolkit/chef_bootstrap/ubuntu.bash +1 -0
- data/lib/chef-vpc-toolkit/chef_installer.rb +8 -1
- data/lib/chef-vpc-toolkit/cloud-servers-vpc/client.rb +186 -0
- data/lib/chef-vpc-toolkit/cloud-servers-vpc/connection.rb +146 -0
- data/lib/chef-vpc-toolkit/cloud-servers-vpc/server.rb +113 -0
- data/lib/chef-vpc-toolkit/cloud-servers-vpc/server_group.rb +387 -0
- data/lib/chef-vpc-toolkit/cloud-servers-vpc/ssh_public_key.rb +25 -0
- data/lib/chef-vpc-toolkit/cloud-servers-vpc/vpn_network_interface.rb +29 -0
- data/lib/chef-vpc-toolkit/util.rb +20 -16
- data/lib/chef-vpc-toolkit/vpn_network_manager.rb +16 -16
- data/lib/chef-vpc-toolkit/xml_util.rb +15 -0
- data/rake/chef_vpc_toolkit.rake +194 -155
- data/test/client_test.rb +108 -0
- data/test/server_group_test.rb +259 -0
- data/test/server_test.rb +66 -0
- data/test/test_helper.rb +21 -0
- data/test/util_test.rb +7 -0
- data/test/vpn_network_manager_test.rb +7 -5
- metadata +17 -8
- data/lib/chef-vpc-toolkit/cloud_servers_vpc.rb +0 -393
- data/lib/chef-vpc-toolkit/http_util.rb +0 -118
- data/test/cloud_servers_vpc_test.rb +0 -129
data/test/util_test.rb
CHANGED
@@ -6,6 +6,8 @@ module ChefVPCToolkit
|
|
6
6
|
|
7
7
|
class VpnNetworkManagerTest < Test::Unit::TestCase
|
8
8
|
|
9
|
+
include ChefVPCToolkit::CloudServersVPC
|
10
|
+
|
9
11
|
def setup
|
10
12
|
tmpdir=TmpDir.new_tmp_dir
|
11
13
|
File.open(File.join(tmpdir, "gconftool-2"), 'w') do |f|
|
@@ -16,14 +18,14 @@ class VpnNetworkManagerTest < Test::Unit::TestCase
|
|
16
18
|
end
|
17
19
|
|
18
20
|
def teardown
|
19
|
-
|
20
|
-
VpnNetworkManager.delete_certs(
|
21
|
+
group=ServerGroup.from_xml(SERVER_GROUP_XML)
|
22
|
+
VpnNetworkManager.delete_certs(group.id)
|
21
23
|
end
|
22
24
|
|
23
25
|
def test_configure_gconf
|
24
|
-
|
25
|
-
|
26
|
-
assert VpnNetworkManager.configure_gconf(
|
26
|
+
group=ServerGroup.from_xml(SERVER_GROUP_XML)
|
27
|
+
client=Client.from_xml(CLIENT_XML)
|
28
|
+
assert VpnNetworkManager.configure_gconf(group, client)
|
27
29
|
end
|
28
30
|
|
29
31
|
def test_ip_to_integer
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-vpc-toolkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 2.
|
10
|
+
version: 2.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dan Prince
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-02-06 00:00:00 -05:00
|
19
19
|
default_executable: chef-vpc-toolkit
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -121,15 +121,22 @@ files:
|
|
121
121
|
- lib/chef-vpc-toolkit/chef_bootstrap/rhel.bash
|
122
122
|
- lib/chef-vpc-toolkit/chef_bootstrap/ubuntu.bash
|
123
123
|
- lib/chef-vpc-toolkit/chef_installer.rb
|
124
|
+
- lib/chef-vpc-toolkit/cloud-servers-vpc/client.rb
|
125
|
+
- lib/chef-vpc-toolkit/cloud-servers-vpc/connection.rb
|
126
|
+
- lib/chef-vpc-toolkit/cloud-servers-vpc/server.rb
|
127
|
+
- lib/chef-vpc-toolkit/cloud-servers-vpc/server_group.rb
|
128
|
+
- lib/chef-vpc-toolkit/cloud-servers-vpc/ssh_public_key.rb
|
129
|
+
- lib/chef-vpc-toolkit/cloud-servers-vpc/vpn_network_interface.rb
|
124
130
|
- lib/chef-vpc-toolkit/cloud_files.bash
|
125
|
-
- lib/chef-vpc-toolkit/cloud_servers_vpc.rb
|
126
|
-
- lib/chef-vpc-toolkit/http_util.rb
|
127
131
|
- lib/chef-vpc-toolkit/ssh_util.rb
|
128
132
|
- lib/chef-vpc-toolkit/util.rb
|
129
133
|
- lib/chef-vpc-toolkit/version.rb
|
130
134
|
- lib/chef-vpc-toolkit/vpn_network_manager.rb
|
135
|
+
- lib/chef-vpc-toolkit/xml_util.rb
|
131
136
|
- rake/chef_vpc_toolkit.rake
|
132
|
-
- test/
|
137
|
+
- test/client_test.rb
|
138
|
+
- test/server_group_test.rb
|
139
|
+
- test/server_test.rb
|
133
140
|
- test/ssh_util_test.rb
|
134
141
|
- test/test_helper.rb
|
135
142
|
- test/util_test.rb
|
@@ -169,8 +176,10 @@ signing_key:
|
|
169
176
|
specification_version: 3
|
170
177
|
summary: Rake tasks to automate and configure server groups in the cloud with Chef.
|
171
178
|
test_files:
|
179
|
+
- test/server_group_test.rb
|
172
180
|
- test/util_test.rb
|
173
181
|
- test/ssh_util_test.rb
|
174
182
|
- test/test_helper.rb
|
175
|
-
- test/cloud_servers_vpc_test.rb
|
176
183
|
- test/vpn_network_manager_test.rb
|
184
|
+
- test/server_test.rb
|
185
|
+
- test/client_test.rb
|
@@ -1,393 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'builder'
|
3
|
-
require 'rexml/document'
|
4
|
-
require 'rexml/xpath'
|
5
|
-
|
6
|
-
module ChefVPCToolkit
|
7
|
-
|
8
|
-
module CloudServersVPC
|
9
|
-
|
10
|
-
SERVER_GROUP_CONFIG_FILE = CHEF_VPC_PROJECT + File::SEPARATOR + "config" + File::SEPARATOR + "server_group.json"
|
11
|
-
|
12
|
-
def self.load_public_key
|
13
|
-
|
14
|
-
ssh_dir=ENV['HOME']+File::SEPARATOR+".ssh"+File::SEPARATOR
|
15
|
-
if File.exists?(ssh_dir+"id_rsa.pub")
|
16
|
-
pubkey=IO.read(ssh_dir+"id_rsa.pub")
|
17
|
-
elsif File.exists?(ssh_dir+"id_dsa.pub")
|
18
|
-
pubkey=IO.read(ssh_dir+"id_dsa.pub")
|
19
|
-
else
|
20
|
-
raise "Failed to load SSH key. Please create a SSH public key pair in your HOME directory."
|
21
|
-
end
|
22
|
-
|
23
|
-
pubkey.chomp
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
# generate a Server Group XML from server_group.json
|
28
|
-
def self.server_group_xml(config_file=SERVER_GROUP_CONFIG_FILE, owner=ENV['USER'])
|
29
|
-
|
30
|
-
json_hash=JSON.parse(IO.read(config_file))
|
31
|
-
|
32
|
-
xml = Builder::XmlMarkup.new
|
33
|
-
xml.tag! "server-group" do |sg|
|
34
|
-
sg.name(json_hash["name"])
|
35
|
-
sg.description(json_hash["description"])
|
36
|
-
sg.tag! "owner-name", owner
|
37
|
-
sg.tag! "domain-name", json_hash["domain_name"]
|
38
|
-
if json_hash["vpn_network"] then
|
39
|
-
sg.tag! "vpn-network", json_hash["vpn_network"]
|
40
|
-
else
|
41
|
-
sg.tag! "vpn-network", "172.19.0.0"
|
42
|
-
end
|
43
|
-
if json_hash["vpn_subnet"] then
|
44
|
-
sg.tag! "vpn-subnet", json_hash["vpn_subnet"]
|
45
|
-
else
|
46
|
-
sg.tag! "vpn-subnet", "255.255.128.0"
|
47
|
-
end
|
48
|
-
sg.servers("type" => "array") do |servers|
|
49
|
-
json_hash["servers"].each_pair do |server_name, server_config|
|
50
|
-
servers.server do |server|
|
51
|
-
server.name(server_name)
|
52
|
-
if server_config["description"] then
|
53
|
-
server.description(server_config["description"])
|
54
|
-
else
|
55
|
-
server.description(server_name)
|
56
|
-
end
|
57
|
-
server.tag! "flavor-id", server_config["flavor_id"]
|
58
|
-
server.tag! "image-id", server_config["image_id"]
|
59
|
-
if server_config["openvpn_server"]
|
60
|
-
server.tag! "openvpn-server", "true", { "type" => "boolean"}
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
sg.tag! "ssh-public-keys", { "type" => "array"} do |ssh_keys|
|
66
|
-
ssh_keys.tag! "ssh-public-key" do |ssh_public_key|
|
67
|
-
ssh_public_key.description "#{ENV['USER']}'s public key"
|
68
|
-
ssh_public_key.tag! "public-key", self.load_public_key
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
xml.target!
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.server_group_hash(xml)
|
77
|
-
|
78
|
-
hash={}
|
79
|
-
dom = REXML::Document.new(xml)
|
80
|
-
REXML::XPath.each(dom, "/server-group") do |sg|
|
81
|
-
|
82
|
-
hash["name"]=sg.elements["name"].text
|
83
|
-
hash["description"]=sg.elements["description"].text
|
84
|
-
hash["id"]=sg.elements["id"].text
|
85
|
-
hash["domain-name"]=sg.elements["domain-name"].text
|
86
|
-
hash["vpn-network"]=sg.elements["vpn-network"].text
|
87
|
-
hash["vpn-subnet"]=sg.elements["vpn-subnet"].text
|
88
|
-
hash["servers"]={}
|
89
|
-
REXML::XPath.each(dom, "//server") do |server|
|
90
|
-
server_name=server.elements["name"].text
|
91
|
-
server_attributes={
|
92
|
-
"id" => server.elements["id"].text,
|
93
|
-
"cloud-server-id-number" => server.elements["cloud-server-id-number"].text,
|
94
|
-
"status" => server.elements["status"].text,
|
95
|
-
"external-ip-addr" => server.elements["external-ip-addr"].text,
|
96
|
-
"internal-ip-addr" => server.elements["internal-ip-addr"].text,
|
97
|
-
"error-message" => server.elements["error-message"].text,
|
98
|
-
"image-id" => server.elements["image-id"].text,
|
99
|
-
"retry-count" => server.elements["retry-count"].text,
|
100
|
-
"openvpn-server" => server.elements["openvpn-server"].text
|
101
|
-
}
|
102
|
-
if server.elements["openvpn-server"].text and server.elements["openvpn-server"].text == "true" and server.elements["external-ip-addr"].text then
|
103
|
-
hash["vpn-gateway"]=server.elements["external-ip-addr"].text
|
104
|
-
end
|
105
|
-
hash["servers"].store(server_name, server_attributes)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
hash
|
110
|
-
|
111
|
-
end
|
112
|
-
|
113
|
-
def self.server_group_xml_for_id(configs, dir, id=nil)
|
114
|
-
|
115
|
-
if id then
|
116
|
-
xml=HttpUtil.get(
|
117
|
-
configs["cloud_servers_vpc_url"]+"/server_groups/#{id}.xml",
|
118
|
-
configs["cloud_servers_vpc_username"],
|
119
|
-
configs["cloud_servers_vpc_password"]
|
120
|
-
)
|
121
|
-
else
|
122
|
-
recent_hash=CloudServersVPC.most_recent_server_group_hash(dir)
|
123
|
-
raise "No server group files exist." if recent_hash.nil?
|
124
|
-
xml=HttpUtil.get(
|
125
|
-
configs["cloud_servers_vpc_url"]+"/server_groups/#{recent_hash['id']}.xml",
|
126
|
-
configs["cloud_servers_vpc_username"],
|
127
|
-
configs["cloud_servers_vpc_password"]
|
128
|
-
)
|
129
|
-
|
130
|
-
end
|
131
|
-
|
132
|
-
end
|
133
|
-
|
134
|
-
def self.most_recent_server_group_hash(dir_pattern)
|
135
|
-
server_groups=[]
|
136
|
-
Dir[dir_pattern].each do |file|
|
137
|
-
server_groups << CloudServersVPC.server_group_hash(IO.read(file))
|
138
|
-
end
|
139
|
-
if server_groups.size > 0 then
|
140
|
-
server_groups.sort { |a,b| b["id"].to_i <=> a["id"].to_i }[0]
|
141
|
-
else
|
142
|
-
nil
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
def self.print_server_group(hash)
|
147
|
-
|
148
|
-
puts "Cloud Group ID: #{hash["id"]}"
|
149
|
-
puts "name: #{hash["name"]}"
|
150
|
-
puts "description: #{hash["description"]}"
|
151
|
-
puts "domain name: #{hash["domain-name"]}"
|
152
|
-
puts "VPN gateway IP: #{hash["vpn-gateway"]}"
|
153
|
-
puts "Servers:"
|
154
|
-
hash["servers"].each_pair do |name, attrs|
|
155
|
-
puts "\tname: #{name} (id: #{attrs['cloud-server-id-number']})"
|
156
|
-
puts "\tstatus: #{attrs['status']}"
|
157
|
-
if attrs["openvpn-server"] and attrs["openvpn-server"] == "true" then
|
158
|
-
puts "\tOpenVPN server: #{attrs['openvpn-server']}"
|
159
|
-
end
|
160
|
-
if attrs["error-message"] then
|
161
|
-
puts "\tlast error message: #{attrs['error-message']}"
|
162
|
-
end
|
163
|
-
puts "\t--"
|
164
|
-
end
|
165
|
-
|
166
|
-
end
|
167
|
-
|
168
|
-
def self.server_names(hash)
|
169
|
-
|
170
|
-
names=[]
|
171
|
-
|
172
|
-
hash["servers"].each_pair do |name, hash|
|
173
|
-
if block_given? then
|
174
|
-
yield name
|
175
|
-
else
|
176
|
-
names << name
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
names
|
181
|
-
|
182
|
-
end
|
183
|
-
|
184
|
-
# Return the name of the VPN server within a server group
|
185
|
-
def self.vpn_server_name(hash)
|
186
|
-
|
187
|
-
hash["servers"].each_pair do |name, hash|
|
188
|
-
if hash['openvpn-server'] and hash['openvpn-server'] == "true" then
|
189
|
-
if block_given? then
|
190
|
-
yield name
|
191
|
-
else
|
192
|
-
return name
|
193
|
-
end
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
end
|
198
|
-
|
199
|
-
# default timeout of 20 minutes
|
200
|
-
def self.poll_until_online(group_id, timeout=1200)
|
201
|
-
|
202
|
-
configs=Util.load_configs
|
203
|
-
|
204
|
-
online = false
|
205
|
-
count=0
|
206
|
-
until online or (count*20) >= timeout.to_i do
|
207
|
-
count+=1
|
208
|
-
begin
|
209
|
-
xml=HttpUtil.get(
|
210
|
-
configs["cloud_servers_vpc_url"]+"/server_groups/#{group_id}.xml",
|
211
|
-
configs["cloud_servers_vpc_username"],
|
212
|
-
configs["cloud_servers_vpc_password"]
|
213
|
-
)
|
214
|
-
|
215
|
-
hash=CloudServersVPC.server_group_hash(xml)
|
216
|
-
|
217
|
-
online=true
|
218
|
-
hash["servers"].each_pair do |name, attrs|
|
219
|
-
if ["Pending", "Rebuilding"].include?(attrs["status"]) then
|
220
|
-
online=false
|
221
|
-
end
|
222
|
-
if attrs["status"] == "Failed" then
|
223
|
-
raise "Failed to create server group with the following message: #{attrs['error-message']}"
|
224
|
-
end
|
225
|
-
end
|
226
|
-
if not online
|
227
|
-
yield hash if block_given?
|
228
|
-
sleep 20
|
229
|
-
end
|
230
|
-
rescue EOFError
|
231
|
-
end
|
232
|
-
end
|
233
|
-
if (count*20) >= timeout.to_i then
|
234
|
-
raise "Timeout waiting for server groups to come online."
|
235
|
-
end
|
236
|
-
|
237
|
-
end
|
238
|
-
|
239
|
-
def self.os_types(server_group_hash)
|
240
|
-
|
241
|
-
os_types={}
|
242
|
-
server_group_hash["servers"].each_pair do |name, attrs|
|
243
|
-
os_type = case attrs["image-id"].to_i
|
244
|
-
when 51 # Centos 5.5
|
245
|
-
"centos"
|
246
|
-
when 187811 # Centos 5.4
|
247
|
-
"centos"
|
248
|
-
when 71 # Fedora 14
|
249
|
-
"fedora"
|
250
|
-
when 53 # Fedora 13
|
251
|
-
"fedora"
|
252
|
-
when 17 # Fedora 12
|
253
|
-
"fedora"
|
254
|
-
when 14 # RHEL 5.4
|
255
|
-
"rhel"
|
256
|
-
when 62 # RHEL 5.5
|
257
|
-
"rhel"
|
258
|
-
when 49 # Ubuntu 10.04
|
259
|
-
"ubuntu"
|
260
|
-
when 14362 # Ubuntu 9.10
|
261
|
-
"ubuntu"
|
262
|
-
when 8 # Ubuntu 9.04
|
263
|
-
"ubuntu"
|
264
|
-
else
|
265
|
-
"unknown"
|
266
|
-
end
|
267
|
-
if block_given? then
|
268
|
-
yield name, os_type
|
269
|
-
else
|
270
|
-
os_types.store(name, os_type)
|
271
|
-
end
|
272
|
-
end
|
273
|
-
os_types
|
274
|
-
|
275
|
-
end
|
276
|
-
|
277
|
-
def self.rebuild(server_group_hash, server_name)
|
278
|
-
|
279
|
-
configs=Util.load_configs
|
280
|
-
|
281
|
-
server_id=nil
|
282
|
-
image_id=nil
|
283
|
-
server_group_hash["servers"].each_pair do |name, attrs|
|
284
|
-
if name == server_name then
|
285
|
-
raise "Error: Rebuilding the OpenVPN server is not supported at this time." if attrs["openvpn-server"] == "true"
|
286
|
-
server_id=attrs["id"]
|
287
|
-
image_id=attrs["image-id"]
|
288
|
-
end
|
289
|
-
end
|
290
|
-
raise "Unable to find server name: #{server_name}" if server_id.nil?
|
291
|
-
|
292
|
-
HttpUtil.post(
|
293
|
-
configs["cloud_servers_vpc_url"]+"/servers/#{server_id}/rebuild",
|
294
|
-
{},
|
295
|
-
configs["cloud_servers_vpc_username"],
|
296
|
-
configs["cloud_servers_vpc_password"]
|
297
|
-
)
|
298
|
-
|
299
|
-
end
|
300
|
-
|
301
|
-
def self.client_hash(xml)
|
302
|
-
|
303
|
-
hash={}
|
304
|
-
dom = REXML::Document.new(xml)
|
305
|
-
REXML::XPath.each(dom, "/client") do |client|
|
306
|
-
|
307
|
-
hash["name"]=client.elements["name"].text
|
308
|
-
hash["description"]=client.elements["description"].text
|
309
|
-
hash["id"]=client.elements["id"].text
|
310
|
-
hash["status"]=client.elements["status"].text
|
311
|
-
hash["server-group-id"]=client.elements["server-group-id"].text
|
312
|
-
hash["vpn-network-interfaces"]=[]
|
313
|
-
REXML::XPath.each(dom, "//vpn-network-interface") do |vni|
|
314
|
-
client_attributes={
|
315
|
-
"id" => vni.elements["id"].text,
|
316
|
-
"vpn-ip-addr" => vni.elements["vpn-ip-addr"].text,
|
317
|
-
"ptp-ip-addr" => vni.elements["ptp-ip-addr"].text,
|
318
|
-
"client-key" => vni.elements["client-key"].text,
|
319
|
-
"client-cert" => vni.elements["client-cert"].text,
|
320
|
-
"ca-cert" => vni.elements["ca-cert"].text
|
321
|
-
}
|
322
|
-
hash["vpn-network-interfaces"] << client_attributes
|
323
|
-
end
|
324
|
-
end
|
325
|
-
|
326
|
-
hash
|
327
|
-
|
328
|
-
end
|
329
|
-
|
330
|
-
def self.poll_client(client_id, timeout=300)
|
331
|
-
|
332
|
-
configs=Util.load_configs
|
333
|
-
|
334
|
-
online = false
|
335
|
-
count=0
|
336
|
-
until online or (count*5) >= timeout.to_i do
|
337
|
-
count+=1
|
338
|
-
begin
|
339
|
-
xml=HttpUtil.get(
|
340
|
-
configs["cloud_servers_vpc_url"]+"/clients/#{client_id}.xml",
|
341
|
-
configs["cloud_servers_vpc_username"],
|
342
|
-
configs["cloud_servers_vpc_password"]
|
343
|
-
)
|
344
|
-
hash=CloudServersVPC.client_hash(xml)
|
345
|
-
|
346
|
-
if hash["status"] == "Online" then
|
347
|
-
online = true
|
348
|
-
else
|
349
|
-
yield hash if block_given?
|
350
|
-
sleep 5
|
351
|
-
end
|
352
|
-
rescue EOFError
|
353
|
-
end
|
354
|
-
end
|
355
|
-
if (count*20) >= timeout.to_i then
|
356
|
-
raise "Timeout waiting for client to come online."
|
357
|
-
end
|
358
|
-
|
359
|
-
end
|
360
|
-
|
361
|
-
def self.client_xml_for_id(configs, dir, id=nil)
|
362
|
-
|
363
|
-
xml=HttpUtil.get(
|
364
|
-
configs["cloud_servers_vpc_url"]+"/clients/#{id}.xml",
|
365
|
-
configs["cloud_servers_vpc_username"],
|
366
|
-
configs["cloud_servers_vpc_password"]
|
367
|
-
)
|
368
|
-
|
369
|
-
end
|
370
|
-
|
371
|
-
def self.create_client(server_group_hash, client_name)
|
372
|
-
|
373
|
-
configs=Util.load_configs
|
374
|
-
|
375
|
-
xml = Builder::XmlMarkup.new
|
376
|
-
xml.client do |client|
|
377
|
-
client.name(client_name)
|
378
|
-
client.description("Toolkit Client: #{client_name}")
|
379
|
-
client.tag! "server-group-id", server_group_hash['id']
|
380
|
-
end
|
381
|
-
|
382
|
-
HttpUtil.post(
|
383
|
-
configs["cloud_servers_vpc_url"]+"/clients.xml",
|
384
|
-
xml.target!,
|
385
|
-
configs["cloud_servers_vpc_username"],
|
386
|
-
configs["cloud_servers_vpc_password"]
|
387
|
-
)
|
388
|
-
|
389
|
-
end
|
390
|
-
|
391
|
-
end
|
392
|
-
|
393
|
-
end
|