dtk-client 0.11.0 → 0.11.1

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/bin/dtk-puppet +3 -2
  3. data/lib/cli/command/module/delete_from_remote.rb +1 -1
  4. data/lib/cli/command/module/list_assemblies.rb +1 -1
  5. data/lib/cli/command/module/list_remotes.rb +1 -1
  6. data/lib/cli/command/module/pull_dtkn.rb +4 -3
  7. data/lib/cli/command/service.rb +3 -0
  8. data/lib/cli/command/service/converge.rb +6 -1
  9. data/lib/cli/command/service/delete.rb +1 -1
  10. data/lib/cli/command/service/exec.rb +4 -4
  11. data/lib/cli/command/service/exec_sync.rb +2 -6
  12. data/lib/cli/command/service/link.rb +52 -0
  13. data/lib/cli/command/service/list_actions.rb +1 -1
  14. data/lib/cli/command/service/list_attributes.rb +1 -1
  15. data/lib/cli/command/service/list_component_links.rb +1 -1
  16. data/lib/cli/command/service/list_components.rb +1 -1
  17. data/lib/cli/command/service/list_dependencies.rb +1 -1
  18. data/lib/cli/command/service/list_nodes.rb +1 -1
  19. data/lib/cli/command/service/list_violations.rb +1 -1
  20. data/lib/cli/command/service/violation.rb +33 -0
  21. data/lib/cli/command/token.rb +6 -1
  22. data/lib/cli/runner.rb +7 -2
  23. data/lib/cli/version.rb +1 -1
  24. data/lib/client/error.rb +7 -2
  25. data/lib/client/operation/client_module_dir.rb +4 -4
  26. data/lib/client/operation/module/install/dependent_modules.rb +2 -2
  27. data/lib/client/operation/module/pull_dtkn.rb +10 -2
  28. data/lib/client/operation/module/push.rb +13 -2
  29. data/lib/client/operation/module/stage.rb +2 -2
  30. data/lib/client/operation/service.rb +1 -0
  31. data/lib/client/operation/service/converge.rb +0 -15
  32. data/lib/client/operation/service/exec.rb +0 -5
  33. data/lib/client/operation/service/link.rb +51 -0
  34. data/lib/client/operation/service/stage.rb +1 -1
  35. data/lib/client/operation/service/uninstall.rb +7 -5
  36. data/lib/client/render.rb +32 -15
  37. data/lib/client/response.rb +4 -0
  38. data/lib/client/response/error_handler.rb +2 -2
  39. data/lib/client/service_and_component_info/transform_from/info.rb +11 -1
  40. data/lib/client/service_and_component_info/transform_from/info/component.rb +1 -1
  41. metadata +5 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3489e815d77b396a9795163b8ce45dd40b7a5ce8
4
- data.tar.gz: de1620b5c1de32244743ff3b6f0eedbc6a5d36dd
3
+ metadata.gz: 254aaacc97b6cc8dde9c36ad4b06d0af2cda66b1
4
+ data.tar.gz: bb1fe62fcd2014f790ecab9a9b13aecbda698cd8
5
5
  SHA512:
6
- metadata.gz: 2b9378cf3c0b696f24434c0b0426c2f16a2e319f912d88cfc641d7eb5c826320e3a4d3f5adc8107704260dd5fca51a4a008ce33a4e1a0ef5255fc4ae0e229dfe
7
- data.tar.gz: c6cf8079566421eda45d057c9c30ee45a3a1b3a640aa48b751d8490df8e1a8280fc68739fb94684053a9191f03bf27d5c9b629ba0e3a65ed63b07541e981e974
6
+ metadata.gz: a7c6b9d6679aa46239b60d9db561a1532c658a10f19b1df5eb963f7f7d62ff3996944a8a33a13fddcd63b3525be8f4f008e238bea58d77533148e21a6157c68e
7
+ data.tar.gz: 18961ad5eb9205cfd73207d605469eeda4c0e16086a1fcbe630865cd9de40843db4871e768b8cc7034889701f8db686249cc6e7db0ad48cff765e4a013c9cf35
data/bin/dtk-puppet CHANGED
@@ -25,7 +25,7 @@ module DTK
25
25
  #dtk_dsl must be loaded after GlobalForDSL set
26
26
  require 'dtk_dsl'
27
27
 
28
- Client::Error.top_level_trap_error do
28
+ return_code = Client::Error.top_level_trap_error do
29
29
  begin
30
30
  require 'puppet'
31
31
  rescue LoadError => e
@@ -35,4 +35,5 @@ module DTK
35
35
  require_relative '../lib/dtk_puppet'
36
36
  Puppet::Parser.parse(ARGV)
37
37
  end
38
- end
38
+ exit return_code
39
+ end
@@ -20,7 +20,7 @@ module DTK::Client
20
20
  module Module
