dtk-client 0.7.5 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/bin/dtk +12 -1
  3. data/dtk-client.gemspec +1 -1
  4. data/lib/command_helpers/git_repo/merge.rb +139 -0
  5. data/lib/command_helpers/git_repo.rb +29 -51
  6. data/lib/command_helpers/service_importer.rb +1 -1
  7. data/lib/commands/common/thor/assembly_workspace.rb +55 -42
  8. data/lib/commands/common/thor/pull_from_remote.rb +11 -3
  9. data/lib/commands/common/thor/puppet_forge.rb +1 -1
  10. data/lib/commands/thor/component_module.rb +3 -1
  11. data/lib/commands/thor/developer.rb +25 -4
  12. data/lib/commands/thor/node.rb +5 -2
  13. data/lib/commands/thor/node_group.rb +1 -1
  14. data/lib/commands/thor/service.rb +39 -23
  15. data/lib/commands/thor/workspace.rb +48 -11
  16. data/lib/domain/git_adapter.rb +8 -0
  17. data/lib/dtk-client/version.rb +1 -1
  18. data/lib/execute/cli_pure/cli_rerouter.rb +3 -0
  19. data/lib/parser/adapters/thor.rb +1 -1
  20. data/lib/shell/context.rb +1 -1
  21. data/lib/{commands/common/thor/task_status → task_status}/refresh_mode.rb +0 -0
  22. data/lib/{commands/common/thor/task_status → task_status}/snapshot_mode.rb +0 -0
  23. data/lib/task_status/stream_mode/element/format.rb +86 -0
  24. data/lib/task_status/stream_mode/element/hierarchical_task/result/action.rb +76 -0
  25. data/lib/task_status/stream_mode/element/hierarchical_task/result/components.rb +9 -0
  26. data/lib/task_status/stream_mode/element/hierarchical_task/result/node_level.rb +9 -0
  27. data/lib/task_status/stream_mode/element/hierarchical_task/result.rb +55 -0
  28. data/lib/task_status/stream_mode/element/hierarchical_task/steps/action.rb +37 -0
  29. data/lib/task_status/stream_mode/element/hierarchical_task/steps/components.rb +36 -0
  30. data/lib/task_status/stream_mode/element/hierarchical_task/steps/node_level.rb +25 -0
  31. data/lib/task_status/stream_mode/element/hierarchical_task/steps.rb +17 -0
  32. data/lib/task_status/stream_mode/element/hierarchical_task.rb +83 -0
  33. data/lib/{commands/common/thor/task_status → task_status}/stream_mode/element/no_results.rb +0 -0
  34. data/lib/task_status/stream_mode/element/render.rb +42 -0
  35. data/lib/task_status/stream_mode/element/stage/render.rb +59 -0
  36. data/lib/task_status/stream_mode/element/stage.rb +67 -0
  37. data/lib/task_status/stream_mode/element/task_end.rb +19 -0
  38. data/lib/task_status/stream_mode/element/task_start.rb +21 -0
  39. data/lib/task_status/stream_mode/element.rb +85 -0
  40. data/lib/{commands/common/thor/task_status → task_status}/stream_mode.rb +5 -5
  41. data/lib/{commands/common/thor/task_status.rb → task_status.rb} +15 -12
  42. data/lib/util/os_util.rb +8 -0
  43. metadata +26 -14
  44. data/lib/commands/common/thor/task_status/stream_mode/element/render.rb +0 -88
  45. data/lib/commands/common/thor/task_status/stream_mode/element/stage.rb +0 -13
  46. data/lib/commands/common/thor/task_status/stream_mode/element/task_end.rb +0 -10
  47. data/lib/commands/common/thor/task_status/stream_mode/element/task_start.rb +0 -10
  48. data/lib/commands/common/thor/task_status/stream_mode/element.rb +0 -90
@@ -11,7 +11,7 @@ module DTK::Client
11
11
  :module_namespace? => namespace
12
12
  }
13
13
 
14
- raise DtkError, "Puppet forge module name should be in format USERNAME-NAME" unless pf_module_name.match(NAME_REGEX)
14
+ raise DtkError, "Puppet forge module name should be in format NAMESPACE-MODULENAME" unless pf_module_name.match(NAME_REGEX)
15
15
 
