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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 90044fb0aeac2ab716a8bbad16eab81ba09b177f
4
- data.tar.gz: af29727daadaa126bc8b3ea39e8515b49e8ace37
3
+ metadata.gz: c80ce06a9a9d822a933c7613d0d2e608e68bf8ea
4
+ data.tar.gz: 516e42bae79455ea32c275236df7720ef683a4a2
5
5
  SHA512:
6
- metadata.gz: 4d40f5739a3921835fb2c38cad3428134f807091327c50eb40c7066cc1fa8168dc1e8c60da2e26fd9c7ceb6c6940f6d81e74001717a6bd0c0f5335bb3abbf7ae
7
- data.tar.gz: e2ab0c0121f8034da2262595f5f7caabe81d6cd85a37a72b7fe6983d480ea89503779e8bb2aef0e5efc4d8d512d8088929db0ec4f634a33a920444e0f2c77326
6
+ metadata.gz: 4d4df462ad21ae5516dfcb89de0949d7c6537814365d93b44a666a099853f17521b5f20c31aa1b286293dff22bffcaabff76bdd8aba9f655fbd879b53a546bd7
7
+ data.tar.gz: 28cd24c15adab48e77f888ff9205954b479866d9a532d69785218c638e51d57ccc69d62517d16109e7c8eac8f8a25f090e10c2625c0c1405bd4ec26df76661e0
data/bin/dtk CHANGED
@@ -5,7 +5,7 @@ $shell_mode = false
5
5
 
6
6
  require File.expand_path('../lib/client', File.dirname(__FILE__))
7
7
  require File.expand_path('../lib/configurator', File.dirname(__FILE__))
8
- require File.expand_path('../lib/parser/adapters/thor', File.dirname(__FILE__))
8
+ require File.expand_path('../lib/parser/adapters/thor', File.dirname(__FILE__))
9
9
  require File.expand_path('../lib/shell/context', File.dirname(__FILE__))
10
10
  require File.expand_path('../lib/shell/domain/context_entity', File.dirname(__FILE__))
11
11
  require File.expand_path('../lib/shell/domain/active_context', File.dirname(__FILE__))
