dtk-client 0.12.0.1 → 0.12.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 (40) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/dtk-client.gemspec +3 -3
  4. data/lib/cli/command/module/pull_dtkn.rb +1 -1
  5. data/lib/cli/command/module/push_dtkn.rb +10 -1
  6. data/lib/cli/command/module/uninstall.rb +3 -3
  7. data/lib/cli/command/service.rb +4 -3
  8. data/lib/cli/command/service/add_component.rb +42 -0
  9. data/lib/cli/command/service/{link.rb → add_link.rb} +2 -2
  10. data/lib/cli/command/service/delete.rb +5 -3
  11. data/lib/cli/command/service/describe.rb +3 -1
  12. data/lib/cli/command/service/ssh.rb +9 -4
  13. data/lib/cli/command/service/uninstall.rb +3 -3
  14. data/lib/cli/command/token.rb +7 -3
  15. data/lib/cli/runner/dtkn_access.rb +20 -19
  16. data/lib/cli/version.rb +1 -1
  17. data/lib/client/configurator.rb +15 -0
  18. data/lib/client/error.rb +6 -6
  19. data/lib/client/operation.rb +6 -1
  20. data/lib/client/operation/account/delete_ssh_key.rb +2 -0
  21. data/lib/client/operation/client_module_dir/git_repo/internal.rb +1 -1
  22. data/lib/client/operation/client_module_dir/service_instance.rb +19 -0
  23. data/lib/client/operation/client_module_dir/service_instance/internal.rb +51 -0
  24. data/lib/client/operation/module/clone_module.rb +5 -3
  25. data/lib/client/operation/module/pull_dtkn.rb +6 -2
  26. data/lib/client/operation/module/push.rb +13 -4
  27. data/lib/client/operation/module/push_dtkn.rb +53 -16
  28. data/lib/client/operation/service.rb +3 -2
  29. data/lib/client/operation/service/add_component.rb +59 -0
  30. data/lib/client/operation/service/{link.rb → add_link.rb} +0 -0
  31. data/lib/client/operation/service/commit_and_push.rb +3 -0
  32. data/lib/client/operation/service/converge.rb +8 -2
  33. data/lib/client/operation/service/delete.rb +9 -2
  34. data/lib/client/operation/service/describe.rb +14 -1
  35. data/lib/client/operation/service/exec.rb +7 -3
  36. data/lib/client/operation/service/ssh.rb +16 -2
  37. data/lib/client/operation/service/task_status.rb +8 -1
  38. data/lib/client/operation/service/uninstall.rb +13 -0
  39. data/lib/client/util/validation.rb +2 -2
  40. metadata +15 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b46ba2c42f7639fbca14adb16eccad873b6d80c5
4
- data.tar.gz: 2d7ebb90f0f16124f521f604985634e260f375af
2
+ SHA256:
3
+ metadata.gz: dd3532222d39184fd4e4b3dabe6089082d66997065b60710dac9315669f0bdb1
4
+ data.tar.gz: 1a596bb53b1fa93c2dfc24a792836a5377fac27947acbaeea54bf069a45dce5b
5
5
  SHA512:
6
- metadata.gz: 56121c79d08683a8d4d973e31173ab50bb8a0fe43740c51c4b9e1e0c165166c658704af1436515faf801d33eeaa85a8bd357f358c844592639e8fc7515d73a68
7
- data.tar.gz: dc4638726dd21687f9590d3ba57f2bc8df26c047a0fd71f510985b19d877a463b1dc8f6ec904f7aef72f5e781db3545728e7748fb490b8753159727411a2d68f
6
+ metadata.gz: 6be78d166a7b90eddd422a3e39fc2f5cc12ac382a896c5bf6813bc9c85ddfbb8aaac111a6e963eb4bcad14c0d7c2ff569122d204194d8721ef17bcaf9b56a5e1
7
+ data.tar.gz: 1fad3c04de2c251f96f84a3ba729e1713024d9bdb0891c6ab2b6c8bc0eb25ae3247c0aee258933c4b9ba4aa0daf72d35e026b94db5b949427a804c640cc37c17
data/.gitignore CHANGED
@@ -10,3 +10,4 @@ doc
10
10
  .solargraph.yml
11
11
  Gemfile.lock
12
12
  sftp.json
13
+ .byebug_history
@@ -21,9 +21,9 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency 'gli', '2.13.4'
22
22
  spec.add_dependency 'highline', '1.7.8'
23
23
  spec.add_dependency 'colorize', '0.7.7'
24
- spec.add_dependency 'git', '1.2.9'
24
+ spec.add_dependency 'git', '~> 1.4.0'
25
25
  spec.add_dependency 'hirb', '0.7.3'
26
26
  spec.add_dependency 'mime-types', '~> 2.99.3'
27
- spec.add_dependency 'dtk-dsl', '1.1.4'
28
- spec.add_dependency 'dtk-network-client', '1.0.2'
27
+ spec.add_dependency 'dtk-dsl', '~> 1.1.4'
28
+ spec.add_dependency 'dtk-network-client', '1.0.3'
29
29
  end
@@ -35,7 +35,7 @@ module DTK::Client
35
35
  :update_deps => options[:update_deps]
36
36
  }
37
37
  Operation::Module.pull_dtkn(operation_args)
38
- # Operation::Module.push(operation_args.merge(:method => "pulled"))
38
+ Operation::Module.push(operation_args.merge(:method => "pulled", context: self))
39
39
  end
40
40
  end
41
41
  end
@@ -22,9 +22,18 @@ module DTK::Client
22
22
  command_body c, 'push-dtkn', 'Push content from client module directory to dtk network' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to module directory containing updates to push; not need if in the module directory'
24
24
  sc.switch Token.update_lock
25
+ sc.switch Token.force
26
+
25
27
  sc.action do |_global_options, options, _args|
26
28
  module_ref = module_ref_object_from_options_or_context(options)
27
- Operation::Module.push_dtkn(:module_ref => module_ref, :base_dsl_file_obj => @base_dsl_file_obj, :directory_path => options[:directory_path], update_lock_file: options['update-lock'])
29
+ operation_args = {
30
+ :module_ref => module_ref,
31
+ :base_dsl_file_obj => @base_dsl_file_obj,
32
+ :directory_path => options[:directory_path],
33
+ :update_lock_file => options['update-lock'],
34
+ :force => options[:f]
35
+ }
36
+ Operation::Module.push_dtkn(operation_args)
28
37
  end