16
16
  response = poller_response do
17
17
  post rest_url("component_module/install_puppet_forge_modules"), PostBody.new(post_body_hash)
@@ -336,7 +336,9 @@ module DTK::Client
336
336
  # version_method_option
337
337
  desc "COMPONENT-MODULE-NAME/ID clone [-n]", "Locally clone component module and component files. Use -n to skip edit prompt"
338
338
  method_option :skip_edit, :aliases => '-n', :type => :boolean, :default => false
339
- def clone(context_params, internal_trigger=false)
339
+ # DEBUG SNIPPET >>> REMOVE <<<
340
+ # REMOVE TRIGGER!!!!
341
+ def clone(context_params, internal_trigger=true)
340
342
  clone_module_aux(context_params, internal_trigger)
341
343
  end
342
344
 
@@ -1,15 +1,20 @@
1
1
  require 'base64'
2
+ dtk_require_common_commands('thor/action_result_handler')
2
3
 
3
4
  module DTK::Client
4
5
  class Developer < CommandBaseThor
5
6
 
7
+ no_tasks do
8
+ include ActionResultHandler
9
+ end
10
+
6
11
  MATCH_FILE_NAME = /[a-zA-Z0-9_]+\.[a-zA-Z]+$/
7
12
  GIT_LOG_LOCATION = File.expand_path('../../../lib/git-logs/git.log', File.dirname(__FILE__))
8
13
  PROJECT_ROOT = File.expand_path('../../../', File.dirname(__FILE__))
9
14
 
10
- desc "upload-agent PATH-TO-AGENT[.rb,.dll] NODE-ID-PATTERN", "Uploads agent and ddl file to requested nodes, pattern is regexp for filtering node ids."
15
+ desc "upload-agent PATH-TO-AGENT[.rb,.dll] NODE-ID-PATTERN", "Uploads agent and ddl file to requested nodes, pattern is regexp for filtering node ids."
11
16
  def upload_agent(context_params)
12
- agent, node_pattern = context_params.retrieve_arguments([:option_1!, :option_2!],method_argument_names)
17
+ agent, node_pattern = context_params.retrieve_arguments([:option_1!, :option_2!], method_argument_names)
13
18
 
14
19
  nodes = post rest_url("node/list"), { :is_list_all => true }
15
20
 
@@ -20,7 +25,7 @@ module DTK::Client
20
25
 
21
26
  # if it doesn't contain extension upload both *.rb and *.ddl
22
27
  files = (agent.match(MATCH_FILE_NAME) ? [agent] : ["#{agent}.rb","#{agent}.ddl"])
23
-
28
+
24
29
  # read require files and encode them
25
30
  request_body = {}
26
31
  files.each do |file_name|
@@ -36,6 +41,22 @@ module DTK::Client
36
41
  return response
37
42
  end
38
43
 
44
+ # run-agent haris1 dev_manager inject_agent "{ 'action_agent_branch': 'master', 'action_agent_url': 'git@github.com:rich-reactor8/dtk-action-agent.git' }"
45
+ desc "run-agent SERVICE-NAME AGENT-NAME AGENT-METHOD PARAMS", "Updates DTK Action Agent to provided branch, example: dev_manager inject_agent \"{ 'action_agent_branch': 'master', 'action_agent_url': 'url' }\""
46
+ def run_agent(context_params)
47
+ service_name, agent_name, agent_method, action_params = context_params.retrieve_arguments([:option_1!, :option_2!, :option_3!, :option_4], method_argument_names)
48
+
49
+ action_params ||= "{}"
50
+ action_params.gsub!("'",'"')
51
+
52
+ response = post_file rest_url("developer/run_agent"), { :service_name => service_name, :agent_name => agent_name, :agent_method => agent_method, :agent_params => action_params }
53
+
54
+ action_results_id = response.data(:action_results_id)
55
+ print_action_results(action_results_id)
56
+
57
+ nil
58
+ end
59
+
39
60
  desc "remove-from-system SERVICE-NAME", "Removes objects associated with service, but does not destroy target isnatnces"
40
61
  method_option :force, :aliases => '-y', :type => :boolean, :default => false
41
62
  def remove_from_system(context_params)