21
21
  subcommand_def 'delete-from-remote' do |c|
22
22
  c.arg Token::Arg.module_name
23
- command_body c, 'delete-from-remote', 'Delete module from the DTK remote catalog (DTKN)' do |sc|
23
+ command_body c, 'delete-from-dtkn', 'Delete module from the DTK remote catalog (DTKN)' do |sc|
24
24
  sc.flag Token.version
25
25
  sc.switch Token.skip_prompt
26
26
 
@@ -19,7 +19,7 @@ module DTK::Client
19
19
  module CLI::Command
20
20
  module Module
21
21
  subcommand_def 'list-assemblies' do |c|
22
- command_body c, 'list-assemblies', 'List assemblies from all modules or specified module' do |sc|
22
+ command_body c, 'assemblies', 'List assemblies from all modules or specified module' do |sc|
23
23
  sc.switch Token.all, :desc => 'List assemblies from all modules'
24
24
  sc.flag Token.directory_path
25
25
  sc.action do |_global_options, options, _args|
@@ -19,7 +19,7 @@ module DTK::Client
19
19
  module CLI::Command
20
20
  module Module
21
21
  subcommand_def 'list-remotes' do |c|
22
- command_body c, 'list-remotes', 'List remote modules' do |sc|
22
+ command_body c, 'dtkn', 'List remote modules' do |sc|
23
23
  sc.flag Token.namespace
24
24
  sc.action do |_global_options, options, args|
25
25
  arg = {}
@@ -21,8 +21,8 @@ module DTK::Client
21
21
  subcommand_def 'pull-dtkn' do |c|
22
22
  command_body c, 'pull-dtkn', 'Pull content from repo manager to client module directory and push to server' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to module directory containing content to update; not need if in the module directory'
24
- sc.switch Token.skip_prompt
25
24
  sc.switch Token.force
25
+ sc.switch Token.update_deps
26
26
  sc.action do |_global_options, options, _args|
27
27
  module_ref = module_ref_object_from_options_or_context(options)
28
28
  operation_args = {
@@ -30,8 +30,9 @@ module DTK::Client
30
30
  :base_dsl_file_obj => @base_dsl_file_obj,
31
31
  :has_directory_param => !options["d"].nil?,
32
32
  :directory_path => options[:directory_path],
33
- :skip_prompt => options[:skip_prompt],
34
- :force => options[:f]
33
+ #:skip_prompt => options[:skip_prompt],
34
+ :force => options[:f],
35
+ :update_deps => options[:update_deps]
35
36
  }
36
37
  Operation::Module.pull_dtkn(operation_args)
37
38
  Operation::Module.push(operation_args.merge(:method => "pulled"))
@@ -19,6 +19,8 @@ module DTK::Client
19
19
  module CLI
20
20
  module Command
21
21
  module Service
22
+ require_relative('service/violation')
23
+
22
24
  include Command::Mixin
23
25
  ALL_SUBCOMMANDS = [
24
26
  'clone',
@@ -37,6 +39,7 @@ module DTK::Client
37
39
  'list-components',
38
40
  'list-nodes',
39
41
  'list-violations',
42
+ 'link',
40
43
  # 'start',
41
44
  # 'stop',
42
45
  'cancel-task',
@@ -30,7 +30,12 @@ module DTK::Client; module CLI
30
30
  :force => force,
31
31
  :module_dir => @base_dsl_file_obj.parent_dir
32
32
  }
33
- Operation::Service.converge(args)
33
+ response = Operation::Service.converge(args)
34
+ if violation_response = Violation.process_violations?(response)
35
+ violation_response
36
+ end
37
+ nil
38
+
34
39
  end
35
40
  end
36
41
  end
@@ -29,7 +29,7 @@ module DTK::Client; module CLI
29
29
  directory_path = options[:directory_path]
30
30
  purge = options[:purge]
31
31
  recursive = options[:recursive]
32
- force = options[:force]
32
+ force = options[:f]
33
33
  service_instance = service_instance_in_options_or_context(options)
34
34
 