29
38
  end
30
39
  end
@@ -24,14 +24,14 @@ module DTK::Client
24
24
  sc.switch Token.skip_prompt, :desc => 'Skip prompt that checks if user wants to uninstall module from server'
25
25
  sc.flag Token.directory_path
26
26
  sc.flag Token.version
27
- sc.flag Token.uninstall_name
27
+ sc.flag Token.uninstall_module_name
28
28
  sc.switch Token.force
29
29
  sc.action do |_global_options, options, args|
30
30
  version = options[:version]
31
31
  force = options["force"]
32
32
 
33
33
  module_refs_opts = {:ignore_parsing_errors => true}
34
- if options[:uninstall_name].nil?
34
+ if options[:uninstall_module_name].nil?
35
35
  module_ref =
36
36
  if module_name = args[0]
37
37
  module_ref_object_from_options_or_context?({:module_ref => module_name, :version => (version)}, module_refs_opts)
@@ -44,7 +44,7 @@ module DTK::Client
44
44
 
45
45
  raise Error::Usage, "You can use version only with 'namespace/name' provided" if version && module_name.nil?
46
46
 
47
- Operation::Module.uninstall(:module_ref => module_ref, :force => force, :skip_prompt => options[:skip_prompt], :name => options[:uninstall_name] || module_name, :version => version)
47
+ Operation::Module.uninstall(:module_ref => module_ref, :force => force, :skip_prompt => options[:skip_prompt], :name => options[:uninstall_module_name] || module_name, :version => version)
48
48
  end
49
49
  end
50
50
  end
@@ -31,7 +31,7 @@ module DTK::Client
31
31
  'eject',
32
32
  'exec',
33
33
  'exec-sync',
34
- 'link',
34
+ 'add-link',
35
35
  'list',
36
36
  'list-actions',
37
37
  'list-attributes',
@@ -52,8 +52,9 @@ module DTK::Client
52
52
 
53
53
  'task-status',
54
54
  'uninstall',
55
- 'describe'
56
- # 'add'
55
+ 'describe',
56
+ # 'add',
57
+ 'add-component'
57
58
  ]
58
59
 
59
60
  command_def :desc => 'Subcommands for creating and interacting with DTK service instances'
@@ -0,0 +1,42 @@
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 'add-component' do |c|
22
+ c.arg Token::Arg.component_ref
23
+ command_body c, 'add-component', 'Add component to service instance' do |sc|
24
+ sc.flag Token.version
25
+ sc.flag Token.namespace
26
+ sc.flag Token.parent
27
+ sc.action do |_global_options, options, args|
28
+ args = {
29
+ service_instance: service_instance_in_options_or_context(options),
30
+ component_ref: args[0],
31
+ version: options[:v],
32
+ namespace: options[:n],
33
+ parent_node: options[:p],
34
+ service_instance_dir: @base_dsl_file_obj.parent_dir
35
+ }
36
+ Operation::Service.add_component(args)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end; end
@@ -18,11 +18,11 @@
18
18
  module DTK::Client; module CLI
19
19
  module Command
20
20
  module Service
21
- subcommand_def 'link' do |c|
21
+ subcommand_def 'add-link' do |c|
22
22
  c.arg Token::Arg.base_cmp
23
23
  c.arg Token::Arg.deps_on_cmp
24
24
  c.arg Token::Arg.service, :optional => true
25
- command_body c, 'link', 'List component links in the service instance.' do |sc|
25
+ command_body c, 'add-link', 'List component links in the service instance.' do |sc|
26
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
27
  sc.switch Token.unlink
28
28
 
@@ -20,6 +20,7 @@ module DTK::Client; module CLI
20
20
  module Service
21
21
  subcommand_def 'delete' do |c|
22
22
  command_body c, :delete, 'Destroys the running infrastructure associated with the service instance' do |sc|
23
+ sc.flag Token.delete_service_name
23
24
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to service instance directory associated; not needed if executed in service instance directory'
24
25
  # sc.flag Token.path, :desc => "Delete specific part of service instance. Supported paths are 'dependencies/[name]', 'components/[name]', 'actions/[name]'"
25
26
 
@@ -31,16 +32,17 @@ module DTK::Client; module CLI
31
32
  directory_path = options[:directory_path]
32
33
  recursive = options[:recursive]
33
34
  force = options[:f]
34
- service_instance = service_instance_in_options_or_context(options)
35
-
35
+ name = options[:delete_service_name]
36
+ service_instance = name ? name : service_instance_in_options_or_context(options)
37
+
36
38
  args = {
37
39
  :service_instance => service_instance,
38
40
  :skip_prompt => options[:skip_prompt],
39
- :directory_path => directory_path || base_dsl_file_obj.parent_dir,
40
41
  :recursive => recursive,
41
42
  :force => force,
42
43
  # :path => options[:path]
43
44
  }
45
+ args[:directory_path] = directory_path || base_dsl_file_obj.parent_dir unless name
44
46
  Operation::Service.delete(args)
45
47
  end
46
48
  end
@@ -21,10 +21,12 @@ module DTK::Client; module CLI
21
21
  subcommand_def 'describe' do |c|
22
22
  command_body c, 'describe', 'Describe service instance content' do |sc|
23
23
  sc.flag Token.path, :desc => "supported paths are 'dependencies', 'components/[name]', 'actions/[name]' "
24
+ sc.switch Token.show_steps, :desc => 'Show steps that will be executed when action is executed'
24
25
  sc.action do |_global_options, options, _args|
25
26
  args = {
26
27
  service_instance: service_instance_in_options_or_context(options),
27
- path: options[:path]
28
+ path: options[:path],
29
+ show_steps: options['show-steps']
28
30
  }
29
31
  Operation::Service.describe(args)
30
32
  end
@@ -19,17 +19,22 @@ module DTK::Client
19
19
  module CLI::Command
20
20
  module Service
21
21
  subcommand_def 'ssh' do |c|