@@ -98,7 +119,7 @@ module DTK::Client
98
119
  puts File.open(fname).readlines
99
120
  DTK::Client::OsUtil.print("*"*header.size, :yellow)
100
121
  end
101
- end
122
+ end
102
123
 
103
124
  end
104
125
  end
@@ -1,5 +1,6 @@
1
- dtk_require_common_commands('thor/task_status')
1
+ dtk_require_from_base('task_status')
2
2
  dtk_require_common_commands('thor/set_required_attributes')
3
+ dtk_require_common_commands('thor/assembly_workspace')
3
4
 
4
5
  module DTK::Client
5
6
  class Node < CommandBaseThor
@@ -115,8 +116,10 @@ module DTK::Client
115
116
  end
116
117
 
117
118
  context_params.forward_options({ :json_return => true })
119
+ # TODO: should call something taht just returns info about nodes, rather than info_aux
120
+ # also info that comes back should indicate whether a node group and if so error message is that
121
+ # ssh cannot be called on node group
118
122
  response = info_aux(context_params)
119
-
120
123
  if response.ok?
121
124
  node_info = {}
122
125
  response.data['nodes'].each do |node|
@@ -1,4 +1,4 @@
1
- dtk_require_common_commands('thor/task_status')
1
+ dtk_require_from_base('task_status')
2
2
  dtk_require_common_commands('thor/set_required_attributes')
3
3
  module DTK::Client
4
4
  class NodeGroup < CommandBaseThor
@@ -2,10 +2,10 @@ require 'rest_client'
2
2
  require 'json'
3
3
  require 'colorize'
4
4
 
5
- dtk_require_from_base("dtk_logger")
6
- dtk_require_from_base("util/os_util")
7
- dtk_require_from_base("command_helper")
8
- dtk_require_common_commands('thor/task_status')
5
+ dtk_require_from_base('dtk_logger')
6
+ dtk_require_from_base('util/os_util')
7
+ dtk_require_from_base('command_helper')
8
+ dtk_require_from_base('task_status')
9
9
  dtk_require_common_commands('thor/set_required_attributes')
10
10
  dtk_require_common_commands('thor/edit')
11
11
  dtk_require_common_commands('thor/purge_clone')
@@ -96,6 +96,19 @@ module DTK::Client
96
96
  :endpoint => "assembly",
97
97
  :url => "assembly/info_about",
98
98
  :opts => {:subtype=>"instance", :about=>"modules"}
99
+ },
100
+ :workflow_info => {
101
+ :endpoint => "assembly",
102
+ :url => "assembly/task_action_list"
103
+ },
104
+ :exec => {
105
+ :endpoint => "assembly",
106
+ :url => "assembly/task_action_list"
107
+ },
108
+ # TODO: DEPRECATE execute_workflow
109
+ :execute_workflow => {
110
+ :endpoint => "assembly",
111
+ :url => "assembly/task_action_list"
99
112
  }
100
113
  }
101
114
  }
@@ -247,25 +260,34 @@ module DTK::Client
247
260
  Response::Ok.new()
248
261
  end
249
262
 
250
- desc "SERVICE-NAME/ID execute-workflow WORKFLOW-ACTION [WORKFLOW-PARAMS] [-m COMMIT-MSG]", "Execute workflow."
263
+ desc "SERVICE-NAME/ID exec SERVICE-LEVEL-ACTION [PARAMS] [--stream-results]", "Execute a service level action"
264
+ method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
265
+ def exec(context_params)
266
+ opts = {}
267
+ opts.merge!(:mode => :stream) if context_params.pure_cli_mode or options['stream-results']
268
+ converge_aux(context_params, opts)
269
+ end
270
+ # TODO: DEPRECATE: keeping around for backward compatibiity but will be deprecating execute-workflow
271
+ desc "SERVICE-NAME/ID execute-workflow WORKFLOW-ACTION [WORKFLOW-PARAMS] [-m COMMIT-MSG]", "Execute workflow.", :hide => true
251
272
  method_option "commit_msg",:aliases => "-m" ,
252
273
  :type => :string,
253
274
  :banner => "COMMIT-MSG",
254
275
  :desc => "Commit message"
255
276
  def execute_workflow(context_params)
