dtk-shell 0.10.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 (191) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +5 -0
  3. data/Gemfile_dev +13 -0
  4. data/README.md +121 -0
  5. data/bin/dtk-execute +32 -0
  6. data/bin/dtk-run +92 -0
  7. data/bin/dtk-shell +31 -0
  8. data/dtk-shell.gemspec +50 -0
  9. data/lib/auxiliary.rb +61 -0
  10. data/lib/bundler_monkey_patch.rb +26 -0
  11. data/lib/client.rb +58 -0
  12. data/lib/command_helper.rb +33 -0
  13. data/lib/command_helpers/git_repo.rb +589 -0
  14. data/lib/command_helpers/git_repo/merge.rb +153 -0
  15. data/lib/command_helpers/jenkins_client.rb +106 -0
  16. data/lib/command_helpers/jenkins_client/config_xml.rb +288 -0
  17. data/lib/command_helpers/service_importer.rb +251 -0
  18. data/lib/command_helpers/service_link.rb +33 -0
  19. data/lib/command_helpers/test_module_creator.rb +69 -0
  20. data/lib/command_helpers/test_module_templates/dtk.model.yaml.eruby +10 -0
  21. data/lib/command_helpers/test_module_templates/spec_helper.rb.eruby +10 -0
  22. data/lib/command_helpers/test_module_templates/temp_component_spec.rb.eruby +5 -0
  23. data/lib/commands.rb +57 -0
  24. data/lib/commands/common/thor/access_control.rb +133 -0
  25. data/lib/commands/common/thor/action_result_handler.rb +74 -0
  26. data/lib/commands/common/thor/assembly_template.rb +92 -0
  27. data/lib/commands/common/thor/assembly_workspace.rb +1801 -0
  28. data/lib/commands/common/thor/base_command_helper.rb +59 -0
  29. data/lib/commands/common/thor/clone.rb +82 -0
  30. data/lib/commands/common/thor/common.rb +88 -0
  31. data/lib/commands/common/thor/common_base.rb +49 -0
  32. data/lib/commands/common/thor/create_target.rb +70 -0
  33. data/lib/commands/common/thor/edit.rb +255 -0
  34. data/lib/commands/common/thor/inventory_parser.rb +98 -0
  35. data/lib/commands/common/thor/list_diffs.rb +128 -0
  36. data/lib/commands/common/thor/module.rb +1011 -0
  37. data/lib/commands/common/thor/module/import.rb +210 -0
  38. data/lib/commands/common/thor/node.rb +53 -0
  39. data/lib/commands/common/thor/poller.rb +65 -0
  40. data/lib/commands/common/thor/pull_clone_changes.rb +28 -0
  41. data/lib/commands/common/thor/pull_from_remote.rb +152 -0
  42. data/lib/commands/common/thor/puppet_forge.rb +72 -0
  43. data/lib/commands/common/thor/purge_clone.rb +101 -0
  44. data/lib/commands/common/thor/push_clone_changes.rb +162 -0
  45. data/lib/commands/common/thor/push_to_remote.rb +94 -0
  46. data/lib/commands/common/thor/remotes.rb +71 -0
  47. data/lib/commands/common/thor/reparse.rb +40 -0
  48. data/lib/commands/common/thor/set_required_attributes.rb +46 -0
  49. data/lib/commands/thor/account.rb +239 -0
  50. data/lib/commands/thor/assembly.rb +356 -0
  51. data/lib/commands/thor/attribute.rb +79 -0
  52. data/lib/commands/thor/component.rb +70 -0
  53. data/lib/commands/thor/component_module.rb +501 -0
  54. data/lib/commands/thor/component_template.rb +174 -0
  55. data/lib/commands/thor/dependency.rb +34 -0
  56. data/lib/commands/thor/developer.rb +144 -0
  57. data/lib/commands/thor/dtk.rb +152 -0
  58. data/lib/commands/thor/library.rb +125 -0
  59. data/lib/commands/thor/node.rb +504 -0
  60. data/lib/commands/thor/node_template.rb +94 -0
  61. data/lib/commands/thor/project.rb +34 -0
  62. data/lib/commands/thor/provider.rb +233 -0
  63. data/lib/commands/thor/remotes.rb +49 -0
  64. data/lib/commands/thor/service.rb +941 -0
  65. data/lib/commands/thor/service_module.rb +914 -0
  66. data/lib/commands/thor/state_change.rb +25 -0
  67. data/lib/commands/thor/target.rb +250 -0
  68. data/lib/commands/thor/task.rb +116 -0
  69. data/lib/commands/thor/test_module.rb +310 -0
  70. data/lib/commands/thor/utils.rb +21 -0
  71. data/lib/commands/thor/workspace.rb +685 -0
  72. data/lib/config/cacert.pem +3785 -0
  73. data/lib/config/client.conf.header +20 -0
  74. data/lib/config/configuration.rb +99 -0
  75. data/lib/config/default.conf +16 -0
  76. data/lib/config/disk_cacher.rb +80 -0
  77. data/lib/configurator.rb +176 -0
  78. data/lib/context_router.rb +44 -0
  79. data/lib/core.rb +497 -0
  80. data/lib/domain/git_adapter.rb +412 -0
  81. data/lib/domain/git_error_handler.rb +64 -0
  82. data/lib/domain/response.rb +285 -0
  83. data/lib/domain/response/error_handler.rb +86 -0
  84. data/lib/dtk-shell/version.rb +20 -0
  85. data/lib/dtk_constants.rb +40 -0
  86. data/lib/dtk_error.rb +114 -0
  87. data/lib/dtk_logger.rb +126 -0
  88. data/lib/dtk_shell.rb +31 -0
  89. data/lib/error.rb +85 -0
  90. data/lib/execute.rb +29 -0
  91. data/lib/execute/cli_pure/cli_rerouter.rb +102 -0
  92. data/lib/execute/command.rb +40 -0
  93. data/lib/execute/command/api_call.rb +60 -0
  94. data/lib/execute/command/api_call/map.rb +60 -0
  95. data/lib/execute/command/api_call/service.rb +91 -0
  96. data/lib/execute/command/api_call/translation_term.rb +119 -0
  97. data/lib/execute/command/rest_call.rb +37 -0
  98. data/lib/execute/command_processor.rb +30 -0
  99. data/lib/execute/command_processor/rest_call.rb +59 -0
  100. data/lib/execute/error_usage.rb +21 -0
  101. data/lib/execute/execute_context.rb +86 -0
  102. data/lib/execute/execute_context/result_store.rb +37 -0
  103. data/lib/execute/script.rb +64 -0
  104. data/lib/execute/script/add_tenant.rb +121 -0
  105. data/lib/git-logs/git.log +0 -0
  106. data/lib/parser/adapters/option_parser.rb +70 -0
  107. data/lib/parser/adapters/thor.rb +555 -0
  108. data/lib/parser/adapters/thor/common_option_defs.rb +40 -0
  109. data/lib/require_first.rb +104 -0
  110. data/lib/search_hash.rb +44 -0
  111. data/lib/shell.rb +261 -0
  112. data/lib/shell/context.rb +1065 -0
  113. data/lib/shell/context_aux.rb +46 -0
  114. data/lib/shell/domain/active_context.rb +186 -0
  115. data/lib/shell/domain/context_entity.rb +89 -0
  116. data/lib/shell/domain/context_params.rb +223 -0
  117. data/lib/shell/domain/override_tasks.rb +88 -0
  118. data/lib/shell/domain/shadow_entity.rb +76 -0
  119. data/lib/shell/header_shell.rb +44 -0
  120. data/lib/shell/help_monkey_patch.rb +283 -0
  121. data/lib/shell/interactive_wizard.rb +225 -0
  122. data/lib/shell/message_queue.rb +63 -0
  123. data/lib/shell/parse_monkey_patch.rb +39 -0
  124. data/lib/shell/status_monitor.rb +124 -0
  125. data/lib/task_status.rb +83 -0
  126. data/lib/task_status/refresh_mode.rb +77 -0
  127. data/lib/task_status/snapshot_mode.rb +28 -0
  128. data/lib/task_status/stream_mode.rb +48 -0
  129. data/lib/task_status/stream_mode/element.rb +101 -0
  130. data/lib/task_status/stream_mode/element/format.rb +101 -0
  131. data/lib/task_status/stream_mode/element/hierarchical_task.rb +100 -0
  132. data/lib/task_status/stream_mode/element/hierarchical_task/result.rb +72 -0
  133. data/lib/task_status/stream_mode/element/hierarchical_task/result/action.rb +93 -0
  134. data/lib/task_status/stream_mode/element/hierarchical_task/result/components.rb +26 -0
  135. data/lib/task_status/stream_mode/element/hierarchical_task/result/node_level.rb +26 -0
  136. data/lib/task_status/stream_mode/element/hierarchical_task/steps.rb +34 -0
  137. data/lib/task_status/stream_mode/element/hierarchical_task/steps/action.rb +53 -0
  138. data/lib/task_status/stream_mode/element/hierarchical_task/steps/components.rb +53 -0
  139. data/lib/task_status/stream_mode/element/hierarchical_task/steps/node_level.rb +42 -0
  140. data/lib/task_status/stream_mode/element/no_results.rb +26 -0
  141. data/lib/task_status/stream_mode/element/render.rb +59 -0
  142. data/lib/task_status/stream_mode/element/stage.rb +84 -0
  143. data/lib/task_status/stream_mode/element/stage/render.rb +76 -0
  144. data/lib/task_status/stream_mode/element/task_end.rb +35 -0
  145. data/lib/task_status/stream_mode/element/task_start.rb +37 -0
  146. data/lib/util/common_util.rb +37 -0
  147. data/lib/util/console.rb +235 -0
  148. data/lib/util/dtk_puppet.rb +65 -0
  149. data/lib/util/module_util.rb +66 -0
  150. data/lib/util/os_util.rb +385 -0
  151. data/lib/util/permission_util.rb +31 -0
  152. data/lib/util/remote_dependency_util.rb +84 -0
  153. data/lib/util/ssh_util.rb +94 -0
  154. data/lib/view_processor.rb +129 -0
  155. data/lib/view_processor/augmented_simple_list.rb +44 -0
  156. data/lib/view_processor/hash_pretty_print.rb +123 -0
  157. data/lib/view_processor/simple_list.rb +156 -0
  158. data/lib/view_processor/table_print.rb +309 -0
  159. data/lib/violation.rb +86 -0
  160. data/lib/violation/attribute.rb +76 -0
  161. data/lib/violation/fix.rb +26 -0
  162. data/lib/violation/fix/result.rb +73 -0
  163. data/lib/violation/fix/result/error.rb +34 -0
  164. data/lib/violation/fix/set_attribute.rb +41 -0
  165. data/lib/violation/sub_classes.rb +60 -0
  166. data/puppet/manifests/init.pp +72 -0
  167. data/puppet/manifests/params.pp +16 -0
  168. data/puppet/r8meta.puppet.yml +35 -0
  169. data/puppet/templates/bash_profile.erb +2 -0
  170. data/puppet/templates/client.conf.erb +1 -0
  171. data/puppet/templates/dtkclient.erb +2 -0
  172. data/spec/component_module_spec.rb +34 -0
  173. data/spec/dependency_spec.rb +6 -0
  174. data/spec/dtk_shell_spec.rb +13 -0
  175. data/spec/dtk_spec.rb +33 -0
  176. data/spec/lib/spec_helper.rb +10 -0
  177. data/spec/lib/spec_thor.rb +108 -0
  178. data/spec/node_template_spec.rb +24 -0
  179. data/spec/project_spec.rb +6 -0
  180. data/spec/repo_spec.rb +7 -0
  181. data/spec/response_spec.rb +52 -0
  182. data/spec/service_module_spec.rb +38 -0
  183. data/spec/service_spec.rb +50 -0
  184. data/spec/state_change_spec.rb +7 -0
  185. data/spec/table_print_spec.rb +48 -0
  186. data/spec/target_spec.rb +57 -0
  187. data/spec/task_spec.rb +28 -0
  188. data/views/assembly/augmented_simple_list.rb +12 -0
  189. data/views/assembly_template/augmented_simple_list.rb +12 -0
  190. data/views/list_task/augmented_simple_list.rb +12 -0
  191. metadata +421 -0
