dtk-client 0.7.7 → 0.7.8

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