lorj 0.1.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.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.gitreview +4 -0
  4. data/Gemfile +25 -0
  5. data/Gemfile.lock +34 -0
  6. data/LICENSE.txt +14 -0
  7. data/README.md +652 -0
  8. data/Rakefile +24 -0
  9. data/bin/cloud_test.rb +81 -0
  10. data/example/students_1/process/Students.rb +20 -0
  11. data/example/students_1/students.rb +16 -0
  12. data/example/students_2/process/Students.rb +27 -0
  13. data/example/students_2/students.rb +36 -0
  14. data/example/students_3/controller/yaml_students.rb +94 -0
  15. data/example/students_3/controller/yaml_students_controller.rb +123 -0
  16. data/example/students_3/process/students.rb +118 -0
  17. data/example/students_3/students.rb +93 -0
  18. data/example/students_4/controller/yaml_students.rb +82 -0
  19. data/example/students_4/controller/yaml_students_controller.rb +141 -0
  20. data/example/students_4/process/students.rb +112 -0
  21. data/example/students_4/students.rb +103 -0
  22. data/example/yaml_students/students.rb +78 -0
  23. data/example/yaml_students/yaml_students.rb +115 -0
  24. data/lib/concept.md +111 -0
  25. data/lib/core/core.rb +723 -0
  26. data/lib/core/definition.rb +505 -0
  27. data/lib/core/definition_internal.rb +338 -0
  28. data/lib/core/lorj-basecontroller.rb +90 -0
  29. data/lib/core/lorj-basedefinition.rb +1079 -0
  30. data/lib/core/lorj-baseprocess.rb +231 -0
  31. data/lib/core/lorj-data.rb +567 -0
  32. data/lib/core/lorj-keypath.rb +115 -0
  33. data/lib/core_process/CloudProcess.rb +334 -0
  34. data/lib/core_process/global_process.rb +406 -0
  35. data/lib/core_process/network_process.rb +603 -0
  36. data/lib/img/.directory +4 -0
  37. data/lib/img/account_data_access.png +0 -0
  38. data/lib/img/config_data_access.png +0 -0
  39. data/lib/img/forj-lib-concept.png +0 -0
  40. data/lib/lorj/version.rb +3 -0
  41. data/lib/lorj.rb +51 -0
  42. data/lib/prc-account.rb +339 -0
  43. data/lib/prc-config.rb +1023 -0
  44. data/lib/prc-logging.rb +183 -0
  45. data/lib/prc.rb +108 -0
  46. data/lib/providers/hpcloud/Hpcloud.rb +419 -0
  47. data/lib/providers/hpcloud/compute.rb +108 -0
  48. data/lib/providers/hpcloud/network.rb +117 -0
  49. data/lib/providers/hpcloud/security_groups.rb +67 -0
  50. data/lib/providers/mock/Mock.rb +141 -0
  51. data/lib/providers/openstack/Openstack.rb +47 -0
  52. data/lib/providers/templates/compute.rb +42 -0
  53. data/lib/providers/templates/core.rb +61 -0
  54. data/lib/providers/templates/network.rb +33 -0
  55. data/lorj-spec/defaults.yaml +26 -0
  56. data/lorj.gemspec +39 -0
  57. data/spec/forj-account_spec.rb +75 -0
  58. data/spec/forj-config_spec.rb +196 -0
  59. metadata +164 -0
