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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.gitreview +4 -0
- data/Gemfile +25 -0
- data/Gemfile.lock +34 -0
- data/LICENSE.txt +14 -0
- data/README.md +652 -0
- data/Rakefile +24 -0
- data/bin/cloud_test.rb +81 -0
- data/example/students_1/process/Students.rb +20 -0
- data/example/students_1/students.rb +16 -0
- data/example/students_2/process/Students.rb +27 -0
- data/example/students_2/students.rb +36 -0
- data/example/students_3/controller/yaml_students.rb +94 -0
- data/example/students_3/controller/yaml_students_controller.rb +123 -0
- data/example/students_3/process/students.rb +118 -0
- data/example/students_3/students.rb +93 -0
- data/example/students_4/controller/yaml_students.rb +82 -0
- data/example/students_4/controller/yaml_students_controller.rb +141 -0
- data/example/students_4/process/students.rb +112 -0
- data/example/students_4/students.rb +103 -0
- data/example/yaml_students/students.rb +78 -0
- data/example/yaml_students/yaml_students.rb +115 -0
- data/lib/concept.md +111 -0
- data/lib/core/core.rb +723 -0
- data/lib/core/definition.rb +505 -0
- data/lib/core/definition_internal.rb +338 -0
- data/lib/core/lorj-basecontroller.rb +90 -0
- data/lib/core/lorj-basedefinition.rb +1079 -0
- data/lib/core/lorj-baseprocess.rb +231 -0
- data/lib/core/lorj-data.rb +567 -0
- data/lib/core/lorj-keypath.rb +115 -0
- data/lib/core_process/CloudProcess.rb +334 -0
- data/lib/core_process/global_process.rb +406 -0
- data/lib/core_process/network_process.rb +603 -0
- data/lib/img/.directory +4 -0
- data/lib/img/account_data_access.png +0 -0
- data/lib/img/config_data_access.png +0 -0
- data/lib/img/forj-lib-concept.png +0 -0
- data/lib/lorj/version.rb +3 -0
- data/lib/lorj.rb +51 -0
- data/lib/prc-account.rb +339 -0
- data/lib/prc-config.rb +1023 -0
- data/lib/prc-logging.rb +183 -0
- data/lib/prc.rb +108 -0
- data/lib/providers/hpcloud/Hpcloud.rb +419 -0
- data/lib/providers/hpcloud/compute.rb +108 -0
- data/lib/providers/hpcloud/network.rb +117 -0
- data/lib/providers/hpcloud/security_groups.rb +67 -0
- data/lib/providers/mock/Mock.rb +141 -0
- data/lib/providers/openstack/Openstack.rb +47 -0
- data/lib/providers/templates/compute.rb +42 -0
- data/lib/providers/templates/core.rb +61 -0
- data/lib/providers/templates/network.rb +33 -0
- data/lorj-spec/defaults.yaml +26 -0
- data/lorj.gemspec +39 -0
- data/spec/forj-account_spec.rb +75 -0
- data/spec/forj-config_spec.rb +196 -0
- 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
|
data/lib/img/.directory
ADDED
Binary file
|
Binary file
|
Binary file
|
data/lib/lorj/version.rb
ADDED
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
|