dtk-client 0.10.0.2 → 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/dtk-client.gemspec +1 -1
  4. data/lib/cli/command/module/install.rb +8 -4
  5. data/lib/cli/command/module/list_remotes.rb +39 -0
  6. data/lib/cli/command/module.rb +1 -1
  7. data/lib/cli/command/service/clone.rb +43 -0
  8. data/lib/cli/command/service/delete.rb +48 -0
  9. data/lib/cli/command/service/exec.rb +10 -1
  10. data/lib/cli/command/service/exec_sync.rb +8 -2
  11. data/lib/cli/command/service/set_attribute.rb +46 -0
  12. data/lib/cli/command/service/ssh.rb +1 -1
  13. data/lib/cli/command/service/uninstall.rb +53 -0
  14. data/lib/cli/command/service.rb +4 -1
  15. data/lib/cli/command/token.rb +7 -1
  16. data/lib/cli/context/type.rb +3 -2
  17. data/lib/cli/context.rb +4 -7
  18. data/lib/cli/directory_parser/file_system.rb +16 -12
  19. data/lib/cli/version.rb +1 -1
  20. data/lib/client/content_generator.rb +62 -3
  21. data/lib/client/operation/client_module_dir/git_repo.rb +2 -2
  22. data/lib/client/operation/client_module_dir.rb +4 -2
  23. data/lib/client/operation/module/clone_module.rb +0 -1
  24. data/lib/client/operation/module/install/external_module.rb +89 -15
  25. data/lib/client/operation/module/install.rb +6 -6
  26. data/lib/client/operation/module/install_from_catalog.rb +1 -1
  27. data/lib/client/operation/module/list_assemblies.rb +1 -1
  28. data/lib/client/operation/module/list_remotes.rb +37 -0
  29. data/lib/client/operation/module.rb +1 -1
  30. data/lib/client/operation/service/clone_service.rb +50 -0
  31. data/lib/client/operation/service/delete.rb +44 -0
  32. data/lib/client/operation/service/exec.rb +5 -0
  33. data/lib/client/operation/service/set_attribute.rb +47 -0
  34. data/lib/client/operation/service/set_required_attributes.rb +11 -1
  35. data/lib/client/operation/service/stage.rb +9 -2
  36. data/lib/client/operation/service/task_status/refresh_mode.rb +1 -0
  37. data/lib/client/operation/service/task_status/snapshot_mode.rb +1 -0
  38. data/lib/client/operation/service/task_status/stream_mode/element/hierarchical_task/result.rb +4 -0
  39. data/lib/client/operation/service/task_status.rb +3 -1
  40. data/lib/client/operation/service/uninstall.rb +46 -0
  41. data/lib/client/operation/service.rb +10 -1
  42. data/lib/client/render/view/table/processor.rb +2 -2
  43. data/lib/client/response/render_helper.rb +4 -0
  44. data/lib/client/util/console.rb +23 -0
  45. metadata +15 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f28cd5b72fe1b22b5ed1c1acf5d7994c70e147d5
4
- data.tar.gz: 3ed5a5af32baa1a5d22e5a493bd4907b7636eef2
3
+ metadata.gz: e9540610a410ba802ef78157c6781d4271ccfe04
4
+ data.tar.gz: 7a38732fc16295a3cad0f088483198746d776b21
5
5
  SHA512:
6
- metadata.gz: 609335a109d58bfc74ffa0b0b5580b6474fdadea1d2691d7270420de7f60bb1bd26363c7e55cd77e0f2dbd854bc4c9939d0587360f314b77b45814809f9fae1a
7
- data.tar.gz: 3f3446bd3d10709e48c19c12886fde17da89e16bf0dcaa866a582a525fe81bb411352da2475100ca54abe75705b02f886805f03546b6a3a6ec846bdad6d7e8ec
6
+ metadata.gz: 7a1ed74ece609638c98e20ba20e2d3cb12364ecc1bc7cadf94fc5341837fda53c51226bc0529c63464c80cdf5ea3b96c3769fc070fc60233e950e0d208bda23f
7
+ data.tar.gz: 300e8bec9f03786c3867a0e473c8eff0d93b7c056148fc9bf70752220d1103c3e7d29eb37305890ad653fa7d16b5d4ca0bc5b8f14aa9f9c59a0329180ac7186c
data/.gitignore CHANGED
@@ -2,4 +2,5 @@
2
2
  sftp-config*.json
