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