@@ -17,6 +17,17 @@ require File.expand_path('../lib/shell/parse_monkey_patch', File.dirname(__FILE_
17
17
  require File.expand_path('../lib/shell/help_monkey_patch', File.dirname(__FILE__))
18
18
  require File.expand_path('../lib/execute/cli_pure/cli_rerouter', File.dirname(__FILE__))
19
19
 
20
+ paths = []
21
+ paths << File.expand_path('../lib/commands/thor/*.rb', File.dirname(__FILE__))
22
+ paths << File.expand_path('../lib/commands/common/thor/*.rb', File.dirname(__FILE__))
23
+
24
+ paths.each do |path|
25
+ Dir[path].each do |thor_class_file|
26
+ require thor_class_file
27
+ end
28
+ end
29
+
30
+
20
31
 
21
32
  require 'shellwords'
22
33
  require 'json'
data/dtk-client.gemspec CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |gem|
29
29
  gem.add_dependency 'hirb','~> 0.7.0'
30
30
  gem.add_dependency 'thor','~> 0.15.4'
31
31
  gem.add_dependency 'erubis','~> 2.7.0'
32
- gem.add_dependency 'dtk-common-core','0.7.2'
32
+ gem.add_dependency 'dtk-common-core','0.7.3'
33
33
  gem.add_dependency 'git','1.2.8'
34
34
  gem.add_dependency 'colorize','~> 0.5.8'
35
35
  gem.add_dependency 'highline', '1.6.16'
@@ -0,0 +1,139 @@
1
+ module DTK; module Client; class CommandHelper
2
+ class GitRepo
3
+ class Merge
4
+ def initialize(repo, remote_branch_ref, opts = {})
5
+ @repo = repo
6
+ @remote_branch_ref = remote_branch_ref
7
+ @local_branch = repo.local_branch_name
8
+ # options
9
+ @opts_commit_sha = opts[:commit_sha]
10
+ @opts_force = opts[:force]
11
+ @opts_merge_if_no_conflict = opts[:merge_if_no_conflict]
12
+ @opts_ignore_dependency_merge_conflict = opts[:ignore_dependency_merge_conflict]
13
+ @opts_full_module_name = opts[:full_module_name]
14
+ end
15
+
16
+ def self.merge(repo, remote_branch_ref, opts = {})
17
+ new(repo, remote_branch_ref, opts).merge
18
+ end
19
+
20
+ def merge
21
+ if @opts_force
22
+ merge_force()
23
+ else
24
+ # check if merge needed
25
+ merge_rel = merge_relationship()
26
+ case merge_rel
27
+ when :equal
28
+ response__no_diffs()
29
+ when :local_ahead, :branchpoint
30
+ merge_not_fast_forward(merge_rel)
31
+ when :local_behind
32
+ merge_simple()
33
+ else
34
+ raise Error.new("Unexpected merge_rel (#{merge_rel})")
35
+ end
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def merge_force
42
+ diffs = compute_diffs()
43
+ # TODO: should put in a commit message that merged from remote repo
44
+ @repo.merge_theirs(@remote_branch_ref)
45
+ response(diffs)
46
+ end
47
+
48
+ def merge_not_fast_forward(merge_rel)
49
+ if @opts_merge_if_no_conflict
50
+ if any_conflicts?
51
+ msg = 'Unable to do pull-dtkn merge without conflicts. Options are:'
52
+ msg << " a) command 'pull-dtkn --force', but all local changes will be lost or"
53
+ msg << " b) use command 'edit' to get in linux shell and directly use git commands."
54
+ raise ErrorUsage.new(msg)
55
+ else
56
+ if merge_rel == :local_ahead
57
+ response__no_diffs(:custom_message => 'No op because local module is ahead')
58
+ else
59
+ merge_simple()
60
+ end
61
+ end
62
+ elsif @opts_force
63
+ merge_force()
64
+ elsif @opts_ignore_dependency_merge_conflict
65
+ custom_message = "Unable to do fast-forward merge. You can go to '#{@opts_full_module_name}' and pull with --force option but all changes will be lost."
66
+ # TODO: should this instead by ErrorUsage.new like below
67
+ response(:custom_message => :custom_message)
68
+ else
69
+ # this will only be reached if opts_merge_if_no_conflict is false
70
+ raise ErrorUsage.new('Unable to do fast-forward merge. You can use --force on pull-dtkn, but all local changes will be lost.')
71
+ end
72
+ end
73
+
74
+ def merge_simple
75
+ # see if any diffs between fetched remote and local branch
76
+ # this has be done after commit
77
+ diffs = compute_diffs()
78
+ return diffs unless diffs.any_diffs?()
79
+
80
+ safe_execute do
81
+ # TODO: should put in a commit message that merged from remote repo
82
+ @repo.merge(@remote_branch_ref)
83
+ end
84
+
85
+ if commit_sha = @opts_commit_sha
86
+ if commit_sha != @repo.head_commit_sha()
87
+ raise Error.new("Git synchronization problem: expected local head to have sha (#{commit_sha})")
88
+ end
89
+ end
90
+
91
+ response(diffs)
92
+ end
93
+
94
+ def merge_relationship
95
+ @repo.merge_relationship(:remote_branch, @remote_branch_ref)
96
+ end
97
+
98
+ def any_conflicts?
99
+ # TODO: optimization is to combine this with mereg to have merge_if_no_conflics?
100
+ # and if no conflicts just commit and merge --no-commit
101
+ ret = nil
102
+ begin
103
+ @repo.command('merge',['--no-commit', @remote_branch_ref])
104
+ rescue ::Git::GitExecuteError
105
+ ret = true
106
+ ensure
107
+ safe_execute do
108
+ @repo.command('merge',['--abort'])
109
+ end
110
+ end
111
+ ret
112
+ end
113
+
114
+ def response__no_diffs(opts_response = {})
115
+ response(diffs__no_diffs(), opts_response)
116
+ end
117
+
118
+ def response(diffs, opts_response = {})
119
+ { :diffs => diffs, :commit_sha => @repo.head_commit_sha() }.merge(opts_response)
120
+ end
121
+
122
+ def diffs__no_diffs
123
+ GitRepo.diffs__no_diffs
124
+ end
125
+
126
+ def compute_diffs
127
+ GitRepo.compute_diffs(@repo, @remote_branch_ref)
128
+ end
129
+
130
+ def safe_execute(&block)
131
+ begin
132
+ yield
133
+ rescue Exception
134
+ nil
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end; end; end
@@ -7,7 +7,8 @@ dtk_require("../domain/git_error_handler")
7
7
 
8
8
  module DTK; module Client; class CommandHelper
9
9
  class GitRepo < self; class << self
10
-
10
+ dtk_require('git_repo/merge')
11
+
11
12
  def create(repo_dir,branch=nil,opts={})
12
13
  GitAdapter.new(repo_dir, branch)
13
14
  end
@@ -357,8 +358,15 @@ module DTK; module Client; class CommandHelper
357
358
  end
358
359
  commit_sha = repo.find_remote_sha(remote_branch_ref)
359
360
  else
360
- where = opts[:where]||'server'
361
- raise ErrorUsage.new("Merge needed before module (#{pp_module(repo)}) can be pushed to #{where}. If you want to force push use '--force' option.")
361
+ where = opts[:where] || 'server'
362
+ msg = "Merge needed before module (#{pp_module(repo)}) can be pushed to #{where}. "
363
+ if where.to_sym == :catalog
364
+ msg << " Either a merge into the local module can be done with pull-dtkn command, followed by push-dtkn or force"
365
+ else
366
+ msg << "Force"
367
+ end
368
+ msg << " push can be used with the '--force' option, but this will overwrite remote contents"
369
+ raise ErrorUsage.new(msg)
362
370
  end
363
371
  elsif merge_rel == :no_remote_ref
364
372
  repo.push(remote_branch_ref)
@@ -447,16 +455,27 @@ module DTK; module Client; class CommandHelper
447
455
  { "diffs" => (diffs[:diffs]||"").to_s, "status" => repo.local_summary() }
448
456
  end
449
457
 
458
+
459
+ def diffs__no_diffs
460
+ DiffSummary.new
461
+ end
462
+ def compute_diffs(repo, remote_branch_ref)
463
+ DiffSummary.diff(repo, repo.local_branch_name, remote_branch_ref)
464
+ end
465
+ public :diffs__no_diffs, :compute_diffs
466
+
450
467
  def pull_repo_changes_aux(repo, opts = {})
451
- diffs = DiffSummary.new()
452
- hard_reset = opts[:hard_reset] || opts[:force]
468
+ # TODO: cleanup use of hard_reset and force
469
+ force = opts[:hard_reset] || opts[:force]
453
470
 
454
471
  # default commit in case it is needed
455
- repo.stage_and_commit('Commit prior to pull from remote') if repo.changed?
472
+ if repo.changed?
473
+ repo.stage_and_commit('Commit prior to pull from remote')
474
+ end
456
475
 
457
476
  if commit_sha = opts[:commit_sha]
458
477
  # no op if at commit_sha
459
- return diffs if (commit_sha == repo.head_commit_sha()) && !hard_reset
478
+ return diffs__no_diffs if (commit_sha == repo.head_commit_sha()) && !force
460
479
  end
461
480
 
462
481
  if opts[:remote_repo] && opts[:remote_repo_url]
@@ -464,50 +483,9 @@ module DTK; module Client; class CommandHelper
464
483
  end
465
484
 
466
485
  repo.fetch(remote(opts[:remote_repo]))
467
- local_branch = repo.local_branch_name
468
- remote_branch_ref = remote_branch_ref(local_branch, opts)
469
-
470
- if hard_reset
471
- diffs = DiffSummary.diff(repo, local_branch, remote_branch_ref)
472
- repo.merge_theirs(remote_branch_ref)
473
- return({ :diffs => diffs, :commit_sha => repo.head_commit_sha() })
474
- end
475
-
476
- # check if merge needed
477
- merge_rel = repo.merge_relationship(:remote_branch, remote_branch_ref)
478
- if merge_rel == :equal
479
- { :diffs => diffs, :commit_sha => repo.head_commit_sha() }
480
- elsif [:branchpoint, :local_ahead].include?(merge_rel)
481
- if opts[:force]
482
- # TODO: right now just wiping out what is in repo
483
- diffs = DiffSummary.diff(repo, local_branch, remote_branch_ref)
484
- repo.merge_theirs(remote_branch_ref)
485
- { :diffs => diffs, :commit_sha => repo.head_commit_sha() }
486
- elsif opts[:ignore_dependency_merge_conflict]
487
- { :diffs => diffs, :commit_sha => repo.head_commit_sha(), :custom_message => "Unable to do fast-forward merge. You can go to '#{opts[:full_module_name]}' and pull with --force option but all changes will be lost." }
488
- else
489
- raise Error.new('Unable to do fast-forward merge. You can use --force but all changes will be lost.')
490
- end
491
- elsif merge_rel == :local_behind
492
- # see if any diffs between fetched remote and local branch
493
- # this has be done after commit
494
- diffs = DiffSummary.diff(repo, local_branch, remote_branch_ref)
495
- return diffs unless diffs.any_diffs?()
496
-
497
- begin
498
- repo.merge(remote_branch_ref)
499
- rescue Exception => e
500
- puts e
501
- end
502
-
503
- if commit_sha && commit_sha != repo.head_commit_sha()
504
- raise Error.new("Git synchronization problem: expected local head to have sha (#{commit_sha})")
505
- end
506
-
507
- { :diffs => diffs, :commit_sha => repo.head_commit_sha() }
508
- else
509
- raise Error.new("Unexpected merge_rel (#{merge_rel})")
510
- end
486
+ remote_branch_ref = remote_branch_ref(repo.local_branch_name, opts)
487
+ # TODO: cleanup use of hard_reset and force; Merge.merge just uses :force
488
+ Merge.merge(repo, remote_branch_ref, opts.merge(:force => force))
511
489
  end
512
490
 
513
491
  def remote(remote_repo=nil)
@@ -32,7 +32,7 @@ module DTK::Client
32
32
  new_context_params.add_context_to_params(module_type, module_type)
33
33
  new_context_params.add_context_name_to_params(module_type, module_type, module_name)
34
34
 
35
- forwarded_opts = { skip_recursive_pull: true, ignore_dependency_merge_conflict: true }
35
+ forwarded_opts = { :skip_recursive_pull => true, :ignore_dependency_merge_conflict => true }
36
36
  forwarded_opts.merge!(:do_not_raise => true) if opts[:do_not_raise]
37
37
  new_context_params.forward_options(forwarded_opts)
38
38
 
@@ -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/set_required_attributes')
9
9
  dtk_require_common_commands('thor/edit')
10
10
  dtk_require_common_commands('thor/purge_clone')
@@ -89,6 +89,7 @@ module DTK::Client
89
89
  # synchronize_clone will load new assembly template into service clone on workspace (if it exists)
90
90
  commit_sha, workspace_branch, namespace, full_module_name, repo_url, version = response.data(:commit_sha, :workspace_branch, :module_namespace, :full_module_name, :repo_url, :version)
91
91
  service_module_name ||= response.data(:module_name)
92
+ merge_warning_message = response.data(:merge_warning_message)
92
93
  opts = { :local_branch => workspace_branch, :namespace => namespace }
93
94
 
94
95
  if (mode == :update) || local_clone_dir_exists
@@ -98,7 +99,9 @@ module DTK::Client
98
99
  end
99
100
  return response unless response.ok?
100
101
 
101
- DTK::Client::OsUtil.print("New assembly template '#{assembly_template_name}' created in service module '#{full_module_name}'.", :yellow) if mode == :create
102
+ OsUtil.print("New assembly template '#{assembly_template_name}' created in service module '#{full_module_name}'.", :yellow) if mode == :create
103
+ OsUtil.print(merge_warning_message, :yellow) if merge_warning_message
104
+
102
105
  response
103
106
  end
104
107
 
@@ -141,8 +144,8 @@ module DTK::Client
141
144
  response = post rest_url("assembly/ad_hoc_action_execute"), post_body
142
145
  return response unless response.ok?
143
146
 
144
- task_status_stream(assembly_or_workspace_id)
145
- Response::Ok.new()
147
+ task_status_stream(assembly_or_workspace_id, :ignore_stage_level_info => true)
148
+ nil
146
149
  end
147
150
 
148
151
  def converge_aux(context_params,opts={})
@@ -155,7 +158,7 @@ module DTK::Client
155
158
  return response unless response.ok?
156
159
  if response.data and response.data.size > 0
157
160
  error_message = "The following violations were found; they must be corrected before workspace can be converged"
158
- DTK::Client::OsUtil.print(error_message, :red)
161
+ OsUtil.print(error_message, :red)
159
162
  return response.render_table(:violation)
160
163
  end
161
164
 
@@ -176,9 +179,14 @@ module DTK::Client
176
179
  return response unless response.ok?
177
180
  end
178
181
  end
182
+ unless task_id = response.data(:task_id)
183
+ if message = response.data(:message)
184
+ OsUtil.print(message, :yellow)
185
+ end
186
+ return Response::Ok.new()
187
+ end
179
188
 
180
189
  # execute task
181
- task_id = response.data(:task_id)
182
190
  response = post rest_url("task/execute"), "task_id" => task_id
183
191
  return response unless response.ok?
184
192
 
@@ -319,7 +327,7 @@ module DTK::Client
319
327
  return response unless response.ok?
320
328
  return Response::Ok.new() unless response.data(:any_updates)
321
329
  if dsl_parsing_errors = response.data(:dsl_parsing_errors)
322
- error_message = "Module '#{component_module_name}' parsing errors found:\n#{dsl_parsing_errors}\nYou can fix errors using 'edit' command from module context and invoke promote-module-updates again.\n"
330
+ error_message = "Module '#{component_module_name}' parsing errors found:\n#{dsl_parsing_errors}\nYou can fix errors using 'edit' command from referenced service modules and then invoke 'push-component-module-updates' again from this context.\n"
323
331
  OsUtil.print(error_message, :red)
324
332
  return Response::NoOp.new()
325
333
  end
@@ -341,10 +349,11 @@ module DTK::Client
341
349
  :module_type => 'component_module'
342
350
  }
343
351
  post_body.merge!(:force => true) if options.force?
344
- response = post(rest_url("assembly/get_component_module_info"),post_body)
352
+ response = post(rest_url("assembly/prepare_for_pull_from_base"),post_body)
345
353
  return response unless response.ok?
346
354
 
347
355
  if dsl_parsing_errors = response.data(:dsl_parsing_errors)
356
+ # TODO: DTK-2206; think error message below is incorrect
348
357
  error_message = "Module '#{component_module_name}' parsing errors found:\n#{dsl_parsing_errors}\nYou can fix errors using 'edit' command from module context and invoke promote-module-updates again.\n"
349
358
  OsUtil.print(error_message, :red)
350
359
  return Response::Error.new()
@@ -420,8 +429,13 @@ module DTK::Client
420
429
  end
421
430
  response = task_status_aux(mode,assembly_or_workspace_id,:assembly,:summarize => options.summarize?)
422
431
 
423
- # TODO: Hack which is necessery for the specific problem (DTK-725), we don't get proper error message when there is a timeout doing converge
424
- unless mode == :stream
432
+ if mode == :stream
433
+ #no response if ok
434
+ response unless response.ok?
435
+ else
436
+ # TODO: Hack which is necessery for the specific problem (DTK-725),
437
+ # we don't get proper error message when there is a timeout doing converge
438
+
425
439
  unless response == true
426
440
  return response.merge("data" => [{ "errors" => {"message" => "Task does not exist for workspace."}}]) unless response["data"]
427
441
  response["data"].each do |data|
@@ -430,9 +444,8 @@ module DTK::Client
430
444
  end
431
445
  end
432
446
  end
447
+ response
433
448
  end
434
-
435
- response
436
449
  end
437
450
 
438
451
  def task_action_detail_aw_aux(context_params)
@@ -534,7 +547,6 @@ module DTK::Client
534
547
  assembly_or_workspace_id, dep_cmp, antec_cmp, dependency_name = context_params.retrieve_arguments([REQ_ASSEMBLY_OR_WS_ID, :option_1!, :option_2!, :option_3], method_argument_names)
535
548
  end
536
549
 
537
- antec_cmp = "assembly_wide/#{antec_cmp}" unless antec_cmp.include?('/')
538
550
  post_body = {
539
551
  :assembly_id => assembly_or_workspace_id,
540
552
  :input_component_id => dep_cmp,
@@ -706,10 +718,10 @@ module DTK::Client
706
718
  :pattern => pattern
707
719
  }
708
720
 
709
- raise DTK::Client::DtkValidationError, 'Please use only component-attribute (-c) or node-attribute (-n) option' if options.component_attribute? && options.node_attribute?
721
+ raise DtkValidationError, 'Please use only component-attribute (-c) or node-attribute (-n) option' if options.component_attribute? && options.node_attribute?
710
722
 
711
723
  # if try to set service instance attribute but using -n option to sepicify it is node attribute, say that node attribute does not exist
712
- raise DTK::Client::DtkError, "[ERROR] Node attribute '#{pattern}' does not exist" if options.node_attribute? && !pattern.include?('/')
724
+ raise DtkError, "[ERROR] Node attribute '#{pattern}' does not exist" if options.node_attribute? && !pattern.include?('/')
713
725
 
714
726
  # make sure -c and -n are used only with node or cmp attributes directly on service instance
715
727
  validate_service_instance_node_or_cmp_attrs(pattern, options) if options.component_attribute? || options.node_attribute?
@@ -725,7 +737,7 @@ module DTK::Client
725
737
  if r_data.is_a?(Hash) && (ambiguous = r_data['ambiguous'])
726
738
  unless ambiguous.empty?
727
739
  msg = "It is ambiguous whether '#{ambiguous.join(', ')}' #{ambiguous.size == 1 ? 'is' : 'are'} node or component attribute(s). Run set-attribute again with one of options -c [--component-attribute] or -n [--node-attribute]."
728
- raise DTK::Client::DtkError, msg
740
+ raise DtkError, msg
729
741
  end
730
742
  end
731
743
  end
@@ -888,6 +900,7 @@ module DTK::Client
888
900
  node_id, component_id = component_id.split('/')
889
901
  node_name = node_id
890
902
  else
903
+ # TODO: update server so dont have to pass in 'assembly_wide'
891
904
  node_id = node_name = 'assembly_wide'
892
905
  end
893
906
  end
@@ -916,7 +929,7 @@ module DTK::Client
916
929
  }
