lorj 0.2.0 → 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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +46 -0
- data/Gemfile +15 -15
- data/README.md +22 -17
- data/Rakefile +12 -2
- data/bin/cloud_test.rb +13 -65
- data/example/students_1/process/students.rb +39 -0
- data/example/students_1/students.rb +22 -5
- data/example/students_2/process/students.rb +48 -0
- data/example/students_2/students.rb +39 -16
- data/example/students_3/controller/yaml_students.rb +50 -43
- data/example/students_3/controller/yaml_students_controller.rb +100 -87
- data/example/students_3/process/students.rb +161 -97
- data/example/students_3/students.rb +85 -56
- data/example/yaml_students/students.rb +40 -40
- data/example/yaml_students/yaml_students.rb +103 -90
- data/lib/core/core.rb +356 -696
- data/lib/core/core_controller.rb +227 -0
- data/lib/core/core_internal.rb +339 -0
- data/lib/core/core_model.rb +328 -0
- data/lib/core/core_object_data.rb +330 -0
- data/lib/core/core_object_params.rb +230 -0
- data/lib/core/core_process.rb +391 -0
- data/lib/core/core_process_setup.rb +353 -0
- data/lib/core/core_setup_ask.rb +241 -0
- data/lib/core/core_setup_encrypt.rb +146 -0
- data/lib/core/core_setup_init.rb +229 -0
- data/lib/core/core_setup_list.rb +160 -0
- data/lib/core/definition.rb +647 -469
- data/lib/core/definition_internal.rb +264 -308
- data/lib/core/lorj_basecontroller.rb +95 -0
- data/lib/core/lorj_basedefinition.rb +307 -0
- data/lib/core/lorj_baseprocess.rb +265 -0
- data/lib/core/lorj_data.rb +583 -0
- data/lib/core/lorj_keypath.rb +119 -0
- data/lib/core_process/cloud/process/common.rb +63 -0
- data/lib/core_process/cloud/process/connection.rb +93 -0
- data/lib/core_process/cloud/process/external_network.rb +94 -0
- data/lib/core_process/cloud/process/flavor.rb +99 -0
- data/lib/core_process/cloud/process/images.rb +87 -0
- data/lib/core_process/cloud/process/internet_network.rb +34 -0
- data/lib/core_process/cloud/process/internet_server.rb +30 -0
- data/lib/core_process/cloud/process/keypairs.rb +276 -0
- data/lib/core_process/cloud/process/network.rb +108 -0
- data/lib/core_process/cloud/process/public_ip.rb +100 -0
- data/lib/core_process/cloud/process/router.rb +260 -0
- data/lib/core_process/cloud/process/rules.rb +120 -0
- data/lib/core_process/cloud/process/security_groups.rb +121 -0
- data/lib/core_process/cloud/process/server.rb +127 -0
- data/lib/core_process/cloud/process/server_log.rb +35 -0
- data/lib/core_process/cloud/process/subnetwork.rb +108 -0
- data/lib/core_process/cloud_process.rb +30 -0
- data/lib/logging.rb +298 -0
- data/lib/lorj/version.rb +18 -1
- data/lib/lorj.rb +58 -18
- data/lib/lorj_account.rb +556 -0
- data/lib/lorj_config.rb +468 -0
- data/lib/lorj_defaults.rb +278 -0
- data/lib/prc.rb +136 -104
- data/lib/prc_base_config.rb +285 -0
- data/lib/prc_core_config.rb +878 -0
- data/lib/prc_section_config.rb +57 -0
- data/lib/providers/hpcloud/compute.rb +81 -93
- data/lib/providers/hpcloud/hpcloud.rb +462 -0
- data/lib/providers/hpcloud/network.rb +96 -98
- data/lib/providers/hpcloud/security_groups.rb +41 -40
- data/lib/providers/mock/mock.rb +144 -0
- data/lib/providers/openstack/openstack.rb +45 -0
- data/lib/providers/templates/compute.rb +21 -23
- data/lib/providers/templates/mycloud.rb +72 -0
- data/lib/providers/templates/network.rb +11 -12
- data/lib/rh.rb +339 -0
- data/lorj-spec/defaults.yaml +4 -0
- data/lorj.gemspec +6 -0
- data/spec/00_lorj_log_spec.rb +53 -0
- data/spec/01_hash_rh_spec.rb +243 -0
- data/spec/02_prc_base_config_spec.rb +216 -0
- data/spec/04_prc_core_config_spec.rb +83 -0
- data/spec/11_lorj_config_spec.rb +263 -0
- data/spec/12_lorj_account_spec.rb +181 -0
- metadata +76 -28
- data/Gemfile.lock +0 -37
- data/example/students_1/process/Students.rb +0 -20
- data/example/students_2/process/Students.rb +0 -27
- data/example/students_4/controller/yaml_students.rb +0 -82
- data/example/students_4/controller/yaml_students_controller.rb +0 -141
- data/example/students_4/process/students.rb +0 -112
- data/example/students_4/students.rb +0 -103
- data/lib/core/lorj-basecontroller.rb +0 -90
- data/lib/core/lorj-basedefinition.rb +0 -1139
- data/lib/core/lorj-baseprocess.rb +0 -236
- data/lib/core/lorj-data.rb +0 -567
- data/lib/core/lorj-keypath.rb +0 -115
- data/lib/core_process/CloudProcess.rb +0 -337
- data/lib/core_process/global_process.rb +0 -502
- data/lib/core_process/network_process.rb +0 -605
- data/lib/prc-account.rb +0 -339
- data/lib/prc-config.rb +0 -1030
- data/lib/prc-logging.rb +0 -261
- data/lib/providers/hpcloud/Hpcloud.rb +0 -426
- data/lib/providers/mock/Mock.rb +0 -141
- data/lib/providers/openstack/Openstack.rb +0 -47
- data/lib/providers/templates/core.rb +0 -61
- data/spec/forj-account_spec.rb +0 -75
- data/spec/forj-config_spec.rb +0 -196
|
@@ -0,0 +1,95 @@
|
|
|
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
|
+
# Module Lorj which contains several classes.
|
|
19
|
+
#
|
|
20
|
+
# Those classes describes :
|
|
21
|
+
# - processes (BaseProcess) : How to create/delete/edit/query object.
|
|
22
|
+
# - controler (BaseControler) : If a provider is defined, define how will do
|
|
23
|
+
# object creation/etc...
|
|
24
|
+
# - definition(BaseDefinition): Functions to declare objects, query/data mapping
|
|
25
|
+
# and setup
|
|
26
|
+
# this task to make it to work.
|
|
27
|
+
|
|
28
|
+
module Lorj
|
|
29
|
+
# Defining basic Controller functions
|
|
30
|
+
class BaseController
|
|
31
|
+
# Default handlers which needs to be defined by the controller,
|
|
32
|
+
# called by BaseDefinition Create functions.
|
|
33
|
+
def connect(_sObjectType, _hParams)
|
|
34
|
+
process_error 'connect has not been redefined by the controller.'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Default handlers which needs to be defined by the controller,
|
|
38
|
+
# called by BaseDefinition Create functions.
|
|
39
|
+
def create(_sObjectType, _hParams)
|
|
40
|
+
process_error 'create_object has not been redefined by the controller.'
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Default handlers which needs to be defined by the controller,
|
|
44
|
+
# called by BaseDefinition Delete functions.
|
|
45
|
+
def delete(_sObjectType, _hParams)
|
|
46
|
+
process_error 'delete_object has not been redefined by the controller.'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Default handlers which needs to be defined by the controller,
|
|
50
|
+
# called by BaseDefinition Get functions.
|
|
51
|
+
def get(_sObjectType, _sUniqId, _hParams)
|
|
52
|
+
process_error 'get_object has not been redefined by the controller.'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Default handlers which needs to be defined by the controller,
|
|
56
|
+
# called by BaseDefinition Query functions.
|
|
57
|
+
def query(_sObjectType, _sQuery, _hParams)
|
|
58
|
+
process_error 'query_object has not been redefined by the controller.'
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Default handlers which needs to be defined by the controller,
|
|
62
|
+
# called by BaseDefinition Update functions.
|
|
63
|
+
def update(_sObjectType, _oObject, _hParams)
|
|
64
|
+
process_error 'update_object has not been redefined by the controller.'
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Simply raise an error
|
|
68
|
+
#
|
|
69
|
+
# * *Args* :
|
|
70
|
+
# - +Msg+ : Error message to print out.
|
|
71
|
+
# * *Returns* :
|
|
72
|
+
# - nil
|
|
73
|
+
# * *Raises* :
|
|
74
|
+
# - Lorj::PrcError
|
|
75
|
+
def controller_error(msg, *p)
|
|
76
|
+
msg = format(msg, *p)
|
|
77
|
+
runtime_fail '%s: %s', self.class, msg
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# check if required data is loaded. raise an error if not
|
|
81
|
+
#
|
|
82
|
+
# * *Args* :
|
|
83
|
+
# - +Params+ : Lorj::ObjectData object for controller.
|
|
84
|
+
# - +key+ : Key to check.
|
|
85
|
+
# * *Returns* :
|
|
86
|
+
# - nil
|
|
87
|
+
# * *Raises* :
|
|
88
|
+
# - +Error+ if the key do not exist.
|
|
89
|
+
def required?(oParams, *key)
|
|
90
|
+
return if oParams.exist?(key)
|
|
91
|
+
|
|
92
|
+
runtime_fail '%s: %s is not set.', self.class, key
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,307 @@
|
|
|
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
|
+
# Module Lorj which contains several classes.
|
|
18
|
+
#
|
|
19
|
+
# Those classes describes :
|
|
20
|
+
# - processes (BaseProcess) : How to create/delete/edit/query object.
|
|
21
|
+
# - controler (BaseControler) : If a provider is defined, define how will do
|
|
22
|
+
# object creation/etc...
|
|
23
|
+
# - definition(BaseDefinition): Functions to declare objects, query/data mapping
|
|
24
|
+
# and setup
|
|
25
|
+
# this task to make it to work.
|
|
26
|
+
|
|
27
|
+
module Lorj
|
|
28
|
+
# This class limits ERC template to access only to config object data.
|
|
29
|
+
class ERBConfig
|
|
30
|
+
attr_reader :config
|
|
31
|
+
|
|
32
|
+
def initialize(config)
|
|
33
|
+
@config = config
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Bind this limited class with ERB templates
|
|
37
|
+
def get_binding # rubocop: disable AccessorMethodName
|
|
38
|
+
binding
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Following class defines class levels function to
|
|
43
|
+
# declare framework objects.
|
|
44
|
+
# As each process needs to define new object to deal with
|
|
45
|
+
# require that process to define it with definition functions
|
|
46
|
+
# See definition.rb for functions to use.
|
|
47
|
+
class BaseDefinition
|
|
48
|
+
# Initialize Lorj BaseDefinition object
|
|
49
|
+
def initialize(oForjConfig, process, controller = nil)
|
|
50
|
+
# Object Data object. Contains all loaded object data.
|
|
51
|
+
# This object is used to build hParams as well.
|
|
52
|
+
@object_data = ObjectData.new(true)
|
|
53
|
+
#
|
|
54
|
+
@runtime_context = {
|
|
55
|
+
:oCurrentObj => nil
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@config = oForjConfig
|
|
59
|
+
@erb_config = ERBConfig.new(oForjConfig)
|
|
60
|
+
fail Lorj::PrcError.new, "'%s' is not a valid ForjAccount or ForjConfig"\
|
|
61
|
+
' Object.',
|
|
62
|
+
[oForjConfig.class] if
|
|
63
|
+
!oForjConfig.is_a?(Lorj::Account) &&
|
|
64
|
+
|
|
65
|
+
!oForjConfig.is_a?(Lorj::Config)
|
|
66
|
+
|
|
67
|
+
@controller = controller
|
|
68
|
+
if controller
|
|
69
|
+
runtime_fail "'%s' is not a valid ForjProvider Object type.",
|
|
70
|
+
controller.class unless controller.is_a?(BaseController)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
@process = process
|
|
74
|
+
fail Lorj::PrcError.new, "'%s' is not a valid BaseProcess Object type.",
|
|
75
|
+
[process.class] unless process.is_a?(BaseProcess)
|
|
76
|
+
|
|
77
|
+
@process.base_object(self)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# ------------------------------------------------------
|
|
81
|
+
# Functions used by processes functions
|
|
82
|
+
# ------------------------------------------------------
|
|
83
|
+
# Ex: object.set_data(...)
|
|
84
|
+
# config
|
|
85
|
+
|
|
86
|
+
# Function to manipulate the config object.
|
|
87
|
+
# 2 kind of functions:
|
|
88
|
+
# - set (key, value) and []=(key, value)
|
|
89
|
+
# From processes, you can set a runtime data with:
|
|
90
|
+
# config.set(key, value)
|
|
91
|
+
# OR
|
|
92
|
+
# config[key] = value
|
|
93
|
+
#
|
|
94
|
+
# - get (key, default) and [](key, default)
|
|
95
|
+
# default is an optional value.
|
|
96
|
+
# From processes, you can get a data (runtime/account/config.yaml or
|
|
97
|
+
# defaults.yaml) with:
|
|
98
|
+
# config.get(key)
|
|
99
|
+
# OR
|
|
100
|
+
# config[key]
|
|
101
|
+
|
|
102
|
+
def config
|
|
103
|
+
fail Lorj::PrcError.new, 'No config object loaded.' unless @config
|
|
104
|
+
@config
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def format_query(sObjectType, oControlerObject, hQuery)
|
|
108
|
+
{
|
|
109
|
+
:object => oControlerObject,
|
|
110
|
+
:object_type => :object_list,
|
|
111
|
+
:list_type => sObjectType,
|
|
112
|
+
:list => [],
|
|
113
|
+
:query => hQuery
|
|
114
|
+
}
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def format_object(object_type, oMiscObject)
|
|
118
|
+
return nil unless [String, Symbol].include?(object_type.class)
|
|
119
|
+
|
|
120
|
+
object_type = object_type.to_sym if object_type.class == String
|
|
121
|
+
|
|
122
|
+
{ :object_type => object_type,
|
|
123
|
+
:attrs => {},
|
|
124
|
+
:object => oMiscObject
|
|
125
|
+
}
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def get_data_metadata(sKey)
|
|
129
|
+
_get_meta_data(sKey)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Before doing a query, mapping fields
|
|
133
|
+
# Transform Object query field to Provider query Fields
|
|
134
|
+
def _query_map(object_type, hParams)
|
|
135
|
+
return {} unless hParams
|
|
136
|
+
|
|
137
|
+
object_type = object_type.to_sym if object_type.class == String
|
|
138
|
+
|
|
139
|
+
result = {}
|
|
140
|
+
maps = PrcLib.model.meta_obj.rh_get(object_type, :query_mapping)
|
|
141
|
+
hParams.each do |key, value|
|
|
142
|
+
key_path_obj = KeyPath.new(key)
|
|
143
|
+
key_path = key_path_obj.fpath
|
|
144
|
+
PrcLib.runtime_fail "Forj query field '%s.%s' not defined by class"\
|
|
145
|
+
" '%s'.\n#{ANSI.bold}ACTION REQUIRED#{ANSI.clear}"\
|
|
146
|
+
":\nMissing data model 'def_attribute' or "\
|
|
147
|
+
"'def_query_attribute' for '%s'??? "\
|
|
148
|
+
"Check the object '%s' data model.",
|
|
149
|
+
object_type, key_path_obj.key,
|
|
150
|
+
self.class, key_path_obj.key,
|
|
151
|
+
object_type unless maps.key?(key_path_obj.fpath)
|
|
152
|
+
map_path = KeyPath.new(maps[key_path_obj.fpath])
|
|
153
|
+
value_mapping = PrcLib.model.meta_obj.rh_get(object_type,
|
|
154
|
+
:value_mapping, key_path)
|
|
155
|
+
if value_mapping
|
|
156
|
+
PrcLib.runtime_fail "'%s.%s': No value mapping for '%s'",
|
|
157
|
+
object_type, key_path_obj.key,
|
|
158
|
+
value unless value_mapping.rh_exist?(value)
|
|
159
|
+
|
|
160
|
+
result.rh_set(value_mapping[value], map_path.tree)
|
|
161
|
+
else
|
|
162
|
+
result.rh_set(value, map_path.tree)
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
result
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Obsolete. Used by the Process.
|
|
169
|
+
# Ask controller get_attr to get a data
|
|
170
|
+
# The result is the data of a defined data attribute.
|
|
171
|
+
# If the value is normally mapped (value mapped), the value is
|
|
172
|
+
# returned as a recognized data attribute value.
|
|
173
|
+
# def get_attr(oObject, key)
|
|
174
|
+
# fail Lorj::PrcError.new, "'%s' is not a valid Object type. " % [oObject.
|
|
175
|
+
# class] if !oObject.is_a?(Hash) &&
|
|
176
|
+
# ! oObject.rh_exist?(:object_type)
|
|
177
|
+
# sCloudObj = oObject[:object_type]
|
|
178
|
+
# oKeyPath = KeyPath.new(key)
|
|
179
|
+
# fail Lorj::PrcError.new, "'%s' key is not declared as data of '%s' "\
|
|
180
|
+
# 'CloudObject. You may need to add obj_needs...'
|
|
181
|
+
# % [oKeyPath.key, sCloudObj] if PrcLib.model.meta_obj.rh_exist?(sClou
|
|
182
|
+
# dObj, :returns, oKeyPath.fpath) != 3
|
|
183
|
+
# begin
|
|
184
|
+
# oMapPath = KeyPath.new PrcLib.model.meta_obj.rh_get(sCloudObj, :
|
|
185
|
+
# returns, oKeyPath.fpath)
|
|
186
|
+
# hMap = oMapPath.fpath
|
|
187
|
+
# value = @controller.get_attr(get_cObject(oObject), hMap)
|
|
188
|
+
|
|
189
|
+
# hValueMapping = PrcLib.model.meta_obj.rh_get(sCloudObj, :value_m
|
|
190
|
+
# apping, oKeyPath.fpath)
|
|
191
|
+
|
|
192
|
+
# if hValueMapping
|
|
193
|
+
# hValueMapping.each do | found_key, found_value |
|
|
194
|
+
# if found_value == value
|
|
195
|
+
# value = found_key
|
|
196
|
+
# break
|
|
197
|
+
# end
|
|
198
|
+
# end
|
|
199
|
+
# end
|
|
200
|
+
# rescue => e
|
|
201
|
+
# raise Lorj::PrcError.new, "'%s.get_attr' fails to provide value of '%s'
|
|
202
|
+
# " % [oProvider.class, key]
|
|
203
|
+
# end
|
|
204
|
+
# end
|
|
205
|
+
|
|
206
|
+
# Register the object to the internal @object_data instance
|
|
207
|
+
def register(oObject, sObjectType = nil, sDataType = :object)
|
|
208
|
+
if oObject.is_a?(Lorj::Data)
|
|
209
|
+
data_objects = oObject
|
|
210
|
+
else
|
|
211
|
+
runtime_fail "Unable to register an object '%s' "\
|
|
212
|
+
'as Lorj::Data object if ObjectType is not given.',
|
|
213
|
+
oObject.class unless sObjectType
|
|
214
|
+
data_objects = Lorj::Data.new(sDataType)
|
|
215
|
+
data_objects.set(oObject, sObjectType) do | sObjType, oControlerObject |
|
|
216
|
+
_return_map(sObjType, oControlerObject)
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
@object_data.add data_objects
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def data_objects(sObjectType, *key)
|
|
223
|
+
@object_data[sObjectType, key]
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# get an attribute/object/... from an object.
|
|
227
|
+
def get_data(oObj, *key)
|
|
228
|
+
if oObj.is_a?(Hash) && oObj.key?(:object_type)
|
|
229
|
+
object_data = ObjectData.new
|
|
230
|
+
object_data << oObj
|
|
231
|
+
else
|
|
232
|
+
object_data = @object_data
|
|
233
|
+
end
|
|
234
|
+
object_data[oObj, *key]
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
# ~ def hParams(sCloudObj, hParams)
|
|
238
|
+
# ~ aParams = _get_object_params(sCloudObj, ":ObjectData.hParams")
|
|
239
|
+
# ~ end
|
|
240
|
+
|
|
241
|
+
# def get_cObject(oObject)
|
|
242
|
+
# return nil unless oObject.rh_exist?(:object)
|
|
243
|
+
# oObject.rh_get(:object)
|
|
244
|
+
# end
|
|
245
|
+
|
|
246
|
+
private
|
|
247
|
+
|
|
248
|
+
# -------------------------------------------------------------------------
|
|
249
|
+
# Functions available for Process to communicate with the controler Object
|
|
250
|
+
# -------------------------------------------------------------------------
|
|
251
|
+
# def cloud_obj_requires(sCloudObj, res = {})
|
|
252
|
+
# aCaller = caller
|
|
253
|
+
# aCaller.pop
|
|
254
|
+
|
|
255
|
+
# return res if @object_data.exist?(sCloudObj)
|
|
256
|
+
# # ~ return res if Lorj::rh_exist?(@CloudData, sCloudObj)
|
|
257
|
+
|
|
258
|
+
# PrcLib.model.meta_obj.rh_get(sCloudObj, :params).each do |
|
|
259
|
+
# key, hParams|
|
|
260
|
+
# case hParams[:type]
|
|
261
|
+
# when :data
|
|
262
|
+
# if hParams.key?(:array)
|
|
263
|
+
# hParams[:array].each do | aElem |
|
|
264
|
+
# aElem = aElem.clone
|
|
265
|
+
# aElem.pop # Do not go until last level, as used to loop next.
|
|
266
|
+
# hParams.rh_get(aElem).each do | subkey, _hSubParam |
|
|
267
|
+
# next if aElem.length == 0 && [:array, :type].include?(subkey)
|
|
268
|
+
# if hSubParams[:required] && @config.get(subkey).nil?
|
|
269
|
+
# res[subkey] = hSubParams
|
|
270
|
+
# end
|
|
271
|
+
# end
|
|
272
|
+
# end
|
|
273
|
+
# else
|
|
274
|
+
# if hParams[:required] && @config.get(key).nil?
|
|
275
|
+
# res[key] = hParams
|
|
276
|
+
# end
|
|
277
|
+
# end
|
|
278
|
+
# when :CloudObject
|
|
279
|
+
# if hParams[:required] && !@object_data.exist?(sCloudObj)
|
|
280
|
+
# res[key] = hParams
|
|
281
|
+
# cloud_obj_requires(key, res)
|
|
282
|
+
# end
|
|
283
|
+
# end
|
|
284
|
+
# end
|
|
285
|
+
# res
|
|
286
|
+
# end
|
|
287
|
+
|
|
288
|
+
def get_object(sCloudObj)
|
|
289
|
+
# ~ return nil unless Lorj::rh_exist?(@CloudData, sCloudObj)
|
|
290
|
+
return nil unless @object_data.exist?(sCloudObj)
|
|
291
|
+
@object_data[sCloudObj, :ObjectData]
|
|
292
|
+
# ~ Lorj::rh_get(@CloudData, sCloudObj)
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
# def objectExist?(sCloudObj)
|
|
296
|
+
# @object_data.exist?(sCloudObj)
|
|
297
|
+
# # ~ !(Lorj::rh_exist?(@CloudData, sCloudObj))
|
|
298
|
+
# end
|
|
299
|
+
|
|
300
|
+
# def get_forjKey(sCloudObj, key)
|
|
301
|
+
# return nil unless @object_data.exist?(sCloudObj)
|
|
302
|
+
# @object_data[sCloudObj, :attrs, key]
|
|
303
|
+
# # ~ return nil unless Lorj::rh_exist?(oCloudData, sCloudObj)
|
|
304
|
+
# # ~ Lorj::rh_get(oCloudData, sCloudObj, :attrs, key)
|
|
305
|
+
# end
|
|
306
|
+
end
|
|
307
|
+
end
|
|
@@ -0,0 +1,265 @@
|
|
|
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
|
+
# Module Lorj which contains several classes.
|
|
19
|
+
#
|
|
20
|
+
# Those classes describes :
|
|
21
|
+
# - processes (BaseProcess) : How to create/delete/edit/query object.
|
|
22
|
+
# - controler (BaseControler) : If a provider is defined, define how will do
|
|
23
|
+
# object creation/etc...
|
|
24
|
+
# - definition(BaseDefinition): Functions to declare objects, query/data mapping
|
|
25
|
+
# and setup
|
|
26
|
+
# this task to make it to work.
|
|
27
|
+
|
|
28
|
+
module Lorj
|
|
29
|
+
# class describing generic Object Process
|
|
30
|
+
# with controller calls
|
|
31
|
+
class BaseProcess
|
|
32
|
+
def initialize
|
|
33
|
+
@definition = nil
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Simply raise an error
|
|
37
|
+
#
|
|
38
|
+
# * *Args* :
|
|
39
|
+
# - +Msg+ : Error message to print out.
|
|
40
|
+
# * *Returns* :
|
|
41
|
+
# - nil
|
|
42
|
+
# * *Raises* :
|
|
43
|
+
# - Lorj::PrcError
|
|
44
|
+
def process_error(msg, *p)
|
|
45
|
+
msg = format(msg, *p)
|
|
46
|
+
runtime_fail '%s: %s', self.class, msg
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
attr_writer :base_object
|
|
50
|
+
|
|
51
|
+
def controller_connect(sObjectType, hParams = {})
|
|
52
|
+
fail Lorj::PrcError.new, 'No Controler object loaded.' unless @definition
|
|
53
|
+
@definition.controller_connect(sObjectType, hParams)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def controller_create(sObjectType, hParams = {})
|
|
57
|
+
fail Lorj::PrcError.new, 'No Controler object loaded.' unless @definition
|
|
58
|
+
@definition.controller_create(sObjectType, hParams)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def controller_query(sObjectType, sQuery, hParams = {})
|
|
62
|
+
fail Lorj::PrcError.new, 'No Controler object loaded.' unless @definition
|
|
63
|
+
@definition.controller_query(sObjectType, sQuery, hParams)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def controller_update(sObjectType, hParams = {})
|
|
67
|
+
fail Lorj::PrcError.new, 'No Controler object loaded.' unless @definition
|
|
68
|
+
@definition.controller_update(sObjectType, hParams)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def controller_delete(sObjectType, hParams = {})
|
|
72
|
+
fail Lorj::PrcError.new, 'No Controler object loaded.' unless @definition
|
|
73
|
+
@definition.controller_delete(sObjectType, hParams)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def controller_get(sObjectType, sId, hParams = {})
|
|
77
|
+
fail Lorj::PrcError.new, 'No Controler object loaded.' unless @definition
|
|
78
|
+
@definition.controller_get(sObjectType, sId, hParams)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# class describing generic Object Process
|
|
83
|
+
# with process calls
|
|
84
|
+
class BaseProcess
|
|
85
|
+
def process_create(sObjectType)
|
|
86
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
87
|
+
@definition.process_create(sObjectType)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def process_query(sObjectType, sQuery)
|
|
91
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
92
|
+
@definition.process_query(sObjectType, sQuery)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def process_update(sObjectType)
|
|
96
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
97
|
+
@definition.process_update(sObjectType)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def process_get(sObjectType, sId)
|
|
101
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
102
|
+
@definition.process_get(sObjectType, sId)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def process_delete(sObjectType)
|
|
106
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
107
|
+
@definition.process_delete(sObjectType)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# class describing generic Object Process
|
|
112
|
+
# with additionnal functions
|
|
113
|
+
class BaseProcess
|
|
114
|
+
private
|
|
115
|
+
|
|
116
|
+
def query_cache_cleanup(sObjectType)
|
|
117
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
118
|
+
@definition.query_cleanup(sObjectType)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def object_cache_cleanup(sObjectType)
|
|
122
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
123
|
+
@definition.object_cleanup(sObjectType)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def controler
|
|
127
|
+
PrcLib.warning('controler object call is obsolete. Please update your'\
|
|
128
|
+
" code. Use controller_<action> instead.\n%s", caller)
|
|
129
|
+
fail Lorj::PrcError.new, 'No Controler object loaded.' unless @definition
|
|
130
|
+
@definition
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def object
|
|
134
|
+
PrcLib.warning('object call is obsolete. Please update your code.'\
|
|
135
|
+
"Use <Action> instead.\n%s", caller)
|
|
136
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
137
|
+
@definition
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def format_object(sObjectType, oMiscObj)
|
|
141
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
142
|
+
@definition.format_object(sObjectType, oMiscObj)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def format_query(sObjectType, oMiscObj, hQuery)
|
|
146
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
147
|
+
@definition.format_list(sObjectType, oMiscObj, hQuery)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def data_objects(sObjectType, *key)
|
|
151
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
152
|
+
@definition.data_objects(sObjectType, *key)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def get_data(oObj, *key)
|
|
156
|
+
PrcLib.warning('get_data call is obsolete. Please update your code. '\
|
|
157
|
+
"Use [] instead.\n%s", caller)
|
|
158
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
159
|
+
@definition.get_data(oObj, :attrs, key)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def register(oObject, sObjectType = nil)
|
|
163
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
164
|
+
@definition.register(oObject, sObjectType)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def config
|
|
168
|
+
fail Lorj::PrcError.new, 'No Base object loaded.' unless @definition
|
|
169
|
+
@definition.config
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def query_single(sCloudObj, list, sQuery, name, sInfoMsg = {})
|
|
173
|
+
list = controller_query(sCloudObj, sQuery)
|
|
174
|
+
|
|
175
|
+
info = _qs_info_init(sInfoMsg)
|
|
176
|
+
|
|
177
|
+
case list.length
|
|
178
|
+
when 0
|
|
179
|
+
PrcLib.info(info[:notfound], sCloudObj, name)
|
|
180
|
+
list
|
|
181
|
+
when 1
|
|
182
|
+
Lorj.debug(2, info[:checkmatch], sCloudObj, name)
|
|
183
|
+
|
|
184
|
+
_qs_check_match(list, sQuery)
|
|
185
|
+
|
|
186
|
+
if list.length == 0
|
|
187
|
+
PrcLib.info(info[:nomatch], sCloudObj, name)
|
|
188
|
+
return list
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
item = _qs_info(list, info[:items], info[:items_form])
|
|
192
|
+
|
|
193
|
+
PrcLib.info(info[:found], sCloudObj, item)
|
|
194
|
+
|
|
195
|
+
list
|
|
196
|
+
else
|
|
197
|
+
Lorj.debug(2, info[:more], sCloudObj, name)
|
|
198
|
+
# Looping to find the one corresponding
|
|
199
|
+
_qs_check_match(list, sQuery)
|
|
200
|
+
|
|
201
|
+
if list.length == 0
|
|
202
|
+
PrcLib.info(info[:notfound], sCloudObj, name)
|
|
203
|
+
return list
|
|
204
|
+
end
|
|
205
|
+
item = _qs_info(list, info[:items], info[:items_form])
|
|
206
|
+
PrcLib.info(info[:found], sCloudObj, item)
|
|
207
|
+
|
|
208
|
+
list
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# internal functions
|
|
214
|
+
class BaseProcess
|
|
215
|
+
private
|
|
216
|
+
|
|
217
|
+
def _qs_info(list, items, items_form)
|
|
218
|
+
items_built = []
|
|
219
|
+
if items.is_a?(Array)
|
|
220
|
+
items.each do | key |
|
|
221
|
+
items_built << list[0, key]
|
|
222
|
+
end
|
|
223
|
+
else
|
|
224
|
+
items_built << list[0, items]
|
|
225
|
+
end
|
|
226
|
+
format(items_form, items_built)
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def _qs_check_match(list, sQuery)
|
|
230
|
+
list.each do | oElem |
|
|
231
|
+
is_found = true
|
|
232
|
+
sQuery.each do | key, value |
|
|
233
|
+
if oElem[key] != value
|
|
234
|
+
is_found = false
|
|
235
|
+
break
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
:remove unless is_found
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# qs_info_init is not omplex as well described. Disabling rubocop
|
|
243
|
+
# rubocop: disable PerceivedComplexity, CyclomaticComplexity
|
|
244
|
+
|
|
245
|
+
def _qs_info_init(sInfoMsg)
|
|
246
|
+
info = {
|
|
247
|
+
:notfound => "No %s '%s' found",
|
|
248
|
+
:checkmatch => "Found 1 %s. checking exact match for '%s'.",
|
|
249
|
+
:nomatch => "No %s '%s' match",
|
|
250
|
+
:found => "Found %s '%s'.",
|
|
251
|
+
:more => "Found several %s. Searching for '%s'.",
|
|
252
|
+
:items_form => '%s',
|
|
253
|
+
:items => [:name]
|
|
254
|
+
}
|
|
255
|
+
info[:notfound] = sInfoMsg[:notfound] if sInfoMsg.key?(:notfound)
|
|
256
|
+
info[:checkmatch] = sInfoMsg[:checkmatch] if sInfoMsg.key?(:checkmatch)
|
|
257
|
+
info[:nomatch] = sInfoMsg[:nomatch] if sInfoMsg.key?(:nomatch)
|
|
258
|
+
info[:found] = sInfoMsg[:found] if sInfoMsg.key?(:found)
|
|
259
|
+
info[:more] = sInfoMsg[:more] if sInfoMsg.key?(:more)
|
|
260
|
+
info[:items] = sInfoMsg[:items] if sInfoMsg.key?(:items)
|
|
261
|
+
info[:items_form] = sInfoMsg[:items_form] if sInfoMsg.key?(:items_form)
|
|
262
|
+
info
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
end
|