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,94 @@
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 NodeTemplate < CommandBaseThor
20
+
21
+ def self.pretty_print_cols()
22
+ PPColumns.get(:node)
23
+ end
24
+
25
+ def self.extended_context()
26
+ {
27
+ :context => {
28
+ :add_component => "component_template"
29
+ }
30
+ }
31
+ end
32
+
33
+ def self.validation_list(context_params)
34
+ get_cached_response(:node_template, "node/list", {:subtype => 'template'})
35
+ end
36
+
37
+ # desc "list --all -t [TARGET-NAME]", "List all node templates."
38
+ desc "list", "List all node templates."
39
+ method_option :all, :type => :boolean, :default => false
40
+ method_option "target_identifier",:aliases => "-t" ,
41
+ :type => :string,
42
+ :banner => "TARGET-IDENTIFIER",
43
+ :desc => "Name or ID of desired target"
44
+ def list(context_params)
45
+ post_body = {
46
+ :subtype => 'template',
47
+ :target_indentifier => options.target_identifier,
48
+ :is_list_all => options.all
49
+ }
50
+ response = post rest_url("node/list"), post_body
51
+ response.render_table(options.all ? :node_template_all : :node_template)
52
+ end
53
+
54
+ #TODO: this may be moved to just be a utility fn
55
+ desc "image-upgrade OLD-IMAGE-ID NEW-IMAGE-ID", "Upgrade use of OLD-IMAGE-ID to NEW-IMAGE-ID"
56
+ def image_upgrade(context_params)
57
+ old_image_id, new_image_id = context_params.retrieve_arguments([:option_1!, :option_2!],method_argument_names)
58
+ post_body = {
59
+ :old_image_id => old_image_id,
60
+ :new_image_id => new_image_id
61
+ }
62
+ post rest_url("node/image_upgrade"), post_body
63
+ end
64
+
65
+ desc "add-node-template NODE-TEMPLATE-NAME [-t TARGET-NAME/ID] --os OS --image-id IMAGE-ID --size SIZE[,SIZE2,..]", "Add new node template"
66
+ method_option "target",:aliases => "-t"
67
+ method_option "os"
68
+ method_option "image-id",:aliases => "-i"
69
+ method_option "size",:aliases => "-s"
70
+ def add_node_template(context_params)
71
+ node_template_name = context_params.retrieve_arguments([:option_1!],method_argument_names)
72
+ size_array = options[:size] && options[:size].split(',')
73
+
74
+ post_body = post_body(
75
+ :node_template_name => node_template_name,
76
+ :target_id => options['target'],
77
+ :operating_system => required_option('os'),
78
+ :image_id => required_option('image-id'),
79
+ :size_array => size_array
80
+ )
81
+ post rest_url("node/add_node_template"), post_body
82
+ end
83
+
84
+ desc "delete-node-template NODE-TEMPLATE-NAME", "Delete node template"
85
+ def delete_node_template(context_params)
86
+ node_template_name = context_params.retrieve_arguments([:option_1!],method_argument_names)
87
+ post_body = post_body(
88
+ :node_template_name => node_template_name
89
+ )
90
+ post rest_url("node/delete_node_template"), post_body
91
+ end
92
+
93
+ end
94
+ end
@@ -0,0 +1,34 @@
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 Project < CommandBaseThor
20
+
21
+ def self.pretty_print_cols()
22
+ PPColumns.get(:project)
23
+ end
24
+
25
+ desc "list","List projects"
26
+ def list(context_params)
27
+ search_hash = SearchHash.new()
28
+ search_hash.cols = pretty_print_cols()
29
+ post rest_url("project/list"), search_hash.post_body_hash()
30
+ end
31
+
32
+ end
33
+ end
34
+
@@ -0,0 +1,233 @@
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 Provider < CommandBaseThor
20
+
21
+ def self.valid_children()
22
+ [:target]
23
+ end
24
+
25
+ def self.all_children()
26
+ [:target]
27
+ end
28
+
29
+ def self.validation_list(context_params)
30
+ get_cached_response(:provider, "target/list", {:subtype => :template })
31
+ end
32
+
33
+ def self.override_allowed_methods()
34
+ return DTK::Shell::OverrideTasks.new({
35
+ :command_only => {
36
+ :target => [
37
+ ['delete-and-destroy',"delete-and-destroy TARGET-NAME","# Deletes target"],
38
+ ['list',"list","# Lists available targets."]
39
+
40
+ ]
41
+ },
42
+ :identifier_only => {
43
+ :target => [
44
+ ['list-nodes',"list-nodes","# Lists node instances in given targets."],
45
+ ['list-services',"list-services","# Lists assembly instances in given targets."]
46
+ ]
47
+ }
48
+ })
49
+ end
50
+
51
+ def self.valid_child?(name_of_sub_context)
52
+ Provider.valid_children().include?(name_of_sub_context.to_sym)
53
+ end
54
+
55
+ desc "create-provider-ec2 PROVIDER-NAME [--keypair KEYPAIR] [--security-group SECURITY-GROUP(S)]", "Create provider for ec2 vpc or classic. Multiple security groups separated with ',' (gr1,gr2,gr3,...)"
56
+ method_option :keypair, :type => :string
57
+ method_option :security_group, :type => :string, :aliases => '--security-groups'
58
+ # TODO: made this a hidden option; needs to be updated because now choice if vpc or classic
59
+ method_option :bootstrap, :type => :boolean, :default => false
60
+ def create_provider_ec2(context_params)
61
+ provider_name = context_params.retrieve_arguments([:option_1!],method_argument_names)
62
+ provider_type = 'ec2'
63
+
64
+ iaas_properties = Hash.new
65
+
66
+ keypair, security_group = context_params.retrieve_thor_options([:keypair, :security_group], options)
67
+
68
+ iaas_properties.merge!(:keypair => keypair) if keypair
69
+ if security_group
70
+ if security_group.end_with?(',')
71
+ raise DtkValidationError.new("Multiple security groups should be separated with ',' and without spaces between them (e.g. --security_groups gr1,gr2,gr3,...) ")
72
+ end
73
+
74
+ security_groups = security_group.split(',')
75
+
76
+ if (security_groups.empty? || security_groups.size==1)
77
+ iaas_properties.merge!(:security_group => security_group)
78
+ else
79
+ iaas_properties.merge!(:security_group_set => security_groups)
80
+ end
81
+ end
82
+
83
+ result = Shell::InteractiveWizard::interactive_user_input(
84
+ {'IAAS Credentials' => { :type => :group, :options => [
85
+ {:key => {}},
86
+ {:secret => {}}
87
+ ]}})
88
+ access_key, secret_key = result['IAAS Credentials'].values_at(:key, :secret)
89
+ iaas_properties.merge!(:key => access_key,:secret => secret_key)
90
+
91
+ # Remove sensitive readline history
92
+ OsUtil.pop_readline_history(2)
93
+
94
+ post_body = {
95
+ :iaas_properties => iaas_properties,
96
+ :provider_name => provider_name,
97
+ :iaas_type => 'ec2',
98
+ :no_bootstrap => ! options.bootstrap?
99
+ }
100
+
101
+ response = post rest_url("target/create_provider"), post_body
102
+ @@invalidate_map << :provider
103
+
104
+ response
105
+ end
106
+
107
+ desc "create-provider-physical PROVIDER-NAME", "Create provider to manage physical nodes."
108
+ def create_provider_physical(context_params)
109
+ provider_name = context_params.retrieve_arguments([:option_1!],method_argument_names)
110
+
111
+ # Remove sensitive readline history
112
+ OsUtil.pop_readline_history(2)
113
+
114
+ post_body = {
115
+ :provider_name => provider_name,
116
+ :iaas_type => 'physical'
117
+ }
118
+
119
+ response = post rest_url("target/create_provider"), post_body
120
+ @@invalidate_map << :provider
121
+
122
+ response
123
+ end
124
+
125
+ =begin
126
+ TODO: deprecated until this can be in sync with create-targets from target context where params depend on type
127
+
128
+ desc "PROVIDER-ID/NAME create-target [TARGET-NAME] --region REGION --keypair KEYPAIR --security-group SECURITY-GROUP(S)", "Create target based on given provider"
129
+ method_option :region, :type => :string
130
+ method_option :keypair, :type => :string
131
+ method_option :security_group, :type => :string, :aliases => '--security-groups'
132
+ def create_target(context_params)
133
+ # we use :target_id but that will retunr provider_id (another name for target template ID)
134
+ provider_id, target_name = context_params.retrieve_arguments([:provider_id!, :option_1],method_argument_names)
135
+ region, keypair, security_group = context_params.retrieve_thor_options([:region!, :keypair!, :security_group!], options)
136
+
137
+ #TODO: data-driven check if legal provider type and then what options needed depending on provider type
138
+ iaas_properties = Hash.new
139
+ Shell::InteractiveWizard.validate_region(region)
140
+
141
+ security_groups = []
142
+ raise DtkValidationError.new("Multiple security groups should be separated with ',' and without spaces between them (e.g. --security_groups gr1,gr2,gr3,...) ") if security_group.end_with?(',')
143
+
144
+ security_groups = security_group.split(',')
145
+ iaas_properties.merge!(:keypair => keypair)
146
+
147
+ if (security_groups.empty? || security_groups.size==1)
148
+ iaas_properties.merge!(:security_group => security_group)
149
+ else
150
+ iaas_properties.merge!(:security_group_set => security_groups)
151
+ end
152
+
153
+ post_body = {
154
+ :provider_id => provider_id,
155
+ :region => region,
156
+ :iaas_properties => iaas_properties
157
+ }
158
+ post_body.merge!(:target_name => target_name) if target_name
159
+ response = post rest_url("target/create"), post_body
160
+ @@invalidate_map << :target
161
+
162
+ response
163
+ end
164
+ =end
165
+
166
+ desc "list","Lists available providers."
167
+ def list(context_params)
168
+ if context_params.is_there_command?(:"target")
169
+ list_targets(context_params)
170
+ else
171
+ response = post rest_url("target/list"), { :subtype => :template }
172
+ response.render_table(:provider)
173
+ end
174
+ end
175
+
176
+ #TODO: Aldin; wanted to name this list_targets, but did not know how to do so w/o conflicting with desc "PROVIDER-ID/NAME list-targets
177
+ # Aldin: moved this to target base context (target>list)
178
+ #
179
+ # desc "list-all-targets","Lists all targets for all providers."
180
+ # def list_all_targets(context_params)
181
+ # response = post rest_url("target/list"), { :subtype => :instance }
182
+ # response.render_table(:target)
183
+ # end
184
+
185
+ desc "PROVIDER-ID/NAME list-targets", "List targets"
186
+ def list_targets(context_params)
187
+ provider_id = context_params.retrieve_arguments([:provider_id!],method_argument_names)
188
+
189
+ response = post rest_url("target/list"), { :subtype => :instance, :parent_id => provider_id }
190
+ response.render_table(:target)
191
+ end
192
+
193
+ desc "delete-and-destroy PROVIDER-NAME [-y]","Deletes target provider, its targets, and their assemblies"
194
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
195
+ def delete_and_destroy(context_params)
196
+ provider_id = context_params.retrieve_arguments([:option_1!],method_argument_names)
197
+
198
+ unless options.force?
199
+ return unless Console.confirmation_prompt("Are you sure you want to delete provider '#{provider_id}' and all target and service instances under it" +'?')
200
+ end
201
+
202
+ post_body = {
203
+ :target_id => provider_id,
204
+ :type => 'template'
205
+ }
206
+
207
+ @@invalidate_map << :provider
208
+
209
+ response = post(rest_url("target/delete_and_destroy"),post_body)
210
+ return response unless response.ok?
211
+ if info_array = response.data['info']
212
+ info_array.each{|info_msg|OsUtil.print(info_msg, :yellow)}
213
+ end
214
+ Response::Ok.new()
215
+ end
216
+
217
+ no_tasks do
218
+
219
+ def decompose_provider_type_and_name(composed_name)
220
+ provider_type, provider_name = composed_name.split(':')
221
+
222
+ if (provider_type.nil? || provider_name.nil? || provider_type.empty? || provider_name.empty?)
223
+ raise DtkValidationError.new("Provider name and type are required parameters and should be provided in format PROVIDER-TYPE:PROVIDER-NAME")
224
+ end
225
+
226
+ return [provider_type, provider_name]
227
+ end
228
+
229
+ end
230
+
231
+
232
+ end
233
+ end
@@ -0,0 +1,49 @@
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 Remotes < CommandBaseThor
20
+
21
+ def self.valid_children()
22
+ []
23
+ end
24
+
25
+ # REMOTE INTERACTION
26
+ desc "push-remote", "Push local changes to remote git repository"
27
+ method_option :force, :aliases => '--force', :type => :boolean, :default => false
28
+ def push_remote(context_params)
29
+ raise "NOT IMPLEMENTED"
30
+ end
31
+
32
+ desc "list-remotes", "List git remotes for given module"
33
+ def list_remotes(context_params)
34
+ raise "NOT IMPLEMENTED"
35
+ end
36
+
37
+ desc "add-remote", "Add git remote for given module"
38
+ def add_remote(context_params)
39
+ raise "NOT IMPLEMENTED"
40
+ end
41
+
42
+ desc "remove-remote", "Remove git remote for given module"
43
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
44
+ def remove_remote(context_params)
45
+ raise "NOT IMPLEMENTED"
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,941 @@
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
+ require 'yaml'
22
+
23
+ dtk_require_from_base('dtk_logger')
24
+ dtk_require_from_base('util/os_util')
25
+ dtk_require_from_base('command_helper')
26
+ dtk_require_from_base('task_status')
27
+ dtk_require_common_commands('thor/set_required_attributes')
28
+ dtk_require_common_commands('thor/edit')
29
+ dtk_require_common_commands('thor/purge_clone')
30
+ dtk_require_common_commands('thor/assembly_workspace')
31
+ dtk_require_common_commands('thor/action_result_handler')
32
+
33
+
34
+ module DTK::Client
35
+ class Service < CommandBaseThor
36
+ no_tasks do
37
+ include TaskStatusMixin
38
+ include SetRequiredParamsMixin
39
+ include EditMixin
40
+ include PurgeCloneMixin
41
+ include AssemblyWorkspaceMixin
42
+ include ActionResultHandler
43
+
44
+ def get_assembly_name(assembly_id)
45
+ get_name_from_id_helper(assembly_id)
46
+ end
47
+
48
+ # def get_assembly_id(assembly_name)
49
+ # assembly_id = nil
50
+ # list = CommandBaseThor.get_cached_response(:service, "assembly/list", {})
51
+
52
+ # list.data.each do |item|
53
+ # if item["display_name"] == assembly_name
54
+ # assembly_id = item["id"]
55
+ # break
56
+ # end
57
+ # end
58
+
59
+ # raise DtkError,"[ERROR] Illegal name (#{assembly_name}) for service." unless assembly_id
60
+ # assembly_id
61
+ # end
62
+
63
+ end
64
+
65
+ def self.whoami()
66
+ return :service, "assembly/list", {:subtype => 'instance'}
67
+ end
68
+
69
+ def self.pretty_print_cols()
70
+ PPColumns.get(:assembly)
71
+ end
72
+
73
+ def self.valid_children()
74
+ [:utils]
75
+ end
76
+
77
+ def self.invisible_context()
78
+ [:node]
79
+ end
80
+
81
+ # using extended_context when we want to use autocomplete from other context
82
+ # e.g. we are in assembly/apache context and want to create-component we will use extended context to add
83
+ # component-templates to autocomplete
84
+ def self.extended_context()
85
+ {
86
+ :context => {
87
+ :create_node => "node_template",
88
+ :create_node_group => "node_template",
89
+ :add_component_dependency => "component_template"
90
+ },
91
+ :command => {
92
+ :add_component => {
93
+ :endpoint => "component_template",
94
+ :url => "component/list",
95
+ :opts => {:subtype=>"template", :ignore => "test_module", :hide_assembly_cmps => "true"}
96
+ },
97
+ :edit_component_module => {
98
+ :endpoint => "assembly",
99
+ :url => "assembly/info_about",
100
+ :opts => {:subtype=>"instance", :about=>"modules"}
101
+ },
102
+ :push_component_module_updates => {
103
+ :endpoint => "assembly",
104
+ :url => "assembly/info_about",
105
+ :opts => {:subtype=>"instance", :about=>"modules"}
106
+ },
107
+ :delete_node => {
108
+ :endpoint => "assembly",
109
+ :url => "assembly/get_nodes_without_node_groups"
110
+ },
111
+ :delete_node_group => {
112
+ :endpoint => "assembly",
113
+ :url => "assembly/get_node_groups"
114
+ },
115
+ :pull_base_component_module => {
116
+ :endpoint => "assembly",
117
+ :url => "assembly/info_about",
118
+ :opts => {:subtype=>"instance", :about=>"modules"}
119
+ },
120
+ :action_info => {
121
+ :endpoint => "assembly",
122
+ :url => "assembly/task_action_list"
123
+ },
124
+ :exec => {
125
+ :endpoint => "assembly",
126
+ :url => "assembly/list_actions"
127
+ },
128
+ :exec_sync => {
129
+ :endpoint => "assembly",
130
+ :url => "assembly/list_actions"
131
+ }
132
+ # TODO: DEPRECATE execute_workflow
133
+ # :execute_workflow => {
134
+ # :endpoint => "assembly",
135
+ # :url => "assembly/task_action_list"
136
+ # }
137
+ }
138
+ }
139
+ end
140
+
141
+ # this includes children of children
142
+ def self.all_children()
143
+ # [:node, :component, :attribute]
144
+ [:node]
145
+ end
146
+
147
+ def self.multi_context_children()
148
+ [[:utils],[:node, :utils]]
149
+ end
150
+
151
+ def self.valid_child?(name_of_sub_context)
152
+ return Service.valid_children().include?(name_of_sub_context.to_sym)
153
+ end
154
+
155
+ def self.validation_list(context_params)
156
+ get_cached_response(:service, "assembly/list", {})
157
+ end
158
+
159
+ # TODO: Hack which is necessery for the specific problem (DTK-541), something to reconsider down the line
160
+ # at this point not sure what would be clenear solution
161
+
162
+ # :all => include both for commands with command and identifier
163
+ # :command_only => only on command level
164
+ # :identifier_only => only on identifier level for given entity (command)
165
+ #
166
+ def self.override_allowed_methods()
167
+ override_methods = {
168
+ :all => {
169
+ # :node => [
170
+ # ['delete-component',"delete-component COMPONENT-ID","# Delete component from assembly's node"],
171
+ # ['list-components',"list-components","# List components associated with assembly's node."],
172
+ # ['list-attributes',"list-attributes","# List attributes associated with assembly's node."]
173
+ # ],
174
+ :component => [
175
+ ['list-attributes',"list-attributes","# List attributes associated with given component."]
176
+ ]
177
+ },
178
+ :command_only => {
179
+ :attribute => [
180
+ ['list-attributes',"list-attributes","# List attributes."]
181
+ ],
182
+ :node => [
183
+ ['delete',"delete NODE-NAME/ID [-y] ","# Delete node, terminating it if the node has been spun up."],
184
+ ['list',"list","# List nodes."]
185
+ ],
186
+ :component => [
187
+ ['delete',"delete COMPONENT-NAME/ID [-y] ","# Delete component from workspace."],
188
+ ['list-components',"list-components","# List components."]
189
+ ],
190
+ :utils => [
191
+ # TODO: DTK-2027 might subsume by the dtk actions; currently server changes does not support this command
192
+ # ['execute-tests',"execute-tests [--component COMPONENT-NAME] [--timeout TIMEOUT]","# Execute tests. --component filters execution per component, --timeout changes default execution timeout."],
193
+ ['get-netstats',"get-netstats","# Get netstats."],
194
+ ['get-ps',"get-ps [--filter PATTERN]","# Get ps."],
195
+ ['grep',"grep LOG-PATH NODE-ID-PATTERN GREP-PATTERN [--first]","# Grep log from multiple nodes. --first option returns first match (latest log entry)."],
196
+ ['tail',"tail LOG-PATH NODE-NAME [REGEX-PATTERN] [--more]","# Tail log from specified node. CTRL+C to quit."]
197
+ ],
198
+ :node_utils => [
199
+ ['get-netstats',"get-netstats","# Get netstats."],
200
+ ['get-ps',"get-ps [--filter PATTERN]","# Get ps."],
201
+ ['grep',"grep LOG-PATH GREP-PATTERN [--first]","# Grep log from node. --first option returns first match (latest log entry)."],
202
+ ['tail',"tail LOG-PATH [REGEX-PATTERN] [--more]","# Tail log from node. CTRL+C to quit."]
203
+ ]
204
+ },
205
+ :identifier_only => {
206
+ :node => [
207
+ ['add-component',"add-component COMPONENT","# Add a component to the node."],
208
+ ['delete-component',"delete-component COMPONENT-NAME [-y]","# Delete component from service's node"],
209
+ ['info',"info","# Return info about node instance belonging to given workspace."],
210
+ ['list-attributes',"list-attributes","# List attributes associated with service's node."],
211
+ ['list-components',"list-components","# List components associated with service's node."],
212
+ ['set-attribute',"set-attribute ATTRIBUTE-NAME [VALUE] [-u]","# (Un)Set attribute value. The option -u will unset the attribute's value."],
213
+ ['start', "start", "# Start node instance."],
214
+ ['stop', "stop", "# Stop node instance."],
215
+ ['ssh', "ssh REMOTE-USER [-i PATH-TO-PEM]","# SSH into node, optional parameters are path to identity file."]
216
+ ],
217
+ :node_group => [
218
+ ['start', "start", "# 2Start node instance."],
219
+ ['stop', "stop", "# 2Stop node instance."],
220
+ ['ssh', "ssh REMOTE-USER [-i PATH-TO-PEM]","# 2SSH into node, optional parameters are path to identity file."]
221
+ ],
222
+ :component => [
223
+ ['info',"info","# Return info about component instance belonging to given node."],
224
+ ['edit',"edit","# Edit component module related to given component."],
225
+ ['link-components',"link-components ANTECEDENT-CMP-NAME [DEPENDENCY-NAME]","#Link components to satisfy component dependency relationship."],
226
+ ['list-component-links',"list-component-links","# List component's links to other components."],
227
+ ['unlink-components',"unlink-components SERVICE-TYPE","# Delete service link on component."]
228
+ ],
229
+ :attribute => [
230
+ ['info',"info","# Return info about attribute instance belonging to given component."]
231
+ ]
232
+ }
233
+ }
234
+
235
+ if DTK::Configuration.get(:development_mode)
236
+ override_methods[:identifier_only][:node] << ['test-action-agent', "test-action-agent BASH-COMMAND-LINE", "Run bash command on test action agent"]
237
+ end
238
+
239
+ return DTK::Shell::OverrideTasks.new(override_methods, [:utils])
240
+ end
241
+
242
+ desc "SERVICE-NAME/ID destroy-and-reset-nodes [-y]", "Terminates all nodes, but keeps config state so they can be spun up from scratch."
243
+ method_option :force, :aliases => '-y', :type => :boolean, :default => false
244
+ def destroy_and_reset_nodes(context_params)
245
+ destroy_and_reset_nodes_aux(context_params)
246
+ end
247
+
248
+ desc "SERVICE-NAME/ID start [NODE-NAME]", "Starts all the service nodes. A single node can be selected."
249
+ def start(context_params)
250
+ start_aux(context_params)
251
+ end
252
+
253
+ desc "SERVICE-NAME/ID stop [NODE-NAME]", "Stops all the service nodes. A single node can be selected."
254
+ method_option :legacy, :aliases => '--legacy', :type => :boolean, :default => false
255
+ def stop(context_params)
256
+ stop_aux(context_params)
257
+ end
258
+
259
+
260
+ desc "SERVICE-NAME/ID cancel-task [TASK_ID]", "Cancels an executing task. If task id is omitted, this command cancels the most recent executing task."
261
+ def cancel_task(context_params)
262
+ cancel_task_aux(context_params)
263
+ end
264
+
265
+ desc "SERVICE-NAME/ID create-assembly [NAMESPACE:]SERVICE-MODULE-NAME ASSEMBLY-NAME [-m DESCRIPTION]", "Create a new assembly from this service instance in the designated service module."
266
+ method_option "description",:aliases => "-m" ,
267
+ :type => :string,
268
+ :banner => "DESCRIPTION"
269
+ def create_assembly(context_params)
270
+ if options.description?
271
+ if context_params.method_arguments.length > 2
272
+ raise DtkError, "The number of arguments is invalid. If you are using -m with multiple words please put them under quotation marks"
273
+ end
274
+ end
275
+
276
+ assembly_id, service_module_name, assembly_template_name = context_params.retrieve_arguments([:service_id!,:option_1!,:option_2!],method_argument_names)
277
+ # need default_namespace for create-assembly because need to check if local service-module directory existst in promote_assembly_aux
278
+ resp = post rest_url("namespace/default_namespace_name")
279
+ return resp unless resp.ok?
280
+ default_namespace = resp.data
281
+
282
+ opts = {:default_namespace => default_namespace}
283
+ if description = options.description
284
+ description = "#{description}"
285
+ opts.merge!(:description => description)
286
+ end
287
+
288
+ response = promote_assembly_aux(:create,assembly_id,service_module_name,assembly_template_name,opts)
289
+ return response unless response.ok?
290
+
291
+ @@invalidate_map << :assembly
292
+ @@invalidate_map << :service
293
+
294
+ Response::Ok.new()
295
+ end
296
+
297
+ desc "SERVICE-NAME/ID exec [NODE/NODE-GROUP/]ACTION [ACTION-PARAMS]", "Execute action asynchronously"
298
+ def exec(context_params)
299
+ exec_aux(context_params)
300
+ end
301
+
302
+ desc "SERVICE-NAME/ID exec-sync [NODE/NODE-GROUP/]ACTION [ACTION-PARAMS]", "Execute action synchronously"
303
+ def exec_sync(context_params)
304
+ exec_sync_aux(context_params)
305
+ end
306
+
307
+ # desc "SERVICE-NAME/ID exec SERVICE-LEVEL-ACTION [PARAMS] [--stream-results]", "Execute a service level action", :hide => true
308
+ # method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
309
+ # def exec(context_params)
310
+ # opts = {}
311
+ # opts.merge!(:mode => :stream) if context_params.pure_cli_mode or options['stream-results']
312
+ # converge_aux(context_params, opts)
313
+ # end
314
+
315
+ # TODO: DEPRECATE: keeping around for backward compatibiity but will be deprecating execute-workflow
316
+ # desc "SERVICE-NAME/ID execute-workflow WORKFLOW-ACTION [WORKFLOW-PARAMS] [-m COMMIT-MSG]", "Execute workflow.", :hide => true
317
+ # method_option "commit_msg",:aliases => "-m" ,
318
+ # :type => :string,
319
+ # :banner => "COMMIT-MSG",
320
+ # :desc => "Commit message"
321
+ # def execute_workflow(context_params)
322
+ # OsUtil.print_deprecate_message("Command 'execute-workflow' will be deprecated; use 'exec' instead")
323
+ # converge(context_params)
324
+ # end
325
+
326
+ desc "SERVICE-NAME/ID converge [-m COMMIT-MSG] [--stream-results]", "Converge service instance."
327
+ method_option "commit_msg",:aliases => "-m" ,
328
+ :type => :string,
329
+ :banner => "COMMIT-MSG",
330
+ :desc => "Commit message"
331
+ method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
332
+ def converge(context_params)
333
+ opts = {}
334
+ opts.merge!(:mode => :stream) if context_params.pure_cli_mode or options['stream-results']
335
+ converge_aux(context_params, opts)
336
+ end
337
+
338
+ # desc "SERVICE-NAME/ID execute-action COMPONENT-INSTANCE [ACTION-NAME [ACTION-PARAMS]]", "Converge the component or execute tha action on the component.", :hide => true
339
+ # def execute_action(context_params)
340
+ # execute_ad_hoc_action_aux(context_params)
341
+ # end
342
+
343
+ desc "SERVICE-NAME/ID list-actions [--type TYPE]", "List the actions defined on components in the service instance."
344
+ method_option :type, :aliases => '-t'
345
+ def list_actions(context_params)
346
+ list_actions_aux(context_params)
347
+ end
348
+
349
+ desc "SERVICE-NAME/ID push-assembly-updates [NAMESPACE:SERVICE-MODULE-NAME/ASSEMBLY-NAME]", "Push changes made to this service instance to the designated assembly; default is parent assembly."
350
+ def push_assembly_updates(context_params)
351
+ assembly_id, qualified_assembly_name = context_params.retrieve_arguments([:service_id!, :option_1], method_argument_names)
352
+ service_module_name, assembly_template_name =
353
+ if qualified_assembly_name
354
+ if qualified_assembly_name =~ /(^[^\/]*)\/([^\/]*$)/
355
+ [$1,$2]
356
+ else
357
+ raise DtkError, "The term (#{qualified_assembly_name}) must have form SERVICE-MODULE-NAME/ASSEMBLY-NAME"
358
+ end
359
+ else
360
+ [nil, nil]
361
+ end
362
+
363
+ response = promote_assembly_aux(:update, assembly_id, service_module_name, assembly_template_name, :use_module_namespace => true)
364
+ return response unless response.ok?
365
+ @@invalidate_map << :assembly
366
+ Response::Ok.new()
367
+ end
368
+
369
+ desc "SERVICE-NAME/ID pull-base-component-module COMPONENT-MODULE-NAME [--force] [--revert]", "Pull base component module changes to component module in the service"
370
+ method_option :force, :type => :boolean, :default => false, :aliases => '-f'
371
+ method_option :revert, :type => :boolean, :default => false, :aliases => '-r'
372
+ def pull_base_component_module(context_params)
373
+ pull_base_component_module_aux(context_params)
374
+ end
375
+
376
+ desc "SERVICE-NAME/ID push-component-module-updates COMPONENT-MODULE-NAME [--force]", "Push changes made to a component module in the service to its base component module."
377
+ method_option :force, :type => :boolean, :default => false, :aliases => '-f'
378
+ def push_component_module_updates(context_params)
379
+ push_module_updates_aux(context_params)
380
+ end
381
+
382
+ desc "SERVICE-NAME/ID edit-component-module COMPONENT-MODULE-NAME", "Edit a component module used in the service."
383
+ def edit_component_module(context_params)
384
+ edit_module_aux(context_params)
385
+ end
386
+
387
+ # desc "SERVICE-NAME/ID create-workflow WORKFLOW-NAME [--from BASE-WORKFLOW-NAME]", "Create a new workflow in the service instance."
388
+ # method_option :from, :type => :string
389
+ # def create_workflow(context_params)
390
+ # edit_or_create_workflow_aux(context_params,:create => true,:create_from => options.from)
391
+ # end
392
+
393
+ desc "SERVICE-NAME/ID edit-action [SERVICE-LEVEL-ACTION]", "Edit action in the service instance."
394
+ def edit_action(context_params)
395
+ edit_or_create_workflow_aux(context_params)
396
+ end
397
+
398
+ desc "SERVICE-NAME/ID edit-attributes [-n NODE] [-c COMPONENT] [-a ATTRIBUTE]", "Edit service's attributes."
399
+ method_option :node, :aliases => '-n'
400
+ method_option :component, :aliases => '-c'
401
+ method_option :attribute, :aliases => '-a'
402
+ def edit_attributes(context_params)
403
+ response = edit_attributes_aux(context_params)
404
+
405
+ @@invalidate_map << :assembly
406
+ @@invalidate_map << :assembly_node
407
+ @@invalidate_map << :service
408
+ @@invalidate_map << :service_node
409
+
410
+ response
411
+ end
412
+
413
+ =begin
414
+ TODO: will put in dot release and will rename to 'extend'
415
+ desc "ASSEMBLY-NAME/ID add EXTENSION-TYPE [-n COUNT]", "Adds a sub assembly template to the assembly"
416
+ method_option "count",:aliases => "-n" ,
417
+ :type => :string, #integer
418
+ :banner => "COUNT",
419
+ :desc => "Number of sub-assemblies to add"
420
+ def add_node(context_params)
421
+ assembly_id,service_add_on_name = context_params.retrieve_arguments([:assembly_id!,:option_1!],method_argument_names)
422
+
423
+ # create task
424
+ post_body = {
425
+ :assembly_id => assembly_id,
426
+ :service_add_on_name => service_add_on_name
427
+ }
428
+
429
+ post_body.merge!(:count => options.count) if options.count
430
+
431
+ response = post rest_url("assembly/add__service_add_on"), post_body
432
+ # when changing context send request for getting latest assemblies instead of getting from cache
433
+ @@invalidate_map << :assembly
434
+
435
+ return response
436
+ end
437
+
438
+ =end
439
+
440
+ # TODO: deprecating --wait since subsubsumed by mode
441
+ # desc "SERVICE-NAME/ID task-status [--wait] [--summarize]", "Get the task status of the running or last running service task."
442
+ desc "SERVICE-NAME/ID task-status [--mode MODE] [--summarize]", "Get the task status of the running or last running service task."
443
+ method_option "mode",:aliases => "-m" ,
444
+ :type => :string,
445
+ :banner => "MODE",
446
+ :desc => "Mode in which task status display; one of [stream,snapshot,refresh]; default is 'snapshot'"
447
+ method_option :summarize, :type => :boolean, :default => false, :aliases => '-s'
448
+ # TODO: leaving --wait in for backwards compatability
449
+ method_option :wait, :type => :boolean, :default => false
450
+ def task_status(context_params)
451
+ response = task_status_aw_aux(context_params)
452
+ @@invalidate_map << :service
453
+ @@invalidate_map << :service_node
454
+ response
455
+ end
456
+
457
+ desc "SERVICE-NAME/ID task-action-detail", "Get the task info of the running or last running service task."
458
+ def task_action_detail(context_params)
459
+ task_action_detail_aw_aux(context_params)
460
+ end
461
+
462
+ desc "SERVICE-NAME/ID list-nodes","List nodes associated with service."
463
+ def list_nodes(context_params)
464
+ list_nodes_aux(context_params)
465
+ end
466
+
467
+ desc "SERVICE-NAME/ID list-component-links","List component links."
468
+ def list_component_links(context_params)
469
+ list_component_links_aux(context_params)
470
+ end
471
+
472
+ desc "SERVICE-NAME/ID list-components [--deps]","List components associated with service."
473
+ method_option :deps, :type => :boolean, :default => false, :aliases => '-l'
474
+ def list_components(context_params)
475
+ list_components_aux(context_params)
476
+ end
477
+
478
+ desc "SERVICE-NAME/ID list-attributes [-f FORMAT] [-t TAG,..] [--links] [-n NODE] [-c COMPONENT] [-a ATTRIBUTE]","List attributes associated with service."
479
+ method_option :format, :aliases => '-f'
480
+ method_option :tags, :aliases => '-t'
481
+ method_option :links, :type => :boolean, :default => false, :aliases => '-l'
482
+ method_option :node, :aliases => '-n'
483
+ method_option :component, :aliases => '-c'
484
+ method_option :attribute, :aliases => '-a'
485
+ def list_attributes(context_params)
486
+ list_attributes_aux(context_params)
487
+ end
488
+
489
+ desc "SERVICE-NAME/ID list-component-modules","List component modules associated with service."
490
+ def list_component_modules(context_params)
491
+ list_modules_aux(context_params)
492
+ end
493
+
494
+ desc "SERVICE-NAME/ID list-tasks","List tasks associated with service."
495
+ def list_tasks(context_params)
496
+ list_tasks_aux(context_params)
497
+ end
498
+
499
+ desc "SERVICE-NAME/ID list-violations [ACTION] [--fix]", "Finds violations that must be corrected before converging the service or running the specified action."
500
+ method_option :fix, :aliases => '-f', :type => :boolean, :default => false, :banner => 'Run wizard to fix violations found'
501
+ def list_violations(context_params)
502
+ list_violations_aux(context_params)
503
+ end
504
+
505
+ desc "SERVICE-NAME/ID print-includes", "Finds includes in the service."
506
+ def print_includes(context_params)
507
+ print_includes_aux(context_params)
508
+ end
509
+
510
+ desc "SERVICE-NAME/ID action-info [SERVICE-LEVEL-ACTION]", "Get the contents of action associated with the service."
511
+ def action_info(context_params)
512
+ action_info_aux(context_params)
513
+ end
514
+
515
+ # desc "SERVICE-NAME/ID list-workflows", "List the workflows associated with the service.", :hide => true
516
+ # def list_workflows(context_params)
517
+ # workflow_list_aux(context_params)
518
+ # end
519
+
520
+ desc "list","List services."
521
+ def list(context_params)
522
+ assembly_id, node_id, component_id, attribute_id, about = context_params.retrieve_arguments([:service_id,:node_id,:component_id,:attribute_id,:option_1],method_argument_names)
523
+ detail_to_include = nil
524
+
525
+ if about
526
+ case about
527
+ when "nodes"
528
+ data_type = :node
529
+ when "components"
530
+ data_type = :component
531
+ detail_to_include = [:component_dependencies]
532
+ when "attributes"
533
+ data_type = :attribute
534
+ detail_to_include = [:attribute_links]
535
+ when "tasks"
536
+ data_type = :task
537
+ else
538
+ raise_validation_error_method_usage('list')
539
+ end
540
+ end
541
+
542
+ post_body = {
543
+ :assembly_id => assembly_id,
544
+ :node_id => node_id,
545
+ :component_id => component_id,
546
+ :subtype => 'instance'
547
+ }
548
+ post_body.merge!(:detail_to_include => detail_to_include) if detail_to_include
549
+ rest_endpoint = "assembly/info_about"
550
+
551
+ if context_params.is_last_command_eql_to?(:attribute)
552
+ raise DtkError, "Not supported command for current context level." if attribute_id
553
+ about, data_type = get_type_and_raise_error_if_invalid(about, "attributes", ["attributes"])
554
+ elsif context_params.is_last_command_eql_to?(:component)
555
+ if component_id
556
+ about, data_type = get_type_and_raise_error_if_invalid(about, "attributes", ["attributes"])
557
+ else
558
+ about, data_type = get_type_and_raise_error_if_invalid(about, "components", ["attributes", "components"])
559
+ end
560
+ elsif context_params.is_last_command_eql_to?(:node)
561
+ if node_id
562
+ about, data_type = get_type_and_raise_error_if_invalid(about, "components", ["attributes", "components"])
563
+ else
564
+ about, data_type = get_type_and_raise_error_if_invalid(about, "nodes", ["attributes", "components", "nodes"])
565
+ end
566
+ else
567
+ if assembly_id
568
+ about, data_type = get_type_and_raise_error_if_invalid(about, "nodes", ["attributes", "components", "nodes", "tasks"])
569
+ else
570
+ data_type = :assembly
571
+ post_body = { :subtype => 'instance', :detail_level => 'nodes',:include_namespaces => true}
572
+ rest_endpoint = "assembly/list"
573
+ end
574
+ end
575
+
576
+ post_body[:about] = about
577
+ response = post rest_url(rest_endpoint), post_body
578
+
579
+ # set render view to be used
580
+ response.render_table(data_type)
581
+
582
+ return response
583
+ end
584
+
585
+ desc "SERVICE-NAME/ID list-diffs COMPONENT-MODULE-NAME", "List diffs between module in service instance and base module."
586
+ def list_diffs(context_params)
587
+ list_remote_module_diffs(context_params)
588
+ end
589
+
590
+ desc "SERVICE-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 service instance"
591
+ method_option :nodes, :type => :string, :default => nil
592
+ def grant_access(context_params)
593
+ grant_access_aux(context_params)
594
+ end
595
+
596
+ desc "SERVICE-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 service instance"
597
+ method_option :nodes, :type => :string, :default => nil
598
+ def revoke_access(context_params)
599
+ revoke_access_aux(context_params)
600
+ end
601
+
602
+ desc "SERVICE-NAME/ID list-ssh-access", "List SSH access for each of the nodes"
603
+ def list_ssh_access(context_params)
604
+ list_ssh_access_aux(context_params)
605
+ end
606
+
607
+ desc "SERVICE-NAME/ID info", "Get info about content of the service."
608
+ def info(context_params)
609
+ info_aux(context_params)
610
+ end
611
+
612
+ desc "SERVICE-NAME/ID link-attributes TARGET-ATTR SOURCE-ATTR", "Link the value of the target attribute to the source attribute."
613
+ def link_attributes(context_params)
614
+ link_attributes_aux(context_params)
615
+ end
616
+
617
+ desc "delete-and-destroy NAME/ID [-y] [--force] [-r]", "Delete service instance, terminating any nodes that have been spun up. Use -r with target to delete all service instances staged into specified target."
618
+ method_option :y, :aliases => '-y', :type => :boolean, :default => false
619
+ method_option :force, :aliases => '-f', :type => :boolean, :default => false
620
+ method_option :recursive, :aliases => '-r', :type => :boolean, :default => false
621
+ def delete_and_destroy(context_params)
622
+ response = delete_and_destroy_aux(context_params)
623
+ @@invalidate_map << :assembly
624
+ @@invalidate_map << :assembly_node
625
+ @@invalidate_map << :service
626
+ @@invalidate_map << :service_node
627
+ @@invalidate_map << :service_module
628
+ response
629
+ end
630
+
631
+ desc "SERVICE-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."
632
+ method_option :unset, :aliases => '-u', :type => :boolean, :default => false
633
+ method_option :component_attribute, :aliases => '-c', :type => :boolean, :default => false
634
+ method_option :node_attribute, :aliases => '-n', :type => :boolean, :default => false
635
+ def set_attribute(context_params)
636
+ response = set_attribute_aux(context_params)
637
+ return response unless response.ok?
638
+
639
+ @@invalidate_map << :assembly
640
+ @@invalidate_map << :assembly_node
641
+ @@invalidate_map << :service
642
+ @@invalidate_map << :service_node
643
+
644
+ response
645
+ end
646
+
647
+ desc "SERVICE-NAME/ID create-attribute ATTRIBUTE-NAME [VALUE] [--type DATATYPE] [--required] [--dynamic]", "Create a new attribute and optionally assign it a value."
648
+ method_option :required, :type => :boolean, :default => false
649
+ method_option :dynamic, :type => :boolean, :default => false
650
+ method_option "type",:aliases => "-t"
651
+ def create_attribute(context_params)
652
+ create_attribute_aux(context_params)
653
+ end
654
+
655
+ # using ^^ before NODE-NAME to remove this command from assembly/assembly_id/node/node_id but show in assembly/assembly_id
656
+ desc "SERVICE-NAME/ID create-node ^^NODE-NAME [-i IMAGE] [-s SIZE]", "Add (stage) a new node in the service."
657
+ method_option :image, :aliases => '-i', :type => :string
658
+ method_option :instance_size, :aliases => '-s', :type => :string
659
+ def create_node(context_params)
660
+ response = create_node_aux(context_params)
661
+
662
+ @@invalidate_map << :assembly
663
+ @@invalidate_map << :assembly_node
664
+ @@invalidate_map << :service
665
+ @@invalidate_map << :service_node
666
+ @@invalidate_map << :workspace
667
+ @@invalidate_map << :workspace_node
668
+
669
+ return response unless response.ok?
670
+
671
+ message = "Created node '#{response.data["display_name"]}'."
672
+ OsUtil.print(message, :yellow)
673
+ end
674
+
675
+ desc "SERVICE-NAME/ID create-node-group ^^NODE-GROUP-NAME [-i IMAGE] [-s SIZE] [-n CARDINALITY]", "Add (stage) a new node group in the service."
676
+ method_option :image, :aliases => '-i', :type => :string
677
+ method_option :instance_size, :aliases => '-s', :type => :string
678
+ method_option :cardinality, :aliases => '-n', :type => :string, :default => 1
679
+ def create_node_group(context_params)
680
+ response = create_node_group_aux(context_params)
681
+ return response unless response.ok?
682
+
683
+ @@invalidate_map << :assembly
684
+ @@invalidate_map << :assembly_node
685
+ @@invalidate_map << :service
686
+ @@invalidate_map << :service_node
687
+ @@invalidate_map << :workspace
688
+ @@invalidate_map << :workspace_node
689
+
690
+ message = "Created node group '#{response.data["display_name"]}'."
691
+ OsUtil.print(message, :yellow)
692
+ end
693
+
694
+ desc "SERVICE-NAME/ID link-components TARGET-CMP-NAME SOURCE-CMP-NAME [DEPENDENCY-NAME]","Link the target component to the source component."
695
+ def link_components(context_params)
696
+ link_components_aux(context_params)
697
+ end
698
+
699
+ # only supported at node-level
700
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/assembly>)
701
+ desc "SERVICE-NAME/ID add-component COMPONENT [--auto-complete]", "Add a component to the service. Use --auto-complete to link components automatically"
702
+ method_option :auto_complete, :type => :boolean, :default => true
703
+ def add_component(context_params)
704
+ response = create_component_aux(context_params)
705
+
706
+ @@invalidate_map << :service
707
+ @@invalidate_map << :service_node
708
+
709
+ response
710
+ end
711
+
712
+ # using ^^ before NODE-NAME to remove this command from assembly/assembly_id/node/node_id but show in assembly/assembly_id
713
+ desc "SERVICE-NAME/ID delete-node ^^NODE-NAME [-y] [--force]","Delete node, terminating it if the node has been spun up."
714
+ method_option :y, :aliases => '-y', :type => :boolean, :default => false
715
+ method_option :force, :aliases => '-f', :type => :boolean, :default => false
716
+ def delete_node(context_params)
717
+ response = delete_node_aux(context_params)
718
+
719
+ @@invalidate_map << :assembly
720
+ @@invalidate_map << :assembly_node
721
+ @@invalidate_map << :service
722
+ @@invalidate_map << :service_node
723
+ @@invalidate_map << :workspace
724
+ @@invalidate_map << :workspace_node
725
+
726
+ return response
727
+ end
728
+
729
+ desc "SERVICE-NAME/ID delete-node-group ^^NODE-NAME [-y] [--force]","Delete node group and all nodes that are part of that group."
730
+ method_option :y, :aliases => '-y', :type => :boolean, :default => false
731
+ method_option :force, :aliases => '-f', :type => :boolean, :default => false
732
+ def delete_node_group(context_params)
733
+ response = delete_node_group_aux(context_params)
734
+
735
+ @@invalidate_map << :assembly
736
+ @@invalidate_map << :assembly_node
737
+ @@invalidate_map << :service
738
+ @@invalidate_map << :service_node
739
+ @@invalidate_map << :workspace
740
+ @@invalidate_map << :workspace_node
741
+
742
+ return response
743
+ end
744
+
745
+ desc "HIDE_FROM_BASE delete NAME/ID [-y]","Delete node, terminating it if the node has been spun up."
746
+ def delete(context_params)
747
+ if context_params.is_last_command_eql_to?(:node)
748
+ response = delete_node_aux(context_params)
749
+ return response unless response.ok?
750
+ @@invalidate_map << :service_node
751
+
752
+ response
753
+ elsif context_params.is_last_command_eql_to?(:component)
754
+ response = delete_component_aux(context_params)
755
+ return response unless response.ok?
756
+ @@invalidate_map << :assembly_node_component
757
+
758
+ response
759
+ end
760
+ end
761
+
762
+ desc "SERVICE-NAME/ID unlink-components TARGET-CMP-NAME SOURCE-CMP-NAME [DEPENDENCY-NAME]", "Remove a component link."
763
+ def unlink_components(context_params)
764
+ unlink_components_aux(context_params)
765
+ end
766
+
767
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/assembly>)
768
+ desc "SERVICE-NAME/ID delete-component COMPONENT-NAME [-y] [--force]","Delete component from the service."
769
+ method_option :y, :aliases => '-y', :type => :boolean, :default => false
770
+ method_option :force, :aliases => '-f', :type => :boolean, :default => false
771
+ def delete_component(context_params)
772
+ response = delete_component_aux(context_params)
773
+
774
+ @@invalidate_map << :service
775
+ @@invalidate_map << :service_node
776
+ @@invalidate_map << :service_node_component
777
+
778
+ response
779
+ end
780
+
781
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/assembly>)
782
+ desc "HIDE_FROM_BASE get-netstats", "Get netstats"
783
+ def get_netstats(context_params)
784
+ get_netstats_aux(context_params)
785
+ end
786
+
787
+ =begin
788
+ # TODO: DTK-2027 might subsume by the dtk actions; currently server changes does not support this command
789
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/assembly>)
790
+ desc "HIDE_FROM_BASE execute-tests [--component COMPONENT-NAME] [--timeout TIMEOUT]", "Execute tests. --component filters execution per component, --timeout changes default execution timeout"
791
+ method_option :component, :type => :string, :desc => "Component name"
792
+ method_option :timeout, :type => :string, :desc => "Timeout"
793
+ def execute_tests(context_params)
794
+ execute_tests_aux(context_params)
795
+ end
796
+ =end
797
+
798
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/assembly>)
799
+ desc "HIDE_FROM_BASE get-ps [--filter PATTERN]", "Get ps"
800
+ method_option :filter, :type => :boolean, :default => false, :aliases => '-f'
801
+ def get_ps(context_params)
802
+ get_ps_aux(context_params)
803
+ end
804
+
805
+ desc "SERVICE-NAME/ID set-required-attributes", "Interactive dialog to set required attributes that are not currently set"
806
+ def set_required_attributes(context_params)
807
+ assembly_id = context_params.retrieve_arguments([:service_id!],method_argument_names)
808
+ set_required_attributes_aux(assembly_id,:assembly,:instance)
809
+ end
810
+
811
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/assembly>)
812
+ desc "HIDE_FROM_BASE tail LOG-PATH NODE-NAME [REGEX-PATTERN] [--more]","Tail specified number of lines from log. CTRL+C to quit."
813
+ method_option :more, :type => :boolean, :default => false
814
+ def tail(context_params)
815
+ tail_aux(context_params)
816
+ end
817
+
818
+ # using HIDE_FROM_BASE to hide this command from base context (dtk:/assembly>)
819
+ 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)."
820
+ method_option :first, :type => :boolean, :default => false
821
+ def grep(context_params)
822
+ grep_aux(context_params)
823
+ end
824
+
825
+ desc "stage ASSEMBLY-TEMPLATE [INSTANCE-NAME] [-t PARENT-SERVICE-INSTANCE-NAME/ID] [-v VERSION] [--no-auto-complete]", "Stage assembly in target."
826
+ method_option :no_auto_complete, :type => :boolean, :default => false, :aliases => '--no-ac'
827
+ method_option :parent_service, :type => :string, :aliases => '-t'
828
+ version_method_option
829
+ #hidden option
830
+ method_option "instance-bindings", :type => :string
831
+ def stage(context_params)
832
+ stage_aux(context_params)
833
+ end
834
+
835
+ desc "set-default-target INSTANCE-NAME/ID", "Set default target service instance."
836
+ def set_default_target(context_params)
837
+ set_default_target_aux(context_params)
838
+ end
839
+
840
+ desc "stage-target ASSEMBLY-TEMPLATE [INSTANCE-NAME] -t PARENT-SERVICE-INSTANCE-NAME/ID] [-v VERSION] [--no-auto-complete]", "Stage assembly as target instance."
841
+ method_option :settings, :type => :string, :aliases => '-s'
842
+ method_option :auto_complete, :type => :boolean, :default => true
843
+ method_option :no_auto_complete, :type => :boolean, :default => false, :aliases => '--no-ac'
844
+ method_option :parent_service, :type => :string, :aliases => '-t'
845
+ version_method_option
846
+ #hidden options
847
+ method_option "instance-bindings", :type => :string
848
+ method_option :is_target, :type => :boolean, :default => true
849
+ def stage_target(context_params)
850
+ response = stage_aux(context_params)
851
+ return response unless response.ok?
852
+
853
+ # when changing context send request for getting latest assemblies instead of getting from cache
854
+ @@invalidate_map << :service
855
+ @@invalidate_map << :assembly
856
+
857
+ return response
858
+ end
859
+
860
+ desc "deploy-target ASSEMBLY-TEMPLATE [INSTANCE-NAME] [-v VERSION] [--no-auto-complete] [--stream-results]", "Deploy assembly as target instance."
861
+ method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
862
+ method_option :no_auto_complete, :type => :boolean, :default => false, :aliases => '--no-ac'
863
+ version_method_option
864
+ #hidden options
865
+ method_option "instance-bindings", :type => :string
866
+ method_option :is_target, :type => :boolean, :default => true
867
+ # method_option :settings, :type => :string, :aliases => '-s'
868
+ def deploy_target(context_params)
869
+ response = deploy_aux(context_params)
870
+ return response unless response.ok?
871
+
872
+ @@invalidate_map << :service
873
+ @@invalidate_map << :assembly
874
+
875
+ response
876
+ end
877
+
878
+ desc "deploy ASSEMBLY-TEMPLATE [INSTANCE-NAME] [-t PARENT-SERVICE-INSTANCE-NAME/ID] [-v VERSION] [--no-auto-complete]", "Deploy assembly in target."
879
+ method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
880
+ method_option :no_auto_complete, :type => :boolean, :default => false, :aliases => '--no-ac'
881
+ method_option :parent_service, :type => :string, :aliases => '-t'
882
+ version_method_option
883
+ #hidden options
884
+ method_option "instance-bindings", :type => :string
885
+ # method_option :settings, :type => :string, :aliases => '-s'
886
+ def deploy(context_params)
887
+ response = deploy_aux(context_params)
888
+ return response unless response.ok?
889
+
890
+ @@invalidate_map << :service
891
+ @@invalidate_map << :assembly
892
+
893
+ response
894
+ end
895
+
896
+ desc "SERVICE-NAME/ID set-required-attributes-and-converge", "Interactive dialog to set required attributes that are not currently set", :hide => true
897
+ def set_required_attributes_and_converge(context_params)
898
+ begin
899
+ response = set_required_attributes_converge_aux(context_params)
900
+ rescue DtkError::InteractiveWizardError => e
901
+ @@invalidate_map << :service
902
+ @@invalidate_map << :assembly
903
+
904
+ # if skip correction wizzard still go to newly created service instance
905
+ if instance_name = (context_params.get_forwarded_options()||{})[:instance_name]
906
+ MainContext.get_context.change_context(["/service/#{instance_name}"])
907
+ end
908
+
909
+ raise e
910
+ end
911
+
912
+ @@invalidate_map << :service
913
+ @@invalidate_map << :assembly
914
+
915
+ # if instance_name = opts[:instance_name]
916
+ # MainContext.get_context.change_context([instance_name])
917
+ # end
918
+
919
+ response
920
+ end
921
+
922
+ desc "create-workspace [WORKSPACE-NAME] [-t PARENT-SERVICE-INSTANCE-NAME/ID]", "Create workspace"
923
+ method_option :parent_service, :type => :string, :aliases => '-t'
924
+ def create_workspace(context_params)
925
+ response = create_workspace_aux(context_params)
926
+ return response unless response.ok?
927
+
928
+ @@invalidate_map << :service
929
+ @@invalidate_map << :assembly
930
+
931
+ yaml_response = YAML.load(response.data)
932
+ if workspace_instance = yaml_response['new_workspace_instance']
933
+ MainContext.get_context.change_context(["/service/#{workspace_instance['name']}"])
934
+ else
935
+ fail DtkError.new('Workspace instance is not staged properly, please try again!')
936
+ end
937
+
938
+ response
939
+ end
940
+ end
941
+ end