917
930
 
918
931
  response = post(rest_url("assembly/initiate_get_netstats"),post_body)
919
- raise DTK::Client::DtkValidationError, response.data(:errors) if response.data(:errors)
932
+ raise DtkValidationError, response.data(:errors) if response.data(:errors)
920
933
  return response unless response.ok?
921
934
 
922
935
  action_results_id = response.data(:action_results_id)
@@ -957,7 +970,7 @@ module DTK::Client
957
970
  begin
958
971
  execute_test_tries = Integer(options['timeout'])
959
972
  rescue
960
- raise DTK::Client::DtkValidationError, "Timeout value is not valid"
973
+ raise DtkValidationError, "Timeout value is not valid"
961
974
  end
962
975
  end
963
976
 
@@ -969,7 +982,7 @@ module DTK::Client
969
982
 
970
983
  response = post(rest_url("assembly/initiate_execute_tests"),post_body)
971
984
 
972
- raise DTK::Client::DtkValidationError, response.data(:errors) if response.data(:errors)
985
+ raise DtkValidationError, response.data(:errors) if response.data(:errors)
973
986
  return response unless response.ok?
974
987
 
975
988
  action_results_id = response.data(:action_results_id)
@@ -1004,9 +1017,9 @@ module DTK::Client
1004
1017
  end
