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,914 @@
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
+ #TODO: putting in version as hidden coption that can be enabled when code ready
19
+ #TODO: may be consistent on whether service module id or service module name used as params
20
+ dtk_require_common_commands('thor/reparse')
21
+ dtk_require_from_base("dtk_logger")
22
+ dtk_require_from_base("util/os_util")
23
+ dtk_require_from_base("commands/thor/assembly")
24
+ dtk_require_from_base('command_helpers/service_importer')
25
+ dtk_require_from_base('task_status')
26
+ dtk_require_common_commands('thor/common')
27
+ dtk_require_common_commands('thor/module')
28
+ dtk_require_common_commands('thor/poller')
29
+ dtk_require_common_commands('thor/assembly_template')
30
+ dtk_require_common_commands('thor/pull_clone_changes')
31
+
32
+ module DTK::Client
33
+ class ServiceModule < CommandBaseThor
34
+
35
+ PULL_CATALOGS = ["dtkn"]
36
+
37
+ no_tasks do
38
+ include ReparseMixin
39
+ include ServiceImporter
40
+ include ModuleMixin
41
+ include Poller
42
+ include AssemblyTemplateMixin
43
+ include TaskStatusMixin
44
+
45
+ def get_service_module_name(service_module_id)
46
+ get_name_from_id_helper(service_module_id)
47
+ end
48
+
49
+ def get_name_and_version_from_assembly_template(assembly_template_name)
50
+ name = assembly_template_name
51
+ version = nil
52
+
53
+ if assembly_template_name.match(/(.*)(\-v\d{1,2}\.\d{1,2}\.\d{1,2}\Z)/)
54
+ name, version = [$1,$2]
55
+ end
56
+
57
+ if version
58
+ version.gsub!('-v','')
59
+ else
60
+ version = 'base'
61
+ end
62
+
63
+ return name, version
64
+ end
65
+
66
+ def stage_aux(context_params)
67
+ if context_params.is_there_identifier?(:assembly)
68
+ service_module_id, service_module_name, assembly_template_name, name = context_params.retrieve_arguments([:service_module_id!, :service_module_name!, :assembly_name!, :option_2], method_argument_names)
69
+ else
70
+ service_module_id, service_module_name, assembly_template_name, name = context_params.retrieve_arguments([:service_module_id!, :service_module_name!, :option_1!, :option_2], method_argument_names)
71
+ end
72
+
73
+ post_body = { :assembly_id => assembly_template_name }
74
+
75
+ # special case when we need service module id
76
+ context_params.pure_cli_mode = true
77
+ post_body[:service_module_id] = service_module_id if context_params.pure_cli_mode
78
+
79
+ # using this to make sure cache will be invalidated after new assembly is created from other commands e.g.
80
+ # 'assembly-create', 'install' etc.
81
+ @@invalidate_map << :assembly
82
+
83
+ fwd_options = context_params.get_forwarded_options()
84
+ instance_bindings = options["instance-bindings"]
85
+ settings = parse_service_settings(options["settings"])
86
+ node_size = fwd_options[:node_size]||options.node_size
87
+ os_type = fwd_options[:os_type]||options.os_type
88
+ version = fwd_options[:version]||options.version
89
+ no_auto_complete = fwd_options[:no_auto_complete]||options.no_auto_complete
90
+ parent_service = fwd_options[:parent_service]||options.parent_service
91
+ is_target = fwd_options[:is_target]||options.is_target?
92
+ do_not_encode = fwd_options[:do_not_encode]
93
+ assembly_list = Assembly.assembly_list()
94
+
95
+ if assembly_template_name.to_s =~ /^[0-9]+$/
96
+ assembly_template_name = DTK::Client::Assembly.get_assembly_template_name_for_service(assembly_template_name, service_module_name)
97
+ assembly_template_name, version = get_name_and_version_from_assembly_template(assembly_template_name)
98
+ else
99
+ namespace, module_name = get_namespace_and_name(service_module_name, ':')
100
+ assembly_template_name = "#{module_name}/#{assembly_template_name}"
101
+ end
102
+ assembly_template_name.gsub!(/(::)|(\/)/,'-') if assembly_template_name
103
+
104
+ if name
105
+ raise DTK::Client::DtkValidationError, "Unable to stage service with name '#{name}'. Service with specified name exists already!" if assembly_list.include?(name)
106
+ else
107
+ name = get_assembly_stage_name(assembly_list, assembly_template_name)
108
+ end
109
+
110
+ post_body.merge!(:name => name) if name
111
+ post_body.merge!(:instance_bindings => instance_bindings) if instance_bindings
112
+ post_body.merge!(:settings_json_form => JSON.generate(settings)) if settings
113
+ post_body.merge!(:node_size => node_size) if node_size
114
+ post_body.merge!(:os_type => os_type) if os_type
115
+ post_body.merge!(:version => version) if version
116
+ post_body.merge!(:service_module_name => service_module_name) if service_module_name
117
+ post_body.merge!(:no_auto_complete => no_auto_complete) if no_auto_complete
118
+ post_body.merge!(:parent_service => parent_service) if parent_service
119
+ post_body.merge!(:is_target => is_target) if is_target
120
+ post_body.merge!(:do_not_encode => do_not_encode) if do_not_encode
121
+
122
+ response = post rest_url("assembly/stage"), post_body
123
+ end
124
+
125
+ def deploy_aux(context_params)
126
+ forwarded_options = context_params.get_forwarded_options()
127
+ context_params.forward_options(forwarded_options.merge!(:do_not_encode => true))
128
+ stage_response = stage_aux(context_params)
129
+ return stage_response unless stage_response.ok?
130
+
131
+ if service_instance = stage_response.data['new_service_instance']
132
+ instance_name = service_instance['name']
133
+
134
+ DTK::Client::OsUtil.print("Service instance '/service/#{instance_name}' has been created!",:yellow)
135
+
136
+ new_context_params = DTK::Shell::ContextParams.new
137
+ new_context_params.add_context_to_params("service", "service")
138
+ new_context_params.add_context_name_to_params("service", "service", instance_name)
139
+ new_context_params.forward_options(:instance_name => instance_name)
140
+
141
+ response = ContextRouter.routeTask("service", "set_required_attributes_and_converge", new_context_params, @conn)
142
+
143
+ # change context to newly created service instance
144
+ MainContext.get_context.change_context(["/service/#{instance_name}"])
145
+
146
+ return response unless response.ok?
147
+
148
+ if forwarded_options['stream-results'] || options['stream-results']
149
+ forwarded_options = new_context_params.get_forwarded_options()
150
+ task_status_stream(instance_name) unless forwarded_options[:violations]
151
+ end
152
+
153
+ response
154
+ else
155
+ fail DtkError.new('Service instance is not staged properly, please try again!')
156
+ end
157
+ end
158
+ end
159
+
160
+ def self.extended_context()
161
+ {
162
+ :command => {
163
+ :stage => {
164
+ :endpoint => "service_module",
165
+ :url => "service_module/list_assemblies",
166
+ :opts => {}
167
+ },
168
+ :stage_target => {
169
+ :endpoint => "service_module",
170
+ :url => "service_module/list_assemblies",
171
+ :opts => {}
172
+ },
173
+ :deploy_target => {
174
+ :endpoint => "service_module",
175
+ :url => "service_module/list_assemblies",
176
+ :opts => {}
177
+ },
178
+ :deploy => {
179
+ :endpoint => "service_module",
180
+ :url => "service_module/list_assemblies",
181
+ :opts => {}
182
+ }
183
+ }
184
+ }
185
+ end
186
+
187
+ def self.valid_children()
188
+ [:assembly, :remotes]
189
+ end
190
+
191
+ def self.all_children()
192
+ [:assembly]
193
+ end
194
+
195
+ def self.multi_context_children()
196
+ [[:assembly], [:remotes], [:assembly, :remotes]]
197
+ end
198
+
199
+ def self.valid_child?(name_of_sub_context)
200
+ return ServiceModule.valid_children().include?(name_of_sub_context.to_sym)
201
+ end
202
+
203
+ def self.pretty_print_cols()
204
+ PPColumns.get(:service_module)
205
+ end
206
+
207
+ def self.validation_list(context_params)
208
+ get_cached_response(:service_module, "service_module/list", {})
209
+ end
210
+
211
+ def self.whoami()
212
+ return :service_module, "service_module/list", nil
213
+ end
214
+
215
+ def self.override_allowed_methods()
216
+ return DTK::Shell::OverrideTasks.new({
217
+ :command_only => {
218
+ :self => [
219
+ ["list"," list [--remote] [--diff] [-n NAMESPACE]","# List service modules (local/remote). Use --diff to compare loaded and remote modules."]
220
+ ],
221
+ :assembly => [
222
+ ["list","list","# List assemblies for given service module."]
223
+ ],
224
+ :remotes => [
225
+ ["push-remote", "push-remote [REMOTE-NAME] [--force]", "# Push local changes to remote git repository"],
226
+ ["list-remotes", "list-remotes", "# List git remotes for given module"],
227
+ ["add-remote", "add-remote REMOTE-NAME REMOTE-URL", "# Add git remote for given module"],
228
+ ["remove-remote", "remove-remote REPO-NAME [-y]", "# Remove git remote for given module"]
229
+ ]
230
+ },
231
+ :identifier_only => {
232
+ :self => [
233
+ ["list-assemblies","list-assemblies","# List assemblies associated with service module."],
234
+ ["list-modules","list-modules","# List modules associated with service module."]
235
+ ],
236
+ :assembly => [
237
+ ["info","info","# Info for given assembly in current service module."],
238
+ # ["stage", "stage [INSTANCE-NAME] [-t TARGET-NAME/ID] [--node-size NODE-SIZE-SPEC] [--os-type OS-TYPE] [-v VERSION]", "# Stage assembly in target."],
239
+ # ["deploy","deploy [-v VERSION] [INSTANCE-NAME] [-t TARGET-NAME/ID] [-m COMMIT-MSG]", "# Stage and deploy assembly in target."],
240
+ # ["deploy","deploy [INSTANCE-NAME] [-t TARGET-NAME/ID] [-m COMMIT-MSG]", "# Stage and deploy assembly in target."],
241
+ # ["deploy","deploy [INSTANCE-NAME] [-m COMMIT-MSG]", "# Stage and deploy assembly in target."],
242
+ ["stage-target","stage-target [INSTANCE-NAME] [-t PARENT-SERVICE-INSTANCE-NAME/ID] [-v VERSION] [--no-auto-complete]", "# Stage assembly as target instance."],
243
+ ["stage","stage [INSTANCE-NAME] [-t PARENT-SERVICE-INSTANCE-NAME/ID] [-v VERSION] [--no-auto-complete]", "# Stage assembly in target."],
244
+ ["deploy-target","deploy-target [INSTANCE-NAME] [-v VERSION] [--no-auto-complete]", "# Deploy assembly as target instance."],
245
+ ["deploy","deploy [INSTANCE-NAME] [-t PARENT-SERVICE-INSTANCE-NAME/ID] [-v VERSION] [--no-auto-complete]", "# Deploy assembly in target."],
246
+ ["list-nodes","list-nodes", "# List all nodes for given assembly."],
247
+ ["list-components","list-components", "# List all components for given assembly."],
248
+ ["list-settings","list-settings", "# List all settings for given assembly."]
249
+ ]
250
+ }
251
+
252
+ })
253
+ end
254
+
255
+ ##MERGE-QUESTION: need to add options of what info is about
256
+ desc "SERVICE-MODULE-NAME/ID info", "Provides information about specified service module"
257
+ def info(context_params)
258
+ module_info_aux(context_params)
259
+ end
260
+
261
+ desc "SERVICE-MODULE-NAME/ID list-assemblies [-v VERSION] [--remote]","List assemblies associated with service module."
262
+ version_method_option
263
+ method_option :remote, :type => :boolean, :default => false
264
+ def list_assemblies(context_params)
265
+ context_params.method_arguments = ["assembly"]
266
+
267
+ if version = options.version
268
+ check_version_format(options.version) if !version.eql?('master') && !version.eql?('base')
269
+ end
270
+
271
+ list(context_params)
272
+ end
273
+
274
+ desc "SERVICE-MODULE-NAME/ID list-component-modules","List component modules associated with service module."
275
+ method_option :remote, :type => :boolean, :default => false
276
+ def list_component_modules(context_params)
277
+ context_params.method_arguments = ["modules"]
278
+ list(context_params)
279
+ end
280
+
281
+ desc "list [--remote] [--diffs] [-n NAMESPACE]","List service modules (local/remote). Use --diff to compare loaded and remote modules."
282
+ method_option :remote, :type => :boolean, :default => false
283
+ method_option :diffs, :type => :boolean, :default => false, :aliases => "--diff"
284
+ method_option :namespace, :aliases => "-n" ,
285
+ :type => :string,
286
+ :banner => "NAMESPACE",
287
+ :desc => "List modules only in specific namespace."
288
+ # method_option :with_versions, :type => :boolean, :default => false, :aliases => "with-versions"
289
+ def list(context_params)
290
+ service_module_id, about, service_module_name = context_params.retrieve_arguments([:service_module_id, :option_1, :option_2],method_argument_names)
291
+ datatype = nil
292
+
293
+ if context_params.is_there_command?(:"assembly")
294
+ about = "assembly"
295
+ end
296
+
297
+ if service_module_id.nil? && !service_module_name.nil?
298
+ service_module_id = service_module_name
299
+ end
300
+
301
+ remote = options.remote?
302
+ namespace = options.namespace
303
+
304
+ # If user is on service level, list task can't have about value set
305
+ if (context_params.last_entity_name == :"service-module") and about.nil?
306
+ action = remote ? "list_remote" : "list"
307
+ post_body = (remote ? { :rsa_pub_key => SSHUtil.rsa_pub_key_content() } : {:detail_to_include => ["remotes"]})
308
+ post_body[:diff] = options.diffs? ? options.diffs : {}
309
+ post_body.merge!(:module_namespace => namespace) if namespace
310
+
311
+ if post_body[:detail_to_include]
312
+ post_body[:detail_to_include] << 'versions' # if options.with_versions?
313
+ else
314
+ post_body[:detail_to_include]
315
+ end
316
+
317
+ response = post rest_url("service_module/#{action}"), post_body
318
+ # If user is on service identifier level, list task can't have '--remote' option.
319
+ else
320
+ # TODO: this is temp; will shortly support this
321
+ # raise DTK::Client::DtkValidationError.new("Not supported '--remote' option when listing service module assemblies, component templates or modules", true) if options.remote?
322
+ raise DTK::Client::DtkValidationError.new("Not supported type '#{about}' for list for current context level. Possible type options: 'assembly'", true) unless(about == "assembly" || about == "modules")
323
+ post_body = { :service_module_id => service_module_id }
324
+ if about
325
+ case about
326
+ when "assembly"
327
+ version = options.version
328
+ data_type = :assembly_template_description
329
+ action = "list_assemblies"
330
+ post_body.merge!(:version => version) if version
331
+
332
+ if remote
333
+ data_type = :remote_assembly_template_description
334
+ action = "list_remote_assemblies"
335
+ path_to_key = SSHUtil.default_rsa_pub_key_path()
336
+ rsa_pub_key = File.file?(path_to_key) && File.open(path_to_key){|f|f.read}.chomp
337
+
338
+ post_body.merge!(:remote_namespace => namespace) if namespace
339
+ post_body.merge!(:rsa_pub_key => rsa_pub_key)
340
+ end
341
+ when "modules"
342
+ data_type = remote ? :component_remote : :component_module
343
+ action = "list_component_modules"
344
+ else
345
+ raise_validation_error_method_usage('list')
346
+ end
347
+ end
348
+ response = post rest_url("service_module/#{action}"), post_body
349
+ end
350
+
351
+ unless response.nil?
352
+ if options.with_versions?
353
+ response.render_table(:module_with_versions, true)
354
+ else
355
+ response.render_table(data_type)
356
+ end
357
+ end
358
+
359
+ response
360
+ end
361
+
362
+ desc "SERVICE-MODULE-NAME/ID list-instances","List all instances associated with this service module."
363
+ def list_instances(context_params)
364
+ list_instances_aux(context_params)
365
+ end
366
+
367
+ desc "SERVICE-MODULE-NAME/ID list-versions","List all versions associated with this service module."
368
+ def list_versions(context_params)
369
+ response = list_versions_aux(context_params)
370
+ return response unless response.ok?
371
+ response.render_table(:list_versions, true)
372
+ end
373
+
374
+ desc "SERVICE-MODULE-NAME/ID list-remote-versions","List all remote versions associated with this service module."
375
+ def list_remote_versions(context_params)
376
+ response = list_remote_versions_aux(context_params)
377
+ return response unless response.ok?
378
+ response.render_table(:list_versions, true)
379
+ end
380
+
381
+ # version_method_option
382
+ desc "install NAMESPACE/REMOTE-SERVICE-MODULE-NAME [-y] [-v VERSION]", "Install remote service module into local environment. -y will automatically clone component modules."
383
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
384
+ # method_option :ignore, :aliases => '-i', :type => :boolean, :default => false
385
+ method_option :update_none, :type => :boolean, :default => false
386
+ version_method_option
387
+ def install(context_params)
388
+ response = install_module_aux(context_params)
389
+ @@invalidate_map << :service_module if response && response.ok?
390
+
391
+ response
392
+ end
393
+
394
+ =begin
395
+ # desc "SERVICE-MODULE-NAME/ID validate-model [-v VERSION]", "Check the DSL Model for Errors"
396
+ # version_method_option
397
+ desc "SERVICE-MODULE-NAME/ID validate-model", "Check the DSL Model for Errors"
398
+ def validate_model(context_params)
399
+ service_module_id, service_module_name = context_params.retrieve_arguments([:service_module_id!, :service_module_name],method_argument_names)
400
+ version = options["version"]
401
+
402
+ if service_module_name.to_s =~ /^[0-9]+$/
403
+ service_module_id = service_module_name
404
+ service_module_name = get_service_module_name(service_module_id)
405
+ end
406
+
407
+ modules_path = OsUtil.service_clone_location()
408
+ module_location = "#{modules_path}/#{service_module_name}#{version && "-#{version}"}"
409
+
410
+ raise DTK::Client::DtkValidationError, "Unable to parse service '#{service_module_name}#{version && "-#{version}"}' that doesn't exist on your local machine!" unless File.directory?(module_location)
411
+
412
+ reparse_aux(module_location)
413
+ end
414
+ =end
415
+
416
+ # desc "SERVICE-MODULE-NAME/ID import-version VERSION", "Import a specific version from a linked service module"
417
+ # def import_version(context_params)
418
+ # service_module_id,version = context_params.retrieve_arguments([:service_module_id!,:option_1!],method_argument_names)
419
+ # post_body = {
420
+ # :service_module_id => service_module_id,
421
+ # :version => version
422
+ # }
423
+ # response = post rest_url("service_module/import_version"), post_body
424
+ # @@invalidate_map << :module_service
425
+
426
+ # return response unless response.ok?
427
+ # module_name,repo_url,branch,version = response.data(:module_name,:repo_url,:workspace_branch,:version)
428
+
429
+ # if error = response.data(:dsl_parse_error)
430
+ # dsl_parsed_message = ServiceImporter.error_message("#{module_name}-#{version}", error)
431
+ # DTK::Client::OsUtil.print(dsl_parsed_message, :red)
432
+ # end
433
+
434
+ # #TODO: need to check if local clone directory exists
435
+ # Helper(:git_repo).create_clone_with_branch(:service_module,module_name,repo_url,branch,version)
436
+ # end
437
+
438
+ # desc "SERVICE-MODULE-NAME/ID create-on-dtkn [[NAMESPACE/]REMOTE-MODULE-NAME]","Export service module to remote repository"
439
+ # def create_on_dtkn(context_params)
440
+ # service_module_id, input_remote_name = context_params.retrieve_arguments([:service_module_id!, :option_1],method_argument_names)
441
+
442
+ # post_body = {
443
+ # :service_module_id => service_module_id,
444
+ # :remote_component_name => input_remote_name,
445
+ # :rsa_pub_key => SSHUtil.rsa_pub_key_content()
446
+ # }
447
+
448
+ # post rest_url("service_module/export"), post_body
449
+ # end
450
+
451
+ desc "SERVICE-MODULE-NAME/ID publish [[NAMESPACE/]REMOTE-SERVICE-MODULE-NAME] -v VERSION [--force]","Publish service module to remote repository"
452
+ version_method_option
453
+ method_option :force, :type => :boolean, :default => false, :aliases => '-f'
454
+ def publish(context_params)
455
+ publish_module_aux(context_params)
456
+ end
457
+
458
+ # desc "SERVICE-MODULE-NAME/ID push-to-dtkn [-n NAMESPACE] [-v VERSION]", "Push local copy of service module to remote repository."
459
+ # version_method_option
460
+ # desc "SERVICE-MODULE-NAME/ID push-to-dtkn [-n NAMESPACE]", "Push local copy of service module to remote repository."
461
+ # method_option "namespace",:aliases => "-n",
462
+ # :type => :string,
463
+ # :banner => "NAMESPACE",
464
+ # :desc => "Remote namespace"
465
+ # def push_to_dtkn(context_params)
466
+ # service_module_id, service_module_name = context_params.retrieve_arguments([:service_module_id!, :service_module_name],method_argument_names)
467
+ # version = options["version"]
468
+
469
+ # if service_module_name.to_s =~ /^[0-9]+$/
470
+ # service_id = service_module_name
471
+ # service_module_name = get_service_module_name(service_id)
472
+ # end
473
+
474
+ # modules_path = OsUtil.service_clone_location()
475
+ # module_location = "#{modules_path}/#{service_module_name}#{version && "-#{version}"}"
476
+
477
+ # unless File.directory?(module_location)
478
+ # if Console.confirmation_prompt("Unable to push to remote because module '#{service_module_name}#{version && "-#{version}"}' has not been cloned. Would you like to clone module now"+'?')
479
+ # response = clone_aux(:service_module,service_module_id,version,false)
480
+
481
+ # if(response.nil? || response.ok?)
482
+ # reparse_aux(module_location)
483
+ # push_to_remote_aux(:service_module, service_module_id, service_module_name, options["namespace"], version) if Console.confirmation_prompt("Would you like to push changes to remote"+'?')
484
+ # end
485
+
486
+ # return response
487
+ # else
488
+ # # user choose not to clone needed module
489
+ # return
490
+ # end
491
+ # end
492
+
493
+ # reparse_aux(module_location)
494
+ # push_to_remote_aux(:service_module, service_module_id, service_module_name, options["namespace"], options["version"])
495
+ # end
496
+
497
+ desc "SERVICE-MODULE-NAME/ID pull-dtkn [-n NAMESPACE] [--force]", "Update local service module from remote repository."
498
+ method_option :namespace,:aliases => '-n',
499
+ :type => :string,
500
+ :banner => "NAMESPACE",
501
+ :desc => "Remote namespace"
502
+ method_option :force,:aliases => '-f',
503
+ :type => :boolean,
504
+ :desc => "Force pull",
505
+ :default => false
506
+ def pull_dtkn(context_params)
507
+ pull_dtkn_aux(context_params)
508
+ end
509
+
510
+ desc "SERVICE-MODULE-NAME/ID chmod PERMISSION-SELECTOR", "Update remote permissions e.g. ug+rw , user and group get RW permissions"
511
+ method_option "namespace", :aliases => "-n", :type => :string, :banner => "NAMESPACE", :desc => "Remote namespace"
512
+ def chmod(context_params)
513
+ chmod_module_aux(context_params)
514
+ end
515
+
516
+ desc "SERVICE-MODULE-NAME/ID make-public", "Make this module public"
517
+ method_option "namespace", :aliases => "-n", :type => :string, :banner => "NAMESPACE", :desc => "Remote namespace"
518
+ def make_public(context_params)
519
+ make_public_module_aux(context_params)
520
+ end
521
+
522
+ desc "SERVICE-MODULE-NAME/ID make-private", "Make this module private"
523
+ method_option "namespace", :aliases => "-n", :type => :string, :banner => "NAMESPACE", :desc => "Remote namespace"
524
+ def make_private(context_params)
525
+ make_private_module_aux(context_params)
526
+ end
527
+
528
+ desc "SERVICE-MODULE-NAME/ID add-collaborators", "Add collabrators users or groups comma seperated (--users or --groups)"
529
+ method_option "namespace", :aliases => "-n", :type => :string, :banner => "NAMESPACE", :desc => "Remote namespace"
530
+ method_option "users",:aliases => "-u", :type => :string, :banner => "USERS", :desc => "User collabrators"
531
+ method_option "groups",:aliases => "-g", :type => :string, :banner => "GROUPS", :desc => "Group collabrators"
532
+ def add_collaborators(context_params)
533
+ add_collaborators_module_aux(context_params)
534
+ end
535
+
536
+ desc "SERVICE-MODULE-NAME/ID remove-collaborators", "Remove collabrators users or groups comma seperated (--users or --groups)"
537
+ method_option "namespace",:aliases => "-n",:type => :string, :banner => "NAMESPACE", :desc => "Remote namespace"
538
+ method_option "users",:aliases => "-u", :type => :string, :banner => "USERS", :desc => "User collabrators"
539
+ method_option "groups",:aliases => "-g", :type => :string, :banner => "GROUPS", :desc => "Group collabrators"
540
+ def remove_collaborators(context_params)
541
+ remove_collaborators_module_aux(context_params)
542
+ end
543
+
544
+ desc "SERVICE-MODULE-NAME/ID list-collaborators", "List collaborators for given module"
545
+ method_option "namespace",:aliases => "-n",:type => :string, :banner => "NAMESPACE", :desc => "Remote namespace"
546
+ def list_collaborators(context_params)
547
+ list_collaborators_module_aux(context_params)
548
+ end
549
+
550
+ ##
551
+ #
552
+ # internal_trigger: this flag means that other method (internal) has trigger this.
553
+ # This will change behaviour of method
554
+ #
555
+ # desc "SERVICE-MODULE-NAME/ID clone [-v VERSION] [-n]", "Locally clone the service module files. Use -n to skip edit prompt"
556
+ # version_method_option
557
+ desc "SERVICE-MODULE-NAME/ID clone [-n] [-v VERSION]", "Locally clone the service module files. Use -n to skip edit prompt"
558
+ method_option :skip_edit, :aliases => '-n', :type => :boolean, :default => false
559
+ version_method_option
560
+ def clone(context_params, internal_trigger=false)
561
+ clone_module_aux(context_params, internal_trigger)
562
+ end
563
+
564
+ # desc "SERVICE-MODULE-NAME/ID edit [-v VERSION]","Switch to unix editing for given service module."
565
+ # version_method_option
566
+ desc "SERVICE-MODULE-NAME/ID edit","Switch to unix editing for given service module."
567
+ def edit(context_params)
568
+ edit_module_aux(context_params)
569
+ end
570
+
571
+ # TODO: put in two versions, one that creates empty and anotehr taht creates from local dir; use --empty flag
572
+ desc "import [NAMESPACE:]SERVICE-MODULE-NAME", "Create new service module from local clone"
573
+ def import(context_params)
574
+ module_name = context_params.retrieve_arguments([:option_1!],method_argument_names)
575
+ namespace, local_module_name = get_namespace_and_name(module_name, ':')
576
+
577
+ # first check that there is a directory there and it is not already a git repo, and it ha appropriate content
578
+ response = Helper(:git_repo).check_local_dir_exists_with_content(:service_module, local_module_name, nil, namespace)
579
+ return response unless response.ok?
580
+ service_directory = response.data(:module_directory)
581
+
582
+ #check for yaml/json parsing errors before import
583
+ reparse_aux(service_directory)
584
+
585
+ # first call to create empty module
586
+ response = post rest_url("service_module/create"), { :module_name => local_module_name, :module_namespace => namespace }
587
+ return response unless response.ok?
588
+ @@invalidate_map << :service_module
589
+
590
+ # initial commit for given service module
591
+ service_module_id, repo_info = response.data(:service_module_id, :repo_info)
592
+ repo_url,repo_id,module_id,branch,new_module_name = [:repo_url,:repo_id,:module_id,:workspace_branch,:full_module_name].map { |k| repo_info[k.to_s] }
593
+
594
+ response = Helper(:git_repo).rename_and_initialize_clone_and_push(:service_module, local_module_name, new_module_name,branch,repo_url,service_directory)
595
+ return response unless (response && response.ok?)
596
+
597
+ repo_obj,commit_sha = response.data(:repo_obj,:commit_sha)
598
+ module_final_dir = repo_obj.repo_dir
599
+ old_dir = response.data[:old_dir]
600
+
601
+ context_params.add_context_to_params(local_module_name, :"service-module", module_id)
602
+ response = push(context_params,true)
603
+
604
+ unless response.ok?
605
+ # remove new directory and leave the old one if import without namespace failed
606
+ if old_dir and (old_dir != module_final_dir)
607
+ FileUtils.rm_rf(module_final_dir) unless namespace
608
+ end
609
+ return response
610
+ end
611
+
612
+ # remove the old one if no errors while importing
613
+ # DTK-1768: removed below; and replaced by removing old dir if unequal to final dir
614
+ # was not sure why clause namespace was in so kept this condition
615
+ #FileUtils.rm_rf(old_dir) unless namespace
616
+ if old_dir and (old_dir != module_final_dir)
617
+ FileUtils.rm_rf(old_dir) unless namespace
618
+ end
619
+
620
+ DTK::Client::OsUtil.print("Module '#{new_module_name}' has been created and module directory moved to #{repo_obj.repo_dir}",:yellow) unless namespace
621
+
622
+ response
623
+ end
624
+
625
+ desc "SERVICE-MODULE-NAME/ID stage-target ASSEMBLY-NAME [INSTANCE-NAME] [-v VERSION] [--no-auto-complete]", "Stage assembly as target instance."
626
+ method_option :settings, :type => :string, :aliases => '-s'
627
+ method_option :no_auto_complete, :type => :boolean, :default => false, :aliases => '--no-ac'
628
+ version_method_option
629
+ #hidden options
630
+ method_option "instance-bindings", :type => :string
631
+ method_option :is_target, :type => :boolean, :default => true
632
+ def stage_target(context_params)
633
+ response = stage_aux(context_params)
634
+ return response unless response.ok?
635
+
636
+ # when changing context send request for getting latest assemblies instead of getting from cache
637
+ @@invalidate_map << :service
638
+ @@invalidate_map << :assembly
639
+
640
+ return response
641
+ end
642
+
643
+ desc "SERVICE-MODULE-NAME/ID stage ASSEMBLY-NAME [INSTANCE-NAME] [-t PARENT-SERVICE-INSTANCE-NAME/ID] [-v VERSION] [--no-auto-complete]", "Stage assembly in target."
644
+ method_option :settings, :type => :string, :aliases => '-s'
645
+ method_option :no_auto_complete, :type => :boolean, :default => false, :aliases => '--no-ac'
646
+ method_option :parent_service, :type => :string, :aliases => '-t'
647
+ version_method_option
648
+ #hidden option
649
+ method_option "instance-bindings", :type => :string
650
+ def stage(context_params)
651
+ response = stage_aux(context_params)
652
+ return response unless response.ok?
653
+
654
+ # when changing context send request for getting latest assemblies instead of getting from cache
655
+ @@invalidate_map << :service
656
+ @@invalidate_map << :assembly
657
+
658
+ return response
659
+ end
660
+
661
+
662
+ # desc "SERVICE-MODULE-NAME/ID push [-v VERSION] [-m COMMIT-MSG]", "Push changes from local copy of service module to server"
663
+ # version_method_option
664
+ =begin
665
+ desc "SERVICE-MODULE-NAME/ID push origin|dtkn [-n NAMESPACE] [-m COMMIT-MSG]", "Push changes from local copy of service module to server (origin) or to remote repository (dtkn)."
666
+ method_option "message",:aliases => "-m" ,
667
+ :type => :string,
668
+ :banner => "COMMIT-MSG",
669
+ :desc => "Commit message"
670
+ method_option "namespace",:aliases => "-n",
671
+ :type => :string,
672
+ :banner => "NAMESPACE",
673
+ :desc => "Remote namespace"
674
+ #hidden option for dev
675
+ method_option 'force-parse', :aliases => '-f', :type => :boolean, :default => false
676
+ def push(context_params, internal_trigger=false)
677
+ service_module_id, service_module_name, catalog = context_params.retrieve_arguments([:service_module_id!, :service_module_name, :option_1],method_argument_names)
678
+ version = options["version"]
679
+
680
+ raise DtkValidationError, "You have to provide valid catalog to push changes to! Valid catalogs: #{PushCatalogs}" unless catalog
681
+
682
+ if service_module_name.to_s =~ /^[0-9]+$/
683
+ service_module_id = service_module_name
684
+ service_module_name = get_service_module_name(service_module_id)
685
+ end
686
+
687
+ modules_path = OsUtil.service_clone_location()
688
+ module_location = "#{modules_path}/#{service_module_name}#{version && "-#{version}"}"
689
+ reparse_aux(module_location) unless internal_trigger
690
+
691
+ if catalog.to_s.eql?("origin")
692
+ push_clone_changes_aux(:service_module,service_module_id,version,nil,internal_trigger)
693
+ elsif catalog.to_s.eql?("dtkn")
694
+ unless File.directory?(module_location)
695
+ if Console.confirmation_prompt("Unable to push to remote because module '#{service_module_name}#{version && "-#{version}"}' has not been cloned. Would you like to clone module now"+'?')
696
+ response = clone_aux(:service_module,service_module_id,version,false)
697
+
698
+ if(response.nil? || response.ok?)
699
+ reparse_aux(module_location)
700
+ push_to_remote_aux(:service_module, service_module_id, service_module_name, options["namespace"], version) if Console.confirmation_prompt("Would you like to push changes to remote"+'?')
701
+ end
702
+
703
+ return response
704
+ else
705
+ # user choose not to clone needed module
706
+ return
707
+ end
708
+ end
709
+
710
+ push_to_remote_aux(:service_module, service_module_id, service_module_name, options["namespace"], options["version"])
711
+ else
712
+ raise DtkValidationError, "You have to provide valid catalog to push changes to! Valid catalogs: #{PushCatalogs}"
713
+ end
714
+ end
715
+ PushCatalogs = ["origin", "dtkn"]
716
+ =end
717
+
718
+ # desc "SERVICE-MODULE-NAME/ID push [-m COMMIT-MSG]", "Push changes from local copy to server (origin)."
719
+ desc "SERVICE-MODULE-NAME/ID push [--force] [--docs]", "Push changes from local copy to server."
720
+ method_option "message",:aliases => "-m" ,
721
+ :type => :string,
722
+ :banner => "COMMIT-MSG",
723
+ :desc => "Commit message"
724
+ method_option :force, :type => :boolean, :default => false, :aliases => '-f'
725
+ method_option :docs, :type => :boolean, :default => false, :aliases => '-d'
726
+ def push(context_params, internal_trigger=false)
727
+ push_module_aux(context_params, internal_trigger)
728
+ end
729
+
730
+ # desc "SERVICE-MODULE-NAME/ID push-dtkn [-n NAMESPACE] [-m COMMIT-MSG]", "Push changes from local copy of service module to remote repository (dtkn)."
731
+ desc "SERVICE-MODULE-NAME/ID push-dtkn [-n NAMESPACE] [--force]", "Push changes from local copy of service module to remote repository (dtkn)."
732
+ method_option "message",:aliases => "-m" ,
733
+ :type => :string,
734
+ :banner => "COMMIT-MSG",
735
+ :desc => "Commit message"
736
+ method_option "namespace",:aliases => "-n",
737
+ :type => :string,
738
+ :banner => "NAMESPACE",
739
+ :desc => "Remote namespace"
740
+ method_option :force, :type => :boolean, :default => false, :aliases => '-f'
741
+ def push_dtkn(context_params, internal_trigger=false)
742
+ push_dtkn_module_aux(context_params, internal_trigger)
743
+ end
744
+
745
+ desc "SERVICE-MODULE-NAME/ID list-diffs", "List diffs between module on server and remote repo"
746
+ method_option :remote, :type => :boolean, :default => false
747
+ def list_diffs(context_params)
748
+ list_remote_module_diffs(context_params)
749
+ # list_diffs_module_aux(context_params)
750
+ end
751
+
752
+ desc "delete-version SERVICE-MODULE-NAME [-y] [-p] [-v VERSION]", "Delete service module version and all items contained in it. Optional parameter [-p] is to delete local directory."
753
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
754
+ method_option :purge, :aliases => '-p', :type => :boolean, :default => false
755
+ version_method_option
756
+ def delete_version(context_params, method_opts = {})
757
+ response = delete_module_aux(context_params, method_opts)
758
+ @@invalidate_map << :service_module if response && response.ok?
759
+
760
+ response
761
+ end
762
+
763
+ desc "delete SERVICE-MODULE-NAME [-y] [-p]", "Delete service module and all items contained in it. Optional parameter [-p] is to delete local directory."
764
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
765
+ method_option :purge, :aliases => '-p', :type => :boolean, :default => false
766
+ def delete(context_params)
767
+ response = delete_module_aux(context_params, :delete_all => true)
768
+ @@invalidate_map << :service_module if response && response.ok?
769
+
770
+ response
771
+ end
772
+
773
+ desc "delete-from-catalog NAMESPACE/REMOTE-SERVICE-MODULE-NAME [-y] [--force] [-v VERSION]", "Delete the service module from the DTK Network catalog"
774
+ method_option :confirmed, :aliases => '-y', :type => :boolean, :default => false
775
+ method_option :force, :type => :boolean, :default => false
776
+ version_method_option
777
+ def delete_from_catalog(context_params)
778
+ delete_from_catalog_aux(context_params)
779
+ end
780
+
781
+ desc "SERVICE-MODULE-NAME/ID delete-assembly ASSEMBLY-NAME [-y]", "Delete assembly from service module."
782
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
783
+ def delete_assembly(context_params)
784
+ response = delete_assembly_aux(context_params)
785
+ @@invalidate_map << :assembly if response && response.ok?
786
+
787
+ response
788
+ end
789
+
790
+
791
+ # REMOTE INTERACTION
792
+
793
+ desc "HIDE_FROM_BASE push-remote [REMOTE-NAME] [--force]", "Push local changes to remote git repository"
794
+ method_option :force, :type => :boolean, :default => false
795
+ def push_remote(context_params)
796
+ push_remote_module_aux(context_params)
797
+ end
798
+
799
+ desc "HIDE_FROM_BASE list-remotes", "List git remotes for given module"
800
+ def list_remotes(context_params)
801
+ remote_list_aux(context_params)
802
+ end
803
+
804
+ desc "HIDE_FROM_BASE add-remote REMOTE-NAME REMOTE-URL", "Add git remote for given module"
805
+ def add_remote(context_params)
806
+ remote_add_aux(context_params)
807
+ end
808
+
809
+ desc "HIDE_FROM_BASE remove-remote REPO-NAME [-y]", "Remove git remote for given module"
810
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
811
+ def remove_remote(context_params)
812
+ remote_remove_aux(context_params)
813
+ end
814
+
815
+ desc "SERVICE-MODULE-NAME/ID fork NAMESPACE", "Fork service module to new namespace"
816
+ def fork(context_params)
817
+ fork_aux(context_params)
818
+ end
819
+
820
+ desc "SERVICE-MODULE-NAME/ID create-new-version VERSION", "Create new service module version"
821
+ def create_new_version(context_params)
822
+ create_new_version_aux(context_params)
823
+ end
824
+
825
+ desc "SERVICE-MODULE-NAME/ID deploy-target ASSEMBLY-NAME [INSTANCE-NAME] [-v VERSION] [--no-auto-complete] [--stream-results]", "Deploy assembly as target instance."
826
+ method_option :no_auto_complete, :type => :boolean, :default => false, :aliases => '--no-ac'
827
+ method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
828
+ version_method_option
829
+ #hidden options
830
+ method_option "instance-bindings", :type => :string
831
+ method_option :is_target, :type => :boolean, :default => true
832
+ # method_option :settings, :type => :string, :aliases => '-s'
833
+ def deploy_target(context_params)
834
+ response = deploy_aux(context_params)
835
+ return response unless response.ok?
836
+
837
+ @@invalidate_map << :service
838
+ @@invalidate_map << :assembly
839
+
840
+ response
841
+ end
842
+
843
+ desc "SERVICE-MODULE-NAME/ID deploy ASSEMBLY-NAME [INSTANCE-NAME] [-t PARENT-SERVICE-INSTANCE-NAME/ID] [-v VERSION] [--no-auto-complete] [--stream-results]", "Deploy assembly in target."
844
+ method_option :no_auto_complete, :type => :boolean, :default => false, :aliases => '--no-ac'
845
+ method_option :parent_service, :type => :string, :aliases => '-t'
846
+ method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
847
+ version_method_option
848
+ #hidden options
849
+ method_option "instance-bindings", :type => :string
850
+ # method_option :settings, :type => :string, :aliases => '-s'
851
+ def deploy(context_params)
852
+ response = deploy_aux(context_params)
853
+ return response unless response.ok?
854
+
855
+ @@invalidate_map << :service
856
+ @@invalidate_map << :assembly
857
+
858
+ response
859
+ end
860
+
861
+ #
862
+ # DEVELOPMENT MODE METHODS
863
+ #
864
+ if DTK::Configuration.get(:development_mode)
865
+
866
+ desc "delete-all","Delete all service modules"
867
+ def delete_all(context_params)
868
+ return unless Console.confirmation_prompt("This will DELETE ALL service modules, are you sure"+'?')
869
+ response = list(context_params)
870
+
871
+ response.data().each do |e|
872
+ run_shell_command("delete #{e['display_name']} -y -p")
873
+ end
874
+ end
875
+
876
+ end
877
+ =begin
878
+ desc "SERVICE-NAME/ID assembly-templates list", "List assembly templates optionally filtered by service ID/NAME."
879
+ def assembly_template(context_params)
880
+
881
+ service_id, method_name = context_params.retrieve_arguments([:service_name!, :option_1!],method_argument_names)
882
+
883
+ options_args = ["-s", service_id]
884
+
885
+ entity_name = "assembly_template"
886
+ load_command(entity_name)
887
+ entity_class = DTK::Client.const_get "#{cap_form(entity_name)}"
888
+
889
+ response = entity_class.execute_from_cli(@conn, method_name, DTK::Shell::ContextParams.new, options_args, false)
890
+
891
+ end
892
+ =end
893
+ =begin
894
+ TODO: needs to be rewritten
895
+ desc "create-jenkins-project SERVICE-ID", "Create Jenkins project for service module"
896
+ def create_jenkins_project(context_params)
897
+ service_module_id = context_params.retrieve_arguments([:service_id],method_argument_names)
898
+ #require put here so dont necessarily have to install jenkins client gems
899
+
900
+ dtk_require_from_base('command_helpers/jenkins_client')
901
+ response = get rest_url("service_module/workspace_branch_info/#{service_module_id.to_s}")
902
+ unless response.ok?
903
+ errors_message = ''
904
+ response['errors'].each { |error| errors_message += ", reason='#{error['code']}' message='#{error['message']}'" }
905
+ raise DTK::Client::DtkError, "Invalid jenkins response#{errors_message}"
906
+ end
907
+ module_name,repo_url,branch = response.data_ret_and_remove!(:module_name,:repo_url,:workspace_branch)
908
+ JenkinsClient.create_service_module_project?(service_module_id,module_name,repo_url,branch)
909
+ #TODO: right now JenkinsClient wil throw error if problem; better to create an error resonse
910
+ response
911
+ end
912
+ =end
913
+ end
914
+ end