dtk-client 0.12.0.1 → 0.12.1

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