3
3
  .remote-sync.json
4
4
  .tags
5
+ .tags1
5
6
  Gemfile.lock
data/dtk-client.gemspec CHANGED
@@ -24,6 +24,6 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency 'git', '1.2.9'
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.0.0'
27
+ spec.add_dependency 'dtk-dsl', '~> 1.0.0'
28
28
 
29
29
  end
@@ -23,9 +23,12 @@ module DTK::Client
23
23
  command_body c, :install, 'Install a module on the server from a client directory or from the DTK remote catalog (DTKN)' do |sc|
24
24
  sc.flag Token.version
25
25
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to directory containing content to install'
26
+ sc.switch Token.skip_prompt
27
+
26
28
  sc.action do |_global_options, options, args|
27
29
  directory_path = options[:directory_path]
28
- version = options[:version]
30
+ version = options[:version]
31
+ skip_prompt = options[:skip_prompt]
29
32
 
30
33
  # install from dtkn (later probably from other remote catalogs)
31
34
  if module_name = args[0]
@@ -40,9 +43,10 @@ module DTK::Client
40
43
  end
41
44
 
42
45
  install_opts = directory_path ? { :directory_path => directory_path, :version => (version || 'master') } : options
43
- module_ref = module_ref_in_options_or_context?(install_opts)
44
- flag = true unless options["d"].nil?
45
- Operation::Module.install(:module_ref => module_ref, :base_dsl_file_obj => @base_dsl_file_obj, :flag => flag)
46
+ module_ref = module_ref_in_options_or_context?(install_opts)
47
+ flag = true unless options["d"].nil?
48
+
49
+ Operation::Module.install(:module_ref => module_ref, :base_dsl_file_obj => @base_dsl_file_obj, :flag => flag, :skip_prompt => skip_prompt)
46
50
  end
47
51
  end
48
52
  end
@@ -0,0 +1,39 @@
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
20
+ module Module
21
+ subcommand_def 'list-remotes' do |c|
22
+ command_body c, 'list-remotes', 'List remote modules' do |sc|
23
+ sc.flag Token.namespace
24
+ sc.action do |_global_options, options, args|
25
+ arg = {}
26
+ unless options[:n].nil?
27
+ arg = {
28
+ :module_namespace => options[:n]
29
+ }
30
+ end
31
+
32
+ Operation::Module.list_remotes(arg)
33
+ end
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -21,7 +21,7 @@ module DTK::Client
21
21
  module Module
22
22
  include Command::Mixin
23
23
 
24
- ALL_SUBCOMMANDS = ['install', 'list', 'list-assemblies', 'push', 'uninstall', 'clone']
24
+ ALL_SUBCOMMANDS = ['install', 'list', 'list-assemblies', 'push', 'uninstall', 'clone', 'list-remotes']
25
25
  command_def :desc => 'Subcommands for interacting with DTK modules'
26
26
  ALL_SUBCOMMANDS.each { |subcommand| require_relative("module/#{subcommand.gsub(/-/,'_')}") }
27
27
  end