35
35
  args = {
@@ -41,11 +41,11 @@ module DTK::Client
41
41
 
42
42
  response = Operation::Service.exec(args)
43
43
 
44
- if violations = response.data(:violations)
45
- response.set_data(violations)
46
- response.data.flatten!
47
- response.set_render_as_table!
44
+ if violation_response = Violation.process_violations?(response)
45
+ violation_response
48
46
  end
47
+ nil
48
+
49
49
  end
50
50
  end
51
51
  end
@@ -42,14 +42,10 @@ module DTK::Client
42
42
  unless response.ok?
43
43
  response
44
44
  else
45
- # TODO: break if any exceptions
46
-
47
45
  if response.data(:empty_workflow)
48
46
  Response::Ok.new
49
- elsif violations = response.data(:violations)
50
- response.set_data(violations)
51
- response.data.flatten!
52
- response.set_render_as_table!
47
+ elsif violation_response = Violation.process_violations?(response)
48
+ violation_response
53
49
  else
54
50
  Operation::Service.task_status(args.merge(:mode => 'stream'))
55
51
  end
@@ -0,0 +1,52 @@
1
+ #
2
+ # Copyright (C) 2010-2016 dtk contributors
3
+ #
4
+ # This file is part of the dtk project.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ module DTK::Client; module CLI
19
+ module Command
20
+ module Service
21
+ subcommand_def 'link' do |c|
22
+ c.arg Token::Arg.base_cmp
23
+ c.arg Token::Arg.deps_on_cmp
24
+ c.arg Token::Arg.service, :optional => true
25
+ command_body c, 'link', 'List component links in the service instance.' do |sc|
26
+ sc.flag Token.directory_path, :desc => 'Absolute or relative path to service instance directory containing updates to pull; not need if in the service instance directory'
27
+ sc.flag Token.link_name
28
+ sc.switch Token.unlink
29
+
30
+ sc.action do |_global_options, options, _args|
31
+ base_component = _args[0]
32
+ dependent_component = _args[1]
33
+ service = _args[2]
34
+ service_instance = service_instance_in_options_or_context(options)
35
+ link_name = options[:l] unless options[:l].nil?
36
+
37
+ args = {
38
+ :service_instance => service_instance,
39
+ :unlink => options["u"],
40
+ :base_component => base_component,
41
+ :dependent_component => dependent_component,
42
+ :service => service,
43
+ :link_name => link_name
44
+ }
45
+
46
+ Operation::Service.link(args)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end; end
@@ -19,7 +19,7 @@ module DTK::Client; module CLI
19
19
  module Command
20
20
  module Service
21
21
  subcommand_def 'list-actions' do |c|
22
- command_body c, 'list-actions', 'List the actions defined on components in the service instance.' do |sc|
22
+ command_body c, 'actions', 'List the actions defined on components in the service instance.' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to service instance directory containing updates to pull; not need if in the service instance directory'
24
24
  sc.flag Token.type, :desc => 'Filter actions based on type (service, component)'
25
25
 
@@ -19,7 +19,7 @@ module DTK::Client; module CLI
19
19
  module Command
20
20
  module Service
21
21
  subcommand_def 'list-attributes' do |c|
22
- command_body c, 'list-attributes', 'List attributes associated with service instance.' do |sc|
22
+ command_body c, 'attributes', 'List attributes associated with service instance.' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to service instance directory containing updates to pull; not need if in the service instance directory'
24
24
  sc.flag Token.node, :desc => 'Filter attributes by node'
25
25
  sc.flag Token.format
@@ -19,7 +19,7 @@ module DTK::Client; module CLI
19
19
  module Command
20
20
  module Service
21
21
  subcommand_def 'list-component-links' do |c|
22
- command_body c, 'list-component-links', 'List component links in the service instance.' do |sc|
22
+ command_body c, 'links', 'List component links in the service instance.' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to service instance directory containing updates to pull; not need if in the service instance directory'
24
24
 
25
25
  sc.action do |_global_options, options, _args|
@@ -19,7 +19,7 @@ module DTK::Client; module CLI
19
19
  module Command
20
20
  module Service
21
21
  subcommand_def 'list-components' do |c|
22
- command_body c, 'list-components', 'List components associated with the service instance.' do |sc|
22
+ command_body c, 'components', 'List components associated with the service instance.' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to service instance directory containing updates to pull; not need if in the service instance directory'
24
24
  sc.switch Token.dependencies, :desc => 'Show dependencies'
25
25
 
@@ -19,7 +19,7 @@ module DTK::Client; module CLI
19
19
  module Command
20
20
  module Service
21
21
  subcommand_def 'list-dependencies' do |c|
22
- command_body c, 'list-dependencies', 'List dependent modules associated with service instance.' do |sc|
22
+ command_body c, 'dependencies', 'List dependent modules associated with service instance.' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to service instance directory containing updates to pull; not need if in the service instance directory'
24
24
 
25
25
  sc.action do |_global_options, options, _args|
@@ -19,7 +19,7 @@ module DTK::Client; module CLI
19
19
  module Command
20
20
  module Service
21
21
  subcommand_def 'list-nodes' do |c|
22
- command_body c, 'list-nodes', 'List nodes associated with the service instance.' do |sc|
22
+ command_body c, 'nodes', 'List nodes associated with the service instance.' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to service instance directory containing updates to pull; not need if in the service instance directory'
24
24
 
25
25
  sc.action do |_global_options, options, _args|
@@ -19,7 +19,7 @@ module DTK::Client; module CLI
19
19
  module Command
20
20
  module Service
21
21
  subcommand_def 'list-violations' do |c|
22
- command_body c, 'list-violations', ' Finds violations that must be corrected before converging the service instance or running the specified action.' do |sc|
22
+ command_body c, 'violations', ' Finds violations that must be corrected before converging the service instance or running the specified action.' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to service instance directory containing updates to pull; not need if in the service instance directory'
24
24
 
25
25
  sc.action do |_global_options, options, _args|
@@ -0,0 +1,33 @@
1
+ #
2
+ # Copyright (C) 2010-2016 dtk contributors
3
+ #
4
+ # This file is part of the dtk project.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ module DTK::Client
19
+ module CLI::Command::Service
20
+ module Violation
21
+ def self.process_violations?(response)
22
+ if violations = response.data(:violations)
23
+ OsUtil.print_error("Cannot execute an action or workflow if there are violations:")
24
+ response.set_data(violations)
25
+ response.data.flatten!
26
+ response.set_render_as_table!.render_data
27
+ Response::NotOk.new
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -48,6 +48,7 @@ module DTK::Client
48
48
  :mode => Flag.new(:mode, 'MODE', 'Mode'),
49
49
  :namespace => Flag.new(:n, 'NAMESPACE', 'Namespace'),
50
50
  :uninstall_name => Flag.new(:name, 'NAME', 'Module name to uninstall'),
51
+ :link_name => Flag.new([:l, :link_name], 'link-name', 'Specify link name'),
51
52
  :format => Flag.new(:format, 'FORMAT', 'Choose in which format to display data (ex. TABLE, YAML)'),
52
53
 
53
54
  # switches
@@ -60,6 +61,7 @@ module DTK::Client
60
61
  :skip_prompt => Switch.new(:y, 'Skip prompt'),
61
62
  :target => Switch.new(:target, 'Create target service instance'),
62
63
  :links => Switch.new(:links, 'Links'),
64
+ :unlink => Switch.new([:u, :unlink], 'unlink'),
63
65
  :dependencies => Switch.new(:deps, 'Dependencies'),
64
66
  :u => Switch.new([:u, :unset], 'Unset attribute'),
65
67
  :recursive => Switch.new(:r, 'Recursive'),
@@ -80,7 +82,10 @@ module DTK::Client
80
82
  :keypair_name => 'KEYPAIR-NAME',
81
83
  :attribute_value => 'VALUE',
82
84
  :component_ref => 'COMPONENT-REF',
83
- :format => 'FORMAT'
85
+ :format => 'FORMAT',
86
+ :base_cmp => 'BASE-COMPONENT',
87
+ :deps_on_cmp => 'DEPENDS-ON-COMPONENT',
88
+ :service => 'SERVICE'
84
89
  }
