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.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +46 -0
  4. data/Gemfile +15 -15
  5. data/README.md +22 -17
  6. data/Rakefile +12 -2
  7. data/bin/cloud_test.rb +13 -65
  8. data/example/students_1/process/students.rb +39 -0
  9. data/example/students_1/students.rb +22 -5
  10. data/example/students_2/process/students.rb +48 -0
  11. data/example/students_2/students.rb +39 -16
  12. data/example/students_3/controller/yaml_students.rb +50 -43
  13. data/example/students_3/controller/yaml_students_controller.rb +100 -87
  14. data/example/students_3/process/students.rb +161 -97
  15. data/example/students_3/students.rb +85 -56
  16. data/example/yaml_students/students.rb +40 -40
  17. data/example/yaml_students/yaml_students.rb +103 -90
  18. data/lib/core/core.rb +356 -696
  19. data/lib/core/core_controller.rb +227 -0
  20. data/lib/core/core_internal.rb +339 -0
  21. data/lib/core/core_model.rb +328 -0
  22. data/lib/core/core_object_data.rb +330 -0
  23. data/lib/core/core_object_params.rb +230 -0
  24. data/lib/core/core_process.rb +391 -0
  25. data/lib/core/core_process_setup.rb +353 -0
  26. data/lib/core/core_setup_ask.rb +241 -0
  27. data/lib/core/core_setup_encrypt.rb +146 -0
  28. data/lib/core/core_setup_init.rb +229 -0
  29. data/lib/core/core_setup_list.rb +160 -0
  30. data/lib/core/definition.rb +647 -469
  31. data/lib/core/definition_internal.rb +264 -308
  32. data/lib/core/lorj_basecontroller.rb +95 -0
  33. data/lib/core/lorj_basedefinition.rb +307 -0
  34. data/lib/core/lorj_baseprocess.rb +265 -0
  35. data/lib/core/lorj_data.rb +583 -0
  36. data/lib/core/lorj_keypath.rb +119 -0
  37. data/lib/core_process/cloud/process/common.rb +63 -0
  38. data/lib/core_process/cloud/process/connection.rb +93 -0
  39. data/lib/core_process/cloud/process/external_network.rb +94 -0
  40. data/lib/core_process/cloud/process/flavor.rb +99 -0
  41. data/lib/core_process/cloud/process/images.rb +87 -0
  42. data/lib/core_process/cloud/process/internet_network.rb +34 -0
  43. data/lib/core_process/cloud/process/internet_server.rb +30 -0
  44. data/lib/core_process/cloud/process/keypairs.rb +276 -0
  45. data/lib/core_process/cloud/process/network.rb +108 -0
  46. data/lib/core_process/cloud/process/public_ip.rb +100 -0
  47. data/lib/core_process/cloud/process/router.rb +260 -0
  48. data/lib/core_process/cloud/process/rules.rb +120 -0
  49. data/lib/core_process/cloud/process/security_groups.rb +121 -0
  50. data/lib/core_process/cloud/process/server.rb +127 -0
  51. data/lib/core_process/cloud/process/server_log.rb +35 -0
  52. data/lib/core_process/cloud/process/subnetwork.rb +108 -0
  53. data/lib/core_process/cloud_process.rb +30 -0
  54. data/lib/logging.rb +298 -0
  55. data/lib/lorj/version.rb +18 -1
  56. data/lib/lorj.rb +58 -18
  57. data/lib/lorj_account.rb +556 -0
  58. data/lib/lorj_config.rb +468 -0
  59. data/lib/lorj_defaults.rb +278 -0
  60. data/lib/prc.rb +136 -104
  61. data/lib/prc_base_config.rb +285 -0
  62. data/lib/prc_core_config.rb +878 -0
  63. data/lib/prc_section_config.rb +57 -0
  64. data/lib/providers/hpcloud/compute.rb +81 -93
  65. data/lib/providers/hpcloud/hpcloud.rb +462 -0
  66. data/lib/providers/hpcloud/network.rb +96 -98
  67. data/lib/providers/hpcloud/security_groups.rb +41 -40
  68. data/lib/providers/mock/mock.rb +144 -0
  69. data/lib/providers/openstack/openstack.rb +45 -0
  70. data/lib/providers/templates/compute.rb +21 -23
  71. data/lib/providers/templates/mycloud.rb +72 -0
  72. data/lib/providers/templates/network.rb +11 -12
  73. data/lib/rh.rb +339 -0
  74. data/lorj-spec/defaults.yaml +4 -0
  75. data/lorj.gemspec +6 -0
  76. data/spec/00_lorj_log_spec.rb +53 -0
  77. data/spec/01_hash_rh_spec.rb +243 -0
  78. data/spec/02_prc_base_config_spec.rb +216 -0
  79. data/spec/04_prc_core_config_spec.rb +83 -0
  80. data/spec/11_lorj_config_spec.rb +263 -0
  81. data/spec/12_lorj_account_spec.rb +181 -0
  82. metadata +76 -28
  83. data/Gemfile.lock +0 -37
  84. data/example/students_1/process/Students.rb +0 -20
  85. data/example/students_2/process/Students.rb +0 -27
  86. data/example/students_4/controller/yaml_students.rb +0 -82
  87. data/example/students_4/controller/yaml_students_controller.rb +0 -141
  88. data/example/students_4/process/students.rb +0 -112
  89. data/example/students_4/students.rb +0 -103
  90. data/lib/core/lorj-basecontroller.rb +0 -90
  91. data/lib/core/lorj-basedefinition.rb +0 -1139
  92. data/lib/core/lorj-baseprocess.rb +0 -236
  93. data/lib/core/lorj-data.rb +0 -567
  94. data/lib/core/lorj-keypath.rb +0 -115
  95. data/lib/core_process/CloudProcess.rb +0 -337
  96. data/lib/core_process/global_process.rb +0 -502
  97. data/lib/core_process/network_process.rb +0 -605
  98. data/lib/prc-account.rb +0 -339
  99. data/lib/prc-config.rb +0 -1030
  100. data/lib/prc-logging.rb +0 -261
  101. data/lib/providers/hpcloud/Hpcloud.rb +0 -426
  102. data/lib/providers/mock/Mock.rb +0 -141
  103. data/lib/providers/openstack/Openstack.rb +0 -47
  104. data/lib/providers/templates/core.rb +0 -61
  105. data/spec/forj-account_spec.rb +0 -75
  106. data/spec/forj-config_spec.rb +0 -196