1005
1018
 
1006
1019
  if (response.data(:results).empty? && options['timeout'].nil?)
1007
- raise DTK::Client::DtkValidationError, "Could not finish execution of tests in default timeframe (#{execute_test_tries} seconds). Try again with passing --timeout TIMEOUT parameter"
1020
+ raise DtkValidationError, "Could not finish execution of tests in default timeframe (#{execute_test_tries} seconds). Try again with passing --timeout TIMEOUT parameter"
1008
1021
  elsif (response.data(:results).empty? && !options['timeout'].nil?)
1009
- raise DTK::Client::DtkValidationError, "Could not finish execution of tests in set timeframe (#{execute_test_tries} seconds). Try again with increasing --timeout TIMEOUT parameter"
1022
+ raise DtkValidationError, "Could not finish execution of tests in set timeframe (#{execute_test_tries} seconds). Try again with increasing --timeout TIMEOUT parameter"
1010
1023
  else
1011
1024
  response.print_error_table = true
1012
1025
  response.set_data(*response.data(:results))
@@ -1026,7 +1039,7 @@ module DTK::Client
1026
1039
  }
1027
1040
 
1028
1041
  response = post(rest_url("assembly/initiate_get_ps"),post_body)
1029
- raise DTK::Client::DtkValidationError, response.data(:errors) if response.data(:errors)
1042
+ raise DtkValidationError, response.data(:errors) if response.data(:errors)
1030
1043
  return response unless response.ok?