@@ -0,0 +1,603 @@
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
+ # This file describe generic process to create/query/get/delete Cloud objects.
18
+ # forj_* function are handler, predefined by cloud_data_pref.rb
19
+ # The process functions communicates with config, object or controler(provider controler)
20
+ #
21
+ # 'config' is the configuration system which implements:
22
+ # - get(key): Get the value to the associated key
23
+ # [key] is the 'set' equivalent
24
+ # - set(key, value): Set a value to a key.
25
+ # [key] = value Is the 'set' equivalent
26
+ #
27
+ # 'object' contains Object definition, Object manipulation. It implements:
28
+ # - query_map(sCloudObj, sQuery): transform Forj Object query request to
29
+ # a Provider controler query request
30
+ # The result of this function is usually sent to
31
+ # the controler query function.
32
+ #
33
+ # - get_attr(oObject, key): Read the object key from the object.
34
+ #
35
+ # Providers can redefine any kind of handler if needed.
36
+
37
+ # ---------------------------------------------------------------------------
38
+ # Network/Subnetwork Management
39
+ # ---------------------------------------------------------------------------
40
+ class CloudProcess < BaseProcess
41
+ # Process Query handler
42
+ def forj_query_network(sCloudObj, sQuery, hParams)
43
+
44
+
45
+ # Call Provider query function
46
+ controler.query(sObjectType, sControlerQuery)
47
+ end
48
+
49
+ # Process Create handler
50
+ def forj_get_or_create_network(sCloudObj, hParams)
51
+
52
+ Logging.state("Searching for network '%s'" % [hParams[:network_name]])
53
+ networks = find_network(sCloudObj, hParams)
54
+ if networks.length == 0
55
+ network = create_network(sCloudObj, hParams)
56
+ else
57
+ network = networks[0]
58
+ end
59
+ register(network)
60
+
61
+ # Attaching if missing the subnet.
62
+ # Creates an object subnet, attached to the network.
63
+ if not hParams[:subnetwork_name]
64
+ hParams[:subnetwork_name] = 'sub-' + hParams[:network_name]
65
+ config[:subnetwork_name] = hParams[:subnetwork_name]
66
+ end
67
+
68
+ object.Create(:subnetwork)
69
+
70
+ network
71
+
72
+ end
73
+
74
+ # Process Delete handler
75
+ def forj_delete_network(sCloudObj, hParams)
76
+ begin
77
+ oProvider.delete(sCloudObj, hParams)
78
+ rescue => e
79
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
80
+ end
81
+ end
82
+
83
+ def forj_get_network(sCloudObj, sID, hParams)
84
+ begin
85
+ oProvider.get(sCloudObj, sID, hParams)
86
+ rescue => e
87
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
88
+ end
89
+ end
90
+
91
+ # Network Process internal functions #
92
+ #------------------------------------#
93
+
94
+ # Network creation
95
+ # It returns:
96
+ # nil or Provider Object
97
+ def create_network(sCloudObj, hParams)
98
+ name = hParams[:network_name]
99
+ begin
100
+ Logging.state("Creating network '%s'" % [name])
101
+ network = controler.create(sCloudObj)
102
+ Logging.info("Network '%s' created" % [network[:name]])
103
+ rescue => e
104
+ Logging.fatal(1, "Unable to create network '%s'" % [name, e])
105
+ end
106
+ network
107
+ end
108
+
109
+ # Search for a network from his name.
110
+ # Name may be unique in project context, but not in the cloud system
111
+ # It returns:
112
+ # nil or Provider Object
113
+ def find_network(sCloudObj, hParams)
114
+ begin
115
+ # retrieve the Provider collection object.
116
+ sQuery = {:name => hParams[:network_name]}
117
+ oList = controler.query(sCloudObj, sQuery)
118
+ query_single(sCloudObj, oList, sQuery, hParams[:network_name])
119
+ rescue => e
120
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
121
+ end
122
+ end
123
+
124
+ def forj_get_or_create_subnetwork(sCloudObj, hParams)
125
+
126
+ Logging.state("Searching for sub-network attached to network '%s'" % [hParams[:network, :name]])
127
+ #######################
128
+ begin
129
+ sQuery = { :network_id => hParams[:network, :id] }
130
+ subnets = controler.query(:subnetwork, sQuery)
131
+ rescue => e
132
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
133
+ end
134
+ if subnets
135
+ case subnets.length()
136
+ when 0
137
+ Logging.info("No subnet found from '%s' network" % [hParams[:network, :name]])
138
+ subnet = ForjLib::Data.new
139
+ when 1
140
+ Logging.info("Found '%s' subnet from '%s' network" % [subnets[0, :name], hParams[:network, :name]])
141
+ subnet = subnets[0]
142
+ else
143
+ Logging.warning("Several subnet was found on '%s'. Choosing the first one = '%s'" % [hParams[:network, :name], subnets[0, :name]])
144
+ subnet = subnets[0]
145
+ end
146
+ end
147
+ if not subnet or subnets.length == 0
148
+ # Create the subnet
149
+ begin
150
+ subnet = create_subnet(sCloudObj, hParams)
151
+ rescue => e
152
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
153
+ end
154
+ end
155
+ register(subnet)
156
+ subnet
157
+ end
158
+
159
+ def create_subnet(sCloudObj, hParams)
160
+ name = hParams[:subnetwork_name]
161
+ Logging.state("Creating subnet '%s'" % [name])
162
+ begin
163
+ subnet = controler.create(sCloudObj)
164
+ Logging.info("Subnet '%s' created." % [subnet[:name]])
165
+ rescue => e
166
+ Logging.fatal(1, "Unable to create '%s' subnet." % name, e)
167
+ end
168
+ subnet
169
+ end
170
+
171
+ def delete_subnet()
172
+
173
+ oNetworkConnect = get_cloudObj(:network_connection)
174
+ oSubNetwork = get_cloudObj(:subnetwork)
175
+
176
+ Logging.state("Deleting subnet '%s'" % [oSubNetwork.name])
177
+ begin
178
+ provider_delete_subnetwork(oNetworkConnect, oSubNetwork)
179
+ oNetworkConnect.subnets.get(oSubNetwork.id).destroy
180
+ rescue => e
181
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
182
+ end
183
+ end
184
+ end
185
+
186
+ # ---------------------------------------------------------------------------
187
+ # Router management
188
+ # ---------------------------------------------------------------------------
189
+ class CloudProcess
190
+ # Process Create handler
191
+ def forj_get_or_create_router(sCloudObj, hParams)
192
+ oSubNetwork = hParams[:subnetwork]
193
+
194
+ if not hParams[:router_name]
195
+ config[:router_name] = 'router-%s' % hParams[:network, :name]
196
+ hParams[:router_name] = config[:router_name]
197
+ end
198
+
199
+ router_name = hParams[:router_name]
200
+ router_port = get_router_interface_attached(:port, hParams)
201
+
202
+ if not router_port or router_port.empty?
203
+ # Trying to get router
204
+ router = get_router(router_name)
205
+ router = create_router(router_name) if not router or router.empty?
206
+ create_router_interface(oSubNetwork, router) if router and not router.empty?
207
+ else
208
+ sQuery = {:id => get_data(router_port, :device_id)}
209
+ routers = controler.query(:router, sQuery)
210
+ case routers.length()
211
+ when 1
212
+ Logging.info("Found router '%s' attached to the network '%s'." % [
213
+ routers[0, :name],
214
+ get_data(:network, :name)
215
+ ])
216
+ router = routers[0]
217
+ else
218
+ Logging.warning("Unable to find the router id '%s'" % [ get_data(router_port, :device_id) ])
219
+ router = ForjLib::Data.new
220
+
221
+ end
222
+ end
223
+ router
224
+ end
225
+
226
+ def forj_update_router(sCloudObj, hParams)
227
+ controler.update(sCloudObj)
228
+ ################################
229
+ #routers[0].external_gateway_info = { 'network_id' => external_network.id }
230
+ #routers[0].save
231
+
232
+ end
233
+
234
+ # Router Process internal functions #
235
+ #------------------------------------#
236
+
237
+ def get_router(name)
238
+ Logging.state("Searching for router '%s'" % [name] )
239
+ begin
240
+ routers = controler.query(:router, {:name => name})
241
+ case routers.length()
242
+ when 1
243
+ routers[0]
244
+ else
245
+ Logging.info("Router '%s' not found." % [ name ] )
246
+ ForjLib::Data.new
247
+ end
248
+ rescue => e
249
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
250
+ end
251
+ end
252
+
253
+ def create_router(router_name, oExternalNetwork = nil)
254
+ begin
255
+ if oExternalNetwork
256
+ sExtNet = get_data(oExternalNetwork, :name)
257
+ Logging.state("Creating router '%s' attached to the external Network '%s'" % [router_name, sExtNet])
258
+ config[:external_gateway_id] = get_data(oExternalNetwork, :id)
259
+ else
260
+ Logging.state("Creating router '%s' without external Network" % [router_name])
261
+ end
262
+
263
+ router = controler.create(:router)
264
+ if oExternalNetwork
265
+ Logging.info("Router '%s' created and attached to the external Network '%s'." % [router_name, sExtNet])
266
+ else
267
+ Logging.info("Router '%s' created without external Network." % [router_name])
268
+ end
269
+ rescue => e
270
+ raise ForjError.new(), "Unable to create '%s' router\n%s" % [router_name, e.message]
271
+ end
272
+ router
273
+ end
274
+
275
+ def delete_router(oNetworkConnect, oRouter)
276
+ Logging.state("Deleting router '%s'" % [router.name])
277
+ begin
278
+ #################
279
+ provider_delete_router(oNetworkConnect, oRouter)
280
+ # oNetworkConnect.routers.get(router.id).destroy
281
+ rescue => e
282
+ Logging.error("Unable to delete '%s' router ID" % router_id, e)
283
+ end
284
+ end
285
+
286
+ # TODO: Move router interface management to hpcloud controller.
287
+ # Router interface to connect to the network
288
+ def create_router_interface(oSubnet, oRouter)
289
+
290
+ Logging.state("Attaching subnet '%s' to router '%s'" % [oSubnet[:name], oRouter[:name]])
291
+ begin
292
+ controler.create(:router_interface)
293
+
294
+ #################
295
+ #provider_add_interface()
296
+ # oRouter.add_interface(oSubnet.id, nil)
297
+ rescue => e
298
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
299
+ end
300
+ end
301
+
302
+ def delete_router_interface(oSubnet, oRouter)
303
+ Logging.state("Removing subnet '%s' from router '%s'" % [oSubnet.name, oRouter.name])
304
+ subnet_id = oSubnet.id
305
+ begin
306
+ #################
307
+ oRouter.remove_interface(subnet_id)
308
+ rescue => e
309
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
310
+ end
311
+ end
312
+
313
+ def get_router_interface_attached(sCloudObj, hParams)
314
+
315
+ oNetwork = hParams[:network]
316
+ Logging.state("Searching for router port attached to the network '%s'" % [hParams[:network, :name]] )
317
+ begin
318
+ # Searching for router port attached
319
+ #################
320
+ sQuery = {:network_id => hParams[:network, :id], :device_owner => 'network:router_interface'}
321
+
322
+ ports = controler.query(sCloudObj, sQuery)
323
+ case ports.length()
324
+ when 0
325
+ Logging.info("No router port attached to the network '%s'" % [hParams[:network, :name] ])
326
+ ForjLib::Data.new
327
+ else
328
+ Logging.info("Found a router port attached to the network '%s' " % [hParams[:network, :name] ] )
329
+ ports[0]
330
+ end
331
+ rescue => e
332
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
333
+ end
334
+ end
335
+
336
+ # Gateway management
337
+ def get_gateway(oNetworkConnect, name)
338
+
339
+ return nil if not name or not oNetworkConnect
340
+
341
+ Logging.state("Getting gateway '%s'" % [name])
342
+ networks = oNetworkConnect
343
+ begin
344
+ netty = networks.get(name)
345
+ rescue => e
346
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
347
+ end
348
+ Logging.state("Found gateway '%s'" % [name]) if netty
349
+ Logging.state("Unable to find gateway '%s'" % [name]) if not netty
350
+ return netty
351
+ end
352
+
353
+ def query_external_network(hParams)
354
+ Logging.state("Identifying External gateway")
355
+ begin
356
+ # Searching for router port attached
357
+ #################
358
+ sQuery = { :router_external => true }
359
+ networks = controler.query(:network, sQuery)
360
+ case networks.length()
361
+ when 0
362
+ Logging.info("No external network")
363
+ ForjLib::Data.new
364
+ when 1
365
+ Logging.info("Found external network '%s'." % [networks[0, :name] ] )
366
+ networks[0]
367
+ else
368
+ Logging.warn("Found several external networks. Selecting the first one '%s'" % [networks[0, :name]] )
369
+ networks[0]
370
+ end
371
+ rescue => e
372
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
373
+ end
374
+ end
375
+
376
+ end
377
+
378
+ # ---------------------------------------------------------------------------
379
+ # SecurityGroups management
380
+ # ---------------------------------------------------------------------------
381
+
382
+ class CloudProcess
383
+
384
+ # Process Create handler
385
+ def forj_get_or_create_sg(sCloudObj, hParams)
386
+ sSGName = hParams[:security_group]
387
+ Logging.state("Searching for security group '%s'" % [sSGName] )
388
+
389
+ security_group = forj_query_sg(sCloudObj, {:name => sSGName}, hParams)
390
+ security_group = create_security_group(sCloudObj, hParams) if not security_group
391
+ register(security_group)
392
+
393
+ Logging.info('Configuring Security Group \'%s\'' % [sSGName])
394
+ ports = config.get(:ports)
395
+
396
+ ports.each do |port|
397
+ port = port.to_s if port.class != String
398
+ if not (/^\d+(-\d+)?$/ =~ port)
399
+ Logging.error("Port '%s' is not valid. Must be <Port> or <PortMin>-<PortMax>" % [port])
400
+ else
401
+ mPortFound = /^(\d+)(-(\d+))?$/.match(port)
402
+ portmin = mPortFound[1]
403
+ portmax = (mPortFound[3]) ? (mPortFound[3]) : (portmin)
404
+ # Need to set runtime data to get or if missing create the required rule.
405
+ config[:dir] = :IN
406
+ config[:proto] = 'tcp'
407
+ config[:port_min] = portmin.to_i
408
+ config[:port_max] = portmax.to_i
409
+ config[:addr_map] = '0.0.0.0/0'
410
+
411
+ object.Create(:rule)
412
+ end
413
+ end
414
+ security_group
415
+ end
416
+
417
+ # Process Delete handler
418
+ def forj_delete_sg(oFC, security_group)
419
+ oSSLError=SSLErrorMgt.new
420
+ begin
421
+ sec_group = get_security_group(oFC, security_group)
422
+ oFC.oNetwork.security_groups.get(sec_group.id).destroy
423
+ rescue => e
424
+ if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
425
+ retry
426
+ end
427
+ end
428
+ end
429
+
430
+ # Process Query handler
431
+ def forj_query_sg(sCloudObj, sQuery, hParams)
432
+ oSSLError=SSLErrorMgt.new
433
+
434
+ begin
435
+ sgroups = controler.query(sCloudObj, sQuery)
436
+ rescue => e
437
+ if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
438
+ retry
439
+ end
440
+ Logging.fatal(1, "Unable to get list of security groups.", e)
441
+ end
442
+ case sgroups.length()
443
+ when 0
444
+ Logging.info("No security group '%s' found" % [ hParams[:security_group] ] )
445
+ nil
446
+ when 1
447
+ Logging.info("Found security group '%s'" % [sgroups[0, :name]])
448
+ sgroups[0]
449
+ end
450
+ end
451
+
452
+ # SecurityGroups Process internal functions #
453
+ #-------------------------------------------#
454
+ def create_security_group(sCloudObj, hParams)
455
+ Logging.state("Creating security group '%s'" % hParams[:security_group])
456
+ begin
457
+ sg = controler.create(sCloudObj)
458
+ Logging.info("Security group '%s' created." % sg[:name])
459
+ rescue => e
460
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
461
+ end
462
+ sg
463
+ end
464
+
465
+ # Rules handler #
466
+ #---------------#
467
+
468
+ # Process Delete handler
469
+ def forj_delete_security_group_rule(sCloudObj, hParams)
470
+
471
+ oSSLError=SSLErrorMgt.new
472
+ begin
473
+ controler.delete(sCloudObj)
474
+ rescue => e
475
+ if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
476
+ retry
477
+ end
478
+ end
479
+ end
480
+
481
+ # Process Query handler
482
+ def forj_query_rule(sCloudObj, sQuery, hParams)
483
+ sRule = '%s %s:%s - %s to %s' % [ hParams[:dir], hParams[:rule_proto], hParams[:port_min], hParams[:port_max], hParams[:addr_map] ]
484
+ Logging.state("Searching for rule '%s'" % [ sRule ])
485
+ oSSLError = SSLErrorMgt.new
486
+ begin
487
+ sInfo = {
488
+ :items => [:dir, :rule_proto, :port_min, :port_max, :addr_map],
489
+ :items_form => '%s %s:%s - %s to %s'
490
+ }
491
+ oList = controler.query(sCloudObj, sQuery)
492
+ query_single(sCloudObj, oList, sQuery, sRule, sInfo)
493
+ rescue => e
494
+ if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
495
+ retry
496
+ end
497
+ end
498
+ end
499
+
500
+ # Process Create handler
501
+ def forj_get_or_create_rule(sCloudObj, hParams)
502
+
503
+ sQuery = {
504
+ :dir => hParams[:dir],
505
+ :proto => hParams[:proto],
506
+ :port_min => hParams[:port_min],
507
+ :port_max => hParams[:port_max],
508
+ :addr_map => hParams[:addr_map],
509
+ :sg_id => hParams[:sg_id]
510
+ }
511
+
512
+ rules = forj_query_rule(sCloudObj, sQuery, hParams)
513
+ if rules.length == 0
514
+ create_rule(sCloudObj, hParams)
515
+ else
516
+ rules[0]
517
+ end
518
+ end
519
+
520
+ # Rules internal #
521
+ #----------------#
522
+ def create_rule(sCloudObj, hParams)
523
+
524
+ sRule = '%s %s:%s - %s to %s' % [ hParams[:dir], hParams[:rule_proto], hParams[:port_min], hParams[:port_max], hParams[:addr_map] ]
525
+ Logging.state("Creating rule '%s'" % [sRule])
526
+ oSSLError=SSLErrorMgt.new
527
+ begin
528
+ rule = controler.create(sCloudObj)
529
+ Logging.info("Rule '%s' created." % [sRule])
530
+ rescue StandardError => e
531
+ if not oSSLError.ErrorDetected(e.message,e.backtrace, e)
532
+ retry
533
+ end
534
+ Logging.error 'error creating the rule for port %s' % [sRule]
535
+ end
536
+ rule
537
+ end
538
+
539
+ end
540
+
541
+ # ---------------------------------------------------------------------------
542
+ # External network process attached to a network
543
+ # ---------------------------------------------------------------------------
544
+ class CloudProcess
545
+ def forj_get_or_create_ext_net(sCloudObj, hParams)
546
+
547
+ Logging.state("Checking router '%s' gateway" % hParams[:router, :name])
548
+
549
+ oRouter = hParams[:router]
550
+ sRouterName = hParams[:router, :name]
551
+ sNetworkId = hParams[:router, :gateway_network_id]
552
+ if sNetworkId
553
+ external_network = forj_query_external_network(sCloudObj, {:id => sNetworkId}, hParams)
554
+ Logging.info("Router '%s' is attached to the external gateway '%s'." % [ sRouterName, external_network[:name] ] )
555
+ else
556
+ Logging.info("Router '%s' needs to be attached to an external gateway." % [ sRouterName ] )
557
+ Logging.state("Attaching")
558
+ external_network = forj_query_external_network(:network, {}, hParams)
559
+ if not external_network.empty?
560
+ oRouter[:gateway_network_id] = external_network[:id]
561
+ forj_update_router(:router, hParams)
562
+ Logging.info("Router '%s' attached to the external network '%s'." % [ sRouterName, external_network[:name] ])
563
+ else
564
+ Logging.fatal(1, "Unable to attach router '%s' to an external gateway. Required for boxes to get internet access. " % [ get_data(:router, :name) ] )
565
+ end
566
+ end
567
+
568
+ # Need to keep the :network object as :external_network object type.
569
+ external_network.type = sCloudObj
570
+ external_network
571
+ end
572
+
573
+ def forj_query_external_network(sCloudObj, sQuery, hParams)
574
+ Logging.state("Identifying External gateway")
575
+ begin
576
+ # Searching for external network
577
+ networks = controler.query(:network, sQuery.merge({ :external => true }))
578
+
579
+ case networks.length()
580
+ when 0
581
+ Logging.info("No external network")
582
+ nil
583
+ when 1
584
+ Logging.info("Found external network '%s'." % [networks[0, :name] ])
585
+ networks[0]
586
+ else
587
+ Logging.warning("Found several external networks. Selecting the first one '%s'" % [networks[0, :name]])
588
+ networks[0]
589
+ end
590
+ rescue => e
591
+ Logging.error("%s\n%s" % [e.message, e.backtrace.join("\n")])
592
+ end
593
+ end
594
+
595
+ end
596
+
597
+ # ---------------------------------------------------------------------------
598
+ # Internet network process
599
+ # ---------------------------------------------------------------------------
600
+ class CloudProcess
601
+
602
+
603
+ end
@@ -0,0 +1,4 @@
1
+ [Dolphin]
2
+ PreviewsShown=true
3
+ Timestamp=2014,11,13,13,19,43
4
+ Version=3
Binary file
Binary file
Binary file
@@ -0,0 +1,3 @@
1
+ module Lorj
2
+ VERSION = "0.1.0"
3
+ end
data/lib/lorj.rb ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ #--
5
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #++
19
+
20
+
21
+
22
+ require "lorj/version"
23
+
24
+ # This is the lorj base library.
25
+
26
+ # To use it, add require 'lorj'
27
+
28
+ require 'prc.rb' # Load PrcLib Base module
29
+ require 'prc-logging.rb' # Load class PrcLib::Logging
30
+ require 'prc-config.rb' # Load class Lorj::Config
31
+ require 'prc-account.rb' # Load class Lorj::Account
32
+
33
+ require "core/core" # Lorj Core classes
34
+ require "core/lorj-data" # Lorj Lorj::Data object
35
+ require "core/lorj-basedefinition" # Lorj Lorj::BaseDefinition object
36
+ require "core/lorj-baseprocess" # Lorj Lorj::BaseProcess object
37
+ require "core/lorj-basecontroller" # Lorj Lorj::BaseController object
38
+ require "core/lorj-keypath" # Lorj Lorj::BaseDefinition object
39
+ require "core/definition" # Lorj Process definition
40
+ require "core/definition_internal" # Lorj internal functions
41
+
42
+ module Lorj
43
+ slib_forj = File.dirname(__FILE__)
44
+ $FORJ_LIB = File.expand_path(File.join(File.dirname(slib_forj),'lib'))
45
+
46
+
47
+ raise "$FORJ_LIB is missing. Please set it." if not $FORJ_LIB
48
+
49
+ $PROVIDERS_PATH = File.expand_path(File.join($FORJ_LIB, "providers"))
50
+ $CORE_PROCESS_PATH = File.join($FORJ_LIB, "core_process")
51
+ end