lorj 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +46 -0
  4. data/Gemfile +15 -15
  5. data/README.md +22 -17
  6. data/Rakefile +12 -2
  7. data/bin/cloud_test.rb +13 -65
  8. data/example/students_1/process/students.rb +39 -0
  9. data/example/students_1/students.rb +22 -5
  10. data/example/students_2/process/students.rb +48 -0
  11. data/example/students_2/students.rb +39 -16
  12. data/example/students_3/controller/yaml_students.rb +50 -43
  13. data/example/students_3/controller/yaml_students_controller.rb +100 -87
  14. data/example/students_3/process/students.rb +161 -97
  15. data/example/students_3/students.rb +85 -56
  16. data/example/yaml_students/students.rb +40 -40
  17. data/example/yaml_students/yaml_students.rb +103 -90
  18. data/lib/core/core.rb +356 -696
  19. data/lib/core/core_controller.rb +227 -0
  20. data/lib/core/core_internal.rb +339 -0
  21. data/lib/core/core_model.rb +328 -0
  22. data/lib/core/core_object_data.rb +330 -0
  23. data/lib/core/core_object_params.rb +230 -0
  24. data/lib/core/core_process.rb +391 -0
  25. data/lib/core/core_process_setup.rb +353 -0
  26. data/lib/core/core_setup_ask.rb +241 -0
  27. data/lib/core/core_setup_encrypt.rb +146 -0
  28. data/lib/core/core_setup_init.rb +229 -0
  29. data/lib/core/core_setup_list.rb +160 -0
  30. data/lib/core/definition.rb +647 -469
  31. data/lib/core/definition_internal.rb +264 -308
  32. data/lib/core/lorj_basecontroller.rb +95 -0
  33. data/lib/core/lorj_basedefinition.rb +307 -0
  34. data/lib/core/lorj_baseprocess.rb +265 -0
  35. data/lib/core/lorj_data.rb +583 -0
  36. data/lib/core/lorj_keypath.rb +119 -0
  37. data/lib/core_process/cloud/process/common.rb +63 -0
  38. data/lib/core_process/cloud/process/connection.rb +93 -0
  39. data/lib/core_process/cloud/process/external_network.rb +94 -0
  40. data/lib/core_process/cloud/process/flavor.rb +99 -0
  41. data/lib/core_process/cloud/process/images.rb +87 -0
  42. data/lib/core_process/cloud/process/internet_network.rb +34 -0
  43. data/lib/core_process/cloud/process/internet_server.rb +30 -0
  44. data/lib/core_process/cloud/process/keypairs.rb +276 -0
  45. data/lib/core_process/cloud/process/network.rb +108 -0
  46. data/lib/core_process/cloud/process/public_ip.rb +100 -0
  47. data/lib/core_process/cloud/process/router.rb +260 -0
  48. data/lib/core_process/cloud/process/rules.rb +120 -0
  49. data/lib/core_process/cloud/process/security_groups.rb +121 -0
  50. data/lib/core_process/cloud/process/server.rb +127 -0
  51. data/lib/core_process/cloud/process/server_log.rb +35 -0
  52. data/lib/core_process/cloud/process/subnetwork.rb +108 -0
  53. data/lib/core_process/cloud_process.rb +30 -0
  54. data/lib/logging.rb +298 -0
  55. data/lib/lorj/version.rb +18 -1
  56. data/lib/lorj.rb +58 -18
  57. data/lib/lorj_account.rb +556 -0
  58. data/lib/lorj_config.rb +468 -0
  59. data/lib/lorj_defaults.rb +278 -0
  60. data/lib/prc.rb +136 -104
  61. data/lib/prc_base_config.rb +285 -0
  62. data/lib/prc_core_config.rb +878 -0
  63. data/lib/prc_section_config.rb +57 -0
  64. data/lib/providers/hpcloud/compute.rb +81 -93
  65. data/lib/providers/hpcloud/hpcloud.rb +462 -0
  66. data/lib/providers/hpcloud/network.rb +96 -98
  67. data/lib/providers/hpcloud/security_groups.rb +41 -40
  68. data/lib/providers/mock/mock.rb +144 -0
  69. data/lib/providers/openstack/openstack.rb +45 -0
  70. data/lib/providers/templates/compute.rb +21 -23
  71. data/lib/providers/templates/mycloud.rb +72 -0
  72. data/lib/providers/templates/network.rb +11 -12
  73. data/lib/rh.rb +339 -0
  74. data/lorj-spec/defaults.yaml +4 -0
  75. data/lorj.gemspec +6 -0
  76. data/spec/00_lorj_log_spec.rb +53 -0
  77. data/spec/01_hash_rh_spec.rb +243 -0
  78. data/spec/02_prc_base_config_spec.rb +216 -0
  79. data/spec/04_prc_core_config_spec.rb +83 -0
  80. data/spec/11_lorj_config_spec.rb +263 -0
  81. data/spec/12_lorj_account_spec.rb +181 -0
  82. metadata +76 -28
  83. data/Gemfile.lock +0 -37
  84. data/example/students_1/process/Students.rb +0 -20
  85. data/example/students_2/process/Students.rb +0 -27
  86. data/example/students_4/controller/yaml_students.rb +0 -82
  87. data/example/students_4/controller/yaml_students_controller.rb +0 -141
  88. data/example/students_4/process/students.rb +0 -112
  89. data/example/students_4/students.rb +0 -103
  90. data/lib/core/lorj-basecontroller.rb +0 -90
  91. data/lib/core/lorj-basedefinition.rb +0 -1139
  92. data/lib/core/lorj-baseprocess.rb +0 -236
  93. data/lib/core/lorj-data.rb +0 -567
  94. data/lib/core/lorj-keypath.rb +0 -115
  95. data/lib/core_process/CloudProcess.rb +0 -337
  96. data/lib/core_process/global_process.rb +0 -502
  97. data/lib/core_process/network_process.rb +0 -605
  98. data/lib/prc-account.rb +0 -339
  99. data/lib/prc-config.rb +0 -1030
  100. data/lib/prc-logging.rb +0 -261
  101. data/lib/providers/hpcloud/Hpcloud.rb +0 -426
  102. data/lib/providers/mock/Mock.rb +0 -141
  103. data/lib/providers/openstack/Openstack.rb +0 -47
  104. data/lib/providers/templates/core.rb +0 -61
  105. data/spec/forj-account_spec.rb +0 -75
  106. data/spec/forj-config_spec.rb +0 -196