277
+ OsUtil.print_deprecate_message("Command 'execute-workflow' will be deprecated; use 'exec' instead")
256
278
  converge(context_params)
257
279
  end
258
- desc "SERVICE-NAME/ID converge [-m COMMIT-MSG]", "Converge service instance."
280
+
281
+ desc "SERVICE-NAME/ID converge [-m COMMIT-MSG] [--stream-results]", "Converge service instance."
259
282
  method_option "commit_msg",:aliases => "-m" ,
260
283
  :type => :string,
261
284
  :banner => "COMMIT-MSG",
262
285
  :desc => "Commit message"
286
+ method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
263
287
  def converge(context_params)
264
- opts = Hash.new
265
- if context_params.pure_cli_mode
266
- opts.merge!(:mode => :stream)
267
- end
268
- converge_aux(context_params,opts)
288
+ opts = {}
289
+ opts.merge!(:mode => :stream) if context_params.pure_cli_mode or options['stream-results']
290
+ converge_aux(context_params, opts)
269
291
  end
270
292
 
271
293
  desc "SERVICE-NAME/ID execute-action COMPONENT-INSTANCE [ACTION-NAME [ACTION-PARAMS]]", "Converge the component or execute tha action on the component."
@@ -333,12 +355,6 @@ module DTK::Client
333
355
  edit_attributes_aux(context_params)
334
356
  end
335
357
 
336
- # desc "ASSEMBLY-NAME/ID promote-module-updates COMPONENT-MODULE-NAME [--force]", "Promotes changes made to component module in assembly to base component module"
337
- # method_option :force, :type => :boolean, :default => false, :aliases => '-f'
338
- # def promote_module_updates(context_params)
339
- # promote_module_updates_aux(context_params)
340
- # end
341
-
342
358
  =begin
343
359
  TODO: will put in dot release and will rename to 'extend'
344
360
  desc "ASSEMBLY-NAME/ID add EXTENSION-TYPE [-n COUNT]", "Adds a sub assembly template to the assembly"
@@ -374,7 +390,7 @@ TODO: will put in dot release and will rename to 'extend'
374
390
  :banner => "MODE",
375
391
  :desc => "Mode in which task status display; one of [stream,snapshot,refresh]; default is 'snapshot'"
376
392
  method_option :summarize, :type => :boolean, :default => false, :aliases => '-s'
377
- # leaving --wait in for backwards compatability
393
+ # TODO: leaving --wait in for backwards compatability
378
394
  method_option :wait, :type => :boolean, :default => false
379
395
  def task_status(context_params)
380
396
  task_status_aw_aux(context_params)
@@ -434,8 +450,8 @@ TODO: will put in dot release and will rename to 'extend'
434
450
  workflow_info_aux(context_params)
435
451
  end
436
452
 
437
- desc "SERVICE-NAME/ID workflow-list", "List the workflows associated with the service."
438
- def workflow_list(context_params)
453
+ desc "SERVICE-NAME/ID list-workflows", "List the workflows associated with the service."
454
+ def list_workflows(context_params)
439
455
  workflow_list_aux(context_params)
440
456
  end
441
457
 
@@ -471,7 +487,7 @@ TODO: will put in dot release and will rename to 'extend'
471
487
  rest_endpoint = "assembly/info_about"
472
488
 
473
489
  if context_params.is_last_command_eql_to?(:attribute)
474
- raise DTK::Client::DtkError, "Not supported command for current context level." if attribute_id
490
+ raise DtkError, "Not supported command for current context level." if attribute_id
475
491
  about, data_type = get_type_and_raise_error_if_invalid(about, "attributes", ["attributes"])
476
492
  elsif context_params.is_last_command_eql_to?(:component)
477
493
  if component_id
@@ -610,7 +626,7 @@ TODO: will put in dot release and will rename to 'extend'
610
626
  @@invalidate_map << :workspace_node
611
627
 
612
628
  message = "Created node '#{response.data["display_name"]}'."
613
- DTK::Client::OsUtil.print(message, :yellow)
629
+ OsUtil.print(message, :yellow)
614
630
  end
615
631
 
616
632
  desc "SERVICE-NAME/ID create-node-group ^^NODE-GROUP-NAME NODE-TEMPLATE [-n CARDINALITY]", "Add (stage) a new node group in the service."