1031
1044
 
1032
1045
  action_results_id = response.data(:action_results_id)
@@ -1114,10 +1127,10 @@ module DTK::Client
1114
1127
  }
1115
1128
 
1116
1129
  response = post rest_url("assembly/initiate_get_log"), post_body
1117
- raise DTK::Client::DtkValidationError, response.data(:errors) if response.data(:errors)
1130
+ raise DtkValidationError, response.data(:errors) if response.data(:errors)
1118
1131
 
1119
1132
  unless response.ok?
1120
- raise DTK::Client::DtkError, "Error while getting log from server, there was no successful response."
1133
+ raise DtkError, "Error while getting log from server, there was no successful response."
1121
1134
  end
1122
1135
 
1123
1136
  action_results_id = response.data(:action_results_id)
@@ -1134,7 +1147,7 @@ module DTK::Client
1134
1147
  # server has found an error
1135
1148
  unless response.data(:results).nil?
1136
1149
  if response.data(:results)['error']
1137
- raise DTK::Client::DtkError, response.data(:results)['error']
1150
+ raise DtkError, response.data(:results)['error']
1138
1151
  end
1139
1152
  end
1140
1153
 
@@ -1148,7 +1161,7 @@ module DTK::Client
1148
1161
  response = response.data(:results).first[1]