22
- c.arg Token::Arg.node_name
22
+ c.arg Token::Arg.node_name, :optional => true
23
23
  command_body c, :ssh, 'SSH into service instance node.' do |sc|
24
24
  sc.flag Token.remote_user
25
25
  sc.flag Token.identity_file, :desc => 'Identity file used for connection, if not provided default is used'
26
26
 
27
27
  sc.action do |_global_options, options, args|
28
- service_instance = service_instance_in_options_or_context(options)
28
+ node_name = args[0]
29
+ if args[0] && args[0].include?('/')
30
+ service_name, node_name = args[0].split('/')
31
+ end
32
+
33
+ service_name ||= service_instance_in_options_or_context(options)
29
34
 
30
35
  args = {
31
- :service_instance => service_instance,
32
- :node_name => args[0],
36
+ :service_instance => service_name,
37
+ :node_name => node_name,
33
38
  :remote_user => options[:remote_user],
34
39
  :identity_file => options[:identity_file]
35
40
  }
@@ -21,7 +21,7 @@ module DTK::Client; module CLI
21
21
  subcommand_def 'uninstall' do |c|
22
22
  command_body c, :uninstall, 'Uninstalls the service instance from the server' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to service instance directory associated; not needed if executed in service instance directory'
24
- sc.flag Token.uninstall_name
24
+ sc.flag Token.uninstall_service_name
25
25
  sc.switch Token.skip_prompt, :desc => 'Skip prompt that checks if user wants to delete the service instance'
26
26
  sc.switch Token.purge, :desc => 'Delete the service instance directory on the client'
27
27
  sc.switch Token.recursive, :desc => 'Delete dependent service instances'
@@ -31,7 +31,7 @@ module DTK::Client; module CLI
31
31
  purge = options[:purge]
32
32
  force = options[:f]
33
33
  recursive = options[:recursive]
34
- name = options[:uninstall_name]
34
+ name = options[:uninstall_service_name]
35
35
 
36
36
  if purge && (!directory_path || (directory_path == @base_dsl_file_obj.parent_dir?))
37
37
  raise Error::Usage, "If use option '#{option_ref(:purge)}' then need to call from outside directory and use option '#{option_ref(:directory_path)}'"
@@ -46,11 +46,11 @@ module DTK::Client; module CLI
46
46
  args = {
47
47
  :service_instance => service_instance,
48
48
  :skip_prompt => options[:skip_prompt],
49
- :directory_path => directory_path,
50
49
  :purge => purge,
51
50
  :recursive => recursive,
52
51
  :force => force
53
52
  }
53
+ args[:directory_path] = directory_path || base_dsl_file_obj.parent_dir unless name
54
54
  Operation::Service.uninstall(args)
55
55
  end
56
56
  end
@@ -47,12 +47,15 @@ module DTK::Client
47
47
  :identity_file => Flag.new(:i, 'PATH-TO-PEM', 'Path to pem file'),
48
48
  :mode => Flag.new(:mode, 'MODE', 'Mode'),
49
49
  :namespace => Flag.new(:n, 'NAMESPACE', 'Namespace'),
50
- :uninstall_name => Flag.new(:name, 'NAME', 'Module name to uninstall'),
50
+ :uninstall_module_name => Flag.new(:name, 'NAME', 'Module name to uninstall'),
51
+ :uninstall_service_name => Flag.new(:name, 'NAME', 'Service instance name to uninstall'),
52
+ :delete_service_name => Flag.new(:name, 'NAME', 'Service instance name to delete'),
51
53
  :link_name => Flag.new([:l, :link_name], 'link-name', 'Specify link name'),
52
54
  :format => Flag.new(:format, 'FORMAT', 'Choose in which format to display data (ex. TABLE, YAML)'),
53
55
  :sleep => Flag.new(:sleep, '', ''),
54
56
  :attempts => Flag.new(:attempts, '', ''),
55
57
  :path => Flag.new(:path, 'PATH', 'Path'),
58
+ :parent => Flag.new([:p, :parent], 'PARENT', ''),
56
59
 
57
60
  # switches
58
61
  # Switch constructor args order: key, desc, opts={}
@@ -72,13 +75,14 @@ module DTK::Client
72
75
  :recursive => Switch.new(:r, 'Recursive'),
73
76
  :update_deps => Switch.new('update-deps', "Skip prompt and update all dependencies or skip prompt and don't update all dependencies (on master)", :negatable => true, :default_value => 'prompt'),
74
77
  :skip_server => Switch.new('skip-server', 'Do not install module on server'),
75
- :update_lock => Switch.new([:u, 'update-lock'], 'Update lock file with new dependencies')
78
+ :update_lock => Switch.new([:u, 'update-lock'], 'Update lock file with new dependencies'),
79
+ :show_steps => Switch.new('show-steps', 'Show steps')
76
80
  }
77
81
 