85
90
 
86
91
  end
data/lib/cli/runner.rb CHANGED
@@ -22,7 +22,8 @@ module DTK::Client
22
22
  require_relative('runner/dtkn_access')
23
23
 
24
24
  def self.run(argv)
25
- Error.top_level_trap_error do
25
+ return_code = Error.top_level_trap_error do
26
+ ret = 0
26
27
  Configurator.check_git
27
28
  Configurator.create_missing_client_dirs
28
29
 
@@ -39,8 +40,12 @@ module DTK::Client
39
40
  if response_obj = context.run_and_return_response_object(argv)
40
41
  # render_response will raise Error in case of error response
41
42
  render_response(response_obj)
43
+ # response_obj can have not ok stateto signal to exit with error
44
+ ret = Error::GENERIC_ERROR_RETURN_CODE if response_obj.notok?
42
45
  end
46
+ ret
43
47
  end
48
+ exit return_code
44
49
  end
45
50
 
46
51
  private
@@ -72,7 +77,7 @@ module DTK::Client
72
77
  end
73
78
 
74
79
  def self.render_response(response_obj)
75
- Response::ErrorHandler.raise_if_error(response_obj)
80
+ Response::ErrorHandler.raise_if_error_info(response_obj)
76
81
  response_obj.render_data
77
82
  end
78
83
 
data/lib/cli/version.rb CHANGED
@@ -18,7 +18,7 @@
18
18
  module DTK
19
19
  module Client
20
20
  module CLI
21
- VERSION="0.11.0"
21
+ VERSION="0.11.1"
22
22
  end
23
23
  end
24
24
  end
data/lib/client/error.rb CHANGED
@@ -26,22 +26,27 @@ module DTK::Client
26
26
  @backtrace = opts[:backtrace]
27
27
  end
28
28
 
29
+ GENERIC_ERROR_RETURN_CODE = 1
30
+ # returns return code
29
31
  def self.top_level_trap_error(&body)
30
32
  begin
31
33
  yield
32
34
  rescue InvalidConnection => e
33
35
  e.print_warning
34
36
  puts "\nDTK will now exit. Please set up your connection properly and try again."
35
- rescue Error => e
37
+ GENERIC_ERROR_RETURN_CODE
38
+ rescue Error => e
36
39
  # If vanilla error treat like client error