1149
1162
 
1150
1163
  unless response["error"].nil?
1151
- raise DTK::Client::DtkError, response["error"]
1164
+ raise DtkError, response["error"]
1152
1165
  end
1153
1166
 
1154
1167
  # removing invalid chars from log
@@ -1195,7 +1208,7 @@ module DTK::Client
1195
1208
  t2.join()
1196
1209
  rescue Interrupt
1197
1210
  t2.exit()
1198
- rescue DTK::Client::DtkError => e
1211
+ rescue DtkError => e
1199
1212
  t2.exit()
1200
1213
  raise e
1201
1214
  end
@@ -1222,10 +1235,10 @@ module DTK::Client
1222
1235
  }
1223
1236
 
1224
1237
  response = post rest_url("assembly/initiate_grep"), post_body
1225
- raise DTK::Client::DtkValidationError, response.data(:errors) if response.data(:errors)
1238
+ raise DtkValidationError, response.data(:errors) if response.data(:errors)
1226
1239
 
1227
1240
  unless response.ok?
1228
- raise DTK::Client::DtkError, "Error while getting log from server. Message: #{response['errors'][0]['message'].nil? ? 'There was no successful response.' : response['errors'].first['message']}"
1241
+ raise DtkError, "Error while getting log from server. Message: #{response['errors'][0]['message'].nil? ? 'There was no successful response.' : response['errors'].first['message']}"
1229
1242
  end