78
82
  ARG_TOKENS = {
79
83
  :assembly_name => 'ASSEMBLY-NAME',
80
84
  :service_instance => flag_token(:service_instance).arg_name,
81
- :node_name => 'NODE',
85
+ :node_name => '[[REMOTE_SERVICE-NAME/]NODE]',
82
86
  :action => '[NODE/NODE-GROUP/]ACTION',
83
87
  :action_params => 'ACTION-PARAMS',
84
88
  :workspace_name => 'WORKSPACE-NAME',
@@ -26,26 +26,27 @@ module DTK::Client; module CLI
26
26
 
27
27
  OsUtil.print_info('Processing ...') if config_existed
28
28
  # check to see if catalog credentials are set
29
- conn = Session.get_connection
30
- response = conn.post 'account/check_catalog_credentials'
29
+ # conn = Session.get_connection
30
+ # response = conn.post 'account/check_catalog_credentials'
31
31
 
32
- # set catalog credentails
33
- if response.ok? && !response.data(:catalog_credentials_set)
34
- # setting up catalog credentials
35
- catalog_creds = Configurator.ask_catalog_credentials
36
- unless catalog_creds.empty?
37
- post_body = {
38
- :username => catalog_creds[:username],
39
- :password => catalog_creds[:password],
40
- :validate => true
41
- }
42
- response = conn.post 'account/set_catalog_credentials', post_body
43
- unless response.ok?
44
- error_message = response.error_message.gsub(/\.[ ]*$/,'')
45
- OsUtil.print_error("#{error_message}. You will have to set catalog credentials manually ('dtk account set-catalog-credentials').")
46
- end
47
- end
48
- end
32
+ # # set catalog credentails
33
+ # if response.ok? && !response.data(:catalog_credentials_set)
34
+ # # setting up catalog credentials
35
+ # catalog_creds = Configurator.ask_catalog_credentials
36
+ # unless catalog_creds.empty?
37
+ # post_body = {
38
+ # :username => catalog_creds[:username],
39
+ # :password => catalog_creds[:password],
40
+ # :validate => true
41
+ # }
42
+ # response = conn.post 'account/set_catalog_credentials', post_body
43
+ # unless response.ok?
44
+ # error_message = response.error_message.gsub(/\.[ ]*$/,'')
45
+ # OsUtil.print_error("#{error_message}. You will have to set catalog credentials manually ('dtk account set-catalog-credentials').")
46
+ # end
47
+ # end
48
+ # end
49
+
49
50
  add_key_opts = {
50
51
  :first_registration => true,
51
52
  :name => "#{Session.connection_username}-client"
@@ -18,7 +18,7 @@
18
18
  module DTK
19
19
  module Client
20
20
  module CLI
21
- VERSION="0.12.0.1"
21
+ VERSION="0.12.1"
22
22
  end
23
23
  end
24
24
  end
@@ -110,6 +110,21 @@ module DTK::Client
110
110
 
111
111
  true
112
112
  end
113
+
114
+ def self.remove_current_user_from_direct_access
115
+ remove_user_from_direct_access(client_username)
116
+ end
117
+
118
+ def self.remove_user_from_direct_access(username)
119
+ File.open('.temp_direct_access', 'w') do |output_file|
120
+ File.foreach(DIRECT_ACCESS) do |line|
121
+ output_file.puts line unless line.strip.eql?(username)
122
+ end
123
+ end
124
+
125
+ FileUtils.mv('.temp_direct_access', DIRECT_ACCESS)
126
+ true
127
+ end
113
128
 
114
129
  def self.client_username
115
130
  parse_key_value_file(CRED_FILE)[:username]
@@ -53,13 +53,13 @@ module DTK::Client
53
53
  NO_BACKTRACE = :no_backtarce
54
54
 
55
55
  def backtrace?
56
- if @backtrace
57
- @backtrace unless @backtrace == NO_BACKTRACE
58
- else
59
- backtrace
60
- end
56
+ if @backtrace
57
+ @backtrace unless @backtrace == NO_BACKTRACE
58
+ else
59
+ backtrace
60
+ end
61
61
  end
62
-
62
+
63
63
  def self.raise_if_error_info(response, opts = {})
64
64
  # check for errors in response
65
65
  error = response.error_info?(opts)
@@ -59,7 +59,12 @@ module DTK::Client
59
59
  if response.ok?
60
60
  response
61
61
  else
62
- raise Error::ServerNotOkResponse.new(response)
62
+ # if errors = response['errors']
63
+ # error_message = errors.first['message']
64
+ # raise Error::Server.new(error_message)
65
+ # else
66
+ raise Error::ServerNotOkResponse.new(response)
67
+ # end
63
68
  end
64
69
  end
65
70
 
@@ -34,6 +34,8 @@ module DTK::Client
34
34
  OsUtil.print("Warning: We were not able to unregister your key with remote catalog! #{response.data(:repoman_registration_error)}", :yellow)
35
35
  end
36
36
 
37
+ Configurator.remove_current_user_from_direct_access
38
+
37
39
  OsUtil.print("SSH key '#{name}' removed successfully!", :yellow)
38
40
  end
39
41
  end
@@ -313,7 +313,7 @@ module DTK::Client
313
313
 
314
314
  def self.checkout_branch_on_service_instance(service_instance, branch, &body)
315
315
  repo = git_repo.new(ret_base_path(:service, service_instance), :branch => branch)
316
- checkout_branch_in_repo(repo, branch, &block)
316
+ checkout_branch(repo, branch, {}, &body)
317
317
  end
318
318
 
319
319
  CHECKOUT_LOCK = Mutex.new
@@ -31,6 +31,25 @@ module DTK::Client
31
31
  response_data_hash(:nested_modules => Internal.commit_and_push_nested_modules(args))
32
32
  end
33
33
  end
34
+
35
+ def self.clone_nested_modules(args)
36
+ wrap_operation(args) do |args|
37
+ response_data_hash(:target_repo_dir => Internal.clone_nested_modules(args))
38
+ end
39
+ end
40
+
41
+ def self.modified_service_instance_or_nested_modules?(args)
42
+ wrap_operation(args) do |args|
43
+ response_data_hash(:modified => Internal.modified_service_instance_or_nested_modules?(args))
44
+ end
45
+ end
46
+
47
+ def self.remove_nested_module_dirs(args)
48
+ wrap_operation(args) do |args|
49
+ response_data_hash(:deleted_nested_modules => Internal.remove_nested_module_dirs(args))
50
+ end
51
+ end
52
+
34
53
  end
35
54
  end
36
55
  end
@@ -35,6 +35,16 @@ module DTK::Client
35
35
  new(args).clone
36
36
  end
37
37
 
38
+ def self.clone_nested_modules(args)
39
+ new(args).clone_nested_modules
40
+ end
41
+
42
+ def clone_nested_modules
43
+ @target_repo_dir = self.repo_dir
44
+ @nested_module_base = self.class.find_nested_modules_dir(self.repo_dir)
45
+ self.nested_modules.each { |nested_module| clone_nested_module(nested_module) }
46
+ end
47
+
38
48
  def clone
39
49
  @target_repo_dir = clone_base_module
40
50
  @nested_module_base = make_nested_module_base
@@ -61,6 +71,37 @@ module DTK::Client
61
71
  nested_modules_with_sha
62
72
  end
63
73
 
74
+ def self.modified_service_instance_or_nested_modules?(args)
75
+ service_instance_dir = args.required(:dir)
76
+ command = args.required(:command)
77
+ error_msg = args.required(:error_msg)
78
+
79
+ is_modified?(service_instance_dir, command, error_msg)
80
+
81
+ nested_modules_dir = find_nested_modules_dir(service_instance_dir)
82
+ nested_modules = Dir.glob("#{nested_modules_dir}/*")
83
+
84
+ nested_modules.each do |nested_module|
85
+ nested_module_name = nested_module.split('/').last
86
+ nested_error_msg = "There are uncommitted changes in nested module '#{nested_module_name}'! #{error_msg}"
87
+ is_modified?(nested_module, command, nested_error_msg)
88
+ end
89
+ end
90
+
91
+ def self.remove_nested_module_dirs(args)
92
+ service_instance = args[:service_instance]
93
+ service_instance_dir = args[:service_instance_dir] || ret_base_path(:service, service_instance)
94
+
95
+ nested_modules_dir = find_nested_modules_dir(service_instance_dir)
96
+ nested_modules = Dir.glob("#{nested_modules_dir}/*")
97
+
98
+ args[:nested_modules_to_delete].each do |nested_module|
99
+ module_to_delete_path = "#{nested_modules_dir}/#{nested_module['display_name']}"
100
+ FileUtils.remove_dir(module_to_delete_path) if nested_modules.include? module_to_delete_path
101
+ end
102
+ args[:nested_modules_to_delete]
103
+ end
104
+
64
105
  protected
65
106
 
66
107
  attr_reader :base_module, :nested_modules, :service_instance, :remove_existing, :repo_dir
@@ -121,6 +162,16 @@ module DTK::Client
121
162
  def self.possible_nested_module_base_dirs
122
163
  @possible_nested_module_base_dirs ||= ::DTK::DSL::DirectoryType::ServiceInstance::NestedModule.possible_paths
123
164
  end
165
+
166
+ def self.is_modified?(path, command, error_msg)
167
+ repo_dir = {
168
+ :path => path,
169
+ :branch => Git.open(path).branches.local,
170
+ :command => command
171
+ }
172
+ message = ClientModuleDir::GitRepo.modified_with_diff(repo_dir)
173
+ raise Error::Usage, error_msg if message.data(:modified)
174
+ end
124
175
 
125
176
  end
126
177
  end
@@ -64,10 +64,10 @@ module DTK::Client
64
64
 
65
65
  # OsUtil.print_info("DTK module '#{@module_ref.pretty_print}' has been successfully cloned into '#{ret.required(:target_repo_dir)}'")
66
66
  target_repo_dir = ret.required(:target_repo_dir)
67
- pull_service_info = check_if_pull_needed
67
+ # pull_service_info = check_if_pull_needed
68
68
  {
69
- target_repo_dir: target_repo_dir,
70
- pull_service_info: pull_service_info
69
+ target_repo_dir: target_repo_dir
70
+ # pull_service_info: pull_service_info
71
71
  }
72
72
  end
73
73
 
@@ -97,6 +97,8 @@ module DTK::Client
97
97
  remote_module_info = rest_get "#{BaseRoute}/remote_module_info", query_string_hash
98
98
  rescue DTK::Client::Error::ServerNotOkResponse => e
99
99
  # ignore if remote does not exist
100
+ rescue DTK::Client::Error::Server => error
101
+ # ignore if remote does not exist
100
102
  end
101
103
 
102
104
  if remote_module_info && remote_module_info.data(:service_info)
@@ -85,8 +85,12 @@ module DTK::Client
85
85
  version: ref_version,
86
86
  repo_dir: target_repo_dir
87
87
  }
88
- DtkNetworkClient::Pull.run(module_info)
89
-
88
+ begin
89
+ DtkNetworkClient::Pull.run(module_info, opts)
90
+ rescue Git::GitExecuteError => e
91
+ exc = e.to_s << "\nUse '--force' flag to overwrite your changes"
92
+ raise (e.to_s.include? 'merge') ? exc : e.to_s
93
+ end
90
94
 
91
95
  # query_string_hash = QueryStringHash.new(
92
96
  # :module_name => @module_ref.module_name,
@@ -52,7 +52,14 @@ module DTK::Client
52
52
  version: module_ref.version,
53
53
  repo_dir: @file_obj.parent_dir
54
54
  }