37
40
  if e.class == Error
38
41
  e = convert_to_client_error(e)
39
42
  end
40
43
  Logger.instance.error_pp(e.message, e.backtrace?)
44
+ GENERIC_ERROR_RETURN_CODE
41
45
  rescue Exception => exception
42
46
  # If treat like client error
43
47
  e = convert_to_client_error(exception)
44
48
  Logger.instance.error_pp(e.message, e.backtrace?)
49
+ GENERIC_ERROR_RETURN_CODE
45
50
  end
46
51
  end
47
52
 
@@ -55,7 +60,7 @@ module DTK::Client
55
60
  end
56
61
  end
57
62
 
58
- def self.raise_if_error(response, opts = {})
63
+ def self.raise_if_error_info(response, opts = {})
59
64
  # check for errors in response
60
65
  error = response.error_info?(opts)
61
66
  return unless error
@@ -41,9 +41,9 @@ module DTK::Client
41
41
  # FileUtils.mv(target_repo_dir, backup_dir)
42
42
  # OsUtil.print_warning("Backup of existing module directory moved to '#{backup_dir}'")
43
43
  # else
44
- # raise Error::Usage, "Directory '#{path}' is not empty; it must be deleted or removed before retrying the command"
44
+ # raise Error::Usage, "Directory '#{path}' is not empty; it must be deleted or moved before retrying the command"
45
45
  #end
46
- raise Error::Usage, "Directory '#{path}' is not empty; it must be deleted or removed before retrying the command" unless (Dir.entries(path) - %w{ . .. }).empty?
46
+ raise Error::Usage, "Directory '#{path}' is not empty; it must be deleted or moved before retrying the command" unless (Dir.entries(path) - %w{ . .. }).empty?
47
47
  return path
48
48
  end
49
49
  end
@@ -71,7 +71,7 @@ module DTK::Client
71
71
  if opts[:remove_existing]
72
72
  FileUtils.rm_rf(path)
73
73
  else
74
- raise Error::Usage, "Directory '#{path}' is not empty; it must be deleted or removed before retrying the command" unless (Dir.entries(path) - %w{ . .. }).empty?
74
+ raise Error::Usage, "Directory '#{path}' is not empty; it must be deleted or moved before retrying the command" unless (Dir.entries(path) - %w{ . .. }).empty?
75
75
  return path
76
76
  end
77
77
  end
@@ -85,7 +85,7 @@ module DTK::Client
85
85
  if opts[:remove_existing]
86
86
  FileUtils.rm_rf(path)
87
87
  else
88
- raise Error::Usage, "Directory '#{path}' is not empty; it must be deleted or removed before retrying the command" unless (Dir.entries(path) - %w{ . .. }).empty?
88
+ raise Error::Usage, "Directory '#{path}' is not empty; it must be deleted or moved before retrying the command" unless (Dir.entries(path) - %w{ . .. }).empty?
89
89
  return path
90
90
  end
91
91
  end
@@ -56,12 +56,12 @@ module DTK::Client
56
56
  end
57
57
 
58
58
  def install
59
- @print_helper.print_getting_dependencies
59
+ @print_helper.print_getting_dependencies unless @prompt_helper.update_none
60
60
  unified_module_refs = get_unified_dependent_module_refs
61
61
  unless unified_module_refs.empty?
62
62
  case @opts[:mode]
63
63
  when 'pull'
64
- @print_helper.print_pulling_dependencies
64
+ @print_helper.print_pulling_dependencies unless @prompt_helper.update_none
65
65
  else
66
66
  @print_helper.print_installing_dependencies
67
67
  end
@@ -43,6 +43,14 @@ module DTK::Client
43
43
  has_directory_param = args[:has_directory_param]
44
44
  skip_prompt = args[:skip_prompt]
45
45
  force = args[:force]
46
+ update_deps = args[:update_deps]
47
+
48
+ case update_deps
49
+ when "prompt"
50
+ update_deps = nil
51
+ when false
52
+ no_update_deps = true
53
+ end
46
54
 
47
55
  if has_directory_param
48
56
  file_obj = base_dsl_file_obj.raise_error_if_no_content_flag(:module_ref)
@@ -50,7 +58,7 @@ module DTK::Client
50
58
  file_obj = base_dsl_file_obj.raise_error_if_no_content
51
59
  end
52
60
 
53
- new('dtkn', module_ref, directory_path, version, file_obj).pull_dtkn(:skip_prompt => skip_prompt, :force => force)
61
+ new('dtkn', module_ref, directory_path, version, file_obj).pull_dtkn(:update_deps => update_deps, :no_update_deps => no_update_deps, :force => force)
54
62
  end
55
63
  end
56
64
 
@@ -78,7 +86,7 @@ module DTK::Client
78
86
 
79
87
  unless dependent_modules.empty?