@@ -0,0 +1,146 @@
1
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'highline/import'
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
+ module Lorj
27
+ # Adding encrypt core functions.
28
+ class BaseDefinition
29
+ # internal runtime function for process call
30
+ # Get encrypted value hidden by *
31
+ #
32
+ # *parameters*:
33
+ # - +sDesc+ : data description
34
+ # - +default+ : encrypted default value
35
+ # - +entropy+ : Entropy Hash
36
+ #
37
+ # *return*:
38
+ # - value : encrypted value.
39
+ #
40
+ # *raise*:
41
+ #
42
+ def _get_encrypt_key
43
+ # Checking key file used to encrypt/decrypt passwords
44
+ key_file = File.join(PrcLib.pdata_path, '.key')
45
+ if !File.exist?(key_file)
46
+ # Need to create a random key.
47
+ random_iv = OpenSSL::Cipher::Cipher.new('aes-256-cbc').random_iv
48
+ entr = {
49
+ :key => rand(36**10).to_s(36),
50
+ :salt => Time.now.to_i.to_s,
51
+ :iv => Base64.strict_encode64(random_iv)
52
+ }
53
+
54
+ Lorj.debug(2, "Writing '%s' key file", key_file)
55
+ File.open(key_file, 'w') do |out|
56
+ out.write(Base64.encode64(entr.to_yaml))
57
+ end
58
+ else
59
+ Lorj.debug(2, "Loading '%s' key file", key_file)
60
+ encoded_key = IO.read(key_file)
61
+ entr = YAML.load(Base64.decode64(encoded_key))
62
+ end
63
+ entr
64
+ end
65
+
66
+ # internal runtime function for process call
67
+ # Get encrypted value hidden by *
68
+ #
69
+ # *parameters*:
70
+ # - +sDesc+ : data description
71
+ # - +default+ : encrypted default value
72
+ # - +entropy+ : Entropy Hash
73
+ #
74
+ # *return*:
75
+ # - value : encrypted value.
76
+ #
77
+ # *raise*:
78
+ #
79
+ def _get_encrypted_value_hidden(sDesc, enc_value, entr)
80
+ return '' if enc_value.nil?
81
+ value_hidden = ''
82
+ begin
83
+ value_hidden = '*' * Encryptor.decrypt(
84
+ :value => Base64.strict_decode64(enc_value),
85
+ :key => entr[:key],
86
+ :iv => Base64.strict_decode64(entr[:iv]),
87
+ :salt => entr[:salt]
88
+ ).length
89
+ rescue
90
+ Lorj.error('Unable to decrypt your %s. You will need to re-enter it.',
91
+ sDesc)
92
+ else
93
+ value_hidden = format('[%s]', value_hidden)
94
+ PrcLib.message("'%s' is already set. If you want to keep it,"\
95
+ ' just press Enter', sDesc)
96
+ end
97
+ value_hidden
98
+ end
99
+
100
+ # internal runtime function for process call
101
+ # Ask encrypted function executed by _ask
102
+ #
103
+ # *parameters*:
104
+ # - +sDesc+ : data description
105
+ # - +default+ : encrypted default value
106
+ #
107
+ # *return*:
108
+ # - value : encrypted value.
109
+ #
110
+ # *raise*:
111
+ #
112
+ def _ask_encrypted(sDesc, default)
113
+ entr = _get_encrypt_key
114
+
115
+ enc_value = default
116
+
117
+ value_hidden = _get_encrypted_value_hidden(sDesc, default, entr)
118
+
119
+ value_free = ''
120
+ while value_free == ''
121
+ # ask for encrypted data.
122
+ value_free = ask(format('Enter %s: [%s]', sDesc, value_hidden)) do |q|
123
+ q.echo = '*'
124
+ end
125
+ if value_free == '' && enc_value
126
+ value_free = Encryptor.decrypt(
127
+ :value => Base64.strict_decode64(enc_value),
128
+ :key => entr[:key],
129
+ :iv => Base64.strict_decode64(entr[:iv]),
130
+ :salt => entr[:salt]
131
+ )
132
+ else
133
+ PrcLib.message('%s cannot be empty.', sDesc) if value_free == ''
134
+ end
135
+ end
136
+ Base64.strict_encode64(
137
+ Encryptor.encrypt(
138
+ :value => value_free,
139
+ :key => entr[:key],
140
+ :iv => Base64.strict_decode64(entr[:iv]),
141
+ :salt => entr[:salt]
142
+ )
143
+ )
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,229 @@
1
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'highline/import'
16
+ require 'erb'
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
+ module Lorj
28
+ # Adding process core functions.
29
+ class BaseDefinition
30
+ # Load /:setup/:ask_step section of the defaults.yaml
31
+ #
32
+ # See lib/core/core_model.rb
33
+ #
34
+ # * *Returns*:
35
+ # - hash : setup data structure.
36
+ #
37
+ # * *Raises* :
38
+ #
39
+ def _setup_load
40
+ ask_steps = Lorj.defaults.get[:setup, :ask_step]
41
+ setup_steps = []
42
+ ask_steps.each do | value |
43
+ setup_steps << {
44
+ :desc => value[:desc],
45
+ :explanation => value[:explanation],
46
+ :pre_step_handler => value[:pre_step_function],
47
+ :order => [[]], # attributes in array of level/order
48
+ :post_step_handler => value[:post_step_function]
49
+ }
50
+ end
51
+ setup_steps
52
+ end
53
+
54
+ # check for any additional data to ask to the user
55
+ # thanks to the /:setup/:ask_step/<steps>/:add option of each steps
56
+ #
57
+ # * *Args* :
58
+ # - setup_steps : Hash. setup data structure to update.
59
+ # It will update setup_steps:/:order 2 dimensions array
60
+ #
61
+ # * *Returns*:
62
+ #
63
+ # * *Raises* :
64
+ #
65
+ def _setup_check_additional(setup_steps)
66
+ setup_steps.each_index do | step |
67
+ value = setup_steps[step]
68
+ next unless value.rh_exist?(:add)
69
+
70
+ datas_to_add = value.rh_get(:add)
71
+ datas_to_add.each do | data_to_add |
72
+ order_array = setup_steps[step][:order]
73
+ next if _setup_attr_already_added?(order_array, data_to_add)
74
+
75
+ _setup_data_insert(setup_steps, data_to_add, step, order_array.length)
76
+ end
77
+ end
78
+ end
79
+
80
+ # Loop on object dependencies to determine the list of attributes to setup.
81
+ #
82
+ #
83
+ # * *Args* :
84
+ # - setup_steps : Hash. setup data structure to update.
85
+ # It will update setup_steps:/:order 2 dimensions array
86
+ #
87
+ # * *Returns*:
88
+ # - Nothing. But setup_steps is updated.
89
+ #
90
+ # * *Raises* :
91
+ #
92
+ def _setup_identify(sObjectType, setup_steps)
93
+ objs_to_inspect = [sObjectType]
94
+ inspected_objects = []
95
+
96
+ while objs_to_inspect.length > 0
97
+ # Identify data to ask
98
+ # A data to ask is a data needs from an object type
99
+ # which is declared in section of defaults.yaml
100
+ # and is declared :account to true (in defaults.yaml or in process
101
+ # declaration - define_data)
102
+
103
+ object_type = objs_to_inspect.pop
104
+
105
+ Lorj.debug(1, "Checking '%s'", object_type)
106
+ attributes = PrcLib.model.meta_obj.rh_get(object_type,
107
+ :params, :keys)
108
+ if attributes.nil?
109
+ Lorj.debug(1, "Warning! Object '%s' has no data/object needs. Check"\
110
+ ' the process', object_type)
111
+ next
112
+ end
113
+ attributes.each do |attr_path, attr_params|
114
+ attr_name = KeyPath.new(attr_path).key
115
+ _setup_identify_obj_params(setup_steps,
116
+ inspected_objects, objs_to_inspect,
117
+ attr_name, attr_params)
118
+ end
119
+ end
120
+ end
121
+
122
+ # Internal setup function to identify data to ask
123
+ # Navigate through objects dependencies to determine the need.
124
+ def _setup_identify_obj_params(setup_steps,
125
+ inspected_objects, objs_to_inspect,
126
+ attr_name, attr_params)
127
+
128
+ attr_type = attr_params[:type]
129
+
130
+ case attr_type
131
+ when :data
132
+ return unless _setup_obj_param_is_data(setup_steps,
133
+ inspected_objects, attr_name)
134
+ inspected_objects << attr_name
135
+ return
136
+ when :CloudObject
137
+ return if objs_to_inspect.include?(attr_name) ||
138
+ inspected_objects.include?(attr_name)
139
+ # New object to inspect
140
+ objs_to_inspect << attr_name
141
+ end
142
+ end
143
+
144
+ def _setup_display_step(setup_step, step)
145
+ Lorj.debug(2, 'Ask step %s:', step)
146
+ puts ANSI.bold(setup_step[:desc]) unless setup_step[:desc].nil?
147
+ begin
148
+ erb_msg = ANSI.yellow(erb(setup_step[:explanation]))
149
+ rescue => e
150
+ PrcLib.Error "setup step '%d/:explanation' : %s", step, e.message
151
+ end
152
+ puts format("%s\n\n", erb_msg) unless setup_step[:explanation].nil?
153
+ end
154
+
155
+ # internal setup function to display step information
156
+ #
157
+ # * *Args* :
158
+ # - +data+ : data name to ask.
159
+ # - +options+ : data options
160
+ #
161
+ # * *Returns*:
162
+ # - +desc+ : Description of the data to ask.
163
+ #
164
+ # * *Raises* :
165
+ #
166
+ def _setup_display_data(data, options)
167
+ desc = format("'%s' value", data)
168
+
169
+ unless options[:explanation].nil?
170
+ begin
171
+ puts format('%s: %s',
172
+ data,
173
+ erb(options[:explanation]))
174
+ rescue => e
175
+ PrcLib.Error "setup key '%s/:explanation' : %s", data, e.message
176
+ end
177
+ end
178
+
179
+ begin
180
+ desc = erb(options[:desc]) unless options[:desc].nil?
181
+ rescue => e
182
+ PrcLib.Error "setup key '%s/:desc' : %s", data, e.message
183
+ end
184
+
185
+ desc
186
+ end
187
+
188
+ # internal setup core function which ask user to enter values.
189
+ # looping step by step and presenting sorted data to set.
190
+ #
191
+ # It execute pre-process if defined by:
192
+ # /:section/<section name>/<data>/:pre_step_function
193
+ #
194
+ # If pre-process returns true, end user interaction is canceled.
195
+ #
196
+ # * *Args* :
197
+ # - +setup_steps+ : setup data structure.
198
+ #
199
+ # * *Returns*:
200
+ #
201
+ # * *Raises* :
202
+ #
203
+ def _setup_ask(setup_steps)
204
+ # Ask for user input
205
+ setup_steps.each_index do | iStep |
206
+ _setup_display_step(setup_step, iStep)
207
+
208
+ order_array = setup_steps[iStep][:order]
209
+
210
+ order_array.each_index do | iIndex |
211
+ Lorj.debug(2, 'Ask order %s:', iIndex)
212
+ order_array[iIndex].each do | data |
213
+ options = _get_meta_data(data)
214
+ options = {} if options.nil?
215
+
216
+ data_desc = _setup_display_data(data, options)
217
+
218
+ if options[:pre_step_function]
219
+ proc = options[:pre_step_function]
220
+ next unless @oForjProcess.method(proc).call(data)
221
+ end
222
+
223
+ _setup_ask_data(data_desc, data, options)
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
229
+ end
@@ -0,0 +1,160 @@
1
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'highline/import'
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
+ module Lorj
27
+ # Adding process core functions.
28
+ class BaseDefinition
29
+ # Internal setup function to build the list from a controller call.
30
+ #
31
+ # * *Args* :
32
+ # - +obj_to_load+ : Object to get list from.
33
+ # - +list_options+: list and validation options
34
+ #
35
+ # * *Returns*:
36
+ # - Hash : list of possible values and default.
37
+ # :default_value : Value pre-selected.
38
+ # :list : list of possible values
39
+ #
40
+ # * *Raises* :
41
+ #
42
+ def _setup_list_from_controller_call(obj_to_load, list_options)
43
+ PrcLib.message("Loading #{obj_to_load}.")
44
+
45
+ object = @object_data[obj_to_load, :ObjectData]
46
+ object = Create(obj_to_load) if object.nil?
47
+ return nil if object.nil?
48
+
49
+ params = ObjectData.new
50
+ params.add(object)
51
+ params << list_options[:query_params]
52
+
53
+ runtime_fail '%s: query_type => :controller_call '\
54
+ 'requires missing :query_call declaration'\
55
+ ' (Controller function)',
56
+ data if list_options[:query_call].nil?
57
+
58
+ proc = list_options[:query_call]
59
+ begin
60
+ list = @controller.method(proc).call(obj_to_load, params)
61
+ rescue => e
62
+ runtime_fail "Error during call of '%s':\n%s", proc, e.message
63
+ end
64
+ { :list => list, :default_value => nil }
65
+ end
66
+
67
+ # Internal setup function to build the list from a query call.
68
+ #
69
+ # * *Args* :
70
+ # - +obj_to_load+ : Object to get list from.
71
+ # - +list_options+: list and validation options
72
+ #
73
+ # * *Returns*:
74
+ # - Hash : list of possible values and default.
75
+ # :default_value : Value pre-selected.
76
+ # :list : list of possible values
77
+ #
78
+ # * *Raises* :
79
+ #
80
+ def _setup_list_from_query_call(obj_to_load, list_options)
81
+ PrcLib.message("Querying #{obj_to_load}.")
82
+
83
+ query_hash = list_options[:query_params]
84
+ query_hash = {} if query_hash.nil?
85
+
86
+ object_list = query(obj_to_load, query_hash)
87
+
88
+ list = []
89
+ object_list.each { | oElem | list << oElem[list_options[:value]] }
90
+
91
+ { :list => list.sort!, :default_value => nil }
92
+ end
93
+
94
+ def _setup_build_process_params(option_params, params)
95
+ return if option_params.nil?
96
+
97
+ option_params.each do | key, value |
98
+ match_res = value.match(/lorj::config\[(.*)\]/)
99
+ if match_res
100
+ extract = match_res[1].split(', ')
101
+ extract.map! { | v | v[1..-1].to_sym if v[0] == ':' }
102
+ params << { key => config[extract] }
103
+ else
104
+ params << { key => value }
105
+ end
106
+ end
107
+ end
108
+
109
+ # Internal setup function to build the list from a process call.
110
+ #
111
+ # * *Args* :
112
+ # - +obj_to_load+ : Object to get list from.
113
+ # - +list_options+: list and validation options
114
+ #
115
+ # * *Returns*:
116
+ # - Hash : list of possible values and default.
117
+ # :default_value : Value pre-selected.
118
+ # :list : list of possible values
119
+ #
120
+ # * *Raises* :
121
+ #
122
+ def _setup_list_from_process_call(obj_to_load, list_options)
123
+ runtime_fail '%s: query_type => :process_call'\
124
+ ' requires missing :query_call declaration'\
125
+ ' (Provider function)',
126
+ data if list_options[:query_call].nil?
127
+ proc = list_options[:query_call]
128
+ obj_to_load = list_options[:object]
129
+ PrcLib.debug(2, "Running process '#{proc}' on '#{obj_to_load}'.")
130
+
131
+ # Building Process function attr_params parameter
132
+ params = ObjectData.new
133
+ params << { :default_value => default }
134
+
135
+ _setup_build_process_params(list_options[:query_params], params)
136
+
137
+ begin
138
+ proc_method = @process.method(proc)
139
+ result = proc_method.call(obj_to_load, params)
140
+ rescue => e
141
+ runtime_fail "Error during call of '%s':\n%s",
142
+ proc, e.message
143
+ end
144
+
145
+ if result.is_a?(Hash)
146
+ if result[:list].nil? ||
147
+ !result[:list].is_a?(Array)
148
+ PrcLib.debug("Process function '%s' did not return an"\
149
+ ' :list => Array of list_options.',
150
+ list_options[:query_call])
151
+ end
152
+ else
153
+ PrcLib.debug("Process function '%s' did not return an"\
154
+ ' Hash with :list and :default_value')
155
+ result = { :list => [], :default_value => nil }
156
+ end
157
+ result
158
+ end
159
+ end
160
+ end