55
- dependency_tree = DtkNetworkDependencyTree.get_or_create(repoman_client_module_info, { format: :hash, parsed_module: parsed_module, save_to_file: true, update_lock_file: update_lock_file })
55
+
56
+ repoman_client_opts = {
57
+ format: :hash,
58
+ save_to_file: true,
59
+ update_lock_file: update_lock_file
60
+ }
61
+ repoman_client_opts.merge!(parsed_module: parsed_module) unless method.eql?('pulled')
62
+ dependency_tree = DtkNetworkDependencyTree.get_or_create(repoman_client_module_info, repoman_client_opts)
56
63
 
57
64
  # TODO: need to refactor to use the same code for push and install
58
65
  dependency_tree.each do |dependency|
@@ -120,9 +127,11 @@ module DTK::Client
120
127
  :commit_sha => git_repo_response.data(:head_sha)
121
128
  )
122
129
 
123
- response = handle_error @file_obj.parent_dir do
124
- rest_post("#{BaseRoute}/update_from_repo", post_body)
125
- end
130
+ # response = handle_error @file_obj.parent_dir do
131
+ # rest_post("#{BaseRoute}/update_from_repo", post_body)
132
+ # end
133
+
134
+ response = rest_post("#{BaseRoute}/update_from_repo", post_body)
126
135
 
127
136
  existing_diffs = nil
128
137
  print = nil
@@ -21,7 +21,7 @@ module DTK::Client
21
21
  require_relative('push_dtkn/convert_source')
22
22
 
23
23
  attr_reader :version, :module_ref, :target_repo_dir, :base_dsl_file_obj
24
- def initialize(catalog, module_ref, directory_path, version, base_dsl_file_obj, update_lock_file)
24
+ def initialize(catalog, module_ref, directory_path, version, base_dsl_file_obj, update_lock_file, force)
25
25
  @catalog = catalog
26
26
  @module_ref = module_ref
27
27
  @directory_path = directory_path
@@ -29,7 +29,7 @@ module DTK::Client
29
29
  @version = version || module_ref.version || 'master'