@@ -0,0 +1,43 @@
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
20
+ module Service
21
+ subcommand_def 'clone' do |c|
22
+ c.arg Token::Arg.service_instance
23
+ c.arg Token::Arg.target_directory, :optional => true
24
+ command_body c, :clone, 'Clone content of service module from server to client' do |sc|
25
+ sc.action do |_global_options, options, args|
26
+ service_name = args[0]
27
+ service_ref = service_instance_in_options_or_context(:service_instance => service_name, :version => options[:version])
28
+
29
+ arg = {
30
+ :service_ref => service_ref,
31
+ :service_name => service_name,
32
+ :target_directory => args[1]
33
+ }
34
+
35
+ Operation::Service.clone_service(arg)
36
+ end
37
+ end
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+
@@ -0,0 +1,48 @@
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 'delete' do |c|
22
+ command_body c, :delete, 'Destroys the running infrastructure associated with the service instance' do |sc|
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.switch Token.skip_prompt, :desc => 'Skip prompt that checks if user wants to delete the service instance'
25
+ sc.switch Token.recursive
26
+ # sc.switch Token.purge, :desc => 'Delete the service instance directory on the client'
27
+ sc.action do |_global_options, options, args|
28
+ directory_path = options[:directory_path]
29
+ purge = options[:purge]
30
+ recursive = options[:recursive]
31
+ # if purge && (!directory_path || (directory_path == @base_dsl_file_obj.parent_dir?))
32
+ # raise Error::Usage, "If use option '#{option_ref(:purge)}' then need to call from outside directory and use option '#{option_ref(:directory_path)}'"
33
+ # end
34
+ service_instance = service_instance_in_options_or_context(options)
35
+
36
+ args = {
37
+ :service_instance => service_instance,
38
+ :skip_prompt => options[:skip_prompt],
39
+ :directory_path => directory_path,
40
+ :recursive => recursive
41
+ }
42
+ Operation::Service.delete(args)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end; end
@@ -22,7 +22,9 @@ module DTK::Client
22
22
  c.arg Token::Arg.action
23
23
  c.arg Token::Arg.action_params, :optional => true
24
24
  command_body c, :exec, 'Execute action asynchronously' do |sc|
25
+ 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'
25
26
  sc.action do |_global_options, options, args|
27
+
26
28
  service_instance = service_instance_in_options_or_context(options)
27
29
 
28
30
  action = args[0]
@@ -33,7 +35,14 @@ module DTK::Client
33
35
  :action => action,
34
36
  :action_params => action_params
35
37
  }
36
- Operation::Service.exec(args)
38
+
39
+ response = Operation::Service.exec(args)
40
+
41
+ if violations = response.data(:violations)
42
+ response.set_data(violations)
43
+ response.data.flatten!
44
+ response.set_render_as_table!
45
+ end
37
46
  end
38
47
  end
39
48
  end
@@ -22,6 +22,7 @@ module DTK::Client
22
22
  c.arg Token::Arg.action
23
23
  c.arg Token::Arg.action_params, :optional => true
24
24
  command_body c, 'exec-sync', 'Execute action synchronously' do |sc|
25
+ 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'
25
26
  sc.action do |_global_options, options, args|
26
27
  service_instance = service_instance_in_options_or_context(options)
27
28
 
@@ -34,13 +35,18 @@ module DTK::Client
34
35
  :action_params => action_params
35
36
  }
36
37
  response = Operation::Service.exec(args)
38
+
37
39
  unless response.ok?
38
40
  response
39
41
  else
40
42
  # TODO: break if any exceptions
43
+
41
44
  if response.data(:empty_workflow)
42
- Response::Ok.new
43
- #eslsif TODO: break if any violations
45
+ Response::Ok.new
46
+ elsif violations = response.data(:violations)
47
+ response.set_data(violations)
48
+ response.data.flatten!
49
+ response.set_render_as_table!
44
50
  else
45
51
  Operation::Service.task_status(args.merge(:mode => 'stream'))
46
52
  end
