dtk-client 0.7.7 → 0.7.8

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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- M2QzNTFhNjlhMWNlN2YwMmM5NGMwYzY5YTViMjQ4Y2ZkYmIwNmZjOA==
4
+ Y2NjNGJhMTdjNzA2ZTI2ZGIzNGU5NGQwOTE2NzY4YTgzNmJlY2Y3MA==
5
5
  data.tar.gz: !binary |-
6
- ZWIyZTI1NjYzYTY3MTU3NjU2MTZhY2I5YTU1N2I3NmI4OTE5OWI4ZA==
6
+ Y2JiNzVhYWE5YzFlY2RjNzVkOWE3ZmI0MjM3YWFhZGU3OTgxOGY1OQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ODRlMzA2ZmQxMWE3NjQxMjEwN2U5YzNjOTlhYTYxNzhhMzI3MzFlZDFhOWYz
10
- NDg1ZDRjMzNlYWMwZDY0YWYyMGU5ZjBlN2Y0NjFlYWY1Y2JkYmM0M2JhZGVi
11
- Y2E0MzlkM2VkYzMwOGVlMjM4YWY3NTYxZDdhOTVhZDE3MDllNzI=
9
+ YmQxMGI5OWEzNDAyY2U3ZGY2MDBkODFmODZiZTAzNDljZmIwN2VjMGQ5MWMw
10
+ OTBjZGJmZThhMWMxZjI5MzNlZWM1MDMwNjQzNzNmMzI2YjY3NWZjNzNjMmEx
11
+ OGI1MWY0NDI5NWNhZjY4MTZjMWQzODY0NmVkNDE5ZjQ2NDM3ZWQ=
12
12
  data.tar.gz: !binary |-
13
- M2E5YzEwMTFiMDI5ODdhYjQ0MTllNDg2YmJmMDM0MmMxM2JlYmI1NjA2MTc0
14
- ZDRkN2M5ZGQzNzNlYzA2MjFlYTJiNGE3M2VkNGE0YmVjMGFhMDVjNTM5Y2Iw
15
- MTYzNzcxNjdhOGNhYmVlZTAyYzRmYTViMmI2YmUwM2FiNDdlMDI=
13
+ MGIxMTA5YWRmZGY2YjVmNmVmOTRmNWNjODc0NjAzZmNlMGQwOTQ2ZDZiMDQ1
14
+ ZjRmZjY2NWMwOWYyODZlYWZlZmFlZTBhNzFmMGEwNWEzZmJkNWFjY2NlZTRl
15
+ MDlkYzk1ZjhjMDg5NThlOWIyNDhiMDVlMDZhZGJmODVkMDE1YTI=
data/dtk-client.gemspec CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |gem|
30
30
  gem.add_dependency 'thor','~> 0.15.4'
31
31
  gem.add_dependency 'erubis','~> 2.7.0'
32
32
  gem.add_dependency 'dtk-common-core','0.7.3'
33
- gem.add_dependency 'git','1.2.8'
33
+ gem.add_dependency 'git','1.2.9'
34
34
  gem.add_dependency 'colorize','~> 0.5.8'
35
35
  gem.add_dependency 'highline', '1.6.16'
36
36
  gem.add_dependency 'awesome_print', '1.1.0'
@@ -225,6 +225,42 @@ module DTK; module Client; class CommandHelper
225
225
  end
226
226
  end
227
227
 
228
+ def create_new_version(type, src_branch, module_name, src_namespace, version, repo_url, opts = {})
229
+ full_name_src = ModuleUtil.join_name(module_name, src_namespace)
230
+ full_name_dest = "#{full_name_src}-#{version}"
231
+
232
+ local_src_dir = local_repo_dir(type, full_name_src)
233
+ local_dest_dir = local_repo_dir(type, full_name_dest)
234
+ branch = "#{src_branch}-v#{version}"
235
+ exist_already = false
236
+
237
+ if File.directory?(local_src_dir) && !(Dir["#{local_src_dir}/*"].empty?)
238
+ if File.directory?(local_dest_dir) && !(Dir["#{local_dest_dir}/*"].empty?)
239
+ # raise ErrorUsage.new("Directory (#{local_dest_dir}) already exist with content.",:log_error=>false)
240
+ exist_already = true
241
+ else
242
+ FileUtils.cp_r(local_src_dir, local_dest_dir)
243
+ end
244
+ else
245
+ raise ErrorUsage.new("The content for module (#{full_name_src}) should be put in directory (#{local_src_dir})",:log_error=>false)
246
+ end
247
+
248
+ unless exist_already
249
+ Response.wrap_helper_actions() do
250
+ repo_dir = local_dest_dir
251
+ remote_branch = local_branch = branch
252
+ repo = create(repo_dir, branch, :no_initial_commit => true)
253
+ repo.add_remote(remote(branch), repo_url)
254
+ repo.checkout(branch, { :new_branch => true })
255
+ repo.push_with_remote(remote(), remote_branch)
256
+ repo.delete_branch(src_branch)
257
+ repo.fetch()
258
+ end
259
+ end
260
+
261
+ {'module_directory' => local_dest_dir, 'version' => version, 'branch' => branch, 'exist_already' => exist_already}
262
+ end
263
+
228
264
  def rename_and_initialize_clone_and_push(type, module_name, new_module_name, branch, repo_url, local_repo_dir, version = nil)
229
265
  # check to see if the new dir has proper naming e.g. (~/dtk/component_modules/dtk::java)