30
30
  @base_dsl_file_obj = base_dsl_file_obj
31
31
  @update_lock_file = update_lock_file
32
-
32
+ @force = force
33
33
  @module_ref.version ||= @version
34
34
  end
35
35
  private :initialize
@@ -41,10 +41,11 @@ module DTK::Client
41
41
  directory_path = args[:directory_path]
42
42
  base_dsl_file_obj = args[:base_dsl_file_obj]
43
43
  update_lock_file = args[:update_lock_file]
44
- new('dtkn', module_ref, directory_path, version, base_dsl_file_obj, update_lock_file).push_dtkn
44
+ force = args[:force]
45
+ new('dtkn', module_ref, directory_path, version, base_dsl_file_obj, update_lock_file, force).push_dtkn
45
46
  end
46
47
  end
47
-
48
+
48
49
  def push_dtkn
49
50
  # TODO: DTK-2765: not sure if we need module to exist on server to do push-dtkn
50
51
  unless module_version_exists?(@module_ref)
@@ -57,8 +58,9 @@ module DTK::Client
57
58
 
58
59
  @file_obj = @base_dsl_file_obj.raise_error_if_no_content
59
60
  parsed_module = @file_obj.parse_content(:common_module_summary)
60
- # error_msg = "To allow push-dtkn to go through, invoke 'dtk push' to push the changes to server before invoking push-dtkn again"
61
- # GitRepo.modified_with_diff?(target_repo_dir, { :error_msg => error_msg, :command => 'push-dtkn' })
61
+
62
+ error_msg = "To allow push-dtkn to go through, invoke 'dtk push' to push the changes to server before invoking push-dtkn again"
63
+ GitRepo.modified_with_diff?(target_repo_dir, { :error_msg => error_msg, :command => 'push-dtkn' })
62
64
 
63
65
  module_info = {
64
66
  name: module_ref.module_name,
@@ -66,20 +68,55 @@ module DTK::Client
66
68
  version: ref_version,
67
69
  repo_dir: target_repo_dir
68
70
  }
69
- DtkNetworkClient::Push.run(module_info, parsed_module: parsed_module, update_lock_file: @update_lock_file)
70
-
71
- # query_string_hash = QueryStringHash.new(
72
- # :module_name => @module_ref.module_name,
73
- # :namespace => @module_ref.namespace,
74
- # :rsa_pub_key => SSHUtil.rsa_pub_key_content,
75
- # :version => @version
76
- # )
77
- # remote_module_info = rest_get "#{BaseRoute}/remote_module_info", query_string_hash
78
71
 
79
- # ConvertSource.transform_and_commit(remote_module_info, self)
72
+ diffs = DtkNetworkClient::Push.run(module_info, parsed_module: parsed_module, update_lock_file: @update_lock_file, force: @force)
73
+ output_diffs diffs
80
74
  nil
81
75
  end
82
76
 
77
+ def output_diffs(diffs)
78
+
79
+ file_states = [:added, :deleted, :modified, :renamed, :changed]
80
+ file_state_arrays = [added = [], deleted = [], modified = [], renamed = [], changed = []]
81
+
82
+ diffs.each do |k, val|
83
+ case val
84
+ when "A"
85
+ file_state_arrays[0].push(k)
86
+ when "D"
87
+ file_state_arrays[1].push(k)
88
+ when "M"
89
+ file_state_arrays[2].push(k)
90
+ when "R100"
91
+ file_state_arrays[3].push(k)
92
+ else
93
+ file_state_arrays[4].push(k)
94
+ end
95
+ end
96
+
97
+ return OsUtil.print_info("No Diffs to be pushed.") if state_arrays_empty?(file_state_arrays)
98
+
99
+ OsUtil.print_info("\nDiffs that were pushed:")
100
+ file_state_arrays.each do | state_array |
101
+ unless state_array.empty?
102
+ file_state = file_states[file_state_arrays.index(state_array)].to_s
103
+ print_diff_array state_array, file_state
104
+ end
105
+ end
106
+
107
+ end
108
+
109
+ def state_arrays_empty?(file_state_arrays)
110
+ file_state_arrays.each do | state_array |
111
+ return false unless state_array.empty?
112
+ end
113
+ return true
114
+ end
115
+
116
+ def print_diff_array(diff_array, file_state)
117
+ print "files_#{file_state}:\n"
118
+ diff_array.each { |d| print "- path: #{d}\n" }
119
+ end
83
120
  end
84
121
  end
85
122
  end
@@ -29,7 +29,7 @@ module DTK::Client
29
29
  :edit,
30
30
  :eject,
31
31
  :exec,
32
- :link,
32
+ :add_link,
33
33
  :list,
34
34
  :list_actions,
35
35
  :list_attributes,
@@ -48,7 +48,8 @@ module DTK::Client
48
48
  :task_status,
49
49
  :uninstall,
50
50
  :describe,
51
- :add
51
+ :add,
52
+ :add_component
52
53
  ]
53
54
  OPERATIONS.each { |operation| require_relative("service/#{operation}") }
54
55
 
@@ -0,0 +1,59 @@
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 AddComponent < self
21
+ def self.execute(args = Args.new)
22
+ wrap_operation(args) do |args|
23
+ service_instance = args.required(:service_instance)
24
+ component_ref = args.required(:component_ref)
25
+ version = args[:version]
26
+ namespace = args[:namespace]
27
+ parent_node = args[:parent_node]
28
+ service_instance_dir = args[:service_instance_dir]
29
+
30
+ query_string_hash = QueryStringHash.new(service_instance: service_instance, component_ref: component_ref, version: version, namespace: namespace, parent_node: parent_node)
31
+ response = rest_post "#{BaseRoute}/add_component", query_string_hash
32
+
33
+ nested_modules = response.required(:nested_modules)
34
+ if nested_modules && !nested_modules.empty?
35
+ clone_args = {
36
+ :base_module => response.required(:base_module),
37
+ :nested_modules => nested_modules,
38
+ :service_instance => service_instance,
39
+ :remove_existing => true,
40
+ :repo_dir => service_instance_dir
41
+ }
42
+ ClientModuleDir::ServiceInstance.clone_nested_modules(clone_args)
43
+ end
44
+
45
+ repo_info_args = Args.new(
46
+ :service_instance => service_instance,
47
+ :commit_message => "Updating changes to service instance '#{service_instance}'",
48
+ :branch => response.required(:base_module, :branch, :name),
49
+ :repo_url => response.required(:base_module, :repo, :url),
50
+ :service_instance_dir => service_instance_dir
51
+ )
52
+ ClientModuleDir::GitRepo.pull_from_service_repo(repo_info_args)
53
+
54
+ OsUtil.print_info("Component '#{component_ref}' has been successfully added to service instance '#{service_instance}'")
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -63,6 +63,9 @@ module DTK::Client
63
63
  print_msgs_of_type(:info_msgs, response)