@@ -0,0 +1,46 @@
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 'set-attribute' do |c|
22
+ c.arg Token::Arg.attribute_name
23
+ c.arg Token::Arg.attribute_value, :optional => true
24
+ command_body c, 'set-attribute', 'Edit specific attribute.' do |sc|
25
+ sc.switch Token.u
26
+ sc.flag Token.directory_path
27
+ sc.action do |_global_options, options, _args|
28
+
29
+ service_instance = service_instance_in_options_or_context(options)
30
+
31
+ attribute_name = _args[0]
32
+ options[:u] ? attribute_value = nil : attribute_value = _args[1]
33
+
34
+ args = {
35
+ :attribute_name => attribute_name,
36
+ :service_instance => service_instance,
37
+ :attribute_value => attribute_value
38
+ }
39
+
40
+ Operation::Service.set_attribute(args)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end; end
@@ -20,7 +20,7 @@ module DTK::Client
20
20
  module Service
21
21
  subcommand_def 'ssh' do |c|
22
22
  c.arg Token::Arg.node_name
23
- command_body c, :ssh, 'Ssh into service instance node.' do |sc|
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
 
@@ -0,0 +1,53 @@
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 'uninstall' do |c|
22
+ command_body c, :uninstall, 'Uninstalls the service instance from the server' do |sc|
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.switch Token.skip_prompt, :desc => 'Skip prompt that checks if user wants to delete the service instance'
25
+ sc.switch Token.purge, :desc => 'Delete the service instance directory on the client'
26
+ sc.switch Token.force
27
+ sc.switch Token.recursive
28
+ sc.action do |_global_options, options, args|
29
+ directory_path = options[:directory_path]
30
+ purge = options[:purge]
31
+ force = options[:force]
32
+ recursive = options[:recursive]
33
+
34
+ if purge && (!directory_path || (directory_path == @base_dsl_file_obj.parent_dir?))
35
+ raise Error::Usage, "If use option '#{option_ref(:purge)}' then need to call from outside directory and use option '#{option_ref(:directory_path)}'"
36
+ end
37
+ service_instance = service_instance_in_options_or_context(options)
38
+
39
+ args = {
40
+ :service_instance => service_instance,
41
+ :skip_prompt => options[:skip_prompt],
42
+ :directory_path => directory_path,
43
+ :purge => purge,
44
+ :force => force,
45
+ :recursive => recursive
46
+ }
47
+ Operation::Service.uninstall(args)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end; end
@@ -21,8 +21,10 @@ module DTK::Client
21
21
  module Service
22
22
  include Command::Mixin
23
23
  ALL_SUBCOMMANDS = [
24
+ 'clone',
24
25
  'stage',
25
- 'destroy',
26
+ 'delete',
27
+ 'uninstall',
26
28
  'edit',
27
29
  'push',
28
30
  'pull',
@@ -41,6 +43,7 @@ module DTK::Client
41
43
  'cancel-task',
42
44
  'ssh',
43
45
  'set-required-attributes',
46
+ 'set-attribute',
44
47
  'exec',
45
48
  'exec-sync',
46
49
  'set-default-target'
@@ -46,6 +46,8 @@ module DTK::Client
46
46
  :remote_user => Flag.new(:u, 'REMOTE-USER', 'Remote user'),
47
47
  :identity_file => Flag.new(:i, 'PATH-TO-PEM', 'Path to pem file'),
48
48
  :mode => Flag.new(:mode, 'MODE', 'Mode'),
49
+ :namespace => Flag.new(:n, 'NAMESPACE', 'Namespace'),
50
+
49
51
 
50
52
  # switches
51
53
  # Switch constructor args order: key, desc, opts={}
@@ -57,6 +59,8 @@ module DTK::Client
57
59
  :target => Switch.new(:target, 'Create target service instance'),
58
60
  :links => Switch.new(:links, 'Links'),
59
61
  :dependencies => Switch.new(:deps, 'Dependencies'),
62
+ :u => Switch.new([:u, :unset], 'Unset attribute'),
63
+ :recursive => Switch.new(:r, 'Recursive')
60
64
  }
61
65
 