230
266
  unless local_repo_dir.match(/\/#{new_module_name.gsub(ModuleUtil::NAMESPACE_SEPERATOR,'/')}$/)
@@ -24,13 +24,32 @@ module DTK::Client
24
24
  #
25
25
  def trigger_module_auto_pull(required_modules, opts = {})
26
26
  return if required_modules.empty?
27
+ hide_output = opts[:hide_output]
28
+
29
+ # options[:force] means this command is triggered from trigger_module_auto_import method bellow
30
+ unless opts[:force]
31
+ update_none = RemoteDependencyUtil.check_for_frozen_modules(required_modules)
32
+
33
+ if update_none
34
+ print "All dependent modules are frozen and will not be updated!\n" unless hide_output
35
+ print "Resuming pull ... " unless hide_output
36
+ return Response::Ok.new()
37
+ end
38
+ end
27
39
 
28
40
  if opts[:force] || Console.confirmation_prompt("Do you want to update in addition to this module its dependent modules from the catalog?")
29
41
  required_modules.each do |r_module|
30
42
  module_name = full_module_name(r_module)
31
43
  module_type = r_module['type']
44
+ version = r_module['version']
45
+ full_name = (version && !version.eql?('master')) ? "#{module_name}(#{version})" : module_name
32
46
 
33
- print "Pulling #{module_type.gsub('_',' ')} content for '#{module_name}' ... "
47
+ if r_module['frozen']
48
+ print "Not allowed to update frozen #{module_type.gsub('_', ' ')} '#{module_name}' version '#{version}' \n" unless hide_output
49
+ next
50
+ end
51
+
52
+ print "Pulling #{module_type.gsub('_',' ')} content for '#{full_name}' ... " unless hide_output
34
53
 
35
54
  new_context_params = DTK::Shell::ContextParams.new
36
55
  new_context_params.add_context_to_params(module_type, module_type)
@@ -38,6 +57,7 @@ module DTK::Client
38
57
 
39
58
  forwarded_opts = { :skip_recursive_pull => true, :ignore_dependency_merge_conflict => true }
40
59
  forwarded_opts.merge!(:do_not_raise => true) if opts[:do_not_raise]
60
+ forwarded_opts.merge!(:version => version) if version && !version.eql?('master')
41
61
  new_context_params.forward_options(forwarded_opts)
42
62
 
43
63
  response = ContextRouter.routeTask(module_type, "pull_dtkn", new_context_params, @conn)
@@ -59,49 +79,58 @@ module DTK::Client
59
79
  # Method will trigger import for each missing module component
60
80
  #
61
81
  def trigger_module_auto_import(modules_to_import, required_modules, opts = {})
62
- puts 'Auto-installing missing module(s)'
82
+ hide_output = opts[:hide_output]
83
+
84
+ puts 'Auto-installing missing module(s)' unless hide_output
63
85
  update_all = false
64
- update_none = false
86
+ update_none = RemoteDependencyUtil.check_for_frozen_modules(required_modules)
65
87
 
66
88
  # Print out or update installed modules from catalog
67
89
  required_modules.each do |r_module|
68
- module_name = full_module_name(r_module)
69
- module_type = r_module['type']
90
+ module_name = full_module_name(r_module)
91
+ module_type = r_module['type']
92
+ version = r_module['version']
93
+ full_name = (version && !version.eql?('master')) ? "#{module_name}(#{version})" : module_name
70
94
 
71
- print "Using #{module_type.gsub('_', ' ')} '#{module_name}'\n"
95
+ print "Using #{module_type.gsub('_', ' ')} '#{full_name}'\n" unless hide_output
72
96
  next if update_none || opts[:update_none]
73
97
 
98
+ pull_opts = {:force => true, :do_not_raise => true}
99
+ pull_opts.merge!(:hide_output => hide_output) if hide_output
100
+
74
101
  if update_all
75
- trigger_module_auto_pull([r_module], :force => true, :do_not_raise => true)
102
+ trigger_module_auto_pull([r_module], pull_opts)
76
103
  else
77
104
  options = required_modules.size > 1 ? %w(all none) : []
78
- update = Console.confirmation_prompt_additional_options("Do you want to update dependent #{module_type.gsub('_', ' ')} '#{module_name}' from the catalog?", options)
105
+ update = Console.confirmation_prompt_additional_options("Do you want to update dependent #{module_type.gsub('_', ' ')} '#{full_name}' from the catalog?", options) unless hide_output
79
106
  next unless update
80
107
 
81
108
  if update.to_s.eql?('all')
82
109
  update_all = true
83
- trigger_module_auto_pull([r_module], :force => true, :do_not_raise => true)
110
+ trigger_module_auto_pull([r_module], pull_opts)
84
111
  elsif update.to_s.eql?('none')
85
112
  update_none = true
86
113
  else
87
- trigger_module_auto_pull([r_module], :force => true, :do_not_raise => true)
114
+ trigger_module_auto_pull([r_module], pull_opts)
88
115
  end
89
116
  end
90
117
  end
91
118
 
92
119
  # Trigger import/install for missing modules
93
- modules_to_import.each do |m_module|
120
+ modules_to_import.uniq.each do |m_module|
94
121
  module_name = full_module_name(m_module)
95
122
  module_type = m_module['type']
123
+ version = m_module['version']
124
+ full_name = (version && !version.eql?('master')) ? "#{module_name}(#{version})" : module_name
96
125
 
97
126
  # we check if there is module_url if so we install from git
98
127
  module_url = m_module['module_url']
99
128
 
100
129
  # descriptive message
101
130
  importing = module_url ? "Importing" : "Installing"
102
- import_msg = "#{importing} #{module_type.gsub('_', ' ')} '#{module_name}'"
131
+ import_msg = "#{importing} #{module_type.gsub('_', ' ')} '#{full_name}'"
103
132
  import_msg += " from git source #{module_url}" if module_url
104
- print "#{import_msg} ... "
133
+ print "#{import_msg} ... " unless hide_output
105
134
 
106
135
  if module_url
107
136
  # import from Git source
@@ -111,13 +140,13 @@ module DTK::Client
111
140
  else
112
141
  # import from Repo Manager
113
142
  new_context_params = ::DTK::Shell::ContextParams.new([module_name])
114
- new_context_params.override_method_argument!('option_2', m_module['version'])
143
+ new_context_params.override_method_argument!('option_2', version) if version && !version.eql?('master')
115
144
  new_context_params.forward_options(:skip_cloning => false, :skip_auto_install => true, :module_type => module_type).merge!(opts)
116
145
  response = ContextRouter.routeTask(module_type, 'install', new_context_params, @conn)
117
146
  end
118
147
 
119
148
  ignore_component_error = (new_context_params.get_forwarded_options() || {})[:ignore_component_error] && module_type.eql?('component_module')
120
- puts(response.data(:does_not_exist) ? response.data(:does_not_exist) : 'Done.')
149
+ puts(response.data(:does_not_exist) ? response.data(:does_not_exist) : 'Done.') unless hide_output
121
150
  raise DtkError, response.error_message if !response.ok? && !ignore_component_error
122
151
  end
123
152
 
@@ -155,7 +184,7 @@ module DTK::Client
155
184
  formated_name = m['formated_name']
156
185
  # print "Cloning component module '#{formated_name}' from server ... "
157
186
  thor_options = {}
158
- thor_options["version"] = m['version']
187
+ thor_options["version"] = m['version'] unless m['version'].eql?('base')
159
188
  thor_options["skip_edit"] = true
160
189
  thor_options["omit_output"] = true
161
190
  thor_options.merge!(:module_type => 'component-module')
@@ -189,7 +218,7 @@ module DTK::Client
189
218
  #
190
219
  # Returns: String
191
220
  def add_version?(display_name, version)
192
- version = nil if 'CURRENT'.eql?(version)
221
+ version = nil if 'CURRENT'.eql?(version) || 'base'.eql?(version)
193
222
  (version ? "#{display_name}-#{version.strip}" : "#{display_name}")
194
223
  end
195
224
 
@@ -20,6 +20,11 @@ module DTK
20
20
  nil
21
21
  end
22
22
 
23
+ def print_simple_results(action_results_id, number_of_retries=8)
24
+ response = action_results(action_results_id, number_of_retries)
25
+ pp response
26
+ end
27
+
23
28
  def action_results(action_results_id, number_of_retries=8)
24
29
  action_body = {
25
30
  :action_results_id => action_results_id,
@@ -46,7 +51,7 @@ module DTK
46
51
  response
47
52
 
48
53
  end
49
-
54
+
50
55
  end
51
56
  end
52
57
  end
@@ -223,6 +223,7 @@ module DTK::Client
223
223
  :automatically_clone => true,
224
224
  :pull_if_needed => false,
225
225
  :service_instance_module => true,
226
+ :skip_if_exist_check => true,
226
227
  :assembly_module => {
227
228
  :assembly_name => assembly_name,
228
229
  :version => version
@@ -375,7 +376,8 @@ module DTK::Client
375
376
  :remote_branch => base_module_branch,
376
377
  :commit_sha => branch_head_sha,
377
378
  :current_branch_sha => current_branch_sha,
378
- :full_module_name => module_name
379
+ :full_module_name => module_name,
380
+ :skip_if_exist_check => true
379
381
  }
380
382
  opts = {:local_branch => local_branch, :namespace => namespace}
381
383
 
@@ -9,35 +9,52 @@ module DTK::Client
9
9
  # This will change behaviour of method
10
10
  # module_type: will be :component_module or :service_module
11
11
 
12
- def clone_aux(module_type, module_id,version,internal_trigger=false,omit_output=false,opts={})
13
- module_name,module_namespace,repo_url,branch,not_ok_response = workspace_branch_info(module_type,module_id,version,opts)
14
- full_module_name = ModuleUtil.resolve_name(module_name, module_namespace)
12
+ def clone_aux(module_type, module_id, version, internal_trigger = false, omit_output = false, opts = {})
13
+ # if version = base do not clone latest, just base
14
+ if version && version.eql?('base')
15
+ version = nil
16
+ opts[:use_latest] = false
17
+ end
15
18
 
19
+ module_name, module_namespace, repo_url, branch, not_ok_response, version = workspace_branch_info(module_type, module_id, version, opts)
16
20
  return not_ok_response if not_ok_response
21
+
22
+ # clone base version first if not cloned already
23
+ clone_base_aux(module_type, module_id, "#{module_namespace}:#{module_name}") if opts[:use_latest] && version
24
+
25
+ module_location = OsUtil.module_location(module_type, "#{module_namespace}:#{module_name}", version)
26
+ raise DTK::Client::DtkValidationError, "#{module_type.to_s.gsub('_',' ').capitalize} '#{module_name}#{version && "-#{version}"}' already cloned!" if File.directory?(module_location) && !opts[:skip_if_exist_check]
27
+
28
+ full_module_name = ModuleUtil.resolve_name(module_name, module_namespace)
29
+
17
30
  # TODO: should we use instead Helper(:git_repo).create_clone_from_optional_branch
18
31
  response = Helper(:git_repo).create_clone_with_branch(module_type,module_name,repo_url,branch,version,module_namespace,opts)
19
32
 
20
33
  if response.ok?
21
- puts "Module '#{full_module_name}' has been successfully cloned!" unless omit_output
34
+ print_name = "Module '#{full_module_name}'"
35
+ print_name << " version '#{version}'" if version
36
+ puts "#{print_name} has been successfully cloned!" unless omit_output
22
37
  # when puppet forge import, print successfully imported instead of cloned
23
- DTK::Client::OsUtil.print("Module '#{full_module_name}' has been successfully imported!", :yellow) if omit_output && opts[:print_imported]
38
+ DTK::Client::OsUtil.print("#{print_name} has been successfully imported!", :yellow) if omit_output && opts[:print_imported]
24
39
  unless internal_trigger
25
40
  if Console.confirmation_prompt("Would you like to edit module now?")
26
41
  context_params_for_module = create_context_for_module(full_module_name, module_type)
27
42
  return edit(context_params_for_module)
28
- # if module_type.to_s.eql?("service_module")
29
- # context_params_for_module = create_context_for_module(module_name, :"service-module")
30
- # elsif module_type.to_s.eql?("component_module")
31
- # context_params_for_module = create_context_for_module(module_name, :"component-module")
32
- # elsif module_type.to_s.eql?("test_module")
33
- # context_params_for_module = create_context_for_module(module_name, :"test-module")
34
- # end
35
43
  end
36
44
  end
37
45
  end
46
+
38
47
  response
39
48
  end
40
49
 
50
+ # clone base module version
51
+ def clone_base_aux(module_type, module_id, full_module_name)
52
+ base_module_location = OsUtil.module_location(module_type, full_module_name, nil)
53
+ unless File.directory?(base_module_location)
54
+ clone_aux(module_type, module_id, nil, true)
55
+ end
56
+ end
57
+
41
58
  def create_context_for_module(full_module_name, module_type)
42
59
  context_params_for_module = DTK::Shell::ContextParams.new
43
60
  context_params_for_module.add_context_to_params(full_module_name, module_type.to_s.gsub!(/\_/,'-').to_sym, full_module_name)
@@ -1,26 +1,32 @@
1
1
  module DTK::Client
2
2
  module CommonMixin
3
3
  private
4
- # returns module_name,module_namespace,repo_url,branch,not_ok_response( only if error)
4
+ # returns module_name, module_namespace, repo_url, branch, not_ok_response( only if error)
5
5
  def workspace_branch_info(module_type, module_id, version, opts={})
6
6
  # shortcut if have info about workspace branch already
7
7
  if info = opts[:workspace_branch_info]
8
8
  name_or_full_module_name = info[:module_name]
9
- module_namespace,module_name = ModuleUtil.full_module_name_parts?(name_or_full_module_name)
9
+ module_namespace, module_name = ModuleUtil.full_module_name_parts?(name_or_full_module_name)
10
10
  module_namespace ||= info[:module_namespace]
11
- ret = [module_name,module_namespace,info[:repo_url],info[:branch]]
11
+ ret = [module_name, module_namespace, info[:repo_url], info[:branch]]
12
12
  unless ret.find{|r|r.nil?}
13
13
  return ret
14
14
  end
15
15
  end
16
16
 
17
- post_body = get_workspace_branch_info_post_body(module_type,module_id,version,opts)
17
+ # if 'base' returned as version set to nil; 'base' = 'master' = nil
18
+ version = nil if version == 'base'
19
+
20
+ post_body = get_workspace_branch_info_post_body(module_type, module_id, version, opts)
18
21
  response = post(rest_url("#{module_type}/get_workspace_branch_info"),post_body)
19
22
  unless response.ok?
20
- [nil,nil,nil,nil,response]
23
+ ret = [nil, nil, nil, nil, response, nil]
21
24
  else
22
- response.data(:module_name,:module_namespace,:repo_url,:workspace_branch)
25
+ m_name, m_namespace, repo_url, w_branch, version = response.data(:module_name, :module_namespace, :repo_url, :workspace_branch, :version)
26
+ ret = [m_name, m_namespace, repo_url, w_branch, nil]
27
+ ret << version if opts[:use_latest]
23
28
  end
29
+ ret
24
30
  end
25
31
 
26
32
  def get_workspace_branch_info_post_body(module_type, module_id, version_explicit, opts={})
@@ -35,6 +41,9 @@ module DTK::Client
35
41
  if assembly_module
36
42
  post_body.merge!(:assembly_module => true,:assembly_name => assembly_module[:assembly_name])
37
43
  end
44
+ if use_latest = opts[:use_latest]
45
+ post_body.merge!(:use_latest => use_latest)
46
+ end
38
47
  post_body
39
48
  end
40
49
 
@@ -2,7 +2,7 @@ dtk_require('common_base')
2
2
  module DTK; module Client; module Commands::Common
3
3
  class CreateTarget < Base
4
4
  # option_list is of form [:provider!, :region, :keypair, :security_group!] indcating what is optional and what is required
5
- def execute(type,option_list)
5
+ def execute(type, option_list)
6
6
  # we use :target_id but that will return provider_id (another name for target template ID)
7
7
  target_name = retrieve_arguments([:option_1])
8
8
  iaas_properties = iaas_properties(type,option_list)
@@ -12,12 +12,15 @@ module DTK; module Client; module Commands::Common
12
12
  :provider_id => provider,
13
13
  :iaas_properties => iaas_properties
14
14
  }
15
- post_body.merge!(:target_name => target_name) if target_name
15
+
16
+ # cleanup for target name not being sterilazied correctly
17
+ post_body.merge!(:target_name => target_name.split(' ').first) if target_name
18
+
16
19
  post 'target/create', post_body
17
20
  end
18
21
 
19
22
  private
20
- def iaas_properties(type,option_list)
23
+ def iaas_properties(type, option_list)
21
24
  iaas_properties = retrieve_option_hash(option_list)
22
25
  special_processing_security_groups!(iaas_properties)
23
26
  special_processing_region!(iaas_properties)
@@ -32,12 +35,12 @@ module DTK; module Client; module Commands::Common
32
35
  end
33
36
 
34
37
  def special_processing_security_groups!(iaas_properties)
35
- if security_group = iaas_properties[:security_group]
38
+ if security_group = iaas_properties[:security_group]
36
39
  if security_group.end_with?(',')
37
40
  raise DtkValidationError.new("Multiple security groups should be separated with ',' and without spaces between them (e.g. --security_groups gr1,gr2,gr3,...) ")
38
41
  end
39
42
  security_groups = security_group.split(',')
40
-
43
+
41
44
  unless security_groups.empty? || security_groups.size==1
42
45
  iaas_properties.delete(:security_group)
43
46
  iaas_properties.merge!(:security_group_set => security_groups)
@@ -95,7 +95,9 @@ module DTK::Client
95
95
 
96
96
  internal_trigger=true
97
97
  reparse_aux(module_location)
98
- opts.merge!(:force_parse => true, :update_from_includes => true, :print_dependencies => true)
98
+
99
+ # use_impl_id - if edit-component-module which has version use impl_id from assembly--<assembly_name> version of component instance
100
+ opts.merge!(:force_parse => true, :update_from_includes => true, :print_dependencies => true, :use_impl_id => true)
99
101
  response = push_clone_changes_aux(module_type,module_id,version,commit_msg,internal_trigger,opts)
100
102
 
101
103
  # if error return
@@ -101,25 +101,52 @@ module DTK::Client
101
101
  module_type = get_module_type(context_params)
102
102
 
103
103
  unless (options.force? || method_opts[:force_delete])
104
- is_go = Console.confirmation_prompt("Are you sure you want to delete module '#{module_name}'"+"?")
104
+ msg = "Are you sure you want to delete module '#{module_name}'"
105
+ msg += " version '#{version}'" if version
106
+ is_go = Console.confirmation_prompt("#{msg}"+"?")
105
107
  return nil unless is_go
106
108
  end
107
109
 
108
- post_body = {
109
- "#{module_type}_id".to_sym => module_id
110
- }
111
- action = (version ? "delete_version" : "delete")
112
- post_body[:version] = version if version
110
+ post_body = { "#{module_type}_id".to_sym => module_id }
111
+ opts = { :module_name => module_name }
112
+
113
+ unless version
114
+ post_body.merge!(:include_base => true)
113
115
 
114
- response = post(rest_url("#{module_type}/#{action}"), post_body)
116
+ versions_response = post rest_url("#{module_type}/list_versions"), post_body
117
+ return versions_response unless versions_response.ok?
118
+
119
+ versions = versions_response.data.first['versions']
120
+ if versions.size > 2
121
+ versions << "all"
122
+ ret_version = Console.confirmation_prompt_multiple_choice("\nSelect version to delete:", versions)
123
+ return unless ret_version
124
+ raise DtkError, "You are not allowed to delete 'base' version while other versions exist!" if ret_version.eql?('base')
125
+ version = ret_version
126
+ end
127
+ end
128
+
129
+ if version
130
+ if version.eql?('all')
131
+ post_body.merge!(:delete_all_versions => true)
132
+ opts.merge!(:delete_all_versions => true)
133
+ else
134
+ post_body.merge!(:version => version)
135
+ opts.merge!(:version => version)
136
+ end
137
+ end
138
+
139
+ response = post(rest_url("#{module_type}/delete"), post_body)
115
140
  return response unless response.ok?
116
141
 
142
+ # if we do not provide version, server will calculate the latest version which we can use here
143
+ unless version
144
+ version = response.data(:version)
145
+ opts.merge!(:version => version)
146
+ end
147
+
117
148
  response =
118
149
  if options.purge? || method_opts[:purge]
119
- opts = {:module_name => module_name}
120
- if version then opts.merge!(:version => version)
121
- else opts.merge!(:delete_all_versions => true)
122
- end
123
150
  purge_clone_aux(module_type.to_sym, opts)
124
151
  else
125
152
  Helper(:git_repo).unlink_local_clone?(module_type.to_sym, module_name, version)
@@ -128,10 +155,14 @@ module DTK::Client
128
155
  return response unless response.ok?
129
156
 
130
157
  unless method_opts[:no_error_msg]
131
- msg = "Module '#{module_name}' "
132
- if version then msg << "version #{version} has been deleted"
133
- else msg << "has been deleted"; end
134
- OsUtil.print(msg, :yellow)
158
+ if version && version.eql?('all')
159
+ OsUtil.print("All versions of '#{module_name}' module have been deleted.", :yellow)
160
+ else
161
+ msg = "Module '#{module_name}' "
162
+ if version then msg << "version '#{version}' has been deleted successfully."
163
+ else msg << "has been deleted successfully."; end
164
+ OsUtil.print(msg, :yellow)
165
+ end
135
166
  end
136
167
 
137
168
  Response::Ok.new()
@@ -204,15 +235,27 @@ module DTK::Client
204
235
  CommonModule::Import.new(self, context_params).from_file()
205
236
  end
206
237
 
207
- def install_module_aux(context_params)
238
+ def install_module_aux(context_params, internal_trigger = false)
208
239
  create_missing_clone_dirs()
209
240
  resolve_direct_access(::DTK::Client::Configurator.check_direct_access)
241
+
210
242
  remote_module_name, version = context_params.retrieve_arguments([:option_1!, :option_2], method_argument_names)
243
+ forwarded_version = context_params.get_forwarded_options()['version']
244
+ add_version = false
245
+
246
+ version ||= forwarded_version || options.version
247
+ version = nil if version.eql?('master')
248
+ if version
249
+ check_version_format(version)
250
+ add_version = true
251
+ end
252
+
211
253
  # in case of auto-import via service import, we skip cloning to speed up a process
212
- skip_cloning = context_params.get_forwarded_options()['skip_cloning'] if context_params.get_forwarded_options()
213
- do_not_raise = context_params.get_forwarded_options()[:do_not_raise] if context_params.get_forwarded_options()
254
+ skip_cloning = context_params.get_forwarded_options()['skip_cloning'] if context_params.get_forwarded_options()
255
+ do_not_raise = context_params.get_forwarded_options()[:do_not_raise] if context_params.get_forwarded_options()
214
256
  skip_ainstall = context_params.get_forwarded_options() ? context_params.get_forwarded_options()[:skip_auto_install] : false
215
- module_type = get_module_type(context_params)
257
+ skip_base = context_params.get_forwarded_options()['skip_base']
258
+ module_type = get_module_type(context_params)
216
259
 
217
260
  # ignore_component_error = context_params.get_forwarded_options()[:ignore_component_error]||options.ignore? if context_params.get_forwarded_options()
218
261
  ignore_component_error = context_params.get_forwarded_options().empty? ? options.ignore? : context_params.get_forwarded_options()[:ignore_component_error]
@@ -220,13 +263,6 @@ module DTK::Client
220
263
 
221
264
  remote_namespace, local_module_name = get_namespace_and_name(remote_module_name, ':')
222
265
 
223
- if clone_dir = Helper(:git_repo).local_clone_dir_exists?(module_type.to_sym, local_module_name, :namespace => remote_namespace, :version => version)
224
- message = "Module's directory (#{clone_dir}) exists on client. To install this needs to be renamed or removed."
225
- # message += '. To ignore this conflict and use existing component module please use -i switch (install REMOTE-SERVICE-NAME -i).' if additional_message
226
-
227
- raise DtkError, message unless ignore_component_error
228
- end
229
-
230
266
  post_body = {
231
267
  :remote_module_name => remote_module_name.sub(':', '/'),
232
268
  :local_module_name => local_module_name,
@@ -237,15 +273,42 @@ module DTK::Client
237
273
  post_body.merge!(:additional_message => additional_message) if additional_message
238
274
  post_body.merge!(:skip_auto_install => skip_ainstall) if skip_ainstall
239
275
 
276
+ # we need to install base module version if not installed
277
+ unless skip_base
278
+ master_response = install_base_version_aux?(context_params, post_body, module_type, version)
279
+ return master_response unless master_response.ok?
280
+
281
+ latest_version = master_response.data(:latest_version)
282
+
283
+ unless version
284
+ version = latest_version.eql?('master') ? nil : latest_version
285
+ end
286
+
287
+ post_body.merge!(:hard_reset_on_pull_version => true) if version
288
+ end
289
+
290
+ if version
291
+ add_version = true
292
+ post_body.merge!(:version => version)
293
+ end
294
+
295
+ if clone_dir = Helper(:git_repo).local_clone_dir_exists?(module_type.to_sym, local_module_name, :namespace => remote_namespace, :version => version)
296
+ message = "Module's directory (#{clone_dir}) exists on client. To install this needs to be renamed or removed."
297
+ raise DtkError, message unless ignore_component_error
298
+ end
299
+
240
300
  response = post rest_url("#{module_type}/import"), post_body
241
301
 
242
- # print permission warnings and then check for other warnings
243
- are_there_warnings = RemoteDependencyUtil.check_permission_warnings(response)
244
- are_there_warnings ||= RemoteDependencyUtil.print_dependency_warnings(response, nil, :ignore_permission_warnings => true)
302
+ # when silently installing base version we don't want to print anything
303
+ unless skip_base
304
+ # print permission warnings and then check for other warnings
305
+ are_there_warnings = RemoteDependencyUtil.check_permission_warnings(response)
306
+ are_there_warnings ||= RemoteDependencyUtil.print_dependency_warnings(response, nil, :ignore_permission_warnings => true)
245
307
 
246
- # prompt to see if user is ready to continue with warnings/errors
247
- if are_there_warnings
248
- return false unless Console.confirmation_prompt('Do you still want to proceed with import' + '?')
308
+ # prompt to see if user is ready to continue with warnings/errors
309
+ if are_there_warnings
310
+ return false unless Console.confirmation_prompt('Do you still want to proceed with import' + '?')
311
+ end
249
312
  end
250
313
 
251
314
  # case when we need to import additional components
@@ -254,17 +317,19 @@ module DTK::Client
254
317
  opts = { :do_not_raise => true }
255
318
  module_opts = ignore_component_error ? opts.merge(:ignore_component_error => true) : opts.merge(:additional_message => true)
256
319
  module_opts.merge!(:update_none => true) if options.update_none?
320
+ module_opts.merge!(:hide_output => true) if skip_base
257
321
 
258
322
  continue = trigger_module_auto_import(missing_components, required_components, module_opts)
259
323
  return unless continue
260
324
 
261
- print "Resuming DTK Network import for #{module_type} '#{remote_module_name}' ..."
325
+ print_remote_name = add_version ? "#{remote_module_name}(#{version})" : remote_module_name
326
+ print "Resuming DTK Network import for #{module_type} '#{print_remote_name}' ..." unless skip_base
262
327
  # repeat import call for service
263
328
  post_body.merge!(opts)
264
329
  response = post rest_url("#{module_type}/import"), post_body
265
330
 
266
331
  # we set skip cloning since it is already done by import
267
- puts ' Done'
332
+ puts ' Done' unless skip_base
268
333
  end
269
334
 
270
335
  return response if !response.ok? || response.data(:does_not_exist)
@@ -284,51 +349,189 @@ module DTK::Client
284
349
  response
285
350
  end
286
351
 
352
+ def install_base_version_aux?(context_params, post_body, module_type, version)
353
+ master_response = post rest_url("#{module_type}/prepare_for_install_module"), post_body
354
+ return master_response unless master_response.ok?
355
+
356
+ head_installed = master_response.data(:head_installed)
357
+ latest_version = master_response.data(:latest_version)
358
+ remote_module_name = context_params.retrieve_arguments([:option_1!], method_argument_names)
359
+
360
+ if version
361
+ versions = master_response.data(:versions)
362
+ raise DtkError, "Module '#{remote_module_name}' version '#{version}' does not exist on repo manager!" unless versions.include?(version)
363
+ end
364
+
365
+ if !head_installed && !latest_version.eql?('master')
366
+ new_context_params = DTK::Shell::ContextParams.new
367
+ new_context_params.add_context_to_params(module_type, module_type)
368
+ new_context_params.method_arguments = [remote_module_name]
369
+ new_context_params.forward_options('skip_base' => true, 'version' => 'master')
370
+ install_module_aux(new_context_params)
371
+ end
372
+
373
+ master_response
374
+ end
375
+
287
376
  def delete_from_catalog_aux(context_params)
288
377
  module_type = get_module_type(context_params)
289
378
  remote_module_name = context_params.retrieve_arguments([:option_1!], method_argument_names)
379
+ version = options.version
380
+ rsa_pub_key = SSHUtil.rsa_pub_key_content()
290
381
 
291
382
  # remote_module_name can be namespace:name or namespace/name
292
383
  remote_namespace, remote_module_name = get_namespace_and_name(remote_module_name, ':')
293
384
 
385
+ if version
386
+ check_version_format(version)
387
+ else
388
+ list_post_body = {
389
+ "#{module_type}_id".to_sym => "#{remote_namespace}:#{remote_module_name}",
390
+ :rsa_pub_key => rsa_pub_key,
391
+ :include_base => true
392
+ }
393
+ # versions_response = post rest_url("#{module_type}/list_remote_versions"), list_post_body
394
+ versions_response = post rest_url("#{module_type}/list_remote"), list_post_body
395
+ return versions_response unless versions_response.ok?
396
+
397
+ selected_module = versions_response.data.find{ |vr| vr['display_name'].eql?("#{remote_namespace}/#{remote_module_name}") }
398
+ raise DtkError, "Module '#{remote_namespace}/#{remote_module_name}'' does not exist on repo manager!" unless selected_module
399
+
400
+ versions = selected_module['versions']
401
+ if versions.size > 2
402
+ versions << "all"
403
+ ret_version = Console.confirmation_prompt_multiple_choice("\nSelect version to delete:", versions)
404
+ return unless ret_version
405
+ raise DtkError, "You are not allowed to delete 'base' version while other versions exist!" if ret_version.eql?('base')
406
+ version = ret_version
407
+ end
408
+ end
409
+
294
410
  unless options.force? || options.confirmed?
295
- return unless Console.confirmation_prompt("Are you sure you want to delete remote #{module_type} '#{remote_namespace.nil? ? '' : remote_namespace + '/'}#{remote_module_name}' and all items contained in it" + '?')
411
+ msg = "Are you sure you want to delete remote #{module_type} '#{remote_namespace.nil? ? '' : remote_namespace + '/'}#{remote_module_name}'"
412
+ msg += " version '#{version}'" if version
413
+ msg += " and all items contained in it"
414
+ return unless Console.confirmation_prompt(msg + '?')
296
415
  end
297
416
 
298
417
  post_body = {
299
- :rsa_pub_key => SSHUtil.rsa_pub_key_content(),
418
+ :rsa_pub_key => rsa_pub_key,
300
419
  :remote_module_name => remote_module_name,
301
420
  :remote_module_namespace => remote_namespace,
302
421
  :force_delete => options.force?
303
422
  }
423
+ post_body.merge!(:version => version) if version
424
+
425
+ response = post rest_url("#{module_type}/delete_remote"), post_body
426
+ return response unless response.ok?
304
427
 
305
- post rest_url("#{module_type}/delete_remote"), post_body
428
+ full_module_name, version = response.data(:module_full_name, :version)
429
+ msg = "Module '#{full_module_name}' "
430
+ msg << "version '#{version}'" if version && !version.eql?('master')
431
+ msg << " has been deleted successfully."
432
+ OsUtil.print(msg, :yellow)
433
+
434
+ Response::Ok.new()
306
435
  end
307
436
 
308
437
  def publish_module_aux(context_params)
309
- module_type = get_module_type(context_params)
310
- module_id, input_remote_name = context_params.retrieve_arguments([REQ_MODULE_ID, :option_1], method_argument_names)
438
+ module_type = get_module_type(context_params)
439
+ module_id, module_name, input_remote_name = context_params.retrieve_arguments([REQ_MODULE_ID, REQ_MODULE_NAME, :option_1!], method_argument_names)
440
+
441
+ raise DtkValidationError, "You have to provide version you want to publish!" unless options.version
442
+
443
+ skip_base = context_params.get_forwarded_options()['skip_base']
444
+ forwarded_version = context_params.get_forwarded_options()['version']
445
+
446
+ version = forwarded_version||options.version
447
+ version = nil if version.eql?('master')
448
+
449
+ forward_namespace?(module_name, input_remote_name, context_params)
311
450
 
312
451
  post_body = {
313
452
  "#{module_type}_id".to_sym => module_id,
314
453
  :remote_component_name => input_remote_name,
315
- :rsa_pub_key => SSHUtil.rsa_pub_key_content()
454
+ :rsa_pub_key => SSHUtil.rsa_pub_key_content(),
316
455
  }
317
456
 
457
+ unless skip_base
458
+ check_response = post rest_url("#{module_type}/check_remote_exist"), post_body
459
+ return check_response unless check_response.ok?
460
+
461
+ remote_exist = check_response.data(:remote_exist)
462
+ unless remote_exist
463
+ context_params.forward_options('skip_base' => true, 'version' => 'master')
464
+ resp = publish_module_aux(context_params)
465
+ return resp unless resp.ok?
466
+ end
467
+
468
+ context_params.forward_options('do_not_raise_if_exist' => true, 'version' => version)
469
+ create_response = create_new_version_aux(context_params, true)
470
+ return create_response unless create_response.ok?
471
+ end
472
+
473
+ post_body.merge!(:version => version) if version
318
474
  response = post rest_url("#{module_type}/export"), post_body
319
475
  return response unless response.ok?
320
476
 
321
- full_module_name = "#{response.data['remote_repo_namespace']}/#{response.data['remote_repo_name']}"
477
+ unless skip_base
478
+ full_module_name = "#{response.data['remote_repo_namespace']}/#{response.data['remote_repo_name']}"
479
+ DTK::Client::RemoteDependencyUtil.print_dependency_warnings(response, "Module has been successfully published to '#{full_module_name}' version '#{version}'!")
480
+ end
322
481
 
323
- DTK::Client::RemoteDependencyUtil.print_dependency_warnings(response, "Module has been successfully published to '#{full_module_name}'!")
324
482
  Response::Ok.new()
325
483
  end
326
484
 
485
+ # def publish_module_aux(context_params)
486
+ # module_type = get_module_type(context_params)
487
+ # module_id, module_name, input_remote_name = context_params.retrieve_arguments([REQ_MODULE_ID, REQ_MODULE_NAME, :option_1], method_argument_names)
488
+
489
+ # post_body = {
490
+ # "#{module_type}_id".to_sym => module_id,
491
+ # :remote_component_name => input_remote_name,
492
+ # :rsa_pub_key => SSHUtil.rsa_pub_key_content()
493
+ # }
494
+ # if options.version?
495
+ # post_body.merge!(:version => options.version)
496
+ # else
497
+ # post_body.merge!(:use_latest => true)
498
+ # end
499
+
500
+ # # check if module exist on repo manager and use it to decide if need to push or publish
501
+ # check_response = post rest_url("#{module_type}/check_remote_exist"), post_body
502
+ # return check_response unless check_response.ok?
503
+
504
+ # unless options.version?
505
+ # version = check_response.data(:version)
506
+ # context_params.forward_options('version' => version)
507
+ # post_body.merge!(:version => version)
508
+ # end
509
+
510
+ # # if remote module exist and user call 'publish' we do push-dtkn else we publish it as new module
511
+ # response_data = check_response['data']
512
+ # if response_data["remote_exist"]
513
+ # raise DtkValidationError, "You are not allowed to update #{module_type} versions!" if response_data['frozen']
514
+
515
+ # # if do publish namespace2/module from namespace1/module, forward namespace as option to be used in push_dtkn_module_aux
516
+ # forward_namespace?(module_name, input_remote_name, context_params)
517
+
518
+ # push_dtkn_module_aux(context_params, true)
519
+ # else
520
+ # response = post rest_url("#{module_type}/export"), post_body
521
+ # return response unless response.ok?
522
+
523
+ # full_module_name = "#{response.data['remote_repo_namespace']}/#{response.data['remote_repo_name']}"
524
+
525
+ # DTK::Client::RemoteDependencyUtil.print_dependency_warnings(response, "Module has been successfully published to '#{full_module_name}'!")
526
+ # Response::Ok.new()
527
+ # end
528
+ # end
529
+
327
530
  def pull_dtkn_aux(context_params)
328
531
  module_id, module_name = context_params.retrieve_arguments([REQ_MODULE_ID,REQ_MODULE_NAME,:option_1],method_argument_names)
329
532
 
330
533
  catalog = 'dtkn'
331
- version = options.version
534
+ version = options.version||context_params.get_forwarded_options()[:version]
332
535
  module_type = get_module_type(context_params)
333
536
  skip_recursive_pull = context_params.get_forwarded_options()[:skip_recursive_pull]
334
537
  ignore_dependency_merge_conflict = context_params.get_forwarded_options()[:skip_recursive_pull]
@@ -391,18 +594,14 @@ module DTK::Client
391
594
  response
392
595
  end
393
596
 
394
- def clone_module_aux(context_params, internal_trigger=false)
597
+ def clone_module_aux(context_params, internal_trigger = false)
395
598
  module_type = get_module_type(context_params)
396
599
  thor_options = context_params.get_forwarded_options() || options
397
600
  module_id = context_params.retrieve_arguments([REQ_MODULE_ID], method_argument_names)
398
601
  module_name = context_params.retrieve_arguments(["#{module_type}_name".to_sym],method_argument_names)
399
- version = thor_options["version"]
602
+ version = thor_options["version"]||options.version
400
603
  internal_trigger = true if thor_options['skip_edit']
401
-
402
- module_location = OsUtil.module_location(module_type, module_name, version)
403
-
404
- raise DTK::Client::DtkValidationError, "#{module_type.gsub('_',' ').capitalize} '#{module_name}#{version && "-#{version}"}' already cloned!" if File.directory?(module_location)
405
- clone_aux(module_type.to_sym, module_id, version, internal_trigger, thor_options['omit_output'])
604
+ clone_aux(module_type.to_sym, module_id, version, internal_trigger, thor_options['omit_output'], :use_latest => true)
406
605
  end
407
606
 
408
607
  def edit_module_aux(context_params)
@@ -478,7 +677,7 @@ module DTK::Client
478
677
  def push_dtkn_module_aux(context_params, internal_trigger=false)
479
678
  module_id, module_name = context_params.retrieve_arguments([REQ_MODULE_ID, REQ_MODULE_NAME],method_argument_names)
480
679
  catalog = 'dtkn'
481
- version = options["version"]
680
+ version = options["version"]||context_params.get_forwarded_thor_option('version')
482
681
  module_type = get_module_type(context_params)
483
682
 
484
683
  raise DtkValidationError, "You have to provide valid catalog to push changes to! Valid catalogs: #{PushCatalogs}" unless catalog
@@ -489,7 +688,8 @@ module DTK::Client
489
688
 
490
689
  if catalog.to_s.eql?("dtkn")
491
690
  module_refs_content = RemoteDependencyUtil.module_ref_content(module_location)
492
- remote_module_info = get_remote_module_info_aux(module_type.to_sym, module_id, options["namespace"], version, module_refs_content, local_namespace)
691
+ options_namespace = options["namespace"]||context_params.get_forwarded_thor_option('namespace')
692
+ remote_module_info = get_remote_module_info_aux(module_type.to_sym, module_id, options_namespace, version, module_refs_content, local_namespace)
493
693
  return remote_module_info unless remote_module_info.ok?
494
694
 
495
695
  unless File.directory?(module_location)
@@ -542,6 +742,29 @@ module DTK::Client
542
742
  list_remote_diffs_aux(module_type.to_sym, module_id)
543
743
  end
544
744
 
745
+ def list_versions_aux(context_params)
746
+ module_type = get_module_type(context_params)
747
+ module_id = context_params.retrieve_arguments([REQ_MODULE_ID], method_argument_names)
748
+ include_base = context_params.get_forwarded_options()['include_base']
749
+
750
+ post_body = { "#{module_type}_id".to_sym => module_id }
751
+ post_body.merge!(:include_base => include_base) if include_base
752
+
753
+ response = post rest_url("#{module_type}/list_versions"), post_body
754
+ end
755
+
756
+ def list_remote_versions_aux(context_params)
757
+ module_type = get_module_type(context_params)
758
+ module_id = context_params.retrieve_arguments([REQ_MODULE_ID], method_argument_names)
759
+
760
+ post_body = {
761
+ "#{module_type}_id".to_sym => module_id,
762
+ :rsa_pub_key => SSHUtil.rsa_pub_key_content()
763
+ }
764
+
765
+ response = post rest_url("#{module_type}/list_remote_versions"), post_body
766
+ end
767
+
545
768
  def delete_assembly_aux(context_params)
546
769
  module_type = get_module_type(context_params)
547
770
 
@@ -638,8 +861,99 @@ module DTK::Client
638
861
  Response::Ok.new()
639
862
  end
640
863
 
864
+ def create_new_version_aux(context_params, internal_trigger = false)
865
+ module_type = get_module_type(context_params)
866
+ module_id, version = context_params.retrieve_arguments([REQ_MODULE_ID, :option_1!], method_argument_names)
867
+
868
+ version = (context_params.get_forwarded_options()['version'] || options.version) if internal_trigger
869
+
870
+ module_name = context_params.retrieve_arguments(["#{module_type}_name".to_sym],method_argument_names)
871
+ namespace, name = get_namespace_and_name(module_name,':')
872
+ do_not_raise_if_exist = context_params.get_forwarded_options()['do_not_raise_if_exist']
873
+
874
+ module_location = OsUtil.module_location(module_type, module_name, nil)
875
+ unless File.directory?(module_location)
876
+ if Console.confirmation_prompt("Module '#{module_name}' has not been cloned. Would you like to clone module now"+'?')
877
+ response = clone_aux(module_type.to_sym, module_id, nil, true)
878
+ return response unless response.ok?
879
+ end
880
+ end
881
+
882
+ opts = {:do_not_raise_if_exist => do_not_raise_if_exist} if do_not_raise_if_exist
883
+ m_name, m_namespace, repo_url, branch, not_ok_response = workspace_branch_info(module_type, module_id, nil)
884
+ resp = Helper(:git_repo).create_new_version(module_type, branch, name, namespace, version, repo_url, opts||{})
885
+
886
+ post_body = get_workspace_branch_info_post_body(module_type, module_id, version)
887
+ post_body.merge!(:do_not_raise_if_exist => do_not_raise_if_exist) if do_not_raise_if_exist
888
+ create_response = post(rest_url("#{module_type}/create_new_version"), post_body)
889
+
890
+ unless create_response.ok?
891
+ FileUtils.rm_rf("#{resp['module_directory']}") unless resp['exist_already']
892
+ return create_response
893
+ end
894
+
895
+ if version_exist = create_response.data(:version_exist)
896
+ return create_response if do_not_raise_if_exist
897
+ end
898
+
899
+ if error = create_response.data(:dsl_parse_error)
900
+ dsl_parsed_message = ServiceImporter.error_message(module_name, error)
901
+ DTK::Client::OsUtil.print(dsl_parsed_message, :red)
902
+ end
903
+
904
+ if external_dependencies = create_response.data(:external_dependencies)
905
+ print_dependencies(external_dependencies)
906
+ end
907
+
908
+ if component_module_refs = create_response.data(:component_module_refs)
909
+ print_using_dependencies(component_module_refs)
910
+ end
911
+
912
+ Response::Ok.new()
913
+ end
914
+
641
915
  def print_ambiguous(ambiguous)
642
916
  end
643
917
 
918
+ def forward_namespace?(module_name, input_remote_name, context_params)
919
+ return unless input_remote_name
920
+ local_namespace, local_name = get_namespace_and_name(module_name,':')
921
+ remote_namespace, remote_name = get_namespace_and_name(input_remote_name,'/')
922
+ context_params.forward_options('namespace' => remote_namespace) unless local_namespace.eql?(remote_namespace)
923
+ end
924
+
925
+ def print_dependencies(dependencies)
926
+ ambiguous = dependencies["ambiguous"]||[]
927
+ amb_sorted = ambiguous.map { |k,v| "#{k.split('/').last} (#{v.join(', ')})" }
928
+ inconsistent = dependencies["inconsistent"]||[]
929
+ possibly_missing = dependencies["possibly_missing"]||[]
930
+
931
+ OsUtil.print("There are inconsistent module dependencies mentioned in dtk.model.yaml: #{inconsistent.join(', ')}", :red) unless inconsistent.empty?
932
+ OsUtil.print("There are missing module dependencies mentioned in dtk.model.yaml: #{possibly_missing.join(', ')}", :yellow) unless possibly_missing.empty?
933
+ OsUtil.print("There are ambiguous module dependencies mentioned in dtk.model.yaml: '#{amb_sorted.join(', ')}'. One of the namespaces should be selected by editing the module_refs file", :yellow) if ambiguous && !ambiguous.empty?
934
+ end
935
+
936
+ def print_using_dependencies(component_refs)
937
+ unless component_refs.empty?
938
+ puts 'Using component modules:'
939
+ names = []
940
+ component_refs.values.each do |cmp_ref|
941
+ version = cmp_ref['version_info']
942
+ name = "#{cmp_ref['namespace_info']}:#{cmp_ref['module_name']}"
943
+ name << "(#{version})" if version
944
+ names << name
945
+ end
946
+ names.sort.each do |name|
947
+ puts " #{name}"
948
+ end
949
+ end
950
+ end
951
+
952
+ def check_version_format(version)
953
+ unless version.match(/\A\d{1,2}\.\d{1,2}\.\d{1,2}\Z/)
954
+ raise DtkValidationError, "Version has an illegal value '#{version}', format needed: '##.##.##'"
955
+ end
956
+ end
957
+
644
958
  end
645
959
  end