64
64
 
65
65
  ClientModuleDir::GitRepo.pull_from_service_repo(repo_info_args) if response.data(:repo_updated)
66
+ if nested_module_args[:nested_modules_to_delete] = response.data['module_refs_to_delete']
67
+ ClientModuleDir::ServiceInstance.remove_nested_module_dirs(nested_module_args)
68
+ end
66
69
  process_backup_files(repo_info_args, response.data(:backup_files))
67
70
  process_semantic_diffs(response.data(:semantic_diffs))
68
71
  nil
@@ -28,8 +28,14 @@ module DTK::Client
28
28
  :service_instance => service_instance
29
29
  )
30
30
 
31
- error_msg = "To allow converge to go through, invoke 'dtk push' to push the changes to server before invoking converge again"
32
- GitRepo.modified_with_diff?(module_dir, { :error_msg => error_msg, :command => 'converge' }) unless force
31
+ unless force
32
+ modified_args = Args.new(
33
+ :dir => module_dir,
34
+ :error_msg => "To allow converge to go through, invoke 'dtk push' to push the changes to server before invoking converge again",
35
+ :command => 'converge'
36
+ )
37
+ ClientModuleDir::ServiceInstance.modified_service_instance_or_nested_modules?(modified_args)
38
+ end
33
39
 
34
40
  rest_post("#{BaseRoute}/#{service_instance}/converge", post_body)
35
41
  end
@@ -32,8 +32,15 @@ module DTK::Client
32
32
  return false unless Console.prompt_yes_no("Are you sure you want to delete the content of service instance '#{@service_instance}' ?", :add_options => true)
33
33
  end
34
34
 
