dtk-shell 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +5 -0
- data/Gemfile_dev +13 -0
- data/README.md +121 -0
- data/bin/dtk-execute +32 -0
- data/bin/dtk-run +92 -0
- data/bin/dtk-shell +31 -0
- data/dtk-shell.gemspec +50 -0
- data/lib/auxiliary.rb +61 -0
- data/lib/bundler_monkey_patch.rb +26 -0
- data/lib/client.rb +58 -0
- data/lib/command_helper.rb +33 -0
- data/lib/command_helpers/git_repo.rb +589 -0
- data/lib/command_helpers/git_repo/merge.rb +153 -0
- data/lib/command_helpers/jenkins_client.rb +106 -0
- data/lib/command_helpers/jenkins_client/config_xml.rb +288 -0
- data/lib/command_helpers/service_importer.rb +251 -0
- data/lib/command_helpers/service_link.rb +33 -0
- data/lib/command_helpers/test_module_creator.rb +69 -0
- data/lib/command_helpers/test_module_templates/dtk.model.yaml.eruby +10 -0
- data/lib/command_helpers/test_module_templates/spec_helper.rb.eruby +10 -0
- data/lib/command_helpers/test_module_templates/temp_component_spec.rb.eruby +5 -0
- data/lib/commands.rb +57 -0
- data/lib/commands/common/thor/access_control.rb +133 -0
- data/lib/commands/common/thor/action_result_handler.rb +74 -0
- data/lib/commands/common/thor/assembly_template.rb +92 -0
- data/lib/commands/common/thor/assembly_workspace.rb +1801 -0
- data/lib/commands/common/thor/base_command_helper.rb +59 -0
- data/lib/commands/common/thor/clone.rb +82 -0
- data/lib/commands/common/thor/common.rb +88 -0
- data/lib/commands/common/thor/common_base.rb +49 -0
- data/lib/commands/common/thor/create_target.rb +70 -0
- data/lib/commands/common/thor/edit.rb +255 -0
- data/lib/commands/common/thor/inventory_parser.rb +98 -0
- data/lib/commands/common/thor/list_diffs.rb +128 -0
- data/lib/commands/common/thor/module.rb +1011 -0
- data/lib/commands/common/thor/module/import.rb +210 -0
- data/lib/commands/common/thor/node.rb +53 -0
- data/lib/commands/common/thor/poller.rb +65 -0
- data/lib/commands/common/thor/pull_clone_changes.rb +28 -0
- data/lib/commands/common/thor/pull_from_remote.rb +152 -0
- data/lib/commands/common/thor/puppet_forge.rb +72 -0
- data/lib/commands/common/thor/purge_clone.rb +101 -0
- data/lib/commands/common/thor/push_clone_changes.rb +162 -0
- data/lib/commands/common/thor/push_to_remote.rb +94 -0
- data/lib/commands/common/thor/remotes.rb +71 -0
- data/lib/commands/common/thor/reparse.rb +40 -0
- data/lib/commands/common/thor/set_required_attributes.rb +46 -0
- data/lib/commands/thor/account.rb +239 -0
- data/lib/commands/thor/assembly.rb +356 -0
- data/lib/commands/thor/attribute.rb +79 -0
- data/lib/commands/thor/component.rb +70 -0
- data/lib/commands/thor/component_module.rb +501 -0
- data/lib/commands/thor/component_template.rb +174 -0
- data/lib/commands/thor/dependency.rb +34 -0
- data/lib/commands/thor/developer.rb +144 -0
- data/lib/commands/thor/dtk.rb +152 -0
- data/lib/commands/thor/library.rb +125 -0
- data/lib/commands/thor/node.rb +504 -0
- data/lib/commands/thor/node_template.rb +94 -0
- data/lib/commands/thor/project.rb +34 -0
- data/lib/commands/thor/provider.rb +233 -0
- data/lib/commands/thor/remotes.rb +49 -0
- data/lib/commands/thor/service.rb +941 -0
- data/lib/commands/thor/service_module.rb +914 -0
- data/lib/commands/thor/state_change.rb +25 -0
- data/lib/commands/thor/target.rb +250 -0
- data/lib/commands/thor/task.rb +116 -0
- data/lib/commands/thor/test_module.rb +310 -0
- data/lib/commands/thor/utils.rb +21 -0
- data/lib/commands/thor/workspace.rb +685 -0
- data/lib/config/cacert.pem +3785 -0
- data/lib/config/client.conf.header +20 -0
- data/lib/config/configuration.rb +99 -0
- data/lib/config/default.conf +16 -0
- data/lib/config/disk_cacher.rb +80 -0
- data/lib/configurator.rb +176 -0
- data/lib/context_router.rb +44 -0
- data/lib/core.rb +497 -0
- data/lib/domain/git_adapter.rb +412 -0
- data/lib/domain/git_error_handler.rb +64 -0
- data/lib/domain/response.rb +285 -0
- data/lib/domain/response/error_handler.rb +86 -0
- data/lib/dtk-shell/version.rb +20 -0
- data/lib/dtk_constants.rb +40 -0
- data/lib/dtk_error.rb +114 -0
- data/lib/dtk_logger.rb +126 -0
- data/lib/dtk_shell.rb +31 -0
- data/lib/error.rb +85 -0
- data/lib/execute.rb +29 -0
- data/lib/execute/cli_pure/cli_rerouter.rb +102 -0
- data/lib/execute/command.rb +40 -0
- data/lib/execute/command/api_call.rb +60 -0
- data/lib/execute/command/api_call/map.rb +60 -0
- data/lib/execute/command/api_call/service.rb +91 -0
- data/lib/execute/command/api_call/translation_term.rb +119 -0
- data/lib/execute/command/rest_call.rb +37 -0
- data/lib/execute/command_processor.rb +30 -0
- data/lib/execute/command_processor/rest_call.rb +59 -0
- data/lib/execute/error_usage.rb +21 -0
- data/lib/execute/execute_context.rb +86 -0
- data/lib/execute/execute_context/result_store.rb +37 -0
- data/lib/execute/script.rb +64 -0
- data/lib/execute/script/add_tenant.rb +121 -0
- data/lib/git-logs/git.log +0 -0
- data/lib/parser/adapters/option_parser.rb +70 -0
- data/lib/parser/adapters/thor.rb +555 -0
- data/lib/parser/adapters/thor/common_option_defs.rb +40 -0
- data/lib/require_first.rb +104 -0
- data/lib/search_hash.rb +44 -0
- data/lib/shell.rb +261 -0
- data/lib/shell/context.rb +1065 -0
- data/lib/shell/context_aux.rb +46 -0
- data/lib/shell/domain/active_context.rb +186 -0
- data/lib/shell/domain/context_entity.rb +89 -0
- data/lib/shell/domain/context_params.rb +223 -0
- data/lib/shell/domain/override_tasks.rb +88 -0
- data/lib/shell/domain/shadow_entity.rb +76 -0
- data/lib/shell/header_shell.rb +44 -0
- data/lib/shell/help_monkey_patch.rb +283 -0
- data/lib/shell/interactive_wizard.rb +225 -0
- data/lib/shell/message_queue.rb +63 -0
- data/lib/shell/parse_monkey_patch.rb +39 -0
- data/lib/shell/status_monitor.rb +124 -0
- data/lib/task_status.rb +83 -0
- data/lib/task_status/refresh_mode.rb +77 -0
- data/lib/task_status/snapshot_mode.rb +28 -0
- data/lib/task_status/stream_mode.rb +48 -0
- data/lib/task_status/stream_mode/element.rb +101 -0
- data/lib/task_status/stream_mode/element/format.rb +101 -0
- data/lib/task_status/stream_mode/element/hierarchical_task.rb +100 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/result.rb +72 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/result/action.rb +93 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/result/components.rb +26 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/result/node_level.rb +26 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/steps.rb +34 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/steps/action.rb +53 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/steps/components.rb +53 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/steps/node_level.rb +42 -0
- data/lib/task_status/stream_mode/element/no_results.rb +26 -0
- data/lib/task_status/stream_mode/element/render.rb +59 -0
- data/lib/task_status/stream_mode/element/stage.rb +84 -0
- data/lib/task_status/stream_mode/element/stage/render.rb +76 -0
- data/lib/task_status/stream_mode/element/task_end.rb +35 -0
- data/lib/task_status/stream_mode/element/task_start.rb +37 -0
- data/lib/util/common_util.rb +37 -0
- data/lib/util/console.rb +235 -0
- data/lib/util/dtk_puppet.rb +65 -0
- data/lib/util/module_util.rb +66 -0
- data/lib/util/os_util.rb +385 -0
- data/lib/util/permission_util.rb +31 -0
- data/lib/util/remote_dependency_util.rb +84 -0
- data/lib/util/ssh_util.rb +94 -0
- data/lib/view_processor.rb +129 -0
- data/lib/view_processor/augmented_simple_list.rb +44 -0
- data/lib/view_processor/hash_pretty_print.rb +123 -0
- data/lib/view_processor/simple_list.rb +156 -0
- data/lib/view_processor/table_print.rb +309 -0
- data/lib/violation.rb +86 -0
- data/lib/violation/attribute.rb +76 -0
- data/lib/violation/fix.rb +26 -0
- data/lib/violation/fix/result.rb +73 -0
- data/lib/violation/fix/result/error.rb +34 -0
- data/lib/violation/fix/set_attribute.rb +41 -0
- data/lib/violation/sub_classes.rb +60 -0
- data/puppet/manifests/init.pp +72 -0
- data/puppet/manifests/params.pp +16 -0
- data/puppet/r8meta.puppet.yml +35 -0
- data/puppet/templates/bash_profile.erb +2 -0
- data/puppet/templates/client.conf.erb +1 -0
- data/puppet/templates/dtkclient.erb +2 -0
- data/spec/component_module_spec.rb +34 -0
- data/spec/dependency_spec.rb +6 -0
- data/spec/dtk_shell_spec.rb +13 -0
- data/spec/dtk_spec.rb +33 -0
- data/spec/lib/spec_helper.rb +10 -0
- data/spec/lib/spec_thor.rb +108 -0
- data/spec/node_template_spec.rb +24 -0
- data/spec/project_spec.rb +6 -0
- data/spec/repo_spec.rb +7 -0
- data/spec/response_spec.rb +52 -0
- data/spec/service_module_spec.rb +38 -0
- data/spec/service_spec.rb +50 -0
- data/spec/state_change_spec.rb +7 -0
- data/spec/table_print_spec.rb +48 -0
- data/spec/target_spec.rb +57 -0
- data/spec/task_spec.rb +28 -0
- data/views/assembly/augmented_simple_list.rb +12 -0
- data/views/assembly_template/augmented_simple_list.rb +12 -0
- data/views/list_task/augmented_simple_list.rb +12 -0
- metadata +421 -0
|
@@ -0,0 +1,225 @@
|
|
|
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 'colorize'
|
|
19
|
+
require 'readline'
|
|
20
|
+
require 'highline/import'
|
|
21
|
+
|
|
22
|
+
module DTK::Client
|
|
23
|
+
module Shell
|
|
24
|
+
class InteractiveWizard
|
|
25
|
+
|
|
26
|
+
PP_LINE_HEAD = '--------------------------------- DATA ---------------------------------'
|
|
27
|
+
PP_LINE = '------------------------------------------------------------------------'
|
|
28
|
+
INVALID_INPUT = OsUtil.colorize(" Input is not valid. ", :yellow)
|
|
29
|
+
|
|
30
|
+
def initialize
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# InteractiveWizard.interactive_user_input is generic wizard which will return hash map based on metadata input
|
|
34
|
+
#
|
|
35
|
+
# Example of form of param 'wizard_params'
|
|
36
|
+
#
|
|
37
|
+
# wizard_params = [
|
|
38
|
+
# {:target_name => {}},
|
|
39
|
+
# {:description => {:optional => true }}
|
|
40
|
+
# {:iaas_type => { :type => :selection, :options => [:ec2] }},
|
|
41
|
+
# {:aws_install => { :type => :question,
|
|
42
|
+
# :question => "Do we have your permission to add necessery 'key-pair' and 'security-group' to your EC2 account?",
|
|
43
|
+
# :options => ["yes","no"],
|
|
44
|
+
# :required_options => ["yes"],
|
|
45
|
+
# :explanation => "This permission is necessary for creation of a custom target."
|
|
46
|
+
# }}
|
|
47
|
+
# ]
|
|
48
|
+
#
|
|
49
|
+
def self.interactive_user_input(wizard_dsl, recursion_call = false)
|
|
50
|
+
results = {}
|
|
51
|
+
wizard_dsl = [wizard_dsl].flatten
|
|
52
|
+
begin
|
|
53
|
+
wizard_dsl.each do |meta_input|
|
|
54
|
+
input_name = meta_input.keys.first
|
|
55
|
+
display_name = input_name.to_s.gsub(/_/,' ').capitalize
|
|
56
|
+
metadata = meta_input.values.first
|
|
57
|
+
|
|
58
|
+
# default values
|
|
59
|
+
output = display_name
|
|
60
|
+
validation = metadata[:validation]
|
|
61
|
+
is_password = false
|
|
62
|
+
is_required = metadata[:requried]
|
|
63
|
+
|
|
64
|
+
case metadata[:type]
|
|
65
|
+
when nil
|
|
66
|
+
when :email
|
|
67
|
+
validation = /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
|
|
68
|
+
when :question
|
|
69
|
+
output = "#{metadata[:question]}"
|
|
70
|
+
validation = metadata[:validation]
|
|
71
|
+
when :password
|
|
72
|
+
is_password = true
|
|
73
|
+
is_required = true
|
|
74
|
+
when :repeat_password
|
|
75
|
+
is_password = true
|
|
76
|
+
is_required = true
|
|
77
|
+
validation = /^#{results[:password]}$/
|
|
78
|
+
when :selection
|
|
79
|
+
options = ""
|
|
80
|
+
display_field = metadata[:display_field]
|
|
81
|
+
metadata[:options].each_with_index do |o,i|
|
|
82
|
+
if display_field
|
|
83
|
+
options += "\t#{i+1}. #{o[display_field]}\n"
|
|
84
|
+
else
|
|
85
|
+
options += "\t#{i+1}. #{o}\n"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
options += OsUtil.colorize("\t0. Skip\n", :yellow) if metadata[:skip_option]
|
|
89
|
+
output = "Select '#{display_name}': \n\n #{options} \n "
|
|
90
|
+
validation_range_start = metadata[:skip_option] ? 0 : 1
|
|
91
|
+
validation = (validation_range_start..metadata[:options].size).to_a
|
|
92
|
+
when :group
|
|
93
|
+
# recursion call to populate second level of hash params
|
|
94
|
+
puts " Enter '#{display_name}': "
|
|
95
|
+
results[input_name] = self.interactive_user_input(metadata[:options], true)
|
|
96
|
+
next
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
input = text_input(output, is_required, validation, is_password)
|
|
100
|
+
|
|
101
|
+
if metadata[:required_options] && !metadata[:required_options].include?(input)
|
|
102
|
+
# case where we have to give explicit permission, if answer is not affirmative
|
|
103
|
+
# we terminate rest of the wizard
|
|
104
|
+
OsUtil.print(" #{metadata[:explanation]}", :red)
|
|
105
|
+
return nil
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# post processing
|
|
109
|
+
if metadata[:type] == :selection
|
|
110
|
+
input = input.to_i == 0 ? nil : metadata[:options][input.to_i - 1]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
results[input_name] = input
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
return results
|
|
117
|
+
rescue Interrupt => e
|
|
118
|
+
puts
|
|
119
|
+
raise DtkValidationError, "Exiting the wizard ..."
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def self.text_input(output, is_required = false, validation_regex = nil, is_password = false)
|
|
124
|
+
while line = ask("#{output}: ") { |q| q.echo = !is_password }
|
|
125
|
+
if is_required && line.strip.empty?
|
|
126
|
+
puts OsUtil.colorize("Field '#{output}' is required field. ", :red)
|
|
127
|
+
next
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
if validation_regex && !validation_regex.match(line)
|
|
131
|
+
puts OsUtil.colorize("Input is not valid, please enter it again. ", :red)
|
|
132
|
+
next
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
return line
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# response_type can be
|
|
140
|
+
# :value_provided
|
|
141
|
+
# :skipped
|
|
142
|
+
PromptResponse = Struct.new(:response_type, :value)
|
|
143
|
+
def self.prompt_user_for_value(prompt_msg)
|
|
144
|
+
value = nil
|
|
145
|
+
puts "#{prompt_msg}:"
|
|
146
|
+
begin
|
|
147
|
+
value = Readline.readline(": ", true)
|
|
148
|
+
response_type = :value_provided
|
|
149
|
+
rescue Interrupt
|
|
150
|
+
response_type = :skipped
|
|
151
|
+
end
|
|
152
|
+
PromptResponse.new(response_type, value)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# takes hash maps with description of missing params and
|
|
156
|
+
# returns array of hash map with key, value for each missed param
|
|
157
|
+
def self.resolve_missing_params(param_list, additional_message = nil)
|
|
158
|
+
begin
|
|
159
|
+
user_provided_params, checkup_hash = [], {}
|
|
160
|
+
|
|
161
|
+
puts "\nPlease fill in missing data.\n"
|
|
162
|
+
param_list.each do |param_info|
|
|
163
|
+
description =
|
|
164
|
+
if param_info['display_name'] =~ Regexp.new(param_info['description'])
|
|
165
|
+
param_info['display_name']
|
|
166
|
+
else
|
|
167
|
+
"#{param_info['display_name']} (#{param_info['description']})"
|
|
168
|
+
end
|
|
169
|
+
datatype_info = (param_info['datatype'] ? OsUtil.colorize(" [#{param_info['datatype'].upcase}]", :yellow) : '')
|
|
170
|
+
string_identifier = OsUtil.colorize(description, :green) + datatype_info
|
|
171
|
+
|
|
172
|
+
puts "Please enter #{string_identifier}:"
|
|
173
|
+
while line = Readline.readline(": ", true)
|
|
174
|
+
id = param_info['id']
|
|
175
|
+
user_provided_params << {:id => id, :value => line, :display_name => param_info['display_name']}
|
|
176
|
+
checkup_hash[id] = {:value => line, :description => description}
|
|
177
|
+
break
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# pp print for provided parameters
|
|
183
|
+
pretty_print_provided_user_info(checkup_hash)
|
|
184
|
+
|
|
185
|
+
# make sure this is satisfactory
|
|
186
|
+
while line = Readline.readline("Is provided information ok? (yes|no) ", true)
|
|
187
|
+
# start all over again
|
|
188
|
+
return resolve_missing_params(param_list) if 'no'.eql? line
|
|
189
|
+
# continue with the code
|
|
190
|
+
break if 'yes'.eql? line
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
rescue Interrupt => e
|
|
194
|
+
raise DtkError::InteractiveWizardError, "You have decided to skip correction wizard.#{additional_message}"
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
return user_provided_params
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
private
|
|
201
|
+
|
|
202
|
+
def self.pretty_print_provided_user_info(user_information)
|
|
203
|
+
puts PP_LINE_HEAD
|
|
204
|
+
user_information.each do |key,info|
|
|
205
|
+
description = info[:description]
|
|
206
|
+
value = info[:value]
|
|
207
|
+
printf "%48s : %s\n", OsUtil.colorize(description, :green), OsUtil.colorize(value, :yellow)
|
|
208
|
+
end
|
|
209
|
+
puts PP_LINE
|
|
210
|
+
puts
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
=begin
|
|
217
|
+
TODO: remove deprecated
|
|
218
|
+
|
|
219
|
+
def self.validate_region(region)
|
|
220
|
+
unless EC2_REGIONS.include? region
|
|
221
|
+
raise DtkValidationError.new("Region '#{region}' is not EC2 region, use one of: #{EC2_REGIONS.join(',')}")
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
EC2_REGIONS = ['us-east-1','us-west-1','us-west-2','eu-west-1','sa-east-1','ap-northeast-1','ap-southeast-1','ap-southeast-2' ]
|
|
225
|
+
=end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2010-2016 dtk contributors
|
|
3
|
+
#
|
|
4
|
+
# This file is part of the dtk project.
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
# TODO-REMOVE: Check if we need this anymore
|
|
19
|
+
|
|
20
|
+
dtk_require_from_base('util/os_util')
|
|
21
|
+
|
|
22
|
+
module DTK
|
|
23
|
+
module Shell
|
|
24
|
+
class MessageQueue
|
|
25
|
+
include Singleton
|
|
26
|
+
|
|
27
|
+
MESSAGE_TYPES = [:info, :warn, :error]
|
|
28
|
+
|
|
29
|
+
def initialize
|
|
30
|
+
@queue = {}
|
|
31
|
+
init_or_clear()
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.process_response(response_obj)
|
|
35
|
+
self.instance.process_response(response_obj)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.print_messages()
|
|
39
|
+
self.instance.print_messages()
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def init_or_clear()
|
|
43
|
+
MESSAGE_TYPES.each { |msg_type| @queue[msg_type] = [] }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def print_messages()
|
|
47
|
+
@queue[:info].each { |msg| DTK::Client::OsUtil.print(msg, :white) }
|
|
48
|
+
@queue[:warn].each { |msg| DTK::Client::OsUtil.print(msg, :yellow) }
|
|
49
|
+
@queue[:error].each { |msg| DTK::Client::OsUtil.print(msg, :red) }
|
|
50
|
+
|
|
51
|
+
init_or_clear()
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def process_response(response_obj)
|
|
55
|
+
MESSAGE_TYPES.each do |msg_type|
|
|
56
|
+
msg = response_obj[msg_type.to_s] || response_obj[msg_type]
|
|
57
|
+
@queue[msg_type] << msg if msg
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
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
|
+
class Thor
|
|
19
|
+
class Options < Arguments #:nodoc:
|
|
20
|
+
|
|
21
|
+
protected
|
|
22
|
+
|
|
23
|
+
def parse_boolean(switch)
|
|
24
|
+
if current_is_value?
|
|
25
|
+
if ["true", "TRUE", "t", "T", true].include?(peek)
|
|
26
|
+
# shift
|
|
27
|
+
true
|
|
28
|
+
elsif ["false", "FALSE", "f", "F", false].include?(peek)
|
|
29
|
+
# shift
|
|
30
|
+
true
|
|
31
|
+
else
|
|
32
|
+
true
|
|
33
|
+
end
|
|
34
|
+
else
|
|
35
|
+
@switches.key?(switch) || !no_or_skip?(switch)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2010-2016 dtk contributors
|
|
3
|
+
#
|
|
4
|
+
# This file is part of the dtk project.
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
# TODO-REMOVE: Check if we need this anymore
|
|
19
|
+
|
|
20
|
+
require 'thread'
|
|
21
|
+
require 'singleton'
|
|
22
|
+
require 'colorize'
|
|
23
|
+
#dtk_require('../commands')
|
|
24
|
+
|
|
25
|
+
# This singleton is used to check status on running processes on the server side
|
|
26
|
+
# Once certain task is complete it will give notice to user da certain task has been completed
|
|
27
|
+
# At the moment this only
|
|
28
|
+
|
|
29
|
+
module DTK
|
|
30
|
+
module Shell
|
|
31
|
+
class TaskStatusThread < Thread
|
|
32
|
+
attr_accessor :task_id, :finished, :status
|
|
33
|
+
|
|
34
|
+
def initialize
|
|
35
|
+
@finished = false
|
|
36
|
+
super
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class StatusMonitor
|
|
41
|
+
include Singleton
|
|
42
|
+
include DTK::Client::CommandBase
|
|
43
|
+
|
|
44
|
+
THREAD_SLEEP_TIME = DTK::Configuration.get(:task_check_frequency)
|
|
45
|
+
|
|
46
|
+
def initialize
|
|
47
|
+
@threads = []
|
|
48
|
+
@finished_tasks = []
|
|
49
|
+
@conn = DTK::Client::Session.get_connection()
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def self.start_monitoring(task_id)
|
|
53
|
+
self.instance.start_monitoring(task_id)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def self.check_status
|
|
57
|
+
self.instance.check_status
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def check_status
|
|
61
|
+
@threads.each do |t|
|
|
62
|
+
if t.finished
|
|
63
|
+
@finished_tasks << t
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# removes finished tasks from the main queue
|
|
68
|
+
@threads = @threads - @finished_tasks
|
|
69
|
+
|
|
70
|
+
@finished_tasks.each do |t|
|
|
71
|
+
puts ""
|
|
72
|
+
puts "[TASK NOTICE] Task with ID: #{t.task_id}, has finished with status: #{colorize_status(t.status)}"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
@finished_tasks.clear
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def start_monitoring(task_id)
|
|
79
|
+
puts "Client has started monitoring task [ID:#{task_id}]. You will be notified when task has been completed."
|
|
80
|
+
@threads << DTK::Shell::TaskStatusThread.new do
|
|
81
|
+
begin
|
|
82
|
+
response, post_hash_body = nil, {}
|
|
83
|
+
post_hash_body[:task_id] = task_id
|
|
84
|
+
DTK::Shell::TaskStatusThread.current.task_id = task_id
|
|
85
|
+
|
|
86
|
+
# pooling server for task status
|
|
87
|
+
while task_running?(response)
|
|
88
|
+
sleep(THREAD_SLEEP_TIME) unless response.nil?
|
|
89
|
+
response = post rest_url("task/status"),post_hash_body
|
|
90
|
+
# we break if there is error in response
|
|
91
|
+
break unless response.ok?
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
DTK::Shell::TaskStatusThread.current.finished = true
|
|
95
|
+
|
|
96
|
+
if response.ok?
|
|
97
|
+
DTK::Shell::TaskStatusThread.current.status = response.data['status'].upcase
|
|
98
|
+
else
|
|
99
|
+
DTK::Shell::TaskStatusThread.current.status = "RESPONSE NOT OK, RESPONSE: #{response}"
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
rescue Exception => e
|
|
103
|
+
DtkLogger.instance.error_pp("[THREAD ERROR] Error getting task status with message: #{e.message}", e.backtrace)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
private
|
|
109
|
+
|
|
110
|
+
def colorize_status(status)
|
|
111
|
+
color = status.eql?('FAILED') ? :red : :green
|
|
112
|
+
return DTK::Client::OsUtil.colorize(status, color)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# return true if status SUCCEDED, FAILED
|
|
116
|
+
# returns false if status EXECUTING
|
|
117
|
+
def task_running?(response)
|
|
118
|
+
return true if response.nil?
|
|
119
|
+
return !(response.data['status'].eql?("succeeded") || response.data['status'].eql?("failed"))
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|