@@ -627,7 +643,7 @@ TODO: will put in dot release and will rename to 'extend'
627
643
  @@invalidate_map << :workspace_node
628
644
 
629
645
  message = "Created node group '#{response.data["display_name"]}'."
630
- DTK::Client::OsUtil.print(message, :yellow)
646
+ OsUtil.print(message, :yellow)
631
647
  end
632
648
 
633
649
  desc "SERVICE-NAME/ID link-components TARGET-CMP-NAME SOURCE-CMP-NAME [DEPENDENCY-NAME]","Link the target component to the source component."
@@ -1,10 +1,10 @@
1
1
  require 'rest_client'
2
2
  require 'json'
3
3
  require 'colorize'
4
- dtk_require_from_base("dtk_logger")
5
- dtk_require_from_base("util/os_util")
6
- dtk_require_from_base("command_helper")
7
- dtk_require_common_commands('thor/task_status')
4
+ dtk_require_from_base('dtk_logger')
5
+ dtk_require_from_base('util/os_util')
6
+ dtk_require_from_base('command_helper')
7
+ dtk_require_from_base('task_status')
8
8
  dtk_require_common_commands('thor/edit')
9
9
  dtk_require_common_commands('thor/purge_clone')
10
10
  dtk_require_common_commands('thor/assembly_workspace')
@@ -77,6 +77,19 @@ module DTK::Client
77
77
  :endpoint => "assembly",
78
78
  :url => "assembly/info_about",
79
79
  :opts => {:subtype=>"instance", :about=>"modules"}
80
+ },
81
+ :workflow_info => {
82
+ :endpoint => "assembly",
83
+ :url => "assembly/task_action_list"
84
+ },
85
+ :exec => {
86
+ :endpoint => "assembly",
87
+ :url => "assembly/task_action_list"
88
+ },
89
+ # TODO: DEPRECATE execute_workflow
90
+ :execute_workflow => {
91
+ :endpoint => "assembly",
92
+ :url => "assembly/task_action_list"
80
93
  }
81
94
  }
82
95
  }
@@ -181,22 +194,36 @@ module DTK::Client
181
194
  # clear_tasks_aux(context_params)
182
195
  #end
183
196
 
184
- desc "WORKSPACE-NAME/ID execute-workflow WORKFLOW-ACTION [WORKFLOW-PARAMS] [-m COMMIT-MSG]", "Execute workflow."
197
+ desc "WORKSPACE-NAME/ID exec SERVICE-LEVEL-ACTION [PARAMS] [--stream-results]", "Execute a service level action"
198
+ method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
199
+ def exec(context_params)
200
+ opts = {}
201
+ opts.merge!(:mode => :stream) if context_params.pure_cli_mode or options['stream-results']
202
+ converge_aux(context_params, opts)
203
+ end
204
+
205
+ # TODO: DEPRECATE: keeping around for backward compatibiity but will be deprecating execute-workflow
206
+ desc "WORKSPACE-NAME/ID execute-workflow WORKFLOW-ACTION [WORKFLOW-PARAMS] [-m COMMIT-MSG]", "Execute workflow.", :hide => true
185
207
  method_option "commit_msg",:aliases => "-m",
186
208
  :type => :string,
187
209
  :banner => "COMMIT-MSG",
188
210
  :desc => "Commit message"
189
211
  def execute_workflow(context_params)
212
+ OsUtil.print_deprecate_message("Command 'execute-workflow' will be deprecated; use 'exec' instead")
190
213
  converge_aux(context_params)
191
214
  end
192
215
 
193
- desc "WORKSPACE-NAME/ID converge [-m COMMIT-MSG]", "Converge workspace instance."
216
+
217
+ desc "WORKSPACE-NAME/ID converge [-m COMMIT-MSG] [--stream-results]", "Converge workspace instance."
194
218
  method_option "commit_msg",:aliases => "-m" ,
195
219
  :type => :string,
196
220
  :banner => "COMMIT-MSG",
197
221
  :desc => "Commit message"
222
+ method_option 'stream-results', :aliases => '-s', :type => :boolean, :default => false, :desc => "Stream results"
198
223
  def converge(context_params)
