forj 0.0.48 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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")