62
66
  ARG_TOKENS = {
@@ -68,7 +72,9 @@ module DTK::Client
68
72
  :workspace_name => 'WORKSPACE-NAME',
69
73
  :target_instance => 'TARGET-SERVICE-INSTANCE',
70
74
  :module_name => 'NAMESPACE/MODULE-NAME',
71
- :target_directory => 'TARGET-DIRECTORY'
75
+ :target_directory => 'TARGET-DIRECTORY',
76
+ :attribute_name => 'ATTRIBUTE-NAME',
77
+ :attribute_value => 'VALUE'
72
78
  }
73
79
 
74
80
  end
@@ -25,13 +25,14 @@ module DTK::Client
25
25
  # This function can have the side of updating base_dsl_file_obj
26
26
  def self.create_context!(base_dsl_file_obj)
27
27
  if path = base_dsl_file_obj.path?
28
- case base_dsl_file_obj.file_type.type
28
+ top_level_type = base_dsl_file_obj.file_type.top_level_type
29
+ case top_level_type
29
30
  when :common_module
30
31
  Module.new(base_dsl_file_obj)
31
32
  when :service_instance
32
33
  Service.new(base_dsl_file_obj)
33
34
  else
34
- raise Error, "Unexpected file_type '#{file_type.type}'"
35
+ raise Error, "Unexpected top_level_type '#{top_level_type}'"
35
36
  end
36
37
  else
37
38
  Top.new(base_dsl_file_obj)
data/lib/cli/context.rb CHANGED
@@ -23,9 +23,6 @@ module DTK::Client
23
23
  require_relative('context/attributes')
24
24
 
25
25
  def self.determine_context
26
- #testing stub
27
- #dir_path = File.expand_path('../../examples/spark', File.dirname(__FILE__))
28
- #base_dsl_file_obj = base_dsl_file_obj(:dir_path => dir_path)
29
26
  base_dsl_file_obj = base_dsl_file_obj()
30
27
  Type.create_context!(base_dsl_file_obj)
31
28
  end
@@ -76,8 +73,8 @@ module DTK::Client
76
73
  end
77
74
 
78
75
  def service_instance_from_base_dsl_file?
79
- #raise_error_when_missing_context(:service_instance) unless base_dsl_file_obj.file_type == DTK::DSL::FileType::ServiceInstance
80
- base_dsl_file_obj.file_type == DTK::DSL::FileType::ServiceInstance
76
+ #raise_error_when_missing_context(:service_instance) unless base_dsl_file_obj.file_type == DTK::DSL::FileType::ServiceInstance::DSLFile::Top
77
+ base_dsl_file_obj.file_type == DTK::DSL::FileType::ServiceInstance::DSLFile::Top
81
78
  base_dsl_file_obj.parse_content(:service_module_summary).val(:Name)
82
79
  end
83
80
 
@@ -96,8 +93,8 @@ module DTK::Client
96
93
  end
97
94
  FILE_TYPES =
98
95
  [
99
- ::DTK::DSL::FileType::CommonModule,
100
- ::DTK::DSL::FileType::ServiceInstance
96
+ ::DTK::DSL::FileType::CommonModule::DSLFile::Top,
97
+ ::DTK::DSL::FileType::ServiceInstance::DSLFile::Top
101
98
  ]
102
99
 
103
100
  def module_ref_in_options_or_context(options)
@@ -60,8 +60,7 @@ module DTK::Client; module CLI
60
60
  end
61
61
  else
62
62
  file_types.each do | file_type |
63
- path_info = file_type.create_path_info
64
- if path = most_nested_matching_file_path?(path_info, flag, :current_dir => opts[:dir_path])
63
+ if path = most_nested_matching_file_path?(file_type, flag, :current_dir => opts[:dir_path])
65
64
  return [file_type, path]
66
65
  end
67
66
  end
@@ -69,22 +68,22 @@ module DTK::Client; module CLI
69
68
  ret
70
69
  end
71
70
 
72
- # return either a string file path or of match to path_info working from current directory and 'otwards'
73
- # until base_path in path_info (if it exists)
71
+ # return either a string file path or of match to file_type working from current directory and 'outwards'
72
+ # until base_path in file_type (if it exists)
74
73
  # opts can have keys
