dtk-client 0.11.0 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
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