@@ -0,0 +1,251 @@
1
+ #
2
+ # Copyright (C) 2010-2016 dtk contributors
3
+ #
4
+ # This file is part of the dtk project.
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
+ dtk_require_from_base('configurator')
19
+ module DTK::Client
20
+ #
21
+ # Main purpose of this module is to recognize which local modules are missing based on
22
+ # name, namespace, version and for those missing component module module will call
23
+ # module#clone and module#import_dtkn method to get missing component modules
24
+ #
25
+ module ServiceImporter
26
+ def create_missing_clone_dirs()
27
+ Configurator.create_missing_clone_dirs
28
+ end
29
+
30
+ def self.error_message(name, errors, opts = {})
31
+ prefix = ''
32
+ unless opts[:module_type] == :service_module
33
+ prefix = "Module '#{name}' has errors:\n "
34
+ end
35
+ command = opts[:command] || 'edit'
36
+ "#{prefix}#{errors.to_s}\nYou can fix errors by invoking the '#{command}' command.\n"
37
+ end
38
+
39
+ ##
40
+ # Method will trigger pull from dtkn for each existing module
41
+ #
42
+ def trigger_module_auto_pull(required_modules, opts = {})
43
+ return if required_modules.empty?
44
+ hide_output = opts[:hide_output]
45
+
46
+ # options[:force] means this command is triggered from trigger_module_auto_import method bellow
47
+ unless opts[:force]
48
+ update_none = RemoteDependencyUtil.check_for_frozen_modules(required_modules)
49
+
50
+ if update_none
51
+ print "All dependent modules are frozen and will not be updated!\n" unless hide_output
52
+ print "Resuming pull ... " unless hide_output
53
+ return Response::Ok.new()
54
+ end
55
+ end
56
+
57
+ if opts[:force] || Console.confirmation_prompt("Do you want to update in addition to this module its dependent modules from the catalog?")
58
+ required_modules.uniq.each do |r_module|
59
+ module_name = full_module_name(r_module)
60
+ module_type = r_module['type']
61
+ version = r_module['version']
62
+ full_name = (version && !version.eql?('master')) ? "#{module_name}(#{version})" : module_name
63
+
64
+ # No op for frozen modules
65
+ next if r_module['frozen']
66
+
67
+ print "Pulling #{module_type.gsub('_',' ')} content for '#{full_name}' ... " unless hide_output
68
+
69
+ new_context_params = DTK::Shell::ContextParams.new
70
+ new_context_params.add_context_to_params(module_type, module_type)
71
+ new_context_params.add_context_name_to_params(module_type, module_type, module_name)
72
+
73
+ forwarded_opts = { :skip_recursive_pull => true, :ignore_dependency_merge_conflict => true }
74
+ forwarded_opts.merge!(:do_not_raise => true) if opts[:do_not_raise]
75
+ forwarded_opts.merge!(:version => version) if version && !version.eql?('master')
76
+ new_context_params.forward_options(forwarded_opts)
77
+
78
+ response = ContextRouter.routeTask(module_type, "pull_dtkn", new_context_params, @conn)
79
+
80
+ unless response.ok?
81
+ if opts[:do_not_raise]
82
+ OsUtil.print("#{response.error_message}", :red)
83
+ else
84
+ raise DtkError, response.error_message
85
+ end
86
+ end
87
+ end
88
+
89
+ print "Resuming pull ... " unless opts[:force]
90
+ end
91
+ end
92
+
93
+ ##
94
+ # Method will trigger import for each missing module component
95
+ #
96
+ def trigger_module_auto_import(modules_to_import, required_modules, opts = {})
97
+ hide_output = opts[:hide_output]
98
+
99
+ puts 'Auto-installing missing module(s)' unless hide_output
100
+ update_all = false
101
+ update_none = RemoteDependencyUtil.check_for_frozen_modules(required_modules)
102
+
103
+ # Print out or update installed modules from catalog
104
+ required_modules.uniq.each do |r_module|
105
+ module_name = full_module_name(r_module)
106
+ module_type = r_module['type']
107
+ version = r_module['version']
108
+ full_name = (version && !version.eql?('master')) ? "#{module_name}(#{version})" : module_name
109
+
110
+ unless hide_output
111
+ print "Using #{module_type.gsub('_', ' ')} '#{full_name}'\n" unless update_all
112
+ end
113
+
114
+ next if update_none || opts[:update_none]
115
+
116
+ pull_opts = {:force => true, :do_not_raise => true}
117
+ pull_opts.merge!(:hide_output => hide_output) if hide_output
118
+
119
+ if update_all
120
+ trigger_module_auto_pull([r_module], pull_opts)
121
+ else
122
+ options = required_modules.size > 1 ? %w(all none) : []
123
+ update = Console.confirmation_prompt_additional_options("Do you want to update dependent #{module_type.gsub('_', ' ')} '#{full_name}' from the catalog?", options) unless hide_output
124
+ next unless update
125
+
126
+ if update.to_s.eql?('all')
127
+ update_all = true
128
+ trigger_module_auto_pull([r_module], pull_opts)
129
+ elsif update.to_s.eql?('none')
130
+ update_none = true
131
+ else
132
+ trigger_module_auto_pull([r_module], pull_opts)
133
+ end
134
+ end
135
+ end
136
+
137
+ # Trigger import/install for missing modules
138
+ modules_to_import.uniq.each do |m_module|
139
+ module_name = full_module_name(m_module)
140
+ module_type = m_module['type']
141
+ version = m_module['version']
142
+ full_name = (version && !version.eql?('master')) ? "#{module_name}(#{version})" : module_name
143
+
144
+ # we check if there is module_url if so we install from git
145
+ module_url = m_module['module_url']
146
+
147
+ # descriptive message
148
+ importing = module_url ? "Importing" : "Installing"
149
+ import_msg = "#{importing} #{module_type.gsub('_', ' ')} '#{full_name}'"
150
+ import_msg += " from git source #{module_url}" if module_url
151
+ print "#{import_msg} ... " unless hide_output
152
+
153
+ if module_url
154
+ # import from Git source
155
+ new_context_params = ::DTK::Shell::ContextParams.new([module_url, module_name])
156
+ new_context_params.forward_options(:internal_trigger => true)
157
+ response = ContextRouter.routeTask(module_type, 'import_git', new_context_params, @conn)
158
+ else
159
+ # import from Repo Manager
160
+ new_context_params = ::DTK::Shell::ContextParams.new([module_name])
161
+ new_context_params.override_method_argument!('option_2', version) if version && !version.eql?('master')
162
+ new_context_params.forward_options(:skip_cloning => false, :skip_auto_install => true, :module_type => module_type, :ignore_component_error => true).merge!(opts)
163
+ response = ContextRouter.routeTask(module_type, 'install', new_context_params, @conn)
164
+ end
165
+
166
+ ignore_component_error = (new_context_params.get_forwarded_options() || {})[:ignore_component_error] && module_type.eql?('component_module')
167
+ puts(response.data(:does_not_exist) ? response.data(:does_not_exist) : 'Done.') unless hide_output
168
+ raise DtkError, response.error_message if !response.ok? && !ignore_component_error
169
+ end
170
+
171
+ Response::Ok.new()
172
+ end
173
+
174
+ def resolve_missing_components(service_module_id, service_module_name, namespace_to_use, force_clone=false)
175
+ # Get dependency component modules and cross reference them with local component modules
176
+ module_component_list = post rest_url("service_module/list_component_modules"), { :service_module_id => service_module_id }
177
+
178
+ local_modules, needed_modules = OsUtil.local_component_module_list(), Array.new
179
+
180
+ if module_component_list
181
+ module_component_list.data.each do |cmp_module|
182
+ with_namespace = ModuleUtil.resolve_name(cmp_module["display_name"],cmp_module["namespace_name"])
183
+ formated_name = add_version?(with_namespace, cmp_module['version'])
184
+ unless local_modules.include?(formated_name)
185
+ needed_modules << cmp_module.merge({'formated_name' => formated_name})
186
+ end
187
+ end
188
+ end
189
+
190
+ unless needed_modules.empty?
191
+ # puts "Service '#{service_module_name}' does not have the following component modules dependencies on the client machine: \n\n"
192
+ # needed_modules.each { |m| puts " - #{m['formated_name']}" }
193
+ is_install_dependencies = true
194
+ # is_install_dependencies = Console.confirmation_prompt("\nDo you want to clone these missing component modules to the client machine?") unless force_clone
195
+
196
+ # we get list of modules available on server
197
+
198
+ new_context_params = nil
199
+
200
+ if is_install_dependencies
201
+ needed_modules.each do |m|
202
+ formated_name = m['formated_name']
203
+ # print "Cloning component module '#{formated_name}' from server ... "
204
+ thor_options = {}
205
+ thor_options["version"] = m['version'] unless m['version'].eql?('base')
206
+ thor_options["skip_edit"] = true
207
+ thor_options["omit_output"] = true
208
+ thor_options.merge!(:module_type => 'component-module')
209
+ thor_options.merge!(:service_importer => true)
210
+ new_context_params = ::DTK::Shell::ContextParams.new
211
+ new_context_params.forward_options(thor_options)
212
+ new_context_params.add_context_to_params(formated_name, :"component-module", m['id'])
213
+
214
+ begin
215
+ response = ContextRouter.routeTask("component_module", "clone", new_context_params, @conn)
216
+ rescue DtkValidationError => e
217
+ # ignoring this
218
+ end
219
+ # puts "Done."
220
+ end
221
+ end
222
+ end
223
+ end
224
+
225
+ private
226
+ #
227
+ # As the result we can have multiple version so we need to resolve them
228
+ #
229
+ # Returns: Array<String>
230
+ def resolve_module_names(e)
231
+ versions = (e['version'] ? e['version'].split(',') : ['CURRENT'])
232
+
233
+ versions.collect { |version| add_version?(e['display_name'], version)}
234
+ end
235
+
236
+ # Resolves local module name
237
+ #
238
+ # Returns: String
239
+ def add_version?(display_name, version)
240
+ version = nil if 'CURRENT'.eql?(version) || 'base'.eql?(version)
241
+ (version ? "#{display_name}-#{version.strip}" : "#{display_name}")
242
+ end
243
+
244
+ private
245
+
246
+ def full_module_name(module_hash)
247
+ ModuleUtil.join_name(module_hash['name'], module_hash['namespace'])
248
+ end
249
+
250
+ end
251
+ end
@@ -0,0 +1,33 @@
1
+ #
2
+ # Copyright (C) 2010-2016 dtk contributors
3
+ #
4
+ # This file is part of the dtk project.
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 DTK; module Client; class CommandHelper
19
+ class ServiceLink < self; class << self
20
+ def post_body_with_id_keys(context_params,method_argument_names)
21
+ assembly_or_workspace_id = context_params.retrieve_arguments([[:service_id!,:workspace_id!]])
22
+ ret = {:assembly_id => assembly_or_workspace_id}
23
+ if context_params.is_last_command_eql_to?(:component)
24
+ component_id,service_type = context_params.retrieve_arguments([:component_id!,:option_1!],method_argument_names)
25
+ ret.merge(:input_component_id => component_id,:service_type => service_type)
26
+ else
27
+ service_link_id = context_params.retrieve_arguments([:option_1!],method_argument_names)
28
+ ret.merge(:service_link_id => service_link_id)
29
+ end
30
+ end
31
+
32
+ end; end
33
+ end; end; end
@@ -0,0 +1,69 @@
1
+ #
2
+ # Copyright (C) 2010-2016 dtk contributors
3
+ #
4
+ # This file is part of the dtk project.
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
+ require 'fileutils'
19
+ require 'erubis'
20
+
21
+ module DTK::Client
22
+ class TestModuleCreator
23
+ class << self
24
+ def create_clone(type, module_name)
25
+ Response.wrap_helper_actions do
26
+ modules_dir = OsUtil.test_clone_location()
27
+ FileUtils.mkdir_p(modules_dir) unless File.directory?(modules_dir)
28
+ target_repo_dir = OsUtil.module_location(type,module_name)
29
+
30
+ begin
31
+ FileUtils.mkdir_p(target_repo_dir)
32
+ generate_model(module_name, target_repo_dir)
33
+ generate_serverspec_files(module_name, target_repo_dir)
34
+ rescue => e
35
+ additional_error_msg = ""
36
+ error_msg = "Create of directory (#{target_repo_dir}) failed."
37
+ additional_error_msg = "Directory already exists" if e.message.include? "File exists"
38
+ raise DTK::ErrorUsage.new(error_msg + " " + additional_error_msg,:log_error=>false)
39
+ end
40
+ {"module_directory" => target_repo_dir}
41
+ end
42
+ end
43
+
44
+ def generate_model(module_name, target_repo_dir)
45
+ input = File.expand_path('test_module_templates/dtk.model.yaml.eruby', File.dirname(__FILE__))
46
+ eruby = Erubis::Eruby.new(File.read(input))
47
+ content = eruby.result(:module_name => module_name)
48
+ File.open(target_repo_dir + "/dtk.model.yaml", "w") { |f| f.write(content) }
49
+ end
50
+
51
+ def generate_serverspec_files(module_name, target_repo_dir)
52
+ template_location = File.expand_path('test_module_templates', File.dirname(__FILE__))
53
+ spec_helper_template = Erubis::Eruby.new(File.read(template_location + "/spec_helper.rb.eruby")).result
54
+ spec_template = Erubis::Eruby.new(File.read(template_location + "/temp_component_spec.rb.eruby")).result
55
+
56
+ begin
57
+ #Create standard serverspec structure
58
+ FileUtils.mkdir_p(target_repo_dir + "/serverspec/spec/localhost")
59
+ File.open(target_repo_dir + "/serverspec/spec/spec_helper.rb", "w") { |f| f.write(spec_helper_template) }
60
+ File.open(target_repo_dir + "/serverspec/spec/localhost/temp_component_spec.rb", "w") { |f| f.write(spec_template) }
61
+ rescue => e
62
+ error_msg = "Generating serverspec files failed."
63
+ DtkLogger.instance.error_pp(e.message, e.backtrace)
64
+ raise DTK::ErrorUsage.new(error_msg,:log_error=>false)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,10 @@
1
+ module: <%= module_name %>
2
+ dsl_version: 0.9.1
3
+ module_type: serverspec
4
+ components:
5
+ temp_component:
6
+ external_ref:
7
+ serverspec_test: temp_component_spec.rb
8
+ attributes:
9
+ temp_attribute:
10
+ type: string
@@ -0,0 +1,10 @@
1
+ require 'serverspec'
2
+
3
+ include SpecInfra::Helper::Exec
4
+ include SpecInfra::Helper::DetectOS
5
+
6
+ class DtkAttribute
7
+ def DtkAttribute.get(name)
8
+ Thread.current[name.to_sym]
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ require File.expand_path('../spec_helper', File.dirname(__FILE__))
2
+
3
+ # Gets attribute defined in dtk.model.yaml
4
+ # This attribute value can be used further in spec examples
5
+ attribute = DtkAttribute.get(:temp_attribute)
@@ -0,0 +1,57 @@
1
+ #
2
+ # Copyright (C) 2010-2016 dtk contributors
3
+ #
4
+ # This file is part of the dtk project.
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 DTK
19
+ module Client
20
+ module CommandBase
21
+ #TODO: temp workaround
22
+ def rotate_args(rotated_args)
23
+ [rotated_args.last] + rotated_args[0..rotated_args.size-2]
24
+ end
25
+
26
+ def get(url)
27
+ get_connection.get(self.class,url)
28
+ end
29
+ def post(url,body=nil)
30
+ get_connection.post(self.class,url,body)
31
+ end
32
+
33
+ def post_file(url,body=nil)
34
+ get_connection.post_file(self.class,url,body)
35
+ end
36
+
37
+ def rest_url(route)
38
+ get_connection.rest_url(route)
39
+ end
40
+
41
+ def get_connection
42
+ DTK::Client::Session.get_connection()
43
+ end
44
+
45
+ def self.handle_argument_error(task, error)
46
+ super
47
+ end
48
+
49
+ private
50
+
51
+ def pretty_print_cols()
52
+ self.class.pretty_print_cols()
53
+ end
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,133 @@
1
+ #
2
+ # Copyright (C) 2010-2016 dtk contributors
3
+ #
4
+ # This file is part of the dtk project.
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 DTK::Client
19
+ module AccessControlMixin
20
+
21
+ def chmod_aux(module_id, permission_string, namespace = nil, chmod_action = :chmod)
22
+ permission_selector = PermissionUtil.validate_permissions!(permission_string.downcase)
23
+ post_body = {
24
+ :module_id => module_id,
25
+ :permission_selector => permission_selector,
26
+ :chmod_action => chmod_action,
27
+ :rsa_pub_key => SSHUtil.rsa_pub_key_content(),
28
+ :remote_module_namespace => namespace
29
+ }
30
+ response = post rest_url("#{resolve_module_type}/remote_chmod"), post_body
31
+ return response unless response.ok?
32
+
33
+ if response.data(:simple_flow)
34
+ puts "Module is now public."
35
+ else
36
+ # in case there are dependencies
37
+ main_module_name = response.data(:main_module)['full_name']
38
+ puts "Main module '#{main_module_name}' has dependencies that are not public: "
39
+ unless response.data(:missing_modules).empty?
40
+ missing = response.data(:missing_modules).collect { |a| a['full_name'] }
41
+ OsUtil.print(" These modules are missing on repository: #{missing.join(', ')}", :red)
42
+ end
43
+ unless response.data(:no_permission).empty?
44
+ no_permission = response.data(:no_permission).collect { |a| a['full_name'] }
45
+ OsUtil.print(" You cannot change permissions for dependencies: #{no_permission.join(', ')}", :yellow)
46
+ end
47
+ unless response.data(:with_permission).empty?
48
+ with_permission = response.data(:with_permission)
49
+ with_permission_names = with_permission.collect { |a| a['full_name'] }
50
+ OsUtil.print(" You can change permissions for dependencies: #{with_permission_names.join(', ')}", :white)
51
+
52
+ # fix for bug in comments for DTK-1959
53
+ # need to send hash instead of array to be able to parse properly in rest_request_params
54
+ with_permission_hash = {}
55
+ with_permission.each do |wp|
56
+ with_permission_hash.merge!("#{wp['name']}" => wp)
57
+ end
58
+
59
+ response.data["with_permission"] = with_permission_hash
60
+ end
61
+
62
+ puts "How should we resolve these dependencies: "
63
+ input = Shell::InteractiveWizard.text_input("(A)ll / (M)ain Module / (N)one ", true, /M|A|N/i)
64
+ if 'N'.eql?(input)
65
+ return nil
66
+ else
67
+ puts "Sending input information ... "
68
+ post_body = {
69
+ :module_id => module_id,
70
+ :module_info => response.data,
71
+ :public_action => 'A'.eql?(input) ? :all : :one,
72
+ :rsa_pub_key => SSHUtil.rsa_pub_key_content(),
73
+ :remote_module_namespace => namespace
74
+ }
75
+
76
+ response = post rest_url("#{resolve_module_type}/confirm_make_public"), post_body
77
+ return response unless response.ok?
78
+ puts "Modules are now public."
79
+ end
80
+ end
81
+
82
+ nil
83
+ end
84
+
85
+ def chown_aux(module_id, remote_user, namespace = nil)
86
+ post_body = {
87
+ :module_id => module_id,
88
+ :remote_user => remote_user,
89
+ :rsa_pub_key => SSHUtil.rsa_pub_key_content(),
90
+ :remote_module_namespace => namespace
91
+ }
92
+ post rest_url("#{resolve_module_type}/remote_chown"), post_body
93
+ end
94
+
95
+ def collaboration_aux(action, module_id, users, groups, namespace = nil)
96
+ raise DtkValidationError, "You must provide --users or --groups to this command" if users.nil? && groups.nil?
97
+ post_body = {
98
+ :module_id => module_id,
99
+ :users => users,
100
+ :groups => groups,
101
+ :action => action,
102
+ :remote_module_namespace => namespace,
103
+ :rsa_pub_key => SSHUtil.rsa_pub_key_content()
104
+ }
105
+ post rest_url("#{resolve_module_type}/remote_collaboration"), post_body
106
+ end
107
+
108
+ def collaboration_list_aux(module_id, namespace = nil)
109
+ post_body = {
110
+ :module_id => module_id,
111
+ :remote_module_namespace => namespace,
112
+ :rsa_pub_key => SSHUtil.rsa_pub_key_content()
113
+ }
114
+ post rest_url("#{resolve_module_type}/list_remote_collaboration"), post_body
115
+ end
116
+
117
+ private
118
+
119
+ def resolve_module_type
120
+ case self
121
+ when ComponentModule
122
+ return :component_module
123
+ when ServiceModule
124
+ return :service_module
125
+ when TestModule
126
+ return :test_module
127
+ else
128
+ raise DtkError, "Module type cannot be resolved for this class (#{self})"
129
+ end
130
+ end
131
+
132
+ end
133
+ end