@@ -1,502 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- class SSLErrorMgt
18
-
19
- def initialize(iMaxRetry = 5)
20
- @iRetry = 0
21
- @iMaxRetry = iMaxRetry
22
- end
23
-
24
- def ErrorDetected(message,backtrace, e)
25
- if message.match('SSLv2/v3 read server hello A: unknown protocol')
26
- if @iRetry <@iMaxRetry
27
- sleep(2)
28
- @iRetry+=1
29
- print "%s/%s try... 'unknown protocol' SSL Error\r" % [@iRetry, @iMaxRetry] if PrcLib.level == 0
30
- return false
31
- else
32
- PrcLib.error('Too many retry. %s' % message)
33
- return true
34
- end
35
- elsif e.is_a?(Excon::Errors::InternalServerError)
36
- if @iRetry <@iMaxRetry
37
- sleep(2)
38
- @iRetry+=1
39
- print "%s/%s try... %s\n" % [@iRetry, @iMaxRetry, ANSI.red(e.class)] if PrcLib.level == 0
40
- return false
41
- else
42
- PrcLib.error('Too many retry. %s' % message)
43
- return true
44
- end
45
- else
46
- PrcLib.error("Exception %s: %s\n%s" % [e.class, message,backtrace.join("\n")])
47
- return true
48
- end
49
- end
50
-
51
- end
52
-
53
-
54
- class CloudProcess
55
- def connect(sCloudObj, hParams)
56
- oSSLError = SSLErrorMgt.new # Retry object
57
- PrcLib.debug("%s:%s Connecting to '%s' - Project '%s'" % [self.class, sCloudObj, config.get(:provider), hParams[:tenant]])
58
- begin
59
- controller_connect(sCloudObj)
60
- rescue => e
61
- if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
62
- retry
63
- end
64
- PrcLib.error('%s:%s: Unable to connect.\n%s' % [self.class, sCloudObj, e.message ])
65
- nil
66
- end
67
- end
68
- end
69
-
70
- # ---------------------------------------------------------------------------
71
- # Keypair management
72
- # ---------------------------------------------------------------------------
73
- class CloudProcess
74
-
75
- # KeyPair Create Process Handler
76
- # The process implemented is:
77
- # * Check local SSH keypairs
78
- # * Check remote keypair existence
79
- # * Compare and warn if needed.
80
- # * Import public key found if missing remotely and name it.
81
- #
82
- # Return:
83
- # - keypair : Lorj::Data keypair object. Following additional data should be found in the keypair attributes
84
- # - :coherent : Boolean. True, if the local keypair (public AND private) is coherent with remote keypair found in the cloud
85
- # - :private_key_file: String. Path to local private key file
86
- # - :public_key_file : String. Path to local public key file
87
- # - :public_key : String. Public key content. (config[:public_key] is also set - Used to import it)
88
- #
89
- def forj_get_or_create_keypair(sCloudObj, hParams)
90
- sKeypair_name = hParams[:keypair_name]
91
- # setup has configured and copied the appropriate key to forj keypairs.
92
-
93
- hLocalKeypair = keypair_detect(sKeypair_name, File.expand_path(hParams[:keypair_path]))
94
-
95
- private_key_file = File.join(hLocalKeypair[:keypair_path], hLocalKeypair[:private_key_name])
96
- public_key_file = File.join(hLocalKeypair[:keypair_path], hLocalKeypair[:private_key_name])
97
-
98
- PrcLib.info("Found openssh private key file '%s'." % private_key_file) if hLocalKeypair[:private_key_exist? ]
99
- PrcLib.info("Found openssh public key file '%s'." % public_key_file) if hLocalKeypair[:public_key_exist? ]
100
-
101
- PrcLib.state("Searching for keypair '%s'" % [sKeypair_name] )
102
-
103
- keypairs = forj_query_keypair(sCloudObj, {:name => sKeypair_name}, hParams)
104
-
105
- if keypairs.length == 0
106
- PrcLib.fatal(1, "Unable to import keypair '%s'. Public key file is not found. Please run 'forj setup %s'" % [sKeypair_name, config[:account_name]]) if not hLocalKeypair[:public_key_exist? ]
107
- begin
108
- config[:public_key] = File.read(hLocalKeypair[:public_key_file])
109
- rescue => e
110
- PrcLib.error("Unable to import keypair '%s'. '%s' is unreadable.\n%s",[hLocalKeypair[:public_key_file], e.message] )
111
- end
112
- keypair = create_keypair(sCloudObj, hParams)
113
- if not hLocalKeypair[:private_key_exist? ]
114
- keypair[:coherent] = false
115
- else
116
- keypair[:coherent] = true
117
- end
118
- else
119
- keypair = keypairs[0]
120
- keypair[:coherent] = coherent_keypair?(hLocalKeypair, keypair)
121
- # Adding information about key files.
122
- end
123
- if keypair[:coherent]
124
- keypair[:private_key_file] = hLocalKeypair[:private_key_file]
125
- keypair[:public_key_file] = hLocalKeypair[:public_key_file]
126
- end
127
- keypair
128
-
129
- end
130
-
131
- def forj_query_keypair(sCloudObj, sQuery, hParams)
132
- key_name = hParams[:keypair_name]
133
- oSSLError = SSLErrorMgt.new
134
- begin
135
- oList = controller_query(sCloudObj, sQuery)
136
- query_single(sCloudObj, oList, sQuery, key_name)
137
- rescue => e
138
- if not oSSLError.ErrorDetected(e.message, e.backtrace, e)
139
- retry
140
- end
141
- end
142
-
143
- end
144
-
145
- # Internal process function: Create keypair
146
- def create_keypair(sCloudObj, hParams)
147
- key_name = hParams[:keypair_name]
148
- PrcLib.state("Importing keypair '%s'" % [key_name])
149
- oSSLError=SSLErrorMgt.new
150
- begin
151
- keypair = controller_create(sCloudObj)
152
- PrcLib.info("Keypair '%s' imported." % [keypair[:name]])
153
- rescue StandardError => e
154
- if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
155
- retry
156
- end
157
- PrcLib.error "error importing keypair '%s'" % [key_name]
158
- end
159
- keypair
160
- end
161
-
162
- # Build keypair data information structure with files found in local filesystem.
163
- # Take care of priv with or without .pem and pubkey with pub.
164
- def keypair_detect(keypair_name, key_fullpath)
165
-
166
- key_basename = File.basename(key_fullpath)
167
- key_path = File.expand_path(File.dirname(key_fullpath))
168
-
169
- mObj = key_basename.match(/^(.*?)(\.pem|\.pub)?$/)
170
- key_basename = mObj[1]
171
-
172
- private_key_ext = nil
173
- temp_file1 = File.join(key_path, key_basename)
174
- private_key_ext = "" if File.exists?(temp_file1) and not File.directory?(temp_file1)
175
- temp_file2 = File.join(key_path, key_basename + '.pem')
176
- private_key_ext = '.pem' if File.exists?(temp_file2) and not File.directory?(temp_file2)
177
-
178
- if private_key_ext
179
- private_key_exist = true
180
- private_key_name = key_basename + private_key_ext
181
- else
182
- [ temp_file1, temp_file2].each { | temp_file |
183
- PrcLib.warning("keypair_detect: Private key file name detection has detected '%s' as a directory. Usually, it should be a private key file. Please check." % temp_file) if File.directory?(temp_file)
184
- }
185
- private_key_exist = false
186
- private_key_name = key_basename
187
- end
188
-
189
- public_key_exist = File.exists?(File.join(key_path, key_basename + '.pub'))
190
- public_key_name = key_basename + '.pub'
191
-
192
-
193
- # keypair basic structure
194
- {:keypair_name => keypair_name,
195
- :keypair_path => key_path, :key_basename => key_basename,
196
- :private_key_name => private_key_name, :private_key_exist? => private_key_exist,
197
- :public_key_name => public_key_name, :public_key_exist? => public_key_exist
198
- }
199
- end
200
-
201
- def forj_get_keypair(sCloudObj, sName, hParams)
202
- oSSLError = SSLErrorMgt.new
203
- begin
204
- controller_get(sCloudObj, sName)
205
- rescue => e
206
- if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
207
- retry
208
- end
209
- end
210
- end
211
-
212
- def get_keypairs_path(hParams, hKeys)
213
- sKeypair_name = hParams[:keypair_name]
214
-
215
- if hKeys[:private_key_exist? ]
216
- hParams[:private_key_file] = File.join(hKeys[:keypair_path], hKeys[:private_key_name])
217
- PrcLib.info("Openssh private key file '%s' exists." % hParams[:private_key_file])
218
- end
219
- if hKeys[:public_key_exist? ]
220
- hParams[:public_key_file] = File.join(hKeys[:keypair_path], hKeys[:public_key_name])
221
- else
222
- PrcLib.fatal(1, "Public key file is not found. Please run 'forj setup %s'" % config[:account_name])
223
- end
224
-
225
- PrcLib.state("Searching for keypair '%s'" % [sKeypair_name] )
226
-
227
- hParams
228
- end
229
-
230
- # Check if 2 keypair objects are coherent (Same public key)
231
- # Parameters:
232
- # - +hLocalKeypair+ : Keypair structure representing local files existence. see keypair_detect
233
- # - +keypair+ : Keypair object to check.
234
- #
235
- # return:
236
- # - coherent : Boolean. True if same public key.
237
- def coherent_keypair?(hLocalKeypair, keypair)
238
- #send keypairs by parameter
239
-
240
- sKeypair_name = hLocalKeypair[:keypair_name]
241
- bCoherent = false
242
-
243
- # Check the public key with the one found here, locally.
244
- if not keypair[:public_key].nil? and keypair[:public_key] != ""
245
- begin
246
- local_pub_key = File.read(File.join(hLocalKeypair[:keypair_path], hLocalKeypair[:public_key_name]))
247
- rescue => e
248
- PrcLib.error("Unable to read '%s'.\n%s" % [hLocalKeypair[:public_key_file], e.message] )
249
- else
250
- if local_pub_key.split(' ')[1].strip == keypair[:public_key].split(' ')[1].strip
251
- PrcLib.info("keypair '%s' local files are coherent with keypair in your cloud service. You will be able to connect to your box over SSH." % sKeypair_name)
252
- bCoherent = true
253
- else
254
- PrcLib.warning("Your local keypair file '%s' are incoherent with public key '%s' found in your cloud. You won't be able to access your box with this keypair.\nPublic key found in the cloud:\n%s" % [hLocalKeypair[:public_key_file], sKeypair_name, keypair[:public_key]])
255
- end
256
- end
257
- else
258
- PrcLib.warning("Unable to verify keypair coherence with your local SSH keys. No public key (:public_key) provided.")
259
- end
260
- bCoherent
261
-
262
- end
263
- end
264
-
265
- # ---------------------------------------------------------------------------
266
- # flavor management
267
- # ---------------------------------------------------------------------------
268
- class CloudProcess
269
- # Depending on clouds/rights, we can create flavor or not.
270
- # Usually, flavor records already exists, and the controller may map them
271
- # CloudProcess predefines some values. Consult CloudProcess.rb for details
272
- def forj_get_or_create_flavor(sCloudObj, hParams)
273
- sFlavor_name = hParams[:flavor_name]
274
- PrcLib.state("Searching for flavor '%s'" % [sFlavor_name] )
275
-
276
- flavors = query_flavor(sCloudObj, {:name => sFlavor_name}, hParams)
277
- if flavors.length == 0
278
- if not hParams[:create]
279
- PrcLib.error("Unable to create %s '%s'. Creation is not supported." % [sCloudObj, sFlavor_name])
280
- ForjLib::Data.new.set(nil, sCloudObj)
281
- else
282
- create_flavor(sCloudObj,hParams)
283
- end
284
- else
285
- flavors[0]
286
- end
287
- end
288
-
289
- # Should return 1 or 0 flavor.
290
- def query_flavor(sCloudObj, sQuery, hParams)
291
- sFlavor_name = hParams[:flavor_name]
292
- oList = forj_query_flavor(sCloudObj, sQuery, hParams)
293
- query_single(sCloudObj, oList, sQuery, sFlavor_name)
294
- end
295
-
296
- # Should return 1 or 0 flavor.
297
- def forj_query_flavor(sCloudObj, sQuery, hParams)
298
- sFlavor_name = hParams[:flavor_name]
299
- oSSLError = SSLErrorMgt.new
300
- begin
301
- oList = controller_query(sCloudObj, sQuery)
302
- rescue => e
303
- if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
304
- retry
305
- end
306
- end
307
- oList
308
- end
309
- end
310
-
311
- # ---------------------------------------------------------------------------
312
- # Image management
313
- # ---------------------------------------------------------------------------
314
- class CloudProcess
315
- def forj_get_or_create_image(sCloudObj, hParams)
316
- sImage_name = hParams[:image_name]
317
- PrcLib.state("Searching for image '%s'" % [sImage_name] )
318
-
319
- search_the_image(sCloudObj, {:name => sImage_name}, hParams)
320
- # No creation possible.
321
- end
322
-
323
- def search_the_image(sCloudObj, sQuery, hParams)
324
- image_name = hParams[:image_name]
325
- images = forj_query_image(sCloudObj, sQuery, hParams)
326
- case images.length()
327
- when 0
328
- PrcLib.info("No image '%s' found" % [ image_name ] )
329
- nil
330
- when 1
331
- PrcLib.info("Found image '%s'." % [ image_name ])
332
- images[0, :ssh_user] = ssh_user(images[0, :name])
333
- images[0]
334
- else
335
- PrcLib.info("Found several images '%s'. Selecting the first one '%s'" % [ image_name, images[0, :name] ])
336
- images[0, :ssh_user] = ssh_user(images[0, :name])
337
- images[0]
338
- end
339
- end
340
-
341
- def forj_query_image(sCloudObj, sQuery, hParams)
342
- oSSLError = SSLErrorMgt.new
343
- begin
344
- images = controller_query(sCloudObj, sQuery)
345
- rescue => e
346
- if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
347
- retry
348
- end
349
- end
350
- images.each { |image|
351
- image[:ssh_user] = ssh_user(image[:name])
352
- }
353
- images
354
- end
355
-
356
- def ssh_user(image_name)
357
- return "fedora" if image_name =~ /fedora/i
358
- return "centos" if image_name =~ /centos/i
359
- return "ubuntu"
360
- end
361
- end
362
-
363
- # ---------------------------------------------------------------------------
364
- # Server management
365
- # ---------------------------------------------------------------------------
366
- class CloudProcess
367
- # Process Handler functions
368
- def forj_get_or_create_server(sCloudObj, hParams)
369
- sServer_name = hParams[:server_name]
370
- PrcLib.state("Searching for server '%s'" % [sServer_name] )
371
- servers = forj_query_server(sCloudObj, {:name => sServer_name}, hParams)
372
- if servers.length > 0
373
- # Get server details
374
- forj_get_server(sCloudObj, servers[0][:attrs][:id], hParams)
375
- else
376
- create_server(sCloudObj, hParams)
377
- end
378
- end
379
-
380
- def forj_delete_server(sCloudObj, hParams)
381
- oSSLError = SSLErrorMgt.new
382
- begin
383
- controller_delete(sCloudObj)
384
- PrcLib.info("Server %s was destroyed " % hParams[:server][:name] )
385
- rescue => e
386
- if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
387
- retry
388
- end
389
- end
390
- end
391
-
392
- def forj_query_server(sCloudObj, sQuery, hParams)
393
- oSSLError = SSLErrorMgt.new
394
- begin
395
- controller_query(sCloudObj, sQuery)
396
- rescue => e
397
- if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
398
- retry
399
- end
400
- end
401
- end
402
-
403
- def forj_get_server(sCloudObj, sId, hParams)
404
- oSSLError = SSLErrorMgt.new
405
- begin
406
- controller_get(sCloudObj, sId)
407
- rescue => e
408
- if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
409
- retry
410
- end
411
- end
412
- end
413
-
414
- # Internal Process function
415
- def create_server(sCloudObj, hParams)
416
- name = hParams[:server_name]
417
- begin
418
- PrcLib.info("boot: meta-data provided.") if hParams[:meta_data]
419
- PrcLib.info("boot: user-data provided.") if hParams[:user_data]
420
- PrcLib.state('creating server %s' % [name])
421
- server = controller_create(sCloudObj)
422
- PrcLib.info("%s '%s' created." % [sCloudObj, name])
423
- rescue => e
424
- PrcLib.fatal(1, "Unable to create server '%s'" % name, e)
425
- end
426
- server
427
- end
428
-
429
- def forj_get_server_log(sCloudObj, sId, hParams)
430
- oSSLError = SSLErrorMgt.new
431
- begin
432
- controller_get(sCloudObj, sId)
433
- rescue => e
434
- if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
435
- retry
436
- end
437
- end
438
- end
439
- end
440
- # ---------------------------------------------------------------------------
441
- # Addresses management
442
- # ---------------------------------------------------------------------------
443
- class CloudProcess
444
- # Process Handler functions
445
- def forj_get_or_assign_public_address(sCloudObj, hParams)
446
- # Function which to assign a public IP address to a server.
447
- sServer_name = hParams[:server, :name]
448
-
449
- PrcLib.state("Searching public IP for server '%s'" % [sServer_name] )
450
- addresses = controller_query(sCloudObj, {:server_id => hParams[:server, :id]})
451
- if addresses.length == 0
452
- assign_address(sCloudObj, hParams)
453
- else
454
- addresses[0]
455
- end
456
- end
457
-
458
- def forj_query_public_address(sCloudObj, sQuery, hParams)
459
- server_name = hParams[:server, :name]
460
- oSSLError = SSLErrorMgt.new
461
- begin
462
- sInfo = {
463
- :notfound => "No %s for '%s' found",
464
- :checkmatch => "Found 1 %s. checking exact match for server '%s'.",
465
- :nomatch => "No %s for '%s' match",
466
- :found => "Found %s '%s' for #{server_name}.",
467
- :more => "Found several %s. Searching for '%s'.",
468
- :items => :public_ip
469
- }
470
- oList = controller_query(sCloudObj, sQuery)
471
- query_single(sCloudObj, oList, sQuery, server_name, sInfo)
472
- rescue => e
473
- if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
474
- retry
475
- end
476
- end
477
- end
478
-
479
- def forj_get_public_address(sCloudObj, sId, hParams)
480
- oSSLError = SSLErrorMgt.new
481
- begin
482
- controller_get(sCloudObj, sId)
483
- rescue => e
484
- if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
485
- retry
486
- end
487
- end
488
- end
489
-
490
- # Internal Process function
491
- def assign_address(sCloudObj, hParams)
492
- name = hParams[:server, :name]
493
- begin
494
- PrcLib.state('Getting public IP for server %s' % [name])
495
- ip_address = controller_create(sCloudObj)
496
- PrcLib.info("Public IP '%s' for server '%s' assigned." % [ip_address[:public_ip], name])
497
- rescue => e
498
- PrcLib.fatal(1, "Unable to assign a public IP to server '%s'" % name, e)
499
- end
500
- ip_address
501
- end
502
- end