80
88
  begin
81
- Install::DependentModules.install(@module_ref, dependent_modules, :skip_prompt => opts[:skip_prompt], :mode => 'pull')
89
+ Install::DependentModules.install(@module_ref, dependent_modules, :update_deps => opts[:update_deps], :no_update_deps => opts[:no_update_deps] , :mode => 'pull')
82
90
  # Install::DependentModules.install(@module_ref, dependent_modules, :skip_prompt => false, :mode => 'pull')
83
91
  rescue Install::TerminateInstall
84
92
  @print_helper.print_terminated_pulling
@@ -54,7 +54,10 @@ module DTK::Client
54
54
 
55
55
  response = rest_post("#{BaseRoute}/update_from_repo", post_body)
56
56
 
57
+ existing_diffs = nil
58
+ print = nil
57
59
  if missing_dependencies = response.data(:missing_dependencies)
60
+ force_parse = false
58
61
  unless missing_dependencies.empty?
59
62
  dependent_modules = missing_dependencies.map { |dependency| Install::ModuleRef.new(:namespace => dependency['namespace_name'], :module_name => dependency['display_name'], :version => dependency['version_info']) }
60
63
  begin
@@ -63,10 +66,18 @@ module DTK::Client
63
66
  @print_helper.print_terminated_installation
64
67
  return nil
65
68
  end
69
+ existing_diffs = response.data(:existing_diffs)
70
+ force_parse = true
66
71
  end
67
- response = rest_post("#{BaseRoute}/update_from_repo", post_body.merge(:skip_missing_check => true))
72
+ response = rest_post("#{BaseRoute}/update_from_repo", post_body.merge(:skip_missing_check => true, force_parse: force_parse))
73
+ end
74
+
75
+ diffs = response.data(:diffs)
76
+ if diffs && !diffs.empty?
77
+ print = process_semantic_diffs(diffs, method)
78
+ else
79
+ print = process_semantic_diffs(existing_diffs, method)
68
80
  end
69
- print = process_semantic_diffs(response.data(:diffs), method)
70
81
 
71
82
  # if diffs is nil then indicate no diffs, otherwise render diffs in yaml
72
83
  OsUtil.print_info("No Diffs to be #{method}.") if response.data(:diffs).nil? || !print
@@ -40,7 +40,7 @@ module DTK::Client
40
40
  service_name ||= rest_post("#{BaseRoute}/generate_service_name", post_body).data
41
41
  base_path = ClientModuleDir.ret_base_path(:service, service_name)
42
42
 
43
- raise Error::Usage, "Directory '#{base_path}' is not empty; it must be deleted or removed before retrying the command" if ClientModuleDir.local_dir_exists?(:service, service_name)
43
+ raise Error::Usage, "Directory '#{base_path}' is not empty; it must be deleted or moved before retrying the command" if ClientModuleDir.local_dir_exists?(:service, service_name)
44
44
 
45
45
  post_body.merge!(:service_name => service_name)
46
46
  response = rest_post("#{BaseRoute}/stage", post_body)
@@ -62,4 +62,4 @@ module DTK::Client
62
62
  end
63
63
  end
64
64
  end
65
- end
65
+ end
@@ -35,6 +35,7 @@ module DTK::Client
35
35
  :list_components,
36
36
  :list_nodes,
37
37
  :list_violations,
38
+ :link,
38
39
  :start,
39
40
  :stop,
40
41
  :cancel_task,
@@ -30,25 +30,10 @@ module DTK::Client
30
30
 
31
31
  error_msg = "To allow converge to go through, invoke 'dtk push' to push the changes to server before invoking converge again"
32
32
  GitRepo.modified_with_diff?(module_dir, { :error_msg => error_msg, :command => 'converge' }) unless force
33
- violations = find_violations(service_instance)
34
- return violations if violations
35
33
 
36
34
  rest_post("#{BaseRoute}/#{service_instance}/converge", post_body)
37
35
  end
38
36
  end
39
-
40
- private
41
-
42
- def self.find_violations(service_instance)
43
- violations_response = rest_get("#{BaseRoute}/#{service_instance}/violations")
44
-
45
- if violations_response.data and violations_response.data.size > 0
46
- OsUtil.print_error("The following violations were found; they must be corrected before workspace can be converged")
47
- return violations_response.set_render_as_table!
48
- end
49
-
50
- nil
51
- end
52
37
  end
53
38
  end
54
39
  end
@@ -66,11 +66,6 @@ module DTK::Client
66
66
  return Response::Ok.new('empty_workflow' => true)
67
67
  end
68
68
 
69
- if response.data(:violations)
70
- OsUtil.print_error("Cannot execute an action or workflow if there are violations:")
71
- return response.set_render_as_table!
72
- end
73
-
74
69
  response
75
70
  end
76
71
  end