1230
1243
 
1231
1244
  action_results_id = response.data(:action_results_id)
@@ -1242,7 +1255,7 @@ module DTK::Client
1242
1255
  # server has found an error
1243
1256
  unless response.data(:results).nil?
1244
1257
  if response.data(:results)['error']
1245
- raise DTK::Client::DtkError, response.data(:results)['error']
1258
+ raise DtkError, response.data(:results)['error']
1246
1259
  end
1247
1260
  end
1248
1261
 
@@ -1251,14 +1264,14 @@ module DTK::Client
1251
1264
  sleep(1)
1252
1265
  end
1253
1266
 
1254
- raise DTK::Client::DtkError, "Error while logging there was no successful response after 3 tries." unless response.data(:is_complete)
1267
+ raise DtkError, "Error while logging there was no successful response after 3 tries." unless response.data(:is_complete)
1255
1268
 
1256
1269
  console_width = ENV["COLUMNS"].to_i
1257
1270
 
1258
1271
  response.data(:results).each do |r|
1259
- raise DTK::Client::DtkError, r[1]["error"] if r[1]["error"]
1272
+ raise DtkError, r[1]["error"] if r[1]["error"]
1260
1273
 
1261
- message_colorized = DTK::Client::OsUtil.colorize(r[0].inspect, :green)
1274
+ message_colorized = OsUtil.colorize(r[0].inspect, :green)
1262
1275
 
1263
1276
  if r[1]["output"].empty?
1264
1277
  puts "NODE-ID #{message_colorized} - Log does not contain data that matches you pattern #{grep_pattern}!"