75
74
  # :current_dir if set means start from this dir; otherwise start from computed current dir
76
- def most_nested_matching_file_path?(path_info, flag, opts = {})
77
- base_dir = path_info.base_dir || OsUtil.home_dir
75
+ def most_nested_matching_file_path?(file_type, flag, opts = {})
76
+ base_dir = file_type.base_dir || OsUtil.home_dir
78
77
  current_dir = opts[:current_dir] || OsUtil.current_dir
79
- check_match_recurse_on_failure?(path_info, current_dir, base_dir, flag)
78
+ check_match_recurse_on_failure?(file_type, current_dir, base_dir, flag)
80
79
  end
81
80
 
82
- def check_match_recurse_on_failure?(path_info, current_dir, base_dir, flag)
83
- match = matching_file_paths(current_dir, path_info)
81
+ def check_match_recurse_on_failure?(file_type, current_dir, base_dir, flag)
82
+ match = matching_file_paths(current_dir, file_type)
84
83
  if match.empty?
85
84
  unless current_dir == base_dir
86
85
  if parent_path = OsUtil.parent_dir?(current_dir)
87
- check_match_recurse_on_failure?(path_info, parent_path, base_dir, flag) unless flag
86
+ check_match_recurse_on_failure?(file_type, parent_path, base_dir, flag) unless flag
88
87
  end
89
88
  end
90
89
  elsif match.size == 1
@@ -94,9 +93,14 @@ module DTK::Client; module CLI
94
93
  end
95
94
  end
96
95
 
97
- # returns an array of strings that are file paths
96
+ # returns an array of strings that are file paths; except bakup files (e.g. bak.dtk.service.yaml)
98
97
  def matching_file_paths(dir_path, path_info)
99
- Dir.glob("#{dir_path}/*").select { |file_path| File.file?(file_path) and path_info.matches?(file_path) }
98
+ Dir.glob("#{dir_path}/*").select { |file_path| File.file?(file_path) and !is_backup_file?(file_path) and path_info.matches?(file_path) }
99
+ end
100
+
101
+ def is_backup_file?(file_path)
102
+ regex = Regexp.new("\.bak\.dtk\.(service|module)\.(yml|yaml)$")
103
+ file_path =~ regex
100
104
  end
101
105
  end
102
106
  end
data/lib/cli/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module DTK
2
2
  module Client
3
3
  module CLI
4
- VERSION = '0.10.0.2'
4
+ VERSION="0.10.1"
5
5
  end
6
6
  end
7
7
  end
@@ -91,9 +91,14 @@ module DTK::Client
91
91
  content_hash = convert_file_content_to_hash(assembly)
92
92
  name = content_hash['name']
93
93
  assembly_content = content_hash['assembly']
94
- workflows = ret_workflows_hash(content_hash)
95
94
 
95
+ workflows = ret_workflows_hash(content_hash)
96
96
  assembly_content.merge!('workflows' => workflows) if workflows
97
+
98
+ # convert node_bindings to node attributes
99
+ node_bindings = content_hash['node_bindings']
100
+ create_node_properties_from_node_bindings?(node_bindings, assembly_content)
101
+
97
102
  assemblies.merge!(name => assembly_content)
98
103
  end
99
104
 
@@ -114,17 +119,71 @@ module DTK::Client
114
119
  def ret_dependencies_hash
115
120
  if file_path = get_module_refs_file
116
121
  module_refs_content = convert_file_content_to_hash(file_path)
117
- dependencies = []
122
+ dependencies = {}
118
123
 
119
124
  if cmp_dependencies = module_refs_content['component_modules']
120
125
  cmp_dependencies.each_pair do |name, namespace_h|
121
- dependencies << "#{namespace_h['namespace']}/#{name}"
126
+ dependencies.merge!({ "#{namespace_h['namespace']}/#{name}" => namespace_h['version']||'master' })
122
127
  end