@@ -0,0 +1,51 @@
1
+ #
2
+ # Copyright (C) 2010-2016 dtk contributors
3
+ #
4
+ # This file is part of the dtk project.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ module DTK::Client
19
+ class Operation::Service
20
+ class Link < self
21
+ def self.execute(args = Args.new)
22
+ wrap_operation(args) do |args|
23
+ service_instance = args.required(:service_instance)
24
+ unlink = args.required(:unlink)
25
+ base_component = args.required(:base_component)
26
+ dependent_component = args.required(:dependent_component)
27
+ service = args[:service]
28
+ link_name = args[:link_name]
29
+
30
+ query_string_hash = QueryStringHash.new(
31
+ :unlink => unlink,
32
+ :base_component => base_component,
33
+ :dep_component => dependent_component,
34
+ :service => service,
35
+ :link_name => link_name
36
+ )
37
+
38
+ response = rest_post("#{BaseRoute}/#{service_instance}/link", query_string_hash)
39
+
40
+ repo_info_args = Args.new(
41
+ :service_instance => service_instance,
42
+ :branch => response.required(:branch, :name),
43
+ :repo_url => response.required(:repo, :url)
44
+ )
45
+ ClientModuleDir::GitRepo.pull_from_service_repo(repo_info_args)
46
+ nil
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -39,7 +39,7 @@ module DTK::Client
39
39
  service_name ||= rest_post("#{BaseRoute}/generate_service_name", post_body).data
40
40
  base_path = ClientModuleDir.ret_base_path(:service, service_name)
41
41
 
42
- raise Error::Usage, "Directory '#{base_path}' is not empty; it must be deleted or removed before retrying the command" if ClientModuleDir.local_dir_exists?(:service, service_name)
42
+ raise Error::Usage, "Directory '#{base_path}' is not empty; it must be deleted or moved before retrying the command" if ClientModuleDir.local_dir_exists?(:service, service_name)
43
43
 
44
44
  post_body.merge!(:service_name => service_name)
45
45
  response = rest_post("#{BaseRoute}/create", post_body)
@@ -26,9 +26,14 @@ module DTK::Client
26
26
  force = args.required(:force)
27
27
  path = args[:directory_path]
28
28
  node = []
29
+ msg = "Are you sure you want to uninstall the infrastructure associated with '#{service_instance}' and delete this service instance from the server?"
30
+
31
+ if force
32
+ msg.prepend("Note: this will not terminate aws instances, you will have to do that manually!\n")
33
+ end
29
34
 
30
35
  unless args[:skip_prompt]
31
- return false unless Console.prompt_yes_no("Are you sure you want to uninstall the infrastructure associated with '#{service_instance}' and delete this service instance from the server?", :add_options => true)
36
+ return false unless Console.prompt_yes_no(msg, :add_options => true)
32
37
  end
33
38
 