199
- converge_aux(context_params)
224
+ opts = {}
225
+ opts.merge!(:mode => :stream) if context_params.pure_cli_mode or options['stream-results']
226
+ converge_aux(context_params, opts)
200
227
  end
201
228
 
202
229
  desc "WORKSPACE-NAME/ID push-component-module-updates COMPONENT-MODULE-NAME [--force]", "Push changes made to a component module in the workspace to its base component module."
@@ -508,8 +535,8 @@ module DTK::Client
508
535
  workflow_info_aux(context_params)
509
536
  end
510
537
 
511
- desc "WORKSPACE-NAME/ID workflow-list", "List the workflows associated with the workspace."
512
- def workflow_list(context_params)
538
+ desc "WORKSPACE-NAME/ID list-workflows", "List the workflows associated with the workspace."
539
+ def list_workflows(context_params)
513
540
  workflow_list_aux(context_params)
514
541
  end
515
542
 
@@ -573,13 +600,23 @@ module DTK::Client
573
600
  tail_aux(context_params)
574
601
  end
575
602
 
576
- desc "WORKSPACE-NAME/ID task-status [--wait] [--summarize]", "Get the task status of the running or last running workspace task."
577
- method_option :wait, :type => :boolean, :default => false
603
+ #desc "WORKSPACE-NAME/ID task-status [--wait] [--summarize]", "Get the task status of the running or last running workspace task."
604
+ desc "WORKSPACE-NAME/ID task-status [--mode MODE] [--summarize]", "Get the task status of the running or last running workspace task."
605
+ method_option "mode",:aliases => "-m" ,
606
+ :type => :string,
607
+ :banner => "MODE",
608
+ :desc => "Mode in which task status display; one of [stream,snapshot,refresh]; default is 'snapshot'"
578
609
  method_option :summarize, :type => :boolean, :default => false, :aliases => '-s'
610
+ # TODO: leaving --wait in for backwards compatability
611
+ method_option :wait, :type => :boolean, :default => false
612
+
579
613
  def task_status(context_params)
580
614
  task_status_aw_aux(context_params)
581
615
  end
582
616
 
617
+
618
+
619
+
583
620
  desc "WORKSPACE-NAME/ID task-action-detail", "Get the task info of the running or last running workspace task."
584
621
  def task_action_detail(context_params)
585
622
  task_action_detail_aw_aux(context_params)
@@ -1,4 +1,8 @@
1
1
  require 'git'
2
+ # monkey patch
3
+ class Git::Lib
4
+ public :command
5
+ end
2
6
 
3
7
  module DTK
4
8
  module Client
@@ -19,6 +23,10 @@ module DTK
19
23
  @local_branch_name = local_branch_name
20
24
  end
21
25
 
26
+ def command(*args, &block)
27
+ @git_repo.lib.command(*args, &block)
28
+ end
29
+
22
30
  def changed?
23
31
  (!(changed().empty? && untracked().empty? && deleted().empty?) || staged_commits?)
24
32
  end
@@ -1,3 +1,3 @@
1
1
  module DtkClient
2
- VERSION="0.7.5"
2
+ VERSION="0.7.6"
3
3
  end
@@ -6,6 +6,9 @@ module DTK
6
6
  { :regex => /service-module (?<service_module_id>[\w:\-]+) (?<method_name>stage) (?<assembly_id>[\w:\-]+) (?<instance_name>[\w:\-\.\:]+)/, :entity => 'assembly' },
7
7
  { :regex => /service-module (?<service_module_id>[\w:\-]+) (?<method_name>deploy) (?<assembly_id>[\w:\-]+) (?<instance_name>[\w:\-\.\:]+)/ }
8
8
  ],