123
128
  end
124
129
 
125
130
  dependencies
126
131
  end
127
132
  end
133
+
134
+ def create_node_properties_from_node_bindings?(node_bindings, assembly_content = {})
135
+ return unless node_bindings
136
+
137
+ nodes = assembly_content['nodes']
138
+ return if nodes.empty?
139
+
140
+ node_bindings.each do |node, node_binding|
141
+ image, size = get_ec2_properties_from_node_binding(node_binding)
142
+ new_attrs = { 'image' => image, 'size' => size }
143
+
144
+ if node_content = nodes[node]
145
+ components = node_content['components']
146
+ components = components.is_a?(Array) ? components : [components]
147
+
148
+ if index = include_node_property_component?(components)
149
+ ec2_properties = components[index]
150
+ if ec2_properties.is_a?(Hash)
151
+ if attributes = ec2_properties.values.first['attributes']
152
+ attributes['image'] = image unless attributes['image']
153
+ attributes['size'] = size unless attributes['size']
154
+ else
155
+ ec2_properties.merge!('attributes' => new_attrs)
156
+ end
157
+ else
158
+ components[index] = { ec2_properties => { 'attributes' => new_attrs } }
159
+ end
160
+ elsif node_attributes = node_content['attributes']
161
+ node_attributes['image'] = image unless node_attributes['image']
162
+ node_attributes['size'] = size unless node_attributes['size']
163
+ else
164
+ node_content['attributes'] = new_attrs
165
+ end
166
+ end
167
+ end
168
+ end
169
+
170
+ def get_ec2_properties_from_node_binding(node_binding)
171
+ image, size = node_binding.split('-')
172
+ [image, size]
173
+ end
174
+
175
+ def include_node_property_component?(components)
176
+ property_component = 'ec2::properties'
177
+ components.each do |component|
178
+ if component.is_a?(Hash)
179
+ return components.index(component) if component.keys.first.eql?(property_component)
180
+ else
181
+ return components.index(component) if component.eql?(property_component)
182
+ end
183
+ end
184
+
185
+ false
186
+ end
128
187
  end
129
188
  end
130
189
 
@@ -137,12 +137,12 @@ module DTK::Client
137
137
 
138
138
  def self.clone_service_repo(args)
139
139
  repo_url = args.required(:repo_url)
140
- module_ref = args.required(:module_ref)
141
140
  branch = args.required(:branch)
142
141
  service_instance = args.required(:service_instance)
143
142
  remove_existing = args[:remove_existing]
143
+ repo_dir = args[:repo_dir]
144
144
 
145
- target_repo_dir = create_service_dir(service_instance, :remove_existing => remove_existing)
145
+ target_repo_dir = create_service_dir(service_instance, :remove_existing => remove_existing, :path => repo_dir)
146
146
  begin
147
147
  git_repo.clone(repo_url, target_repo_dir, branch)
148
148
  rescue => e
@@ -28,7 +28,8 @@ module DTK::Client
28
28
  # :backup_if_exist - Boolean (default: false)
29
29
  # :remove_existing - Boolean (default: false)
30
30
  def self.create_service_dir(service_instance, opts = {})
31
- path = "#{base_path(:service)}/#{service_instance}"
31
+ path = opts[:path]
32
+ path = "#{base_path(:service)}/#{service_instance}" if path.nil?
32
33
  if File.exists?(path)
33
34
  if opts[:remove_existing]
34
35
  FileUtils.rm_rf(path)
@@ -42,7 +43,8 @@ module DTK::Client
42
43
  # else
43
44
  # raise Error::Usage, "Directory '#{path}' is not empty; it must be deleted or removed before retrying the command"
44
45
  #end
45
- raise Error::Usage, "Directory '#{path}' is not empty; it must be deleted or removed before retrying the command"
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?
47
+ return path
46
48
  end
47
49
  end
48
50
  FileUtils.mkdir_p(path)