@@ -1272,7 +1285,7 @@ module DTK::Client
1272
1285
  puts r[1]["output"].gsub(/`/,'\'')
1273
1286
  end
1274
1287
  end
1275
- rescue DTK::Client::DtkError => e
1288
+ rescue DtkError => e
1276
1289
  raise e
1277
1290
  end
1278
1291
  end
@@ -1286,7 +1299,7 @@ module DTK::Client
1286
1299
  # we expect action result ID
1287
1300
  response = post rest_url("assembly/start"), post_body
1288
1301
  return response unless response.ok?()
1289
- raise DTK::Client::DtkValidationError, response.data(:errors).first if response.data(:errors)
1302
+ raise DtkValidationError, response.data(:errors).first if response.data(:errors)
1290
1303
 
1291
1304
  task_id = response.data(:task_id)
1292
1305
  post rest_url("task/execute"), "task_id" => task_id
@@ -1300,7 +1313,7 @@ module DTK::Client
1300
1313
 
1301
1314
  response = post rest_url("assembly/stop"), post_body
1302
1315
  return response unless response.ok?()
1303
- raise DTK::Client::DtkValidationError, response.data(:errors).first if response.data(:errors)
1316
+ raise DtkValidationError, response.data(:errors).first if response.data(:errors)
1304
1317
 
1305
1318
  response
1306
1319
  end
@@ -1365,7 +1378,7 @@ module DTK::Client
1365
1378
  rest_endpoint = "assembly/info_about"
1366
1379
 
1367
1380
  if context_params.is_last_command_eql_to?(:attribute)
1368
- raise DTK::Client::DtkError, "Not supported command for current context level." if attribute_id
1381
+ raise DtkError, "Not supported command for current context level." if attribute_id
1369
1382
  about, data_type = get_type_and_raise_error_if_invalid(about, "attributes", ["attributes"])
1370
1383
  elsif context_params.is_last_command_eql_to?(:component)
1371
1384
  if component_id
@@ -1420,9 +1433,9 @@ module DTK::Client
1420
1433
  split_pattern = pattern.split('/')
1421
1434
  return if split_pattern.size == 2
1422
1435
  if options.node_attribute?
1423
- raise DTK::Client::DtkError, 'Please use -n option only with service instance node attributes (node_name/attribute_name)'
1436
+ raise DtkError, 'Please use -n option only with service instance node attributes (node_name/attribute_name)'
1424
1437
  elsif options.component_attribute?
1425
- raise DTK::Client::DtkError, 'Please use -c option only with service instance component attributes (cmp_name/attribute_name)'
1438
+ raise DtkError, 'Please use -c option only with service instance component attributes (cmp_name/attribute_name)'
1426
1439
  end
1427
1440
  end
1428
1441
  end
@@ -28,13 +28,21 @@ module DTK::Client
28
28
  end
29
29
 
30
30
  # check whether a local module exists to determine whether pull from local clone or try to pull from server
31
- OsUtil.print("Pulling changes from remote: #{remote_params[:remote_repo]} @ #{remote_params[:remote_repo_url]}")
31
+ # TODO: probably remove OsUtil.print("Pulling changes from remote: #{remote_params[:remote_repo]} @ #{remote_params[:remote_repo_url]}")
32
32
 
33
33
  if Helper(:git_repo).local_clone_dir_exists?(module_type,module_name,:full_module_name=>full_module_name,:version=>version)
34
34
  unless rsa_pub_key
35
35
  raise DtkError,"No File found at (#{path_to_key}). Path is wrong or it is necessary to generate the public rsa key (e.g., run ssh-keygen -t rsa)"
36
36
  end
37
- opts_perform_locally = remote_params.merge(:full_module_name => full_module_name, :force => opts[:force], :do_not_raise => opts[:do_not_raise], :ignore_dependency_merge_conflict => opts[:ignore_dependency_merge_conflict])
37
+ # making :merge_if_no_conflict the default (when force not set)
38
+ merge_if_no_conflict = (opts[:force] ? nil : true)
39
+ opts_perform_locally = remote_params.merge(
40
+ :full_module_name => full_module_name,
41
+ :force => opts[:force],
42
+ :merge_if_no_conflict => merge_if_no_conflict,
43
+ :do_not_raise => opts[:do_not_raise],
44
+ :ignore_dependency_merge_conflict => opts[:ignore_dependency_merge_conflict]
45
+ )
38
46
  PullFromRemote.perform_locally(self,module_type,module_id,module_name,opts_perform_locally)
39
47
  else
40
48
  # TODO: see if this works correctly
@@ -100,7 +108,7 @@ module DTK::Client
100
108
  puts "Changes pulled from remote"
101
109
  end
102
110
 
103
- return response
111
+ response
104
112
  end
105
113
 
106
114
  def self.perform_on_server(cmd_obj,module_type,module_id,module_name,remote_params)