dtk-client 0.6.8 → 0.7.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 +8 -8
- data/bin/dtk +5 -1
- data/lib/auxiliary.rb +0 -1
- data/lib/commands/common/thor/assembly_workspace.rb +20 -1
- data/lib/commands/common/thor/inventory_parser.rb +1 -1
- data/lib/commands/common/thor/module/import.rb +41 -106
- data/lib/commands/common/thor/module.rb +13 -226
- data/lib/commands/common/thor/poller.rb +48 -0
- data/lib/commands/common/thor/puppet_forge.rb +7 -1
- data/lib/commands/common/thor/purge_clone.rb +2 -1
- data/lib/commands/common/thor/task_status.rb +15 -14
- data/lib/commands/common/thor/test_action_agent.rb +39 -0
- data/lib/commands/thor/component_module.rb +2 -2
- data/lib/commands/thor/node.rb +55 -14
- data/lib/commands/thor/node_group.rb +2 -26
- data/lib/commands/thor/service.rb +31 -11
- data/lib/commands/thor/service_module.rb +3 -1
- data/lib/commands/thor/workspace.rb +13 -3
- data/lib/core.rb +16 -6
- data/lib/domain/git_adapter.rb +0 -3
- data/lib/domain/response.rb +25 -13
- data/lib/dtk-client/version.rb +1 -1
- data/lib/parser/adapters/thor.rb +8 -5
- data/lib/shell/context.rb +8 -19
- data/lib/shell/domain/active_context.rb +169 -0
- data/lib/shell/domain/context_entity.rb +72 -0
- data/lib/shell/domain/context_params.rb +202 -0
- data/lib/shell/domain/override_tasks.rb +71 -0
- data/lib/shell/domain/shadow_entity.rb +59 -0
- data/lib/shell/help_monkey_patch.rb +76 -71
- data/lib/shell/message_queue.rb +2 -0
- data/lib/shell/status_monitor.rb +5 -3
- data/lib/shell.rb +4 -2
- data/lib/util/dtk_puppet.rb +8 -6
- data/lib/util/os_util.rb +5 -1
- data/lib/view_processor/table_print.rb +67 -12
- data/spec/lib/spec_thor.rb +5 -2
- metadata +9 -3
- data/lib/shell/domain.rb +0 -492
@@ -0,0 +1,59 @@
|
|
1
|
+
##
|
2
|
+
# This is temporary workaround to faciliate concept we are introducing
|
3
|
+
#
|
4
|
+
# Entity / Double Entity Identifier
|
5
|
+
#
|
6
|
+
|
7
|
+
module DTK
|
8
|
+
module Shell
|
9
|
+
class ShadowEntity
|
10
|
+
|
11
|
+
def self.resolve(context_entity)
|
12
|
+
entity, shadow_entity = context_entity.entity, context_entity.shadow_entity
|
13
|
+
|
14
|
+
return nil if shadow_entity.nil? || entity.nil?
|
15
|
+
entity_mapping = @shadow_mapping.fetch(entity.to_sym)
|
16
|
+
|
17
|
+
return entity_mapping ? entity_mapping.fetch(shadow_entity.to_sym) : nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.resolve_tasks(context_entity)
|
21
|
+
entity, shadow_entity = context_entity.entity, context_entity.shadow_entity
|
22
|
+
entity_mapping = @shadow_mapping.fetch(entity.to_sym)
|
23
|
+
|
24
|
+
raise DTK::Client::DtkError, "You are missing mapping for shadow entity #{entity} / #{shadow_entity} you need to specify it" if entity_mapping.nil?
|
25
|
+
|
26
|
+
shadow_entity_mapping = entity_mapping.fetch(shadow_entity.to_sym)
|
27
|
+
|
28
|
+
# return just task names
|
29
|
+
return shadow_entity_mapping.collect { |se_map| se_map.first.split(' ').first }
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
@shadow_mapping = {
|
35
|
+
:node => {
|
36
|
+
:node_group => [
|
37
|
+
["add-component COMPONENT", "# Add a component to the node."],
|
38
|
+
["list-attributes", "# List attributes associated with service's node."],
|
39
|
+
["list-components", "# List components associated with service's node."],
|
40
|
+
["delete-component COMPONENT-NAME [-y]", "# Delete component from service's node"],
|
41
|
+
["set-attribute ATTRIBUTE-NAME [VALUE] [-u]", "# (Un)Set attribute value. The option -u will unset the attribute's value."]
|
42
|
+
],
|
43
|
+
:node_group_node => [
|
44
|
+
["info", "# Return info about node instance belonging to given workspace."],
|
45
|
+
["start", "# Start node instance."],
|
46
|
+
["stop", "# Stop node instance."],
|
47
|
+
["ssh REMOTE-USER [-i PATH-TO-PEM]", "# SSH into node, optional parameters are path to identity file."]
|
48
|
+
]
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
if ::DTK::Configuration.get(:development_mode)
|
53
|
+
@shadow_mapping[:node][:node_group_node] << ["test-action-agent BASH-COMMAND-LINE", "# Run bash command on test action agent"]
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -97,102 +97,107 @@ class Thor
|
|
97
97
|
#
|
98
98
|
override_tasks_obj = self.respond_to?(:override_allowed_methods) ? self.override_allowed_methods.dup : nil
|
99
99
|
|
100
|
+
shadow_list = ::DTK::Shell::ShadowEntity.resolve(active_context.last_context)
|
100
101
|
# N-LEVEL-CONTEXT - context that has at least 2 commands and 1 or more identifiers
|
101
102
|
# e.g. dtk:\assembly\assembly1\node> THIS IS N-LEVEL CONTEXT
|
102
103
|
# e.g. dtk:\assembly\assembly1\node\node123> THIS IS N-LEVEL CONTEXT
|
103
104
|
# e.g. dtk:\assembly\assembly1> THIS IS NOT N-LEVEL CONTEXT
|
104
105
|
#
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
# for help we only care about first context name / identifier
|
122
|
-
if !is_there_identifier
|
123
|
-
# if it contains [] it is optional and will be available on both tiers
|
124
|
-
if matched_data[0].include?('[')
|
125
|
-
# we remove it, since there is no need to use it
|
126
|
-
help_item.first.gsub!(matched_data[0],' ') unless help_item.nil?
|
127
|
-
filtered_list << overriden_help(override_tasks_obj, help_item, true)
|
128
|
-
end
|
106
|
+
unless shadow_list
|
107
|
+
if (!active_context.is_n_context? || active_context.current_identifier?)
|
108
|
+
|
109
|
+
list.each do |help_item|
|
110
|
+
help_item.first.gsub!("^^", '') if help_item.first.include?("^^")
|
111
|
+
|
112
|
+
# this will match entity_name (command) and alternative identifiers
|
113
|
+
identifers = [command] + alt_identifiers
|
114
|
+
|
115
|
+
# matches identifiers for ID/NAME
|
116
|
+
matched_data = help_item.first.match(/^\s\[?(#{identifers.join('|')}).?(NAME\/ID|ID\/NAME)\]?\s/)
|
117
|
+
alt_matched_data = help_item.first.match(/^\s\[?(#{alt_identifiers.join('|')}).?(NAME\/ID|ID\/NAME)\]?\s/)
|
118
|
+
|
119
|
+
if matched_data.nil?
|
120
|
+
# not found and tier 1 we add it to help list
|
121
|
+
filtered_list << overriden_help(override_tasks_obj, help_item, true) if @@shell_context.current_command?
|
129
122
|
else
|
130
|
-
#
|
131
|
-
if
|
132
|
-
if
|
133
|
-
|
134
|
-
|
123
|
+
# for help we only care about first context name / identifier
|
124
|
+
if !is_there_identifier
|
125
|
+
# if it contains [] it is optional and will be available on both tiers
|
126
|
+
if matched_data[0].include?('[')
|
127
|
+
# we remove it, since there is no need to use it
|
128
|
+
help_item.first.gsub!(matched_data[0],' ') unless help_item.nil?
|
129
|
+
filtered_list << overriden_help(override_tasks_obj, help_item, true)
|
135
130
|
end
|
136
131
|
else
|
137
|
-
|
138
|
-
|
139
|
-
|
132
|
+
# Adding alt identifiers here
|
133
|
+
if alt_matched_data
|
134
|
+
if active_context.current_alt_identifier?
|
135
|
+
help_item.first.gsub!(matched_data[0],'') unless help_item.nil?
|
136
|
+
filtered_list << overriden_help(override_tasks_obj, help_item, false)
|
137
|
+
end
|
138
|
+
else
|
139
|
+
unless active_context.current_alt_identifier?
|
140
|
+
help_item.first.gsub!(matched_data[0],'') unless help_item.nil?
|
141
|
+
filtered_list << overriden_help(override_tasks_obj, help_item, false)
|
142
|
+
end
|
140
143
|
end
|
141
144
|
end
|
142
145
|
end
|
143
146
|
end
|
144
147
|
end
|
145
|
-
end
|
146
148
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
149
|
+
# This will return commands that have identifiers
|
150
|
+
# e.g. dtk:\assembly\assembly1\node\node123> => ['assembly','node']
|
151
|
+
commands_that_have_identifiers = active_context.commands_that_have_identifiers()
|
152
|
+
is_n_level_context = active_context.command_list.size > 1
|
153
|
+
|
154
|
+
# first one does not count
|
155
|
+
if is_n_level_context
|
156
|
+
# additional filter list for n-context
|
157
|
+
n_filter_list = []
|
158
|
+
# we do not need first one, since above code takes care of that one
|
159
|
+
filtered_list = filtered_list.select do |filtered_help_item|
|
160
|
+
#next unless filtered_help_item
|
161
|
+
unless commands_that_have_identifiers.empty?
|
162
|
+
commands_that_have_identifiers[1..-1].each_with_index do |entity,i|
|
163
|
+
matched = match_help_item_changes(filtered_help_item, entity)
|
164
|
+
filtered_help_item = replace_if_matched!(filtered_help_item, matched)
|
165
|
+
|
166
|
+
# if it is last command, and there were changes
|
167
|
+
if (i == (commands_that_have_identifiers.size - 2) && matched)
|
168
|
+
n_filter_list << filtered_help_item
|
169
|
+
end
|
167
170
|
end
|
168
171
|
end
|
169
172
|
end
|
170
|
-
end
|
171
173
|
|
172
|
-
|
173
|
-
|
174
|
+
if override_tasks_obj && is_n_level_context
|
175
|
+
last_entity_name = active_context.last_context_entity_name.to_sym
|
174
176
|
|
175
|
-
|
176
|
-
|
177
|
+
# we get commands task, and identifier tasks for given entity (e.g. :assembly)
|
178
|
+
command_o_tasks, identifier_o_tasks = override_tasks_obj.get_all_tasks(last_entity_name)
|
177
179
|
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
180
|
+
if active_context.current_identifier?
|
181
|
+
identifier_o_tasks.each do |o_task|
|
182
|
+
n_filter_list << [o_task[1],o_task[2]]
|
183
|
+
end
|
184
|
+
else
|
185
|
+
command_o_tasks.each do |o_task|
|
186
|
+
n_filter_list << [o_task[1],o_task[2]]
|
187
|
+
end
|
185
188
|
end
|
186
189
|
end
|
190
|
+
|
191
|
+
# we have just filtered those methods that have attribute for given entity
|
192
|
+
# and also are last in the list
|
193
|
+
filtered_list = n_filter_list
|
187
194
|
end
|
188
195
|
|
189
|
-
#
|
190
|
-
|
191
|
-
|
196
|
+
# remove double spaces
|
197
|
+
list = filtered_list.each { |e| e.first.gsub!(/ /,' ') }
|
198
|
+
else
|
199
|
+
list = shadow_list
|
192
200
|
end
|
193
|
-
|
194
|
-
# remove double spaces
|
195
|
-
list = filtered_list.each { |e| e.first.gsub!(/ /,' ') }
|
196
201
|
end
|
197
202
|
else
|
198
203
|
# no dtk-shell just dtk, we make sure that underscore is not used '_'
|
data/lib/shell/message_queue.rb
CHANGED
data/lib/shell/status_monitor.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# TODO-REMOVE: Check if we need this anymore
|
2
|
+
|
1
3
|
require 'thread'
|
2
4
|
require 'singleton'
|
3
5
|
require 'colorize'
|
@@ -5,7 +7,7 @@ require 'colorize'
|
|
5
7
|
|
6
8
|
# This singleton is used to check status on running processes on the server side
|
7
9
|
# Once certain task is complete it will give notice to user da certain task has been completed
|
8
|
-
# At the moment this only
|
10
|
+
# At the moment this only
|
9
11
|
|
10
12
|
module DTK
|
11
13
|
module Shell
|
@@ -71,12 +73,12 @@ module DTK
|
|
71
73
|
# we break if there is error in response
|
72
74
|
break unless response.ok?
|
73
75
|
end
|
74
|
-
|
76
|
+
|
75
77
|
DTK::Shell::TaskStatusThread.current.finished = true
|
76
78
|
|
77
79
|
if response.ok?
|
78
80
|
DTK::Shell::TaskStatusThread.current.status = response.data['status'].upcase
|
79
|
-
else
|
81
|
+
else
|
80
82
|
DTK::Shell::TaskStatusThread.current.status = "RESPONSE NOT OK, RESPONSE: #{response}"
|
81
83
|
end
|
82
84
|
|
data/lib/shell.rb
CHANGED
@@ -4,7 +4,7 @@ require File.expand_path('commands/thor/dtk', File.dirname(__FILE__))
|
|
4
4
|
require File.expand_path('error', File.dirname(__FILE__))
|
5
5
|
|
6
6
|
# load all from shell directory since those are required
|
7
|
-
Dir[File.expand_path('shell
|
7
|
+
Dir[File.expand_path('shell/**/*.rb', File.dirname(__FILE__))].each { |file| require file }
|
8
8
|
|
9
9
|
require 'shellwords'
|
10
10
|
require 'readline'
|
@@ -94,7 +94,9 @@ end
|
|
94
94
|
def execute_shell_command(line, prompt)
|
95
95
|
begin
|
96
96
|
# remove single/double quotes from string because shellwords module is not able to parse it
|
97
|
-
line.
|
97
|
+
if matched = line.scan(/['"]/)
|
98
|
+
line.gsub!(/['"]/, '') if matched.size.odd?
|
99
|
+
end
|
98
100
|
|
99
101
|
# some special cases
|
100
102
|
raise DTK::Shell::ExitSignal if line == 'exit'
|
data/lib/util/dtk_puppet.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# TODO-REMOVE: Check if we need this anymore
|
2
|
+
|
1
3
|
module DTK
|
2
4
|
module Client
|
3
5
|
#
|
4
6
|
# Class is used as puppet wrapper, at the moment it will use console comamnds, later
|
5
|
-
# to be replaced with direct usage of puppet code, or re-implentation of their direct calls
|
7
|
+
# to be replaced with direct usage of puppet code, or re-implentation of their direct calls
|
6
8
|
#
|
7
9
|
class DtkPuppet
|
8
10
|
|
@@ -14,16 +16,16 @@ module DTK
|
|
14
16
|
# Returns: Name of directory where module is saved
|
15
17
|
def self.install_module(module_name)
|
16
18
|
output = nil
|
17
|
-
|
19
|
+
|
18
20
|
OsUtil.suspend_output do
|
19
21
|
output = `puppet module install #{module_name} --modulepath #{MODULE_PATH} --force --render-as json`
|
20
22
|
end
|
21
|
-
|
23
|
+
|
22
24
|
# extract json from output, regex will match json in string
|
23
25
|
matched = output.match(/\{.+\}/)
|
24
26
|
|
25
27
|
raise DTK::Client::DtkError, "Puppet module '#{module_name}' not found." unless matched
|
26
|
-
|
28
|
+
|
27
29
|
# parse matched json
|
28
30
|
result = JSON.parse(matched[0])
|
29
31
|
|
@@ -34,13 +36,13 @@ module DTK
|
|
34
36
|
filtered = filtered.split(/\n/).map(&:strip).join(', ')
|
35
37
|
raise DTK::Client::DtkError, filtered
|
36
38
|
end
|
37
|
-
|
39
|
+
|
38
40
|
# puppet uses last part of the module name, as dir for location
|
39
41
|
dir_name = module_name.split('-').last
|
40
42
|
puts "Successfully installed '#{module_name}' from puppet forge, location: '#{MODULE_PATH}/#{dir_name}'"
|
41
43
|
return dir_name
|
42
44
|
end
|
43
|
-
|
45
|
+
|
44
46
|
end
|
45
47
|
end
|
46
48
|
end
|
data/lib/util/os_util.rb
CHANGED
@@ -282,7 +282,11 @@ module DTK
|
|
282
282
|
load File.expand_path('../../lib/util/ssh_util.rb', File.dirname(__FILE__))
|
283
283
|
load File.expand_path('../../lib/util/remote_dependency_util.rb', File.dirname(__FILE__))
|
284
284
|
load File.expand_path('../../lib/shell/help_monkey_patch.rb', File.dirname(__FILE__))
|
285
|
-
load File.expand_path('../../lib/shell/domain.rb', File.dirname(__FILE__))
|
285
|
+
load File.expand_path('../../lib/shell/domain/context_entity.rb', File.dirname(__FILE__))
|
286
|
+
load File.expand_path('../../lib/shell/domain/active_context.rb', File.dirname(__FILE__))
|
287
|
+
load File.expand_path('../../lib/shell/domain/context_params.rb', File.dirname(__FILE__))
|
288
|
+
load File.expand_path('../../lib/shell/domain/override_tasks.rb', File.dirname(__FILE__))
|
289
|
+
load File.expand_path('../../lib/shell/context.rb', File.dirname(__FILE__))
|
286
290
|
load File.expand_path('../../lib/domain/git_adapter.rb', File.dirname(__FILE__))
|
287
291
|
load File.expand_path('../../lib/command_helpers/git_repo.rb', File.dirname(__FILE__))
|
288
292
|
load File.expand_path('../../lib/command_helpers/service_importer.rb', File.dirname(__FILE__))
|
@@ -70,12 +70,16 @@ module DTK
|
|
70
70
|
data = [data] unless data.kind_of?(Array)
|
71
71
|
|
72
72
|
data.each do |data_element|
|
73
|
+
# special flag to filter out data not needed here
|
74
|
+
next if data_element['dtk_client_hidden']
|
75
|
+
|
73
76
|
structured_data << to_ostruct(data_element)
|
74
77
|
end
|
75
78
|
|
76
79
|
# we use array of OpenStruct to hold our evaluated values
|
77
80
|
@evaluated_data = []
|
78
81
|
@error_data = []
|
82
|
+
@action_data = []
|
79
83
|
structured_data.each do |structured_element|
|
80
84
|
evaluated_element = DtkOpenStruct.new
|
81
85
|
error_element = DtkOpenStruct.new
|
@@ -88,7 +92,8 @@ module DTK
|
|
88
92
|
|
89
93
|
if print_error_table && k.include?('error')
|
90
94
|
error_message = value_of(structured_element, v)
|
91
|
-
|
95
|
+
server_error = nil
|
96
|
+
|
92
97
|
# here we see if there was an error if not we will skip this
|
93
98
|
# if so we add it to @error_data
|
94
99
|
|
@@ -99,25 +104,58 @@ module DTK
|
|
99
104
|
error_index = ""
|
100
105
|
error_type = value_of(structured_element,'errors.dtk_type') || ""
|
101
106
|
|
107
|
+
if error_type.empty?
|
108
|
+
val = value_of(structured_element,'dtk_type')||''
|
109
|
+
# extract e.g. 3.1.1.1 from '3.1.1.1 action' etc.
|
110
|
+
error_type = val.scan( /\d+[,.]\d?[,.]?\d?[,.]?\d?[,.]?\d?/ ).first
|
111
|
+
end
|
112
|
+
|
102
113
|
# we set index for each message first => [ 1 ], second => [ 2 ], etc.
|
103
114
|
if error_type == "user_error" || error_type == "test_error"
|
104
115
|
error_index = "[ #{@error_data.size + 1} ]"
|
116
|
+
else
|
117
|
+
server_error = true
|
118
|
+
error_index = error_type
|
105
119
|
end
|
106
120
|
|
107
121
|
# original table takes that index
|
108
122
|
evaluated_element.send("#{k}=", error_index)
|
109
123
|
# we set new error element
|
110
124
|
error_element.id = error_index
|
111
|
-
if error_index.empty?
|
112
|
-
|
125
|
+
# if error_index.empty?
|
126
|
+
if server_error
|
127
|
+
error_element.message = "[SERVER ERROR] " + error_message
|
113
128
|
else
|
114
129
|
error_element.message = "[USER ERROR] " + error_message if error_type == "user_error"
|
115
|
-
error_element.message = "[TEST ERROR] " + error_message if error_type == "test_error"
|
130
|
+
error_element.message = "[TEST ERROR] " + error_message if error_type == "test_error"
|
116
131
|
end
|
117
132
|
|
118
133
|
# add it with other
|
119
134
|
@error_data << error_element
|
120
135
|
end
|
136
|
+
elsif k.include?('action')
|
137
|
+
error_message = value_of(structured_element, v)
|
138
|
+
|
139
|
+
# here we see if there was an error if not we will skip this
|
140
|
+
# if so we add it to @error_data
|
141
|
+
|
142
|
+
if error_message.empty?
|
143
|
+
# no error message just add it as regular element
|
144
|
+
evaluated_element.send("#{k}=",value_of(structured_element, v))
|
145
|
+
else
|
146
|
+
error_index = "[ #{value_of(structured_element,'logs.label')} ]" || ""
|
147
|
+
error_type = value_of(structured_element,'logs.dtk_type') || ""
|
148
|
+
|
149
|
+
# original table takes that index
|
150
|
+
evaluated_element.send("#{k}=", error_index)
|
151
|
+
|
152
|
+
# we set new error element
|
153
|
+
error_element.id = error_index
|
154
|
+
error_element.message = error_message
|
155
|
+
|
156
|
+
# add it with other
|
157
|
+
@action_data << error_element
|
158
|
+
end
|
121
159
|
else
|
122
160
|
evaluated_element.send("#{k}=", value_of(structured_element, v))
|
123
161
|
# eval "evaluated_element.#{k}=structured_element.#{v}"
|
@@ -129,8 +167,12 @@ module DTK
|
|
129
167
|
# make sure when in development to disable this TODO: better solution needed
|
130
168
|
raise DTK::Client::DtkError,"Error with missing metadata occurred. There is a mistake in table metadata or unexpected data presented to table view."
|
131
169
|
end
|
132
|
-
end
|
170
|
+
end
|
133
171
|
end
|
172
|
+
|
173
|
+
@order_definition.delete('action')
|
174
|
+
@order_definition.delete('errors')
|
175
|
+
|
134
176
|
@evaluated_data << evaluated_element
|
135
177
|
end
|
136
178
|
end
|
@@ -178,12 +220,12 @@ module DTK
|
|
178
220
|
unless (forced_metadata['order'].nil? || forced_metadata['mapping'].nil?)
|
179
221
|
return if (forced_metadata['order'].class.eql?(Array) && forced_metadata['mapping'].class.eql?(Hash))
|
180
222
|
end
|
181
|
-
|
223
|
+
|
182
224
|
raise DTK::Client::DtkError,"Provided table definition is not valid. Please review your order and mapping for provided definition: \n #{forced_metadata.inspect}"
|
183
225
|
end
|
184
226
|
|
185
227
|
def filter_remove_underscore(field)
|
186
|
-
|
228
|
+
|
187
229
|
end
|
188
230
|
|
189
231
|
def print
|
@@ -196,10 +238,23 @@ module DTK
|
|
196
238
|
unless @error_data.empty?
|
197
239
|
printf "\nERRORS: \n\n"
|
198
240
|
#table(@error_data,{:fields => [ :id, :message ]})
|
199
|
-
@error_data.each do |error_row|
|
241
|
+
@error_data.each do |error_row|
|
200
242
|
printf "%15s %s\n", error_row.id.colorize(:yellow), error_row.message.colorize(:red)
|
201
243
|
end
|
202
244
|
end
|
245
|
+
|
246
|
+
unless @action_data.empty?
|
247
|
+
printf " \n"
|
248
|
+
#table(@error_data,{:fields => [ :id, :message ]})
|
249
|
+
printed = []
|
250
|
+
@action_data.each do |action_row|
|
251
|
+
# printf "%15s\n"
|
252
|
+
# printf(" INFO: #{action_row.message.colorize(:yellow)} \n") #, action_row.id.colorize(:yellow), action_row.message.colorize(:yellow)
|
253
|
+
message = action_row.message
|
254
|
+
printf "%15s %s\n", "INFO:".colorize(:yellow), message.colorize(:yellow) unless printed.include?(message)
|
255
|
+
printed << message
|
256
|
+
end
|
257
|
+
end
|
203
258
|
end
|
204
259
|
|
205
260
|
private
|
@@ -223,7 +278,7 @@ module DTK
|
|
223
278
|
case
|
224
279
|
when command.include?('map{')
|
225
280
|
matched_data = command.match(/\['(.+)'\]/)
|
226
|
-
|
281
|
+
|
227
282
|
my_lambda = lambda{|_x| _x.map{|r|r["#{matched_data[1]}"]||[]}}
|
228
283
|
value = my_lambda.call(value)
|
229
284
|
|
@@ -242,19 +297,19 @@ module DTK
|
|
242
297
|
value = value.send('[]',params)
|
243
298
|
when command.start_with?("list_")
|
244
299
|
matched_data = command.match(/list_(.+)/)
|
245
|
-
|
300
|
+
|
246
301
|
my_lambda = lambda{|_x| _x.map{|r|r["#{matched_data[1]}"]||[]}}
|
247
302
|
value = my_lambda.call(value)
|
248
303
|
|
249
304
|
raise DTK::Client::DtkError,"There is a mistake in table metadata: #{command.inspect}" if value.nil?
|
250
305
|
when command.start_with?("count_")
|
251
306
|
matched_data = command.match(/count_(.+)/)
|
252
|
-
|
307
|
+
|
253
308
|
my_lambda = lambda{|_x| _x.map{|r|r["#{matched_data[1]}"]||[]}.flatten.size}
|
254
309
|
value = my_lambda.call(value)
|
255
310
|
|
256
311
|
raise DTK::Client::DtkError,"There is a mistake in table metadata: #{command.inspect}" if value.nil?
|
257
|
-
else
|
312
|
+
else
|
258
313
|
value = value.send(command)
|
259
314
|
end
|
260
315
|
return value
|
data/spec/lib/spec_thor.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
require File.expand_path('../../lib/client', File.dirname(__FILE__))
|
2
2
|
require File.expand_path('../../lib/parser/adapters/thor', File.dirname(__FILE__))
|
3
3
|
require File.expand_path('../../lib/shell/context', File.dirname(__FILE__))
|
4
|
-
require File.expand_path('../../lib/shell/domain', File.dirname(__FILE__))
|
4
|
+
require File.expand_path('../../lib/shell/domain/context_entity', File.dirname(__FILE__))
|
5
|
+
require File.expand_path('../../lib/shell/domain/active_context', File.dirname(__FILE__))
|
6
|
+
require File.expand_path('../../lib/shell/domain/context_params', File.dirname(__FILE__))
|
7
|
+
require File.expand_path('../../lib/shell/domain/override_tasks', File.dirname(__FILE__))
|
5
8
|
Dir[File.expand_path('../../lib/shell/parse_monkey_patch.rb', File.dirname(__FILE__))].each {|file| require file }
|
6
9
|
|
7
10
|
require 'shellwords'
|
@@ -92,7 +95,7 @@ module SpecThor
|
|
92
95
|
gsub(regex, '').chomp
|
93
96
|
end
|
94
97
|
|
95
|
-
private
|
98
|
+
private
|
96
99
|
|
97
100
|
##
|
98
101
|
# Method will take task name from class name
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dtk-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rich PELAVIN
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -219,6 +219,7 @@ files:
|
|
219
219
|
- lib/commands/common/thor/list_diffs.rb
|
220
220
|
- lib/commands/common/thor/module.rb
|
221
221
|
- lib/commands/common/thor/module/import.rb
|
222
|
+
- lib/commands/common/thor/poller.rb
|
222
223
|
- lib/commands/common/thor/pull_clone_changes.rb
|
223
224
|
- lib/commands/common/thor/pull_from_remote.rb
|
224
225
|
- lib/commands/common/thor/puppet_forge.rb
|
@@ -228,6 +229,7 @@ files:
|
|
228
229
|
- lib/commands/common/thor/reparse.rb
|
229
230
|
- lib/commands/common/thor/set_required_params.rb
|
230
231
|
- lib/commands/common/thor/task_status.rb
|
232
|
+
- lib/commands/common/thor/test_action_agent.rb
|
231
233
|
- lib/commands/thor/account.rb
|
232
234
|
- lib/commands/thor/assembly.rb
|
233
235
|
- lib/commands/thor/attribute.rb
|
@@ -276,7 +278,11 @@ files:
|
|
276
278
|
- lib/shell.rb
|
277
279
|
- lib/shell/context.rb
|
278
280
|
- lib/shell/context_aux.rb
|
279
|
-
- lib/shell/domain.rb
|
281
|
+
- lib/shell/domain/active_context.rb
|
282
|
+
- lib/shell/domain/context_entity.rb
|
283
|
+
- lib/shell/domain/context_params.rb
|
284
|
+
- lib/shell/domain/override_tasks.rb
|
285
|
+
- lib/shell/domain/shadow_entity.rb
|
280
286
|
- lib/shell/header_shell.rb
|
281
287
|
- lib/shell/help_monkey_patch.rb
|
282
288
|
- lib/shell/interactive_wizard.rb
|