dtk-shell 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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,21 @@
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
+ class Utils < CommandBaseThor
20
+ end
21
+ end
@@ -0,0 +1,685 @@
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 'rest_client'
19
+ require 'json'
20
+ require 'colorize'
21
+ dtk_require_from_base('dtk_logger')
22
+ dtk_require_from_base('util/os_util')
23
+ dtk_require_from_base('command_helper')
24
+ dtk_require_from_base('task_status')
25
+ dtk_require_common_commands('thor/edit')
26
+ dtk_require_common_commands('thor/purge_clone')
27
+ dtk_require_common_commands('thor/assembly_workspace')
28
+ dtk_require_common_commands('thor/action_result_handler')
29
+ # LOG_SLEEP_TIME_W = DTK::Configuration.get(:tail_log_frequency)
30
+
31
+ module DTK::Client
32
+ class Workspace < CommandBaseThor
33
+ no_tasks do
34
+ include TaskStatusMixin
35
+ include SetRequiredParamsMixin
36
+ include EditMixin
37
+ include PurgeCloneMixin
38
+ include AssemblyWorkspaceMixin
39
+ include ActionResultHandler
40
+
41
+ def get_workspace_name(workspace_id)
42
+ get_name_from_id_helper(workspace_id)
43
+ end
44
+ end
45
+
46
+ def self.whoami()
47
+ return :workspace, "assembly/list", {:subtype => 'instance'}
48
+ end
49
+
50
+ def self.pretty_print_cols()
51
+ PPColumns.get(:assembly)
52
+ end
53
+
54
+ def self.valid_children()
55
+ [:utils]
56
+ end
57
+
58
+ def self.invisible_context()
59
+ [:node]
60
+ end
61
+
62
+ # using extended_context when we want to use autocomplete from other context
63
+ # e.g. we are in assembly/apache context and want to create-component we will use extended context to add
64
+ # component-templates to autocomplete
65
+ def self.extended_context()
66
+ {
67
+ :context => {
68
+ :add_component => "component_template",
69
+ :create_node => "node_template",
70
+ :create_node_group => "node_template",
71
+ :add_component_dependency => "component_template",
72
+ :set_target => 'target'
73
+ },
74
+ :command => {
75
+ :edit_component_module => {
76
+ :endpoint => "assembly",
77
+ :url => "assembly/info_about",
78
+ :opts => {:subtype=>"instance", :about=>"modules"}
79
+ },
80
+ :push_component_module_updates => {
81
+ :endpoint => "assembly",
82
+ :url => "assembly/info_about",
83
+ :opts => {:subtype=>"instance", :about=>"modules"}
84
+ },
85
+ :delete_node => {
86
+ :endpoint => "assembly",
87
+ :url => "assembly/get_nodes_without_node_groups"
88
+ },
89
+ :delete_node_group => {
90
+ :endpoint => "assembly",
91
+ :url => "assembly/get_node_groups"
92
+ },
93
+ :pull_base_component_module => {
94
+ :endpoint => "assembly",
95
+ :url => "assembly/info_about",
96
+ :opts => {:subtype=>"instance", :about=>"modules"}
97
+ },
98
+ :action_info => {
99
+ :endpoint => "assembly",
100
+ :url => "assembly/task_action_list"
101
+ },
102
+ :exec => {
103
+ :endpoint => "assembly",
104
+ :url => "assembly/list_actions"
105
+ },
106
+ :exec_sync => {
107
+ :endpoint => "assembly",
108
+ :url => "assembly/list_actions"
109
+ }
110
+ # TODO: DEPRECATE execute_workflow
111
+ # :execute_workflow => {
112
+ # :endpoint => "assembly",
113
+ # :url => "assembly/task_action_list"
114
+ # }
115
+ }
116
+ }
117
+ end
118
+
119
+ # this includes children of children
120
+ def self.all_children()
121
+ # [:node, :component, :attribute]
122
+ [:node]
123
+ end
124
+
125
+ def self.multi_context_children()
126
+ [[:utils],[:node, :utils]]
127
+ end
128
+
129
+ def self.valid_child?(name_of_sub_context)
130
+ return Workspace.valid_children().include?(name_of_sub_context.to_sym)
131
+ end
132
+
133
+ def self.validation_list(context_params)
134
+ get_cached_response(:workspace, "assembly/list_with_workspace", {})
135
+ end
136
+
137
+ # TODO: Hack which is necessery for the specific problem (DTK-541), something to reconsider down the line
138
+ # at this point not sure what would be clenear solution
139
+
140
+ # :all => include both for commands with command and identifier
141
+ # :command_only => only on command level
142
+ # :identifier_only => only on identifier level for given entity (command)
143
+ #
144
+ def self.override_allowed_methods()
145
+ return DTK::Shell::OverrideTasks.new({
146
+ :all => {
147
+ :node => [
148
+ # ['delete-component',"delete-component COMPONENT-ID [-y]","# Delete component from assembly's node"],
149
+ # ['list-attributes',"list-attributes","# List attributes associated with workspace's node."],
150
+ # ['list-components',"list-components","# List components associated with workspace's node."]
151
+ ],
152
+ :component => [
153
+ ['list-attributes',"list-attributes","# List attributes associated with given component."]
154
+ ]
155
+ },
156
+ :command_only => {
157
+ :attribute => [
158
+ ['list-attributes',"list-attributes","# List attributes."]
159
+ ],
160
+ :node => [
161
+ # ['delete',"delete NAME/ID [-y] ","# Delete component from workspace."],
162
+ ['delete',"delete NODE-NAME/ID [-y] ","# Delete node, terminating it if the node has been spun up."],
163
+ ['list',"list","# List nodes."]
164
+ ],
165
+ :component => [
166
+ ['delete',"delete COMPONENT-NAME/ID [-y] ","# Delete component from workspace."],
167
+ ['list-components',"list-components","# List components."]
168
+ ],
169
+ :utils => [
170
+ # TODO: DTK-2027 might subsume by the dtk actions; currently server changes does not support this command
171
+ # ['execute-tests',"execute-tests [--component COMPONENT-NAME] [--timeout TIMEOUT]","# Execute tests. --component filters execution per component, --timeout changes default execution timeout."],
172
+ ['get-netstats',"get-netstats","# Get netstats."],
173
+ ['get-ps',"get-ps [--filter PATTERN]","# Get ps."],
174
+ ['grep',"grep LOG-PATH NODE-ID-PATTERN GREP-PATTERN [--first]","# Grep log from multiple nodes. --first option returns first match (latest log entry)."],
175
+ ['tail',"tail LOG-PATH NODE-NAME [REGEX-PATTERN] [--more]","# Tail specified number of lines from log. CTRL+C to quit."]
176
+ ]
177
+ },
178
+ :identifier_only => {
179
+ :node => [
180
+ ['add-component',"add-component COMPONENT","# Add a component to the node."],
181
+ ['delete-component',"delete-component COMPONENT-NAME [-y]","# Delete component from workspace's node"],
182
+ ['info',"info","# Return info about node instance belonging to given workspace."],
183
+ # ['link-attributes', "link-attributes TARGET-ATTR-TERM SOURCE-ATTR-TERM", "# Set TARGET-ATTR-TERM to SOURCE-ATTR-TERM."],
184
+ ['list-attributes',"list-attributes","# List attributes associated with workspace's node."],
185
+ ['list-components',"list-components","# List components associated with workspace's node."],
186
+ ['set-attribute',"set-attribute ATTRIBUTE-NAME [VALUE] [-u]","# (Un)Set attribute value. The option -u will unset the attribute's value."],
187
+ ['start', "start", "# Start node instance."],
188
+ ['stop', "stop", "# Stop node instance."],
189
+ ['ssh', "ssh REMOTE-USER [-i PATH-TO-PEM]","# SSH into node, optional parameters are path to identity file."]
190
+ ],
191
+
192
+ :component => [
193
+ ['info',"info","# Return info about component instance belonging to given node."],
194
+ ['edit',"edit","# Edit component module related to given component."],
195
+ # ['edit-dsl',"edit-dsl","# Edit component module dsl file related to given component."],
196
+ ['link-components',"link-components ANTECEDENT-CMP-NAME [DEPENDENCY-NAME]","#Link components to satisfy component dependency relationship."],
197
+ ['list-component-links',"list-component-links","# List component's links to other components."]
198
+ #['unlink-components',"unlink-components SERVICE-TYPE","# Delete service link on component."]
199
+ # ['create-attribute',"create-attribute SERVICE-TYPE DEP-ATTR ARROW BASE-ATTR","# Create an attribute to service link."],
200
+ ],
201
+ :attribute => [
202
+ ['info',"info","# Return info about attribute instance belonging to given component."]
203
+ ]
204
+ }
205
+ }, [:utils])
206
+ end
207
+
208
+ desc "WORKSPACE-NAME/ID cancel-task [TASK-ID]", "Cancel an executing task. If task id is omitted, the most recent executing task is canceled."
209
+ def cancel_task(context_params)
210
+ cancel_task_aux(context_params)
211
+ end
212
+
213
+ #desc "WORKSPACE-NAME/ID clear-tasks", "Clears the tasks that have been run already."
214
+ #def clear_tasks(context_params)
215
+ # clear_tasks_aux(context_params)
216
+ #end
217
+
218
+ desc "WORKSPACE-NAME/ID exec [NODE/NODE-GROUP/]ACTION [ACTION-PARAMS]", "Execute action asynchronously"
219
+ def exec(context_params)
220
+ exec_aux(context_params)
221
+ end
222
+
223
+ desc "WORKSPACE-NAME/ID exec-sync [NODE/NODE-GROUP/]ACTION [ACTION-PARAMS]", "Execute action synchronously"
224
+ def exec_sync(context_params)
225
+ exec_sync_aux(context_params)
226
+ end
227
+
228
+ # desc "WORKSPACE-NAME/ID exec SERVICE-LEVEL-ACTION [PARAMS] [--stream-results]", "Execute a service level action"
229
+ # method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
230
+ # def exec(context_params)
231
+ # opts = {}
232
+ # opts.merge!(:mode => :stream) if context_params.pure_cli_mode or options['stream-results']
233
+ # converge_aux(context_params, opts)
234
+ # end
235
+
236
+ # TODO: DEPRECATE: keeping around for backward compatibiity but will be deprecating execute-workflow
237
+ # desc "WORKSPACE-NAME/ID execute-workflow WORKFLOW-ACTION [WORKFLOW-PARAMS] [-m COMMIT-MSG]", "Execute workflow.", :hide => true
238
+ # method_option "commit_msg",:aliases => "-m",
239
+ # :type => :string,
240
+ # :banner => "COMMIT-MSG",
241
+ # :desc => "Commit message"
242
+ # def execute_workflow(context_params)
243
+ # OsUtil.print_deprecate_message("Command 'execute-workflow' will be deprecated; use 'exec' instead")
244
+ # converge_aux(context_params)
245
+ # end
246
+
247
+
248
+ desc "WORKSPACE-NAME/ID converge [-m COMMIT-MSG] [--stream-results]", "Converge workspace instance."
249
+ method_option "commit_msg",:aliases => "-m" ,
250
+ :type => :string,
251
+ :banner => "COMMIT-MSG",
252
+ :desc => "Commit message"
253
+ method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
254
+ def converge(context_params)
255
+ opts = {}
256
+ opts.merge!(:mode => :stream) if context_params.pure_cli_mode or options['stream-results']
257
+ converge_aux(context_params, opts)
258
+ end
259
+
260
+ desc "WORKSPACE-NAME/ID push-component-module-updates COMPONENT-MODULE-NAME [--force]", "Push changes made to a component module in the workspace to its base component module."
261
+ method_option :force, :type => :boolean, :default => false, :aliases => '-f'
262
+ def push_component_module_updates(context_params)
263
+ push_module_updates_aux(context_params)
264
+ end
265
+
266
+ desc "WORKSPACE-NAME/ID pull-base-component-module COMPONENT-MODULE-NAME [--force] [--revert]", "Pull base component module changes to component module in workspace"
267
+ method_option :force, :type => :boolean, :default => false, :aliases => '-f'
268
+ method_option :revert, :type => :boolean, :default => false, :aliases => '-r'
269
+ def pull_base_component_module(context_params)
270
+ pull_base_component_module_aux(context_params)
271
+ end
272
+
273
+ desc "WORKSPACE-NAME/ID push-assembly-updates [NAMESPACE:]SERVICE-MODULE-NAME/ASSEMBLY-NAME", "Push changes made to this workspace to the designated assembly."
274
+ def push_assembly_updates(context_params)
275
+ workspace_id, qualified_assembly_name = context_params.retrieve_arguments([:workspace_id!,:option_1!],method_argument_names)
276
+ if qualified_assembly_name =~ /(^[^\/]*)\/([^\/]*$)/
277
+ service_module_name, assembly_template_name = [$1,$2]
278
+ else
279
+ raise DtkError,"The term (#{qualified_assembly_name}) must have form SERVICE-MODULE-NAME/ASSEMBLY-NAME"
280
+ end
281
+ response = promote_assembly_aux(:update,workspace_id, service_module_name, assembly_template_name)
282
+ return response unless response.ok?
283
+ @@invalidate_map << :assembly
284
+ Response::Ok.new()
285
+ end
286
+
287
+ desc "WORKSPACE-NAME/ID create-assembly [NAMESPACE:]SERVICE-MODULE-NAME ASSEMBLY-NAME [-p] [-m DESCRIPTION]", "Create a new assembly from the workspace instance in the designated service module."
288
+ # The option -p will purge the workspace after assembly creation."
289
+ method_option :purge, :aliases => '-p', :type => :boolean, :default => false
290
+ method_option "description",:aliases => "-m" ,
291
+ :type => :string,
292
+ :banner => "DESCRIPTION"
293
+ def create_assembly(context_params)
294
+ workspace_id, service_module_full_name, assembly_template_name = context_params.retrieve_arguments([:workspace_id!,:option_1!,:option_2!],method_argument_names)
295
+
296
+ # need default_namespace for create-assembly because need to check if local service-module directory existst in promote_assembly_aux
297
+ resp = post rest_url("namespace/default_namespace_name")
298
+ return resp unless resp.ok?
299
+ default_namespace = resp.data
300
+
301
+ opts = {:default_namespace => default_namespace}
302
+ opts.merge!(:description => options.description) if options.description
303
+ response = promote_assembly_aux(:create,workspace_id,service_module_full_name,assembly_template_name,opts)
304
+ return response unless response.ok?
305
+
306
+ if options.purge?
307
+ response = purge_aux(context_params)
308
+ return response unless response.ok?
309
+ end
310
+
311
+ @@invalidate_map << :assembly
312
+ @@invalidate_map << :service
313
+
314
+ Response::Ok.new()
315
+ end
316
+
317
+ desc "WORKSPACE-NAME/ID create-attribute ATTRIBUTE-NAME [VALUE] [--type DATATYPE] [--required] [--dynamic]", "Create a new attribute and optionally assign it a value."
318
+ method_option :required, :type => :boolean, :default => false
319
+ method_option :dynamic, :type => :boolean, :default => false
320
+ method_option :type, :aliases => "-t"
321
+ def create_attribute(context_params)
322
+ create_attribute_aux(context_params)
323
+ end
324
+
325
+ #only supported at node-level
326
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/workspace>)
327
+ desc "WORKSPACE-NAME/ID add-component COMPONENT [--auto-complete]", "Add a component to a workspace. Use --auto-complete to link components automatically"
328
+ method_option :auto_complete, :type => :boolean, :default => true
329
+ def add_component(context_params)
330
+ response = create_component_aux(context_params)
331
+ return response unless response.ok?
332
+
333
+ @@invalidate_map << :service
334
+ @@invalidate_map << :service_node
335
+
336
+ response
337
+ end
338
+
339
+ # using ^^ before NODE-NAME to remove this command from workspace/node/node_id but show in workspace
340
+ desc "WORKSPACE-NAME/ID create-node ^^NODE-NAME NODE-TEMPLATE", "Add (stage) a new node in the workspace."
341
+ def create_node(context_params)
342
+ response = create_node_aux(context_params)
343
+ return response unless response.ok?
344
+
345
+ @@invalidate_map << :assembly
346
+ @@invalidate_map << :assembly_node
347
+ @@invalidate_map << :service
348
+ @@invalidate_map << :service_node
349
+ @@invalidate_map << :workspace
350
+ @@invalidate_map << :workspace_node
351
+
352
+ message = "Created node '#{response.data["display_name"]}'."
353
+ DTK::Client::OsUtil.print(message, :yellow)
354
+ end
355
+
356
+ desc "WORKSPACE-NAME/ID create-node-group ^^NODE-GROUP-NAME NODE-TEMPLATE [-n CARDINALITY]", "Add (stage) a new node group in the workspace."
357
+ method_option :cardinality, :aliases => '-n', :type => :string, :default => 1
358
+ def create_node_group(context_params)
359
+ response = create_node_group_aux(context_params)
360
+ return response unless response.ok?
361
+
362
+ @@invalidate_map << :assembly
363
+ @@invalidate_map << :assembly_node
364
+ @@invalidate_map << :service
365
+ @@invalidate_map << :service_node
366
+ @@invalidate_map << :workspace
367
+ @@invalidate_map << :workspace_node
368
+
369
+ message = "Created node group '#{response.data["display_name"]}'."
370
+ DTK::Client::OsUtil.print(message, :yellow)
371
+ end
372
+
373
+ desc "WORKSPACE-NAME/ID link-components TARGET-CMP-NAME SOURCE-CMP-NAME [DEPENDENCY-NAME]","Link the target component to the source component."
374
+ def link_components(context_params)
375
+ link_components_aux(context_params)
376
+ end
377
+
378
+ desc "delete NAME/ID [-y]", ""
379
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
380
+ def delete(context_params)
381
+ if context_params.is_last_command_eql_to?(:node)
382
+ response = delete_node_aux(context_params)
383
+ @@invalidate_map << :service_node
384
+
385
+ response
386
+ elsif context_params.is_last_command_eql_to?(:component)
387
+ response = delete_component_aux(context_params)
388
+ return response unless response.ok?
389
+ @@invalidate_map << :service_node_component
390
+
391
+ response
392
+ end
393
+ # delete_aux(context_params)
394
+ end
395
+
396
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/workspace>)
397
+ desc "WORKSPACE-NAME/ID delete-component COMPONENT-NAME [-y]","Delete component from the workspace."
398
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
399
+ def delete_component(context_params)
400
+ response = delete_component_aux(context_params)
401
+
402
+ @@invalidate_map << :service
403
+ @@invalidate_map << :service_node
404
+ @@invalidate_map << :service_node_component
405
+
406
+ return response
407
+ end
408
+
409
+ # using ^^ before NODE-NAME to remove this command from workspace/node/node_id but show in workspace
410
+ desc "WORKSPACE-NAME/ID delete-node ^^NODE-NAME [-y]","Delete node, terminating it if the node has been spun up."
411
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
412
+ def delete_node(context_params)
413
+ response = delete_node_aux(context_params)
414
+
415
+ @@invalidate_map << :assembly
416
+ @@invalidate_map << :assembly_node
417
+ @@invalidate_map << :service
418
+ @@invalidate_map << :service_node
419
+ @@invalidate_map << :workspace
420
+ @@invalidate_map << :workspace_node
421
+
422
+ return response
423
+ end
424
+
425
+ desc "WORKSPACE-NAME/ID delete-node-group ^^NODE-NAME [-y]","Delete node group and all nodes that are part of that group."
426
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
427
+ def delete_node_group(context_params)
428
+ response = delete_node_group_aux(context_params)
429
+
430
+ @@invalidate_map << :assembly
431
+ @@invalidate_map << :assembly_node
432
+ @@invalidate_map << :service
433
+ @@invalidate_map << :service_node
434
+ @@invalidate_map << :workspace
435
+ @@invalidate_map << :workspace_node
436
+
437
+ return response
438
+ end
439
+
440
+ desc "WORKSPACE-NAME/ID unlink-components TARGET-CMP-NAME SOURCE-CMP-NAME [DEPENDENCY-NAME]", "Remove a component link."
441
+ def unlink_components(context_params)
442
+ unlink_components_aux(context_params)
443
+ end
444
+
445
+ desc "WORKSPACE-NAME/ID edit-component-module COMPONENT-MODULE-NAME", "Edit a component module used in the workspace."
446
+ def edit_component_module(context_params)
447
+ edit_module_aux(context_params)
448
+ end
449
+
450
+ # desc "WORKSPACE-NAME/ID create-workflow WORKFLOW-NAME [--from BASE-WORKFLOW-NAME]", "Create a new workflow in the workspace."
451
+ # method_option :from, :type => :string
452
+ # def create_workflow(context_params)
453
+ # edit_or_create_workflow_aux(context_params,:create => true,:create_from => options.from)
454
+ # end
455
+
456
+ desc "WORKSPACE-NAME/ID edit-action [WORKSPACE-LEVEL-ACTION]", "Edit a workflow in the workspace."
457
+ def edit_action(context_params)
458
+ edit_or_create_workflow_aux(context_params)
459
+ end
460
+
461
+ desc "WORKSPACE-NAME/ID edit-attributes [-n NODE] [-c COMPONENT] [-a ATTRIBUTE]", "Edit workspace's attributes."
462
+ method_option :node, :aliases => '-n'
463
+ method_option :component, :aliases => '-c'
464
+ method_option :attribute, :aliases => '-a'
465
+ def edit_attributes(context_params)
466
+ response = edit_attributes_aux(context_params)
467
+
468
+ @@invalidate_map << :assembly
469
+ @@invalidate_map << :assembly_node
470
+ @@invalidate_map << :service
471
+ @@invalidate_map << :service_node
472
+ @@invalidate_map << :workspace
473
+ @@invalidate_map << :workspace_node
474
+
475
+ response
476
+ end
477
+
478
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/workspace>)
479
+ desc "HIDE_FROM_BASE get-netstats", "Get netstats"
480
+ def get_netstats(context_params)
481
+ get_netstats_aux(context_params)
482
+ end
483
+
484
+ =begin
485
+ # TODO: DTK-2027 might subsume by the dtk actions; currently server changes does not support this command
486
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/workspace>)
487
+ desc "HIDE_FROM_BASE execute-tests [--component COMPONENT-NAME] [--timeout TIMEOUT]", "Execute tests. --component filters execution per component, --timeout changes default execution timeout"
488
+ method_option :component, :type => :string, :desc => "Component name"
489
+ method_option :timeout, :type => :string, :desc => "Timeout"
490
+ def execute_tests(context_params)
491
+ execute_tests_aux(context_params)
492
+ end
493
+ =end
494
+
495
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/workspace>)
496
+ desc "HIDE_FROM_BASE get-ps [--filter PATTERN]", "Get ps"
497
+ method_option :filter, :type => :boolean, :default => false, :aliases => '-f'
498
+ def get_ps(context_params)
499
+ get_ps_aux(context_params)
500
+ end
501
+
502
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/workspace>)
503
+ desc "HIDE_FROM_BASE grep LOG-PATH NODES-ID-PATTERN GREP-PATTERN [--first]","Grep log from multiple nodes. --first option returns first match (latest log entry)."
504
+ method_option :first, :type => :boolean, :default => false
505
+ def grep(context_params)
506
+ grep_aux(context_params)
507
+ end
508
+
509
+ desc "WORKSPACE-NAME/ID grant-access USER-ACCOUNT PUB-KEY-NAME [PATH-TO-PUB-KEY] [--nodes NODE-NAMES]", "Grants ssh access to user account USER-ACCOUNT for nodes in workspace"
510
+ method_option :nodes, :type => :string, :default => nil
511
+ def grant_access(context_params)
512
+ grant_access_aux(context_params)
513
+ end
514
+
515
+ desc "WORKSPACE-NAME/ID revoke-access USER-ACCOUNT PUB-KEY-NAME [PATH-TO-PUB-KEY] [--nodes NODE-NAMES]", "Revokes ssh access to user account USER-ACCOUNT for nodes in workspace"
516
+ method_option :nodes, :type => :string, :default => nil
517
+ def revoke_access(context_params)
518
+ revoke_access_aux(context_params)
519
+ end
520
+
521
+ desc "WORKSPACE-NAME/ID list-ssh-access", "List SSH access for each of the nodes"
522
+ def list_ssh_access(context_params)
523
+ list_ssh_access_aux(context_params)
524
+ end
525
+
526
+ desc "WORKSPACE-NAME/ID info", "Get info about content of the workspace."
527
+ def info(context_params)
528
+ info_aux(context_params)
529
+ end
530
+
531
+ desc "WORKSPACE-NAME/ID link-attributes TARGET-ATTR SOURCE-ATTR", "Link the value of the target attribute to the source attribute."
532
+ def link_attributes(context_params)
533
+ link_attributes_aux(context_params)
534
+ end
535
+
536
+ desc "list", ""
537
+ def list(context_params)
538
+ if context_params.is_last_command_eql_to?(:node)
539
+ list_nodes_aux(context_params)
540
+ end
541
+ end
542
+
543
+ desc "WORKSPACE-NAME/ID list-attributes [-f FORMAT] [-t TAG,..] [--links] [-n NODE] [-c COMPONENT] [-a ATTRIBUTE]","List attributes associated with workspace."
544
+ method_option :format, :aliases => '-f'
545
+ method_option :tags, :aliases => '-t'
546
+ method_option :links, :type => :boolean, :default => false, :aliases => '-l'
547
+ method_option :node, :aliases => '-n'
548
+ method_option :component, :aliases => '-c'
549
+ method_option :attribute, :aliases => '-a'
550
+ def list_attributes(context_params)
551
+ list_attributes_aux(context_params)
552
+ end
553
+
554
+ desc "WORKSPACE-NAME/ID list-components [--deps]","List components associated with workspace."
555
+ method_option :deps, :type => :boolean, :default => false, :aliases => '-l'
556
+ def list_components(context_params)
557
+ list_components_aux(context_params)
558
+ end
559
+
560
+ desc "WORKSPACE-NAME/ID list-nodes","List nodes associated with workspace."
561
+ def list_nodes(context_params)
562
+ list_nodes_aux(context_params)
563
+ end
564
+
565
+ desc "WORKSPACE-NAME/ID list-component-links","List component links."
566
+ def list_component_links(context_params)
567
+ list_component_links_aux(context_params)
568
+ end
569
+
570
+ desc "WORKSPACE-NAME/ID list-component-modules","List component modules associated with workspace."
571
+ def list_component_modules(context_params)
572
+ list_modules_aux(context_params)
573
+ end
574
+
575
+ desc "WORKSPACE-NAME/ID list-tasks","List tasks associated with workspace."
576
+ def list_tasks(context_params)
577
+ list_tasks_aux(context_params)
578
+ end
579
+
580
+ desc "WORKSPACE-NAME/ID action-info [WORKSPACE-LEVEL-ACTION]", "Get the contents of action associated with the workspace."
581
+ def action_info(context_params)
582
+ action_info_aux(context_params)
583
+ end
584
+
585
+ desc "WORKSPACE-NAME/ID list-actions [--type TYPE]", "List the actions defined on components in the workspace."
586
+ method_option :type, :aliases => '-t'
587
+ def list_actions(context_params)
588
+ list_actions_aux(context_params)
589
+ end
590
+
591
+ # desc "WORKSPACE-NAME/ID list-workflows", "List the workflows associated with the workspace.", :hide => true
592
+ # def list_workflows(context_params)
593
+ # workflow_list_aux(context_params)
594
+ # end
595
+
596
+ desc "WORKSPACE-NAME/ID list-violations", "Finds violations in the workspace that will prevent a converge operation."
597
+ def list_violations(context_params)
598
+ list_violations_aux(context_params)
599
+ end
600
+
601
+ desc "WORKSPACE-NAME/ID print-includes", "Finds includes in the workspace."
602
+ def print_includes(context_params)
603
+ print_includes_aux(context_params)
604
+ end
605
+
606
+ desc "WORKSPACE-NAME/ID purge [-y]", "Purge the workspace, deleting and terminating any nodes that have been spun up."
607
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
608
+ def purge(context_params)
609
+ purge_aux(context_params)
610
+ end
611
+
612
+ desc "WORKSPACE-NAME/ID destroy-and-reset-nodes [-y]", "Terminates all nodes, but keeps config state so they can be spun up from scratch."
613
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
614
+ def destroy_and_reset_nodes(context_params)
615
+ destroy_and_reset_nodes_aux(context_params)
616
+ end
617
+
618
+ desc "WORKSPACE-NAME/ID set-target TARGET-NAME/ID", "Set target associated with workspace."
619
+ def set_target(context_params)
620
+ set_target_aux(context_params)
621
+ end
622
+
623
+ desc "WORKSPACE-NAME/ID set-attribute ATTRIBUTE-NAME [VALUE] [-u] [-c] [-n]", "(Un)Set attribute value. The option -u will unset the attribute's value, -c to set component-attribute, -n to set node-attribute."
624
+ method_option :unset, :aliases => '-u', :type => :boolean, :default => false
625
+ method_option :component_attribute, :aliases => '-c', :type => :boolean, :default => false
626
+ method_option :node_attribute, :aliases => '-n', :type => :boolean, :default => false
627
+ def set_attribute(context_params)
628
+ response = set_attribute_aux(context_params)
629
+ return response unless response.ok?
630
+
631
+ @@invalidate_map << :assembly
632
+ @@invalidate_map << :assembly_node
633
+ @@invalidate_map << :service
634
+ @@invalidate_map << :service_node
635
+ @@invalidate_map << :workspace
636
+ @@invalidate_map << :workspace_node
637
+
638
+ response
639
+ end
640
+
641
+ desc "WORKSPACE-NAME/ID set-required-attributes", "Interactive dialog to set required attributes that are not currently set"
642
+ def set_required_attributes(context_params)
643
+ workspace_id = context_params.retrieve_arguments([:workspace_id!],method_argument_names)
644
+ set_required_attributes_aux(workspace_id,:assembly,:instance)
645
+ end
646
+
647
+ # desc "WORKSPACE-NAME/ID start [NODE-ID-PATTERN]", "Starts all workspace's nodes, specific nodes can be selected via node id regex."
648
+ desc "WORKSPACE-NAME/ID start [NODE-NAME]", "Starts all the workspace nodes. A single node can be selected."
649
+ def start(context_params)
650
+ start_aux(context_params)
651
+ end
652
+
653
+ # desc "WORKSPACE-NAME/ID stop [NODE-ID-PATTERN]", "Stops all workspace's nodes, specific nodes can be selected via node id regex."
654
+ desc "WORKSPACE-NAME/ID stop [NODE-NAME]", "Stops all the workspace nodes. A single node can be selected."
655
+ def stop(context_params)
656
+ stop_aux(context_params)
657
+ end
658
+
659
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/workspace>)
660
+ desc "HIDE_FROM_BASE tail LOG-PATH NODE-NAME [REGEX-PATTERN] [--more]","Tail specified number of lines from log. CTRL+C to quit."
661
+ method_option :more, :type => :boolean, :default => false
662
+ def tail(context_params)
663
+ tail_aux(context_params)
664
+ end
665
+
666
+ #desc "WORKSPACE-NAME/ID task-status [--wait] [--summarize]", "Get the task status of the running or last running workspace task."
667
+ desc "WORKSPACE-NAME/ID task-status [--mode MODE] [--summarize]", "Get the task status of the running or last running workspace task."
668
+ method_option "mode",:aliases => "-m" ,
669
+ :type => :string,
670
+ :banner => "MODE",
671
+ :desc => "Mode in which task status display; one of [stream,snapshot,refresh]; default is 'snapshot'"
672
+ method_option :summarize, :type => :boolean, :default => false, :aliases => '-s'
673
+ # TODO: leaving --wait in for backwards compatability
674
+ method_option :wait, :type => :boolean, :default => false
675
+
676
+ def task_status(context_params)
677
+ task_status_aw_aux(context_params)
678
+ end
679
+
680
+ desc "WORKSPACE-NAME/ID task-action-detail", "Get the task info of the running or last running workspace task."
681
+ def task_action_detail(context_params)
682
+ task_action_detail_aw_aux(context_params)
683
+ end
684
+ end
685
+ end