35
- error_msg = "To allow delete to go through, invoke 'dtk push' to push the changes to server before invoking delete again"
36
- GitRepo.modified_with_diff?(directory_path || @module_ref.client_dir_path, { :error_msg => error_msg, :command => 'delete' }) unless force
35
+ if !force && directory_path
36
+ modified_args = Args.new(
37
+ :dir => directory_path,
38
+ :error_msg => "To allow delete to go through, invoke 'dtk push' to push the changes to server before invoking delete again",
39
+ :command => 'delete'
40
+ )
41
+ ClientModuleDir::ServiceInstance.modified_service_instance_or_nested_modules?(modified_args)
42
+ end
43
+
37
44
  post_body = PostBody.new(
38
45
  :service_instance => @service_instance,
39
46
  :recursive? => recursive
@@ -22,12 +22,25 @@ module DTK::Client
22
22
  wrap_operation(args) do |args|
23
23
  service_instance = args.required(:service_instance)
24
24
  path = args[:path]
25
+ show_steps = args[:show_steps]
25
26
  query_string_hash = QueryStringHash.new
26
27
 
28
+ raise Error, 'Option --show-steps can only be used with actions path' if show_steps && !actions_path_valid?(path)
29
+
27
30
  query_string_hash.merge!(path: path) if path
28
- rest_get "#{BaseRoute}/#{service_instance}/describe", query_string_hash
31
+ query_string_hash.merge!(show_steps: show_steps) if show_steps
32
+ response = rest_get "#{BaseRoute}/#{service_instance}/describe", query_string_hash
33
+
34
+ response.set_render_as_table! if show_steps
35
+ response
29
36
  end
30
37
  end
38
+
39
+ def self.actions_path_valid?(path)
40
+ prefix, suffix = (path||'').split('/')
41
+ prefix.eql? 'actions'
42
+ end
43
+
31
44
  end
32
45
  end
33
46
  end
@@ -45,9 +45,13 @@ module DTK::Client
45
45
  node, action = $1, $2
46
46
  task_params.merge!("node" => node)
47
47
  end
48
-
49
- error_msg = "To allow #{args[:command]} to go through, invoke 'dtk push' to push the changes to server before invoking #{args[:command]} again"
50
- GitRepo.modified_with_diff?(directory_path, { :error_msg => error_msg, :command => 'exec'})
48
+
49
+ modified_args = Args.new(
50
+ :dir => directory_path,
51
+ :error_msg => "To allow #{args[:command]} to go through, invoke 'dtk push' to push the changes to server before invoking #{args[:command]} again",
52
+ :command => 'exec'
53
+ )
54
+ ClientModuleDir::ServiceInstance.modified_service_instance_or_nested_modules?(modified_args)
51
55
 
52
56
  post_body = PostBody.new(
53
57
  :task_params? => task_params
@@ -56,8 +56,22 @@ module DTK::Client
56
56
  info_hash = {}
57
57
 
58
58
  response = rest_get("#{BaseRoute}/#{service_instance}/nodes")
59
- unless node_info = response.data.find{ |node| node_name == node['display_name'] }
60
- raise Error::Usage, "The node '#{node_name}' does not exist"
59
+
60
+ if node_name.nil?
61
+ if response.data.nil?
62
+ raise Error::Usage, "Service instance does not contain any nodes"
63
+ end
64
+
65
+ if response.data.size == 1
66
+ node_info = response.data.first
67
+ else
68
+ node_names = response.data.map { |node| node['display_name'] }
69
+ raise Error::Usage, "The service instance '#{service_instance}' has more than one node. Please use 'dtk service ssh' command with a node name. Legal names are: #{node_names.join(', ')}"
70
+ end
71
+ else
72
+ unless node_info = response.data.find{ |node| node_name == node['display_name'] }
73
+ raise Error::Usage, "The node '#{node_name}' does not exist"
74
+ end
61
75
  end
62
76
 
63
77
  if dns_address = node_info['dns_address']
@@ -47,6 +47,12 @@ module DTK::Client
47
47
  DEFAULT_MODE = :snapshot
48
48
  LEGAL_MODES = [:refresh, :snapshot, :stream]
49
49
  def self.task_status_with_mode(mode, service_instance, opts = {})
50
+ Dir.glob("*", File::FNM_DOTMATCH).each do |f|
51
+ if match = /^(.task_id_)(\d*)/.match(f)
52
+ opts[:task_id] = match[2] if match[2]
53
+ break
54
+ end
55
+ end
50
56
  case mode
51
57
  when :refresh
52
58
  RefreshMode.new(mode, service_instance).task_status(opts)
@@ -67,7 +73,8 @@ module DTK::Client
67
73
  QueryStringHash.new(
68
74
  :form? => opts[:form],
69
75
  :wait_for? => opts[:wait_for],
70
- :summarize_node_groups? => opts[:summarize]
76
+ :summarize_node_groups? => opts[:summarize],
77
+ :task_id? => opts[:task_id]
71
78
  )
72
79
  end
73
80
 
@@ -27,6 +27,15 @@ module DTK::Client
27
27
  node = []
28
28
  msg = "Are you sure you want to uninstall the infrastructure associated with '#{service_instance}' and delete this service instance from the server?"
29
29
 
30
+ if !force && path
31
+ modified_args = Args.new(
32
+ :dir => path || @module_ref.client_dir_path,
33
+ :error_msg => "To allow uninstall to go through, invoke 'dtk push' to push the changes to server before invoking uninstall again",
34
+ :command => 'uninstall'
35
+ )
36
+ ClientModuleDir::ServiceInstance.modified_service_instance_or_nested_modules?(modified_args)
37
+ end
38
+
30
39
  if force
31
40
  msg.prepend("Note: this will not terminate aws instances, you will have to do that manually!\n")
32
41
  end
@@ -46,6 +55,10 @@ module DTK::Client
46
55
  ClientModuleDir.rm_f(path) if args[:purge]
47
56
 
48
57
  if message = response.data(:message) || "DTK service '#{service_instance}' has been uninstalled successfully."
58
+ Dir.glob("*", File::FNM_DOTMATCH).each do |f|
59
+ ClientModuleDir.rm_f(f) if f.include? '.task_id_'
60
+ end
61
+ ClientModuleDir.create_file_with_content(".task_id_#{response.data(:task_id)}", '') if response.data(:task_id)
49
62
  OsUtil.print_info(message)
50
63
  end
51
64
  end
@@ -35,10 +35,10 @@ module DTK::Client
35
35
  private
36
36
 
37
37
  def self.valid_name?(name)
38
- name.to_s.match(/\A[\w\-\.]+\z/)
38
+ name.to_s.match(/\A[[a-z]\-\.\_\d]+\z/)
39
39
  end
40
40
 
41
- VALID_NAME_CHARACTERS = ['letters', 'numbers', '-', '_', '.']
41
+ VALID_NAME_CHARACTERS = ['lowercase letters', 'numbers', '-', '_', '.']
42
42
  def self.valid_characters
43
43
  VALID_NAME_CHARACTERS.join("', '")
44
44
  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.12.0.1
4
+ version: 0.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reactor8
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-07 00:00:00.000000000 Z
11
+ date: 2018-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dtk-common-core
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: git
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '='
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 1.2.9
75
+ version: 1.4.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '='
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 1.2.9
82
+ version: 1.4.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: hirb
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -112,14 +112,14 @@ dependencies:
112
112
  name: dtk-dsl
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '='
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
117
  version: 1.1.4
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '='
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: 1.1.4
125
125
  - !ruby/object:Gem::Dependency
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - '='
130
130
  - !ruby/object:Gem::Version
131
- version: 1.0.2
131
+ version: 1.0.3
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: 1.0.2
138
+ version: 1.0.3
139
139
  description: Command line tool to interact with a DTK Server and DTK Service Catalog.
140
140
  email: support@reactor8.com
141
141
  executables:
@@ -195,6 +195,8 @@ files:
195
195
  - lib/cli/command/options.rb
196
196
  - lib/cli/command/service.rb
197
197
  - lib/cli/command/service/add.rb
198
+ - lib/cli/command/service/add_component.rb
199
+ - lib/cli/command/service/add_link.rb
198
200
  - lib/cli/command/service/cancel_task.rb
199
201
  - lib/cli/command/service/clone.rb
200
202
  - lib/cli/command/service/converge.rb
@@ -206,7 +208,6 @@ files:
206
208
  - lib/cli/command/service/eject.rb
207
209
  - lib/cli/command/service/exec.rb
208
210
  - lib/cli/command/service/exec_sync.rb
209
- - lib/cli/command/service/link.rb
210
211
  - lib/cli/command/service/list.rb
211
212
  - lib/cli/command/service/list_actions.rb
212
213
  - lib/cli/command/service/list_attributes.rb
@@ -318,6 +319,8 @@ files:
318
319
  - lib/client/operation/module_service_common.rb
319
320
  - lib/client/operation/service.rb
320
321
  - lib/client/operation/service/add.rb
322
+ - lib/client/operation/service/add_component.rb
323
+ - lib/client/operation/service/add_link.rb
321
324
  - lib/client/operation/service/cancel_task.rb
322
325
  - lib/client/operation/service/clone_service.rb
323
326
  - lib/client/operation/service/commit_and_push.rb
@@ -329,7 +332,6 @@ files:
329
332
  - lib/client/operation/service/edit.rb
330
333
  - lib/client/operation/service/eject.rb
331
334
  - lib/client/operation/service/exec.rb
332
- - lib/client/operation/service/link.rb
333
335
  - lib/client/operation/service/list.rb
334
336
  - lib/client/operation/service/list_actions.rb
335
337
  - lib/client/operation/service/list_attributes.rb
@@ -428,7 +430,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
428
430
  version: '0'
429
431
  requirements: []
430
432
  rubyforge_project:
431
- rubygems_version: 2.4.8
433
+ rubygems_version: 2.7.8
432
434
  signing_key:
433
435
  specification_version: 4
434
436
  summary: DTK CLI client for DTK server interaction.