34
39
  post_body = PostBody.new(
@@ -46,10 +51,7 @@ module DTK::Client
46
51
  OsUtil.print_info(message)
47
52
  end
48
53
  else
49
- msg = "DTK module '#{service_instance}' has been uninstalled successfully."
50
- if force
51
- msg += "\nNote: this will not terminate aws instances, you will have to do that manually!"
52
- end
54
+ msg = "DTK service '#{service_instance}' has been uninstalled successfully."
53
55
  OsUtil.print_info(msg)
54
56
  end
55
57
  end
data/lib/client/render.rb CHANGED
@@ -49,26 +49,43 @@ module DTK::Client
49
49
  #
50
50
  # value returned is Boolean indicating whether any additional print needed
51
51
  def self.render(ruby_obj, opts = {})
52
- render_type = opts[:render_type]
53
- if render_type == Type::TABLE
54
- render_opts = {
55
- :print_error_table => opts[:print_error_table],
56
- :footnote => opts[:footnote]
57
- }
58
- get_adapter(Type::TABLE, opts).render(ruby_obj, render_opts)
59
- elsif ruby_obj.kind_of?(Hash)
60
- get_adapter(render_type, opts).render(ruby_obj)
61
- elsif ruby_obj.kind_of?(Array)
62
- get_adapter(render_type, opts).render(ruby_obj)
63
- elsif ruby_obj.kind_of?(String)
64
- ruby_obj
65
- else
66
- raise Error.new('ruby_obj has unexpected type')
52
+ wrap_to_handle_warning_message(ruby_obj) do |ruby_obj|
53
+ render_type = opts[:render_type]
54
+ if render_type == Type::TABLE
55
+ render_opts = {
56
+ :print_error_table => opts[:print_error_table],
57
+ :footnote => opts[:footnote]
58
+ }
59
+ get_adapter(Type::TABLE, opts).render(ruby_obj, render_opts)
60
+ elsif ruby_obj.kind_of?(::Hash)
61
+ get_adapter(render_type, opts).render(ruby_obj)
62
+ elsif ruby_obj.kind_of?(::Array)
63
+ get_adapter(render_type, opts).render(ruby_obj)
64
+ elsif ruby_obj.kind_of?(::String)
65
+ ruby_obj
66
+ else
67
+ raise Error.new('ruby_obj has unexpected type')
68
+ end
67
69
  end
68
70
  end
69
71
 
70
72
  private
71
73
 
74
+ WARNING_KEY = 'warn'
75
+ def self.wrap_to_handle_warning_message(ruby_obj, &body)
76
+ warning_message = nil
77
+ passed_ruby_obj = ruby_obj
78
+
79
+ if ruby_obj.kind_of?(::Hash)
80
+ if warning_message = ruby_obj[WARNING_KEY]
81
+ # remove warning key
82
+ passed_ruby_obj = ruby_obj.inject({}) { |h, (k, v)| h.merge(k == WARNING_KEY ? {} : { k => v }) }
83
+ end
84
+ end
85
+ body.call(passed_ruby_obj)
86
+ OsUtil.print_warning(warning_message) if warning_message
87
+ end
88
+
72
89
  def render_text(text)
73
90
  STDOUT << text
74
91
  end
@@ -52,6 +52,10 @@ module DTK::Client
52
52
  end
53
53
  end
54
54
 
55
+ def notok?
56
+ kind_of?(NotOk)
57
+ end
58
+
55
59
  def index_data(*indexes)
56
60
  index_common(*indexes) { |_indexes| nil }
57
61
  end
@@ -18,8 +18,8 @@
18
18
  module DTK::Client
19
19
  class Response
20
20
  module ErrorHandler
21
- def self.raise_if_error(response)
22
- Error.raise_if_error(response)
21
+ def self.raise_if_error_info(response)
22
+ Error.raise_if_error_info(response)
23
23
  end
24
24
 
25
25
  def self.check_for_session_expiried(response)
@@ -54,11 +54,21 @@ module DTK::Client
54
54
  end
55
55
 
56
56
  def module_refs_path
57
- matches = directory_file_paths.select { |path| module_ref_input_files_processor.match?(path) }
57
+ matches = dsl_file_matches { |path| module_ref_input_files_processor.match?(path) }
58
58
  raise Error, "Unexpected that multiple module ref files" if matches.size > 1
59
59
  matches.first
60
60
  end
61
61
 
62
+ def dsl_file_matches(&block)
63
+ # TODO: maybe better to solve by restricting directory_file_paths to be least_nested_pos of 2
64
+ matches = directory_file_paths.select { |path| block.call(path) }
65
+ if matches.size > 1
66
+ least_nested_pos = matches.map { |match| match.split('/').size }.min
67
+ matches.reject! { |match| match.split('/').size != least_nested_pos }
68
+ end
69
+ matches
70
+ end
71
+
62
72
  def module_ref_input_files_processor
63
73
  @module_ref_input_files_processor ||= input_files_processor(:module_refs)
64
74
  end
@@ -43,7 +43,7 @@ module DTK::Client
43
43
  end
44
44
 
45
45
  def component_dsl_path
46
- matches = directory_file_paths.select { |path| component_dsl_input_files_processor.match?(path) }
46
+ matches = dsl_file_matches { |path| component_dsl_input_files_processor.match?(path) }
47
47
  raise Error::MissingDslFile, "Unexpected that there is not a unique component dsl file" if matches.size != 1
48
48
  matches.first
49
49
  end
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.11.0
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reactor8
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-23 00:00:00.000000000 Z
11
+ date: 2017-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dtk-common-core
@@ -182,6 +182,7 @@ files:
182
182
  - lib/cli/command/service/eject.rb
183
183
  - lib/cli/command/service/exec.rb
184
184
  - lib/cli/command/service/exec_sync.rb
185
+ - lib/cli/command/service/link.rb
185
186
  - lib/cli/command/service/list.rb
186
187
  - lib/cli/command/service/list_actions.rb
187
188
  - lib/cli/command/service/list_attributes.rb
@@ -201,6 +202,7 @@ files:
201
202
  - lib/cli/command/service/stop.rb
202
203
  - lib/cli/command/service/task_status.rb
203
204
  - lib/cli/command/service/uninstall.rb
205
+ - lib/cli/command/service/violation.rb
204
206
  - lib/cli/command/subcommand.rb
205
207
  - lib/cli/command/token.rb
206
208
  - lib/cli/command/token/arg.rb
@@ -291,6 +293,7 @@ files:
291
293
  - lib/client/operation/service/edit.rb
292
294
  - lib/client/operation/service/eject.rb
293
295
  - lib/client/operation/service/exec.rb
296
+ - lib/client/operation/service/link.rb
294
297
  - lib/client/operation/service/list.rb
295
298
  - lib/client/operation/service/list_actions.rb
296
299
  - lib/client/operation/service/list_attributes.rb