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
data/lib/core/definition.rb
CHANGED
|
@@ -15,498 +15,676 @@
|
|
|
15
15
|
# See the License for the specific language governing permissions and
|
|
16
16
|
# limitations under the License.
|
|
17
17
|
|
|
18
|
+
# rubocop: disable Metrics/AbcSize
|
|
19
|
+
|
|
18
20
|
# Module Lorj which contains several classes.
|
|
19
21
|
#
|
|
20
22
|
# Those classes describes :
|
|
21
23
|
# - processes (BaseProcess) : How to create/delete/edit/query object.
|
|
22
|
-
# - controler (BaseControler) : If a provider is defined, define how will do
|
|
23
|
-
#
|
|
24
|
+
# - controler (BaseControler) : If a provider is defined, define how will do
|
|
25
|
+
# object creation/etc...
|
|
26
|
+
# - definition(BaseDefinition): Functions to declare objects, query/data mapping
|
|
27
|
+
# and setup
|
|
24
28
|
# this task to make it to work.
|
|
25
29
|
module Lorj
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
# :account: Optional. default: False
|
|
80
|
-
# => setup will configure the account with this <Data>
|
|
81
|
-
# :ask_sort: Number which represents the ask order in the step group. (See /:setup/:ask_step for details)
|
|
82
|
-
# :after: <Data> Name of the previous <Data> to ask before the current one.
|
|
83
|
-
# :depends_on:
|
|
84
|
-
# => Identify :data type required to be set before the current one.
|
|
85
|
-
# :default_value: Default value at setup time. This is not necessarily the Application default value (See /:default)
|
|
86
|
-
# :validate: Regular expression to validate end user input during setup.
|
|
87
|
-
# :value_mapping: list of values to map as defined by the controller
|
|
88
|
-
# :controller: mapping for get controller value from process values
|
|
89
|
-
# <value> : <map> value map equivalence. See data_value_mapping function
|
|
90
|
-
# :process: mapping for get process value from controller values
|
|
91
|
-
# <value> : <map> value map equivalence. See data_value_mapping function
|
|
92
|
-
# :defaut: Default value
|
|
93
|
-
# :list_values: Defines a list of valid values for the current data.
|
|
94
|
-
# :query_type :controller_call to execute a function defined in the controller object.
|
|
95
|
-
# :process_call to execute a function defined in the process object.
|
|
96
|
-
# :values to get list of values from :values.
|
|
97
|
-
# :object Object to load before calling the function. Only :query_type = :*_call
|
|
98
|
-
# :query_call Symbol. function name to call. Only :query_type = :*_call
|
|
99
|
-
# function must return an Array.
|
|
100
|
-
# :query_params Hash. Controler function parameters. Only :query_type = :*_call
|
|
101
|
-
# :validate :list_strict. valid only if value is one of those listed.
|
|
102
|
-
# :values:
|
|
103
|
-
# to retrieve from.
|
|
104
|
-
# otherwise define simply a list of possible values.
|
|
105
|
-
# :ask_step: Step number. By default, setup will determine the step, thanks to meta lorj object dependencies tree.
|
|
106
|
-
# This number start at 0. Each step can be defined by /:setup/:ask_step/<steps> list.
|
|
107
|
-
#
|
|
108
|
-
# :setup: This section describes group of fields to ask, step by step.
|
|
109
|
-
# :ask_step: Define an Array of setup steps to ask to the end user. The step order is respected, and start at 0
|
|
110
|
-
# - :desc: Define the step description. ERB template enable. To get config data, type config[...]
|
|
111
|
-
# :explanation: |- Define a multiline explanation. This is printed out in brown color.
|
|
112
|
-
# ERB template enable. To get config data, type <%= config[...] %>
|
|
113
|
-
# :add: Define a list of additionnal fields to ask.
|
|
114
|
-
# - <Data> Data to ask.
|
|
115
|
-
#
|
|
116
|
-
# :default: List of <Data> application default values.
|
|
117
|
-
# <Data> : Value to use at the config application level.
|
|
118
|
-
@@meta_data = {}
|
|
119
|
-
|
|
120
|
-
# The Generic Process can pre-define some data and value (function predefine_data)
|
|
121
|
-
# The Generic Process (and external framework call) only knows about Generic data.
|
|
122
|
-
# information used
|
|
123
|
-
#
|
|
124
|
-
@@meta_predefined_values = {}
|
|
125
|
-
|
|
126
|
-
# <Data>: Data name
|
|
127
|
-
# :values: List of possible values
|
|
128
|
-
# <Value>: Value Name attached to the data
|
|
129
|
-
# options: Options
|
|
130
|
-
# :desc: Description of that predefine value.
|
|
131
|
-
|
|
132
|
-
@@Context = {
|
|
133
|
-
:oCurrentObj => nil, # Defines the Current Object to manipulate
|
|
134
|
-
:needs_optional => nil, # set optional to true for any next needs declaration
|
|
135
|
-
:ClassProcess => nil # Current Process Class declaration
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
# Available functions for:
|
|
139
|
-
# - BaseDefinition class declaration
|
|
140
|
-
# - Controler (derived from BaseDefinition) class declaration
|
|
141
|
-
|
|
142
|
-
@@query_auto_map = false
|
|
143
|
-
|
|
144
|
-
def self.current_process (cProcessClass)
|
|
145
|
-
@@Context[:ClassProcess] = cProcessClass
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
def self.obj_needs_optional
|
|
149
|
-
@@Context[:needs_optional] = true
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
def self.obj_needs_requires
|
|
153
|
-
@@Context[:needs_optional] = false
|
|
30
|
+
# Global Process functions
|
|
31
|
+
class BaseDefinition
|
|
32
|
+
# Process declaration
|
|
33
|
+
# Defines current Process context
|
|
34
|
+
#
|
|
35
|
+
# parameters:
|
|
36
|
+
# - +process_class+ : Process Class object.
|
|
37
|
+
#
|
|
38
|
+
def self.current_process(cProcessClass)
|
|
39
|
+
PrcLib.model.heap true
|
|
40
|
+
PrcLib.model.process_context(cProcessClass)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Process declaration
|
|
44
|
+
# Set obj_needs requirement setting to false
|
|
45
|
+
#
|
|
46
|
+
def self.obj_needs_optional
|
|
47
|
+
PrcLib.model.heap true
|
|
48
|
+
PrcLib.model.needs_optional true
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Process declaration
|
|
52
|
+
# Set obj_needs requirement setting to True
|
|
53
|
+
#
|
|
54
|
+
def self.obj_needs_requires
|
|
55
|
+
PrcLib.model.heap true
|
|
56
|
+
PrcLib.model.needs_optional false
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Process declaration
|
|
60
|
+
# Defines default process options
|
|
61
|
+
#
|
|
62
|
+
# parameters:
|
|
63
|
+
# - +options+ : Supported options are:
|
|
64
|
+
# - use_controller : Boolean. True if the model require a controller
|
|
65
|
+
# False otherwise. Default is true.
|
|
66
|
+
#
|
|
67
|
+
def self.process_default(hOptions)
|
|
68
|
+
PrcLib.model.heap true
|
|
69
|
+
supported_options = [:use_controller]
|
|
70
|
+
unless hOptions.nil?
|
|
71
|
+
hOptions.each_key do | key |
|
|
72
|
+
case key
|
|
73
|
+
when :use_controller
|
|
74
|
+
value = hOptions.rh_get(:use_controller)
|
|
75
|
+
next unless value.boolean?
|
|
76
|
+
PrcLib.model[key] = hOptions[key]
|
|
77
|
+
else
|
|
78
|
+
PrcLib.dcl_fail("Unknown default process options '%s'. "\
|
|
79
|
+
"Supported are '%s'",
|
|
80
|
+
key, supported_options.join(','))
|
|
81
|
+
end
|
|
82
|
+
end
|
|
154
83
|
end
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Base definition class for Process declaration
|
|
88
|
+
class BaseDefinition
|
|
89
|
+
# Application process or controller to defines an object.
|
|
90
|
+
#
|
|
91
|
+
# The context will be set by this definition for next declaration.
|
|
92
|
+
# Depending on the context, define_obj is not used identically:
|
|
93
|
+
#
|
|
94
|
+
# *Context* : Application Process
|
|
95
|
+
# 'define_obj' is the first object declaration. It sets the object context
|
|
96
|
+
# for next declaration.
|
|
97
|
+
# At least it needs to create an handler or define it with :nohandler: true
|
|
98
|
+
#
|
|
99
|
+
# Usually, this definition is followed by:
|
|
100
|
+
# - def_attribute : Object attribute list
|
|
101
|
+
# - obj_needs : Handler parameters needs
|
|
102
|
+
# - undefine_attribute : Remove predefined attributes.
|
|
103
|
+
# - def_query_attribute: Query attribute definition
|
|
104
|
+
#
|
|
105
|
+
# *Context*: Controller
|
|
106
|
+
#
|
|
107
|
+
# A controller uses define_obj to update an existing object.
|
|
108
|
+
# A controller can create a new object, only if the controller
|
|
109
|
+
# defines specific process.
|
|
110
|
+
#
|
|
111
|
+
# Usually, this definition is followed by:
|
|
112
|
+
# - query_mapping : Adapt query attribute to match controller query
|
|
113
|
+
# settings
|
|
114
|
+
# - obj_needs : Adapt needed parameters, and/or set mapping.
|
|
115
|
+
# - def_hdata : Define Controller Hash parameter, for handlers.
|
|
116
|
+
# - def_attr_mapping : Define object attribute mapping.
|
|
117
|
+
# - data_value_mapping: Define Data model values mapping.
|
|
118
|
+
#
|
|
119
|
+
def self.define_obj(obj_type_name, handlers = nil)
|
|
120
|
+
return nil unless [NilClass, String, Symbol].include?(obj_type_name.class)
|
|
121
|
+
PrcLib.model.heap true
|
|
122
|
+
|
|
123
|
+
obj_type_name = obj_type_name.to_sym if obj_type_name.is_a?(String)
|
|
124
|
+
|
|
125
|
+
handlers = {} unless handlers.is_a?(Hash)
|
|
126
|
+
|
|
127
|
+
lorj_object = PrcLib.model.meta_obj.rh_get(obj_type_name)
|
|
128
|
+
|
|
129
|
+
# Checking handlers_options data
|
|
130
|
+
handlers = _verify_handlers(obj_type_name, lorj_object, handlers)
|
|
131
|
+
|
|
132
|
+
if lorj_object.nil?
|
|
133
|
+
lorj_object = _define_obj_initialize(obj_type_name, handlers)
|
|
134
|
+
PrcLib.model.meta_obj.rh_set(lorj_object, obj_type_name)
|
|
171
135
|
end
|
|
172
136
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
# Those function are predefined in ForjController
|
|
232
|
-
# The Provider needs to derive from ForjController and redefine those functions.
|
|
233
|
-
oCloudObj[:lambdas][key] = key
|
|
234
|
-
else
|
|
235
|
-
# If needed, ForjProviver redefined can contains some additionnal functions
|
|
236
|
-
# to call.
|
|
237
|
-
oCloudObj[:lambdas][key] = hParam[key]
|
|
238
|
-
end
|
|
239
|
-
}
|
|
240
|
-
Lorj::rhSet(@@meta_obj, oCloudObj, sCloudObj)
|
|
137
|
+
PrcLib.model.object_context(:object => obj_type_name)
|
|
138
|
+
|
|
139
|
+
_handler_settings(lorj_object, handlers)
|
|
140
|
+
|
|
141
|
+
nil
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Application process to defines query attributes.
|
|
145
|
+
def self.def_query_attribute(key)
|
|
146
|
+
PrcLib.model.heap true
|
|
147
|
+
query_mapping(key, key)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Available functions exclusively for Controller (derived from
|
|
151
|
+
# BaseDefinition) class declaration
|
|
152
|
+
|
|
153
|
+
# Following functions are related to Object Attributes
|
|
154
|
+
# ----------------------------------------------------
|
|
155
|
+
|
|
156
|
+
# Function to declare handlers data/object needs.
|
|
157
|
+
# Used by application process declaration and controller declaration
|
|
158
|
+
# to defines the object data needs or sub-object dependency.
|
|
159
|
+
#
|
|
160
|
+
# The application process declare global objects/data dependency
|
|
161
|
+
# while the controller can complete it with any needed other object/data
|
|
162
|
+
# as required by the controller code.
|
|
163
|
+
#
|
|
164
|
+
# Ex: A process can define a generic connection object.
|
|
165
|
+
# define_obj :connection
|
|
166
|
+
# obj_needs :data, :user, :for => [:create_e]
|
|
167
|
+
# obj_needs :data, :passwd, :for => [:create_e]
|
|
168
|
+
#
|
|
169
|
+
# The controller can add several other needs, specifically
|
|
170
|
+
# to this controller.
|
|
171
|
+
#
|
|
172
|
+
# define_obj :connection
|
|
173
|
+
# obj_needs :data, :user, mapping => :username
|
|
174
|
+
# obj_needs :data, :uri
|
|
175
|
+
#
|
|
176
|
+
# Requires Object context
|
|
177
|
+
#
|
|
178
|
+
# parameters:
|
|
179
|
+
# - +type+ : :data or :object requirement
|
|
180
|
+
# - +name+ : Name of the data or the object.
|
|
181
|
+
# - +options+ : Possible options
|
|
182
|
+
# - :for : Array: requirement for a limited list of handler.
|
|
183
|
+
# By default, all handlers requires this data or object.
|
|
184
|
+
def self.obj_needs(type, name, options = {})
|
|
185
|
+
return nil unless [String, Symbol].include?(type.class)
|
|
186
|
+
return nil unless [String, Symbol, Array].include?(name.class)
|
|
187
|
+
PrcLib.model.heap true
|
|
188
|
+
|
|
189
|
+
type = type.to_sym if type.is_a?(String)
|
|
190
|
+
|
|
191
|
+
options = {} unless options.is_a?(Hash)
|
|
192
|
+
|
|
193
|
+
unless options.key?(:required)
|
|
194
|
+
options[:required] = !PrcLib.model.needs_optional
|
|
241
195
|
end
|
|
242
196
|
|
|
243
|
-
|
|
244
|
-
|
|
197
|
+
_configure_options_handlers(options)
|
|
198
|
+
|
|
199
|
+
params = PrcLib.model.meta_obj.rh_get(PrcLib.model.object_context,
|
|
200
|
+
:params)
|
|
201
|
+
|
|
202
|
+
_define_object_needs(params, type,
|
|
203
|
+
_initialize_object_needs(name), options)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
# Function used by the Process to define Model Object attributes.
|
|
207
|
+
# By default, any attributes are queriable as well. No need to call
|
|
208
|
+
# query_mapping
|
|
209
|
+
#
|
|
210
|
+
# parameters:
|
|
211
|
+
# - +key+ : name of the default object attribute
|
|
212
|
+
# - +options+: optional.
|
|
213
|
+
def self.def_attribute(key, options = {})
|
|
214
|
+
PrcLib.model.heap true
|
|
215
|
+
|
|
216
|
+
key_path = _set_attr_mapping(key, key, options)[0]
|
|
217
|
+
|
|
218
|
+
Lorj.debug(4, "%s: Defining object attribute '%s'",
|
|
219
|
+
PrcLib.model.object_context, key_path)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# Process to undeclare default lorj object attributes
|
|
223
|
+
# By default, while process declares a new lorj object,
|
|
224
|
+
# :id and :name are predefined.
|
|
225
|
+
# If the model of this lorj object do not have any ID or Name
|
|
226
|
+
# the process will needs to undeclare it.
|
|
227
|
+
#
|
|
228
|
+
# The Controller can undeclare some attribute defined by the
|
|
229
|
+
# Application process model. But it requires the controller to
|
|
230
|
+
# re-define any object handler which can use those attributes.
|
|
231
|
+
#
|
|
232
|
+
# parameters:
|
|
233
|
+
# - +key+ : Attribute name to undeclare.
|
|
234
|
+
def self.undefine_attribute(key)
|
|
235
|
+
return nil unless [String, Symbol].include?(key.class)
|
|
236
|
+
PrcLib.model.heap true
|
|
237
|
+
|
|
238
|
+
PrcLib.dcl_fail('%s: No Object defined. Missing define_obj?',
|
|
239
|
+
self.class) if PrcLib.model.object_context.nil?
|
|
240
|
+
|
|
241
|
+
key_path = KeyPath.new(key)
|
|
242
|
+
|
|
243
|
+
PrcLib.model.meta_obj.rh_set(nil, PrcLib.model.object_context,
|
|
244
|
+
:returns, key_path.sFullPath)
|
|
245
|
+
PrcLib.model.attribute_context key_path
|
|
246
|
+
Lorj.debug(4, "%s: Undefining attribute mapping '%s'",
|
|
247
|
+
PrcLib.model.object_context, key_path.sFullPath)
|
|
248
|
+
|
|
249
|
+
_query_mapping(key, nil)
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
# Process or controller to defines or update data model options
|
|
253
|
+
# Possible data model options are defined definition under <section>/<data>
|
|
254
|
+
# of defaults.yaml
|
|
255
|
+
#
|
|
256
|
+
# Parameters:
|
|
257
|
+
# - +data+ : String/Symbol. Name of the data
|
|
258
|
+
# - +options+ : Hash. List of options
|
|
259
|
+
def self.define_data(data, options)
|
|
260
|
+
return nil unless [String, Symbol].include?(data.class)
|
|
261
|
+
return nil if options.class != Hash
|
|
262
|
+
PrcLib.model.heap true
|
|
263
|
+
|
|
264
|
+
data = data.to_sym if data.class == String
|
|
265
|
+
PrcLib.dcl_fail("%s: Config data '%s' unknown",
|
|
266
|
+
self.class, data) unless Lorj.defaults.meta_exist?(data)
|
|
267
|
+
|
|
268
|
+
PrcLib.model.data_context data
|
|
269
|
+
|
|
270
|
+
section = _section_from(data)
|
|
271
|
+
|
|
272
|
+
cur_options = PrcLib.model.meta_data.rh_get(section, data)
|
|
273
|
+
return cur_options.merge!(options) if cur_options
|
|
274
|
+
PrcLib.model.meta_data.rh_set(options, section, data)
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# Controller to declare a model Data value mapping
|
|
278
|
+
#
|
|
279
|
+
# Parameters:
|
|
280
|
+
# - +value+ : Value to map
|
|
281
|
+
# - +map+ : Value mapped
|
|
282
|
+
def self.data_value_mapping(value, map)
|
|
283
|
+
return nil unless _decl_data_valid?(value, map)
|
|
284
|
+
PrcLib.model.heap true
|
|
285
|
+
|
|
286
|
+
data = PrcLib.model.data_context
|
|
287
|
+
|
|
288
|
+
section = _section_from(data)
|
|
289
|
+
|
|
290
|
+
Lorj.debug(2, format("%s/%s: Define config data value mapping: '%s' => "\
|
|
291
|
+
"'%s'", section, data, value, map))
|
|
292
|
+
PrcLib.model.meta_data.rh_set(map, section, data,
|
|
293
|
+
:value_mapping, :controller, value)
|
|
294
|
+
PrcLib.model.meta_data.rh_set(value, section, data,
|
|
295
|
+
:value_mapping, :process, map)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def self.defined?(objType)
|
|
299
|
+
PrcLib.model.heap true
|
|
300
|
+
@obj_type.include?(objType)
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
# Internal BaseDefinition function
|
|
304
|
+
|
|
305
|
+
def self.predefine_data_value(data, hOptions)
|
|
306
|
+
PrcLib.model.heap true
|
|
307
|
+
# Refuse to run if not a
|
|
308
|
+
return nil if self.class != BaseDefinition
|
|
309
|
+
# BaseDefinition call
|
|
310
|
+
return nil unless [String, Symbol].include?(value.class)
|
|
311
|
+
return nil unless [NilClass, Symbol, String].include?(map.class)
|
|
312
|
+
|
|
313
|
+
key_path = PrcLib.model.attribute_context
|
|
314
|
+
|
|
315
|
+
value = { data => { :options => hOptions } }
|
|
316
|
+
|
|
317
|
+
PrcLib.model.predefine_data_value.rh_set(value,
|
|
318
|
+
key_path.sFullPath, :values)
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
# function to interpret a template data, and use ERBConfig as data context.
|
|
322
|
+
# ERBConfig contains config object only.
|
|
323
|
+
def erb(str)
|
|
324
|
+
ERB.new(str).result(@erb_config.get_binding)
|
|
325
|
+
end
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
##############################################################
|
|
329
|
+
# Completing BaseDefinition with Exclusive controller functions
|
|
330
|
+
class BaseDefinition
|
|
331
|
+
attr_writer :obj_type
|
|
332
|
+
|
|
333
|
+
# Controller declaration to map an query attribute
|
|
334
|
+
# By default, def_attribute configure those attributes as queriable.
|
|
335
|
+
# The controller can redefine the query part.
|
|
336
|
+
def self.query_mapping(key, map)
|
|
337
|
+
PrcLib.model.heap true
|
|
338
|
+
_query_mapping(key, map)
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
# Function used by the controler to define mapping.
|
|
342
|
+
# By default, any attributes are queriable as well. No need to call
|
|
343
|
+
# query_mapping
|
|
344
|
+
#
|
|
345
|
+
# parameters:
|
|
346
|
+
# - +key+ : name of the default object attribute
|
|
347
|
+
# - +map+ : optional.
|
|
348
|
+
# - +options+: optional.
|
|
349
|
+
def self.def_attr_mapping(key, map, options = {})
|
|
350
|
+
PrcLib.model.heap true
|
|
351
|
+
key_paths = _set_attr_mapping(key, map, options)
|
|
352
|
+
|
|
353
|
+
Lorj.debug(4, "%s: Defining object attribute mapping '%s' => '%s'",
|
|
354
|
+
PrcLib.model.object_context, key_paths[0], key_paths[1])
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
# Controller to declare an lorj object attribute data mapping.
|
|
358
|
+
#
|
|
359
|
+
# You need to define object and attribute context before attr_value_mapping
|
|
360
|
+
#
|
|
361
|
+
# parameters:
|
|
362
|
+
# - +value+ : name of the default object attribute
|
|
363
|
+
# - +map+ : Map a predefined object attribute value.
|
|
364
|
+
#
|
|
365
|
+
# Ex: If the application model has defined:
|
|
366
|
+
# :server[:status] = [:create, :boot, :active]
|
|
367
|
+
#
|
|
368
|
+
# define_obj :server # Required to set object context
|
|
369
|
+
# get_attr_mapping :status, :state # set attribute mapping and context.
|
|
370
|
+
# attr_value_mapping :create, 'BUILD'
|
|
371
|
+
# attr_value_mapping :boot, :boot
|
|
372
|
+
# attr_value_mapping :active, 'ACTIVE'
|
|
373
|
+
#
|
|
374
|
+
def self.attr_value_mapping(value, map)
|
|
375
|
+
PrcLib.model.heap true
|
|
376
|
+
|
|
377
|
+
return nil unless _decl_data_valid?(value, map)
|
|
378
|
+
|
|
379
|
+
object_type = PrcLib.model.object_context(fct_context)
|
|
380
|
+
|
|
381
|
+
key_path = PrcLib.model.attribute_context __callee__
|
|
382
|
+
|
|
383
|
+
keypath = key_path.sFullPath
|
|
384
|
+
Lorj.debug(2, "%s-%s: Attribute value mapping '%s' => '%s'",
|
|
385
|
+
object_type, key_path.to_s, value, map)
|
|
386
|
+
PrcLib.model.meta_obj.rh_set(map,
|
|
387
|
+
object_type, :value_mapping, keypath, value)
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
# Controller to declare predefined Hash options for controller wrapper code.
|
|
391
|
+
#
|
|
392
|
+
# When a controller wrapper code is called to execute a function,
|
|
393
|
+
# the controller may/should provides some options.
|
|
394
|
+
#
|
|
395
|
+
# lorj framework can simplify the way to call this function
|
|
396
|
+
# and provide a predefined options list, prepared by lorj.
|
|
397
|
+
#
|
|
398
|
+
# Ex: If you are calling a connection function, which requires one
|
|
399
|
+
# or more parameters passed as an Hash:
|
|
400
|
+
# wrapper code without using :hdata:
|
|
401
|
+
# def connect(params)
|
|
402
|
+
# options = { :hp_access_key => params[:account_id],
|
|
403
|
+
# :hp_secret_key => params[:account_key]
|
|
404
|
+
# :hp_auth_uri => params[:auth_uri]
|
|
405
|
+
# :hp_tenant_id => params[:tenant]
|
|
406
|
+
# :hp_avl_zone => params[:network]
|
|
407
|
+
# }
|
|
408
|
+
# Fog::HP::Network.new(options)
|
|
409
|
+
# end
|
|
410
|
+
#
|
|
411
|
+
# wrapper code using :hdata and def_hdata:
|
|
412
|
+
# def connect(params)
|
|
413
|
+
# Fog::HP::Network.new(params[:hdata])
|
|
414
|
+
# end
|
|
415
|
+
#
|
|
416
|
+
# def_hdata requires the object context.
|
|
417
|
+
# Ex:
|
|
418
|
+
# define_obj(:student)
|
|
419
|
+
# def_hdata :first_name
|
|
420
|
+
# def_hdata :last_name
|
|
421
|
+
# def_hdata :course, mapping: :training
|
|
422
|
+
#
|
|
423
|
+
# parameters:
|
|
424
|
+
# - +attr_name+ : Attribute name to add in :hdata Hash
|
|
425
|
+
# as hdata[attr_name] = value.
|
|
426
|
+
# - +options+: Possible options:
|
|
427
|
+
# - :mapping : map name to use mapping instead of attr_name.
|
|
428
|
+
# hdata[map_name] = value
|
|
429
|
+
#
|
|
430
|
+
#
|
|
431
|
+
def self.def_hdata(attr_name, options = {})
|
|
432
|
+
PrcLib.model.heap true
|
|
433
|
+
fct_context = { :function_name => __callee__ }
|
|
434
|
+
return nil unless [String, Symbol, Array].include?(attr_name.class)
|
|
435
|
+
|
|
436
|
+
options = {} unless options.is_a?(Hash)
|
|
437
|
+
|
|
438
|
+
object_type = PrcLib.model.object_context(fct_context)
|
|
439
|
+
|
|
440
|
+
key_access = KeyPath.new(attr_name).sFullPath
|
|
441
|
+
|
|
442
|
+
# PrcLib.model.meta_obj://<Object>/:params/:keys/<keypath> must exist.
|
|
443
|
+
object_param = PrcLib.model.meta_obj.rh_get(object_type,
|
|
444
|
+
:params, :keys, key_access)
|
|
445
|
+
|
|
446
|
+
object_param[:mapping] = attr_name
|
|
447
|
+
object_param[:mapping] = options[:mapping] unless options[:mapping].nil?
|
|
448
|
+
|
|
449
|
+
Lorj.debug(2, "%-28s: hdata set '%s' => '%s'",
|
|
450
|
+
_object_name(object_type), attr_name, object_param[:mapping])
|
|
451
|
+
|
|
452
|
+
# Internally, lorj stores this declaration in
|
|
453
|
+
# PrcLib.model.meta_obj://<Object>/:params/:keys/<keypath>/:mapping)
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
##############################################################
|
|
458
|
+
# Completing BaseDefinition with internal functions
|
|
459
|
+
class BaseDefinition
|
|
460
|
+
# Internal function
|
|
461
|
+
def self._query_mapping(key, map)
|
|
462
|
+
return nil unless [String, Symbol].include?(key.class)
|
|
463
|
+
return nil unless [NilClass, Symbol, String].include?(map.class)
|
|
464
|
+
|
|
465
|
+
object_type = PrcLib.model.object_context
|
|
466
|
+
key_path = KeyPath.new(key)
|
|
467
|
+
map_path_obj = KeyPath.new(map)
|
|
468
|
+
|
|
469
|
+
PrcLib.model.attribute_context key_path
|
|
470
|
+
|
|
471
|
+
PrcLib.model.meta_obj.rh_set(map_path_obj.sFullPath, object_type,
|
|
472
|
+
:query_mapping, key_path.sFullPath)
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
# Internal function to store object attribute and mapping information
|
|
476
|
+
# parameters:
|
|
477
|
+
# - +key+ : KeyPath. key object
|
|
478
|
+
# - +map+ : KeyPath. map object
|
|
479
|
+
# - +options+: Hash. Options to set.
|
|
480
|
+
def self._set_attr_mapping(key, map, options)
|
|
481
|
+
return nil unless _decl_object_attr_valid?(key, map, options)
|
|
482
|
+
|
|
483
|
+
object_type = PrcLib.model.object_context
|
|
484
|
+
key_path_obj = KeyPath.new(key)
|
|
485
|
+
|
|
486
|
+
map_path_obj = KeyPath.new(map)
|
|
487
|
+
|
|
488
|
+
PrcLib.model.meta_obj.rh_set(map_path_obj.sFullPath, object_type,
|
|
489
|
+
:returns, key_path_obj.sFullPath)
|
|
490
|
+
|
|
491
|
+
PrcLib.model.attribute_context key_path_obj
|
|
492
|
+
|
|
493
|
+
return if options[:not_queriable] == true
|
|
494
|
+
query_mapping(key, map)
|
|
495
|
+
[key_path_obj.sFullPath, map_path_obj.sFullPath]
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
# Internal section detection
|
|
499
|
+
def self._section_from(data)
|
|
500
|
+
section = Lorj.defaults.get_meta_section(data)
|
|
501
|
+
section = :runtime if section.nil?
|
|
502
|
+
|
|
503
|
+
section
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
# Internal model data validation
|
|
507
|
+
# return true if valid. false otherwise.
|
|
508
|
+
def self._decl_object_attr_valid?(key, map, options)
|
|
509
|
+
return false unless [String, Symbol].include?(key.class)
|
|
510
|
+
return false unless options.is_a?(Hash)
|
|
511
|
+
return false unless [Symbol, String, Array].include?(map.class)
|
|
512
|
+
|
|
513
|
+
true
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
# Internal model data validation
|
|
517
|
+
# return true if valid. false otherwise.
|
|
518
|
+
def self._decl_data_valid?(value, map)
|
|
519
|
+
return false if [String, Symbol].include?(value.class)
|
|
520
|
+
return false if [NilClass, Symbol, String].include?(map.class)
|
|
521
|
+
true
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
# Internal function to get the object_name as class.object
|
|
525
|
+
#
|
|
526
|
+
# return formated string.
|
|
527
|
+
def self._object_name(name)
|
|
528
|
+
format("'%s.%s'", self.class, name)
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
# Internal function for obj_needs
|
|
532
|
+
# Initialize :params/:keys/
|
|
533
|
+
def self._initialize_object_needs(name)
|
|
534
|
+
top_param_obj = PrcLib.model.meta_obj.rh_get(PrcLib.model.object_context,
|
|
535
|
+
:params)
|
|
536
|
+
|
|
537
|
+
PrcLib.model.attribute_context KeyPath.new(name)
|
|
538
|
+
key_access = PrcLib.model.attribute_context.sFullPath
|
|
539
|
+
|
|
540
|
+
unless top_param_obj[:keys].key?(key_access)
|
|
541
|
+
top_param_obj[:keys][key_access] = {}
|
|
542
|
+
return 'New'
|
|
245
543
|
end
|
|
246
544
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
return nil if not [NilClass, Symbol, String].include?(map.class)
|
|
250
|
-
|
|
251
|
-
aCaller = caller
|
|
252
|
-
aCaller.pop
|
|
253
|
-
|
|
254
|
-
raise Lorj::PrcError.new(), "%s: No Object defined. Missing define_obj?" % [ self.class], aCaller if @@Context[:oCurrentObj].nil?
|
|
255
|
-
|
|
256
|
-
sCloudObj = @@Context[:oCurrentObj]
|
|
257
|
-
oKeyPath = KeyPath.new(key)
|
|
258
|
-
oMapPath = KeyPath.new(map)
|
|
545
|
+
'Upd'
|
|
546
|
+
end
|
|
259
547
|
|
|
260
|
-
|
|
548
|
+
# Internal function
|
|
549
|
+
def self._define_object_needs(params, type, msg_action, options)
|
|
550
|
+
attribute = PrcLib.model.attribute_context
|
|
261
551
|
|
|
262
|
-
|
|
552
|
+
case type
|
|
553
|
+
when :data
|
|
554
|
+
return _obj_needs_data(params[:keys][attribute.sFullPath],
|
|
555
|
+
msg_action, options)
|
|
556
|
+
when :CloudObject, :object
|
|
557
|
+
return _obj_needs_object(params[:keys][attribute.sFullPath],
|
|
558
|
+
options)
|
|
263
559
|
end
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
raise Lorj::PrcError.new(), "%s: '%s' not declared. Missing define_obj(%s)?" % [ self.class, sCloudObj, sCloudObj], aCaller if Lorj::rhExist?(@@meta_obj, sCloudObj) != 1
|
|
292
|
-
|
|
293
|
-
oObjTopParam = Lorj::rhGet(@@meta_obj, sCloudObj, :params)
|
|
294
|
-
if not oObjTopParam.key?(:keys)
|
|
295
|
-
# Initialize top structure
|
|
296
|
-
|
|
297
|
-
oObjTopParam.merge!({ :keys => {} })
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
oKeyPath = KeyPath.new(sParam)
|
|
301
|
-
sKeyAccess = oKeyPath.sFullPath
|
|
302
|
-
|
|
303
|
-
@@Context[:oCurrentKey] = oKeyPath
|
|
304
|
-
|
|
305
|
-
oCloudObjParam = Lorj::rhGet(oObjTopParam, :keys, sKeyAccess)
|
|
306
|
-
if oCloudObjParam.nil?
|
|
307
|
-
sMsgAction = "New"
|
|
308
|
-
oObjTopParam[:keys][sKeyAccess] = {}
|
|
309
|
-
oCloudObjParam = oObjTopParam[:keys][sKeyAccess]
|
|
310
|
-
else
|
|
311
|
-
sMsgAction = "Upd"
|
|
312
|
-
end
|
|
313
|
-
sObjectName = "'%s.%s'" % [self.class, sCloudObj]
|
|
314
|
-
case sType
|
|
315
|
-
when :data
|
|
316
|
-
if Lorj::Default.meta_exist?(sParam)
|
|
317
|
-
Lorj.debug(2, "%-28s: %s predefined config '%s'." % [sObjectName, sMsgAction, sParam])
|
|
318
|
-
else
|
|
319
|
-
Lorj.debug(2, "%-28s: %s runtime config '%s'." % [sObjectName, sMsgAction, sParam])
|
|
320
|
-
end
|
|
321
|
-
oCloudObjParam.merge!( hParams.merge({:type => sType}) ) # Merge from predefined params, but ensure type is never updated.
|
|
322
|
-
when :CloudObject
|
|
323
|
-
raise Lorj::PrcError.new(), "%s: '%s' not declared. Missing define_obj(%s)?" % [self.class, sParam, sParam], aCaller if not @@meta_obj.key?(sParam)
|
|
324
|
-
oCloudObjParam.merge!( hParams.merge({:type => sType}) ) # Merge from predefined params, but ensure type is never updated.
|
|
325
|
-
else
|
|
326
|
-
raise Lorj::PrcError.new(), "%s: Object parameter type '%s' unknown." % [ self.class, sType ], aCaller
|
|
327
|
-
end
|
|
560
|
+
PrcLib.dcl_fail("%s: Object parameter type '%s' unknown.",
|
|
561
|
+
self.class, type)
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
# Internal function
|
|
565
|
+
def self._configure_options_handlers(options)
|
|
566
|
+
for_events = PrcLib.model.meta_obj.rh_get(PrcLib.model.object_context,
|
|
567
|
+
:lambdas).keys
|
|
568
|
+
options.merge(:for => for_events) unless options.key?(:for)
|
|
569
|
+
end
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
##############################################################
|
|
573
|
+
# Completing BaseDefinition with internal functions for obj_needs
|
|
574
|
+
class BaseDefinition
|
|
575
|
+
# Internal function
|
|
576
|
+
def self._obj_needs_data(object_attr, msg_action, new_params)
|
|
577
|
+
attr_name = PrcLib.model.attribute_context
|
|
578
|
+
if Lorj.defaults.meta_exist?(attr_name)
|
|
579
|
+
Lorj.debug(2, "%-28s: %s predefined config '%s'.",
|
|
580
|
+
_object_name(PrcLib.model.object_context),
|
|
581
|
+
msg_action, attr_name)
|
|
582
|
+
else
|
|
583
|
+
Lorj.debug(2, "%-28s: %s runtime config '%s'.",
|
|
584
|
+
_object_name(PrcLib.model.object_context),
|
|
585
|
+
msg_action, attr_name)
|
|
328
586
|
end
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
aCaller = caller
|
|
343
|
-
aCaller.pop
|
|
344
|
-
|
|
345
|
-
raise Lorj::PrcError.new(), "%s: No Object defined. Missing define_obj?" % [ self.class], aCaller if @@Context[:oCurrentObj].nil?
|
|
346
|
-
sCloudObj = @@Context[:oCurrentObj]
|
|
347
|
-
|
|
348
|
-
raise Lorj::PrcError.new(), "%s: '%s' not declared. Missing define_obj(%s)?" % [ self.class, sCloudObj, sCloudObj], aCaller if Lorj::rhExist?(@@meta_obj, sCloudObj) != 1
|
|
349
|
-
|
|
350
|
-
oKeyPath = KeyPath.new(sParam)
|
|
351
|
-
sKeyAccess = oKeyPath.sFullPath
|
|
352
|
-
|
|
353
|
-
# @@meta_obj://<Object>/:params/:keys/<keypath> must exist.
|
|
354
|
-
oCloudObjParam = Lorj::rhGet(@@meta_obj, sCloudObj, :params, :keys, sKeyAccess)
|
|
355
|
-
|
|
356
|
-
sMapping = sParam
|
|
357
|
-
sMapping = hParams[:mapping] unless hParams[:mapping].nil?
|
|
358
|
-
oCloudObjParam[:mapping] = sMapping
|
|
359
|
-
|
|
360
|
-
sObjectName = "'%s.%s'" % [self.class, sCloudObj]
|
|
361
|
-
Lorj.debug(2, "%-28s: hdata set '%s' => '%s'" % [sObjectName, sParam, sMapping])
|
|
587
|
+
# Merge from predefined params, but ensure type is never updated.
|
|
588
|
+
object_attr.merge!(new_params.merge(:type => :data))
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
# Internal function
|
|
592
|
+
def self._obj_needs_object(object_attr, new_params)
|
|
593
|
+
attr_name = PrcLib.model.attribute_context
|
|
594
|
+
unless PrcLib.model.meta_obj.key?(attr_name.key)
|
|
595
|
+
PrcLib.dcl_fail("%s: '%s' not declared. Missing define_obj(%s)?",
|
|
596
|
+
self.class,
|
|
597
|
+
attr_name,
|
|
598
|
+
attr_name)
|
|
362
599
|
end
|
|
600
|
+
# Merge from predefined params, but ensure type is never updated.
|
|
601
|
+
object_attr.merge!(new_params.merge(:type => :CloudObject))
|
|
602
|
+
end
|
|
363
603
|
|
|
604
|
+
# Internal function
|
|
605
|
+
def self._define_obj_initialize(obj_type_name, handlers)
|
|
606
|
+
use_controller = PrcLib.model[:use_controller]
|
|
364
607
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
aCaller = caller
|
|
370
|
-
aCaller.pop
|
|
371
|
-
|
|
372
|
-
sCloudObj = @@Context[:oCurrentObj]
|
|
373
|
-
raise Lorj::PrcError.new, "attr_value_mapping: mapping '%s' needs object context definition. You need to call define_obj to get the context." % value if sCloudObj.nil?
|
|
374
|
-
|
|
375
|
-
oKeypath = @@Context[:oCurrentKey]
|
|
376
|
-
raise Lorj::PrcError.new, "attr_value_mapping: mapping '%s' needs object data context definition. You need to call define_obj, then obj_needs to get the context." % value if oKeypath.nil?
|
|
377
|
-
|
|
378
|
-
keypath = oKeypath.sFullPath
|
|
379
|
-
Lorj.debug(2, "%s-%s: Value mapping definition '%s' => '%s'" % [sCloudObj, oKeypath.to_s, value, map])
|
|
380
|
-
Lorj::rhSet(@@meta_obj, map, sCloudObj, :value_mapping, keypath, value)
|
|
381
|
-
end
|
|
382
|
-
|
|
383
|
-
def self.def_attribute(key, options = nil)
|
|
384
|
-
self.get_attr_mapping(key, options)
|
|
385
|
-
#~ self.def_query_attribute(key) unless options and options.key?(:not_queriable) and options[:not_queriable]== true
|
|
386
|
-
end
|
|
387
|
-
|
|
388
|
-
# Function used by the controler to define mapping.
|
|
389
|
-
# By default, any attributes are queriable as well. No need to call
|
|
390
|
-
# query_mapping
|
|
391
|
-
def self.get_attr_mapping(key, map = nil, options = nil)
|
|
392
|
-
return nil if not [String, Symbol].include?(key.class)
|
|
393
|
-
return nil if not [NilClass, Symbol, String, Array].include?(map.class)
|
|
394
|
-
|
|
395
|
-
aCaller = caller
|
|
396
|
-
aCaller.pop
|
|
397
|
-
|
|
398
|
-
raise Lorj::PrcError.new(), "%s: No Object defined. Missing define_obj?" % [ self.class], aCaller if @@Context[:oCurrentObj].nil?
|
|
399
|
-
|
|
400
|
-
sCloudObj = @@Context[:oCurrentObj]
|
|
401
|
-
oKeyPath = KeyPath.new(key)
|
|
402
|
-
|
|
403
|
-
if map.nil?
|
|
404
|
-
oMapPath = oKeyPath
|
|
405
|
-
map = oMapPath.sKey
|
|
406
|
-
else
|
|
407
|
-
oMapPath = KeyPath.new(map)
|
|
408
|
-
end
|
|
409
|
-
|
|
410
|
-
Lorj::rhSet(@@meta_obj, oMapPath.sFullPath, sCloudObj, :returns, oKeyPath.sFullPath)
|
|
411
|
-
@@Context[:oCurrentKey] = oKeyPath
|
|
412
|
-
if oMapPath == oKeyPath
|
|
413
|
-
Lorj::debug(4, "%s: Defining object attribute '%s'" % [sCloudObj, oKeyPath.sFullPath])
|
|
414
|
-
else
|
|
415
|
-
Lorj::debug(4, "%s: Defining object attribute mapping '%s' => '%s'" % [sCloudObj, oKeyPath.sFullPath, oMapPath.sFullPath])
|
|
416
|
-
end
|
|
417
|
-
|
|
418
|
-
self.query_mapping(key, map) unless options and options.key?(:not_queriable) and options[:not_queriable]== true
|
|
419
|
-
end
|
|
420
|
-
|
|
421
|
-
def self.undefine_attribute(key)
|
|
422
|
-
return nil if not [String, Symbol].include?(key.class)
|
|
423
|
-
|
|
424
|
-
aCaller = caller
|
|
425
|
-
aCaller.pop
|
|
426
|
-
|
|
427
|
-
raise Lorj::PrcError.new(), "%s: No Object defined. Missing define_obj?" % [ self.class], aCaller if @@Context[:oCurrentObj].nil?
|
|
428
|
-
|
|
429
|
-
sCloudObj = @@Context[:oCurrentObj]
|
|
430
|
-
oKeyPath = KeyPath.new(key)
|
|
431
|
-
|
|
432
|
-
Lorj::rhSet(@@meta_obj, nil, sCloudObj, :returns, oKeyPath.sFullPath)
|
|
433
|
-
@@Context[:oCurrentKey] = oKeyPath
|
|
434
|
-
Lorj::debug(4, "%s: Undefining attribute mapping '%s'" % [sCloudObj, oKeyPath.sFullPath])
|
|
435
|
-
|
|
436
|
-
self.query_mapping(key, nil)
|
|
437
|
-
end
|
|
438
|
-
|
|
439
|
-
# Defines/update CloudData parameters
|
|
440
|
-
def self.define_data(sData, hMeta)
|
|
441
|
-
return nil if not sData or not hMeta
|
|
442
|
-
return nil if not [String, Symbol].include?(sData.class)
|
|
443
|
-
return nil if hMeta.class != Hash
|
|
444
|
-
|
|
445
|
-
aCaller = caller
|
|
446
|
-
aCaller.pop
|
|
447
|
-
|
|
448
|
-
sData = sData.to_sym if sData.class == String
|
|
449
|
-
raise Lorj::PrcError.new(), "%s: Config data '%s' unknown" % [self.class, sData], aCaller if not Lorj::Default.meta_exist?(sData)
|
|
450
|
-
|
|
451
|
-
@@Context[:oCurrentData] = sData
|
|
452
|
-
|
|
453
|
-
section = Lorj::Default.get_meta_section(sData)
|
|
454
|
-
section = :runtime if section.nil?
|
|
455
|
-
|
|
456
|
-
if Lorj::rhExist?(@@meta_data, section, sData) == 2
|
|
457
|
-
Lorj::rhGet(@@meta_data, section, sData).merge!(hMeta)
|
|
458
|
-
else
|
|
459
|
-
Lorj::rhSet(@@meta_data, hMeta, section, sData)
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
end
|
|
463
|
-
|
|
464
|
-
def self.data_value_mapping(value, map)
|
|
465
|
-
return nil if not [String, Symbol].include?(value.class)
|
|
466
|
-
return nil if not [NilClass, Symbol, String].include?(map.class)
|
|
467
|
-
|
|
468
|
-
aCaller = caller
|
|
469
|
-
aCaller.pop
|
|
470
|
-
sData = @@Context[:oCurrentData]
|
|
471
|
-
raise Lorj::PrcError.new, "Config data context not set. at least, you need to call define_data before." if sData.nil?
|
|
472
|
-
|
|
473
|
-
section = Lorj::Default.get_meta_section(sData)
|
|
474
|
-
section = :runtime if section.nil?
|
|
475
|
-
|
|
476
|
-
Lorj.debug(2, "%s/%s: Define config data value mapping: '%s' => '%s'" % [section, sData, value, map])
|
|
477
|
-
Lorj::rhSet(@@meta_data, map, section, sData, :value_mapping, :controller, value)
|
|
478
|
-
Lorj::rhSet(@@meta_data, value, section, sData, :value_mapping, :process, map)
|
|
608
|
+
if use_controller.nil?
|
|
609
|
+
PrcLib.model.options :use_controller => true
|
|
610
|
+
use_controller = true
|
|
479
611
|
end
|
|
480
612
|
|
|
481
|
-
|
|
482
|
-
|
|
613
|
+
# TODO: Cleanup un-used 2 levels :params/:keys by single :params
|
|
614
|
+
object = { :lambdas => { :create_e => nil, :delete_e => nil,
|
|
615
|
+
:update_e => nil, :get_e => nil,
|
|
616
|
+
:query_e => nil, :get_attr_e => nil },
|
|
617
|
+
:params => { :keys => {} },
|
|
618
|
+
:options => { :controller => use_controller },
|
|
619
|
+
:query_mapping => { ':id' => ':id', ':name' => ':name' },
|
|
620
|
+
:returns => { ':id' => ':id', ':name' => ':name' }
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
PrcLib.dcl_fail("A new declared object '%s' requires at "\
|
|
624
|
+
'least one handler. Ex: define_obj :%s, '\
|
|
625
|
+
'create_e: myhandler or nohandler: true',
|
|
626
|
+
obj_type_name,
|
|
627
|
+
obj_type_name) if handlers.length == 0
|
|
628
|
+
|
|
629
|
+
if !handlers.rh_get(:nohandler)
|
|
630
|
+
msg = '%-28s object declared.'
|
|
631
|
+
else
|
|
632
|
+
msg = '%-28s meta object declared.'
|
|
483
633
|
end
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
634
|
+
Lorj.debug(2, msg, _object_name(obj_type_name))
|
|
635
|
+
object
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
# Internal function for define_obj
|
|
639
|
+
# Check handler options.
|
|
640
|
+
# Return the list of handlers set if handler list is ok (exist 1 at least)
|
|
641
|
+
# return false if no handler is set.
|
|
642
|
+
def self._verify_handlers(type_name, object, handlers)
|
|
643
|
+
return false if handlers.rh_get(:nohandler)
|
|
644
|
+
|
|
645
|
+
PrcLib.dcl_fail("A new declared object '%s' requires at "\
|
|
646
|
+
'least one handler. Ex: define_obj :%s, '\
|
|
647
|
+
'create_e: myhandler or nohandler: true',
|
|
648
|
+
type_name, type_name) if object.nil? &&
|
|
649
|
+
handlers.length == 0
|
|
650
|
+
|
|
651
|
+
return handlers if object.nil?
|
|
652
|
+
|
|
653
|
+
handlers_list = object[:lambdas].keys.join(', ')
|
|
654
|
+
handlers.each_key do | key |
|
|
655
|
+
next if lorj_object.rh_exist?(:lambdas, key)
|
|
656
|
+
|
|
657
|
+
PrcLib.dcl_fail("'%s' parameter is invalid. Use '%s'",
|
|
658
|
+
key, handlers_list)
|
|
487
659
|
end
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
660
|
+
handlers
|
|
661
|
+
end
|
|
662
|
+
|
|
663
|
+
# Setting procs
|
|
664
|
+
def self._handler_settings(object, handlers_options)
|
|
665
|
+
handlers_dcl = object[:lambdas]
|
|
666
|
+
process_context = PrcLib.model.process_context
|
|
667
|
+
|
|
668
|
+
handlers_dcl.each_key do |key|
|
|
669
|
+
next unless handlers_options.key?(key)
|
|
670
|
+
|
|
671
|
+
unless process_context.instance_methods.include?(handlers_options[key])
|
|
672
|
+
PrcLib.dcl_fail("'%s' parameter requires a valid instance method"\
|
|
673
|
+
" '%s' in the process '%s'.",
|
|
674
|
+
key, handlers_options[key], process_context)
|
|
675
|
+
end
|
|
676
|
+
if handlers_options[key] == :default
|
|
677
|
+
# By default, we use the event name as default function to call.
|
|
678
|
+
# Those function are predefined in ForjController
|
|
679
|
+
# The Provider needs to derive from ForjController and redefine those
|
|
680
|
+
# functions.
|
|
681
|
+
object[:lambdas][key] = key
|
|
682
|
+
else
|
|
683
|
+
# If needed, ForjProviver redefined can contains some additionnal
|
|
684
|
+
# functions to call.
|
|
685
|
+
object[:lambdas][key] = handlers_options[key]
|
|
686
|
+
end
|
|
510
687
|
end
|
|
511
|
-
|
|
688
|
+
end
|
|
689
|
+
end
|
|
512
690
|
end
|