9
+ :component_module => [
10
+ { :regex => /component-module (?<component_module_id>[\w:\-]+) (?<method_name>clone)/ }
11
+ ],
9
12
  :service => [
10
13
  { :regex => /service (?<service_id>[\w:\-]+) (?<method_name>set-attribute) (?<name>[\w:\-\.\:]+) (?<value>[\w:\-\.\:]+)/ },
11
14
  { :regex => /service (?<service_id>[\w:\-]+) (?<method_name>converge)/ },
@@ -7,7 +7,7 @@ require 'digest/sha1'
7
7
  dtk_require("../../shell/interactive_wizard")
8
8
  dtk_require("../../util/os_util")
9
9
  dtk_require("../../util/console")
10
- dtk_require_common_commands('thor/task_status')
10
+ dtk_require_from_base('task_status')
11
11
  dtk_require_from_base("command_helper")
12
12
  dtk_require("../../context_router")
13
13
  dtk_require_common_commands('thor/poller')
data/lib/shell/context.rb CHANGED
@@ -132,7 +132,7 @@ module DTK
132
132
  warning_message = restricted[:message]
133
133
  node_specific = restricted[:node_specific]
134
134
 
135
- DTK::Client::OsUtil.print(warning_message, :yellow) if warning_message
135
+ DTK::Client::OsUtil.print_warning(warning_messag) if warning_message
136
136
  # end
137
137
 
138
138
  # Validate and change context
@@ -0,0 +1,86 @@
1
+ class DTK::Client::TaskStatus::StreamMode::Element
2
+ class Format < ::Hash
3
+ Settings = {
4
+ :task_start => {
5
+ },
6
+ :task_end => {
7
+ },
8
+ :stage => {
9
+ },
10
+ :stage_start => {
11
+ :border_symbol => '=',
12
+ },
13
+ :stage_end => {
14
+ :border_symbol => '-',
15
+ },
16
+ :default => {
17
+ :border_symbol => '=',
18
+ :border_size => 60,
19
+ :bracket_symbol => '=',
20
+ :bracket_size => 25,
21
+ :duration_accuracy => 1, # how many decimal places accuracy
22
+ :include_start_time => true,
23
+ :tab_size => 2, # how many spaces each tab has
24
+ }
25
+ }
26
+
27
+ def initialize(type)
28
+ super()
29
+ @type = type && type.to_sym
30
+ replace(Settings[:default].merge(Settings[@type] || {}))
31
+ end
32
+
33
+ def format(msg, params = {})
34
+ aug_msg = augment(msg, params)
35
+ params[:bracket] ? bracket(aug_msg) : aug_msg
36
+ end
37
+
38
+ def border
39
+ border_symbol = self[:border_symbol]
40
+ border_size = self[:border_size]
41
+ "#{border_symbol * border_size}"
42
+ end
43
+
44
+ def start_time_msg?(started_at)
45
+ if started_at
46
+ "TIME START: #{started_at}"
47
+ end
48
+ end
49
+
50
+ def formatted_duration?(duration)
51
+ if duration
52
+ "#{duration.round(self[:duration_accuracy])}s"
53
+ end
54
+ end
55
+
56
+ def duration_msg?(duration)
57
+ if formatted_duration = formatted_duration?(duration)
58
+ "DURATION: #{formatted_duration}"
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def bracket(aug_msg)
65
+ bracket_symbol = self[:bracket_symbol]
66
+ bracket_size = self[:bracket_size]
67
+ "#{bracket_symbol * bracket_size} #{aug_msg} #{bracket_symbol * bracket_size}"
68
+ end
69
+
70
+ def augment(msg, params = {})
71
+ msg_prefix = ''
72
+ started_at = params[:started_at]
73
+ if started_at and self[:include_start_time]
74
+ msg_prefix << "#{started_at} "
75
+ end
76
+ ret = "#{msg_prefix}#{msg}"
77
+ if tabs = params[:tabs]
78
+ ident = ' ' * (tabs * self[:tab_size])
79
+ ret = ret.split("\n").map { |line| "#{ident}#{line}" }.join("\n")
80
+ end
81
+ ret
82
+ end
83
+ end
84
+ end
85
+
86
+
@@ -0,0 +1,76 @@
1
+ module DTK::Client; class TaskStatus::StreamMode::Element::HierarchicalTask
2
+ class Results
3
+ class Action < self
4
+ def initialize(element, hash)
5
+ super
6
+ @action_results = hash['action_results'] || []
7
+ end
8
+
9
+ attr_reader :action_results
10
+
11
+ def render_results(results_per_node)
12
+ if any_results?(results_per_node)
13
+ render_line 'RESULTS:'
14
+ render_empty_line
15
+ results_per_node.each { |result| result.render }
16
+ else
17
+ render_errors(results_per_node)
18
+ end
19
+ end
20
+
21
+ def render
22
+ not_first_time = nil
23
+ render_node_term
24
+ @action_results.each do |action_result|
25
+ render_action_result_lines(action_result, :first_time => not_first_time.nil?)
26
+ not_first_time ||= true
27
+ end
28
+ render_empty_line
29
+ end
30
+
31
+ private
32
+
33
+ def any_results?(results_per_node)
34
+ !!results_per_node.find { |results| !results.action_results.empty? }
35
+ end
36
+
37
+ def render_action_result_lines(action_result, opts = {})
38
+ stdout = action_result['stdout']
39
+ stderr = action_result['stderr']
40
+ unless opts[:first_time]
41
+ render_line '--'
42
+ end
43
+ if command = command?(action_result)
44
+ render_line command
45
+ end
46
+ if return_code = action_result['status']
47
+ render_line "RETURN CODE: #{return_code.to_s}"
48
+ end
49
+ if stdout && !stdout.empty?
50
+ render_line 'STDOUT:'
51
+ render_action_output stdout
52
+ end
53
+ if stderr && !stderr.empty?
54
+ render_line 'STDERR:'
55
+ render_action_output stderr
56
+ end
57
+ end
58
+
59
+ def render_action_output(line)
60
+ render_line line, RenderActionLineOpts
61
+ end
62
+ RenderActionLineOpts = { :tabs => 1 }
63
+
64
+ def command?(action_result)
65
+ if command = action_result['description']
66
+ if match = command.match(/^(create )(.*)/)
67
+ "ADD: #{match[2]}"
68
+ else
69
+ "RUN: #{command}"
70
+ end
71
+ end
72
+ end
73
+
74
+ end
75
+ end
76
+ end; end
@@ -0,0 +1,9 @@
1
+ module DTK::Client; class TaskStatus::StreamMode::Element::HierarchicalTask
2
+ class Results
3
+ class Components < self
4
+ def render_results(results_per_node)
5
+ render_errors(results_per_node)
6
+ end
7
+ end
8
+ end
9
+ end; end
@@ -0,0 +1,9 @@
1
+ module DTK::Client; class TaskStatus::StreamMode::Element::HierarchicalTask
2
+ class Results
3
+ class NodeLevel < self
4
+ def render_results(results_per_node)
5
+ render_errors(results_per_node)
6
+ end
7
+ end
8
+ end
9
+ end; end
@@ -0,0 +1,55 @@
1
+ module DTK::Client; class TaskStatus::StreamMode::Element
2
+ class HierarchicalTask
3
+ class Results < self
4
+ require File.expand_path('result/action', File.dirname(__FILE__))
5
+ require File.expand_path('result/components', File.dirname(__FILE__))
6
+ require File.expand_path('result/node_level', File.dirname(__FILE__))
7
+
8
+ def initialize(element, hash)
9
+ super
10
+ @errors = hash['errors'] || []
11
+ end
12
+
13
+
14
+ def self.render(element, stage_subtasks)
15
+ results_per_node = base_subtasks(element, stage_subtasks)
16
+ return if results_per_node.empty?
17
+ # assumption is that if multipe results_per_node they are same type
18
+ results_per_node.first.render_results(results_per_node)
19
+ end
20
+
21
+ protected
22
+
23
+ attr_reader :errors
24
+
25
+ def render_errors(results_per_node)
26
+ return unless results_per_node.find { |result| not result.errors.empty?}
27
+ first_time = true
28
+ results_per_node.each do |result|
29
+ if first_time
30
+ render_line 'ERRORS:'
31
+ first_time = false
32
+ end
33
+ result.render_node_errors
34
+ end
35
+ end
36
+
37
+ def render_node_errors
38
+ return if @errors.empty?
39
+ render_node_term
40
+ @errors.each do |error|
41
+ if err_msg = error['message']
42
+ render_error_line err_msg
43
+ render_empty_line
44
+ end
45
+ end
46
+ end
47
+
48
+ def render_error_line(line, opts = {})
49
+ render_line(line, ErrorRenderOpts.merge(opts))
50
+ end
51
+ ErrorRenderOpts = { :tabs => 1}
52
+
53
+ end
54
+ end
55
+ end; end