dtk-client 0.6.2 → 0.6.3

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 255d3202f2e1ed5a8549778e48dbb1e98d83e287
4
- data.tar.gz: c7c2879f1783ea5dfae4bba570e0587e7853c469
3
+ metadata.gz: 6ae387fa3ef1b1ab77afa462b3de70d85dc091d9
4
+ data.tar.gz: 28a1fbd9f0f73e2e4d8b3a4071f50610957e5f35
5
5
  SHA512:
6
- metadata.gz: edc060619dbdfee5195dd346a87a0c81edbe18c69a67704b0510c048560d60e125270f7dc27b40877f718453d2a288c992a8e56b0f11f308d46901a2cd8fb1d9
7
- data.tar.gz: 436463ab2e98c92e9e5677ef12e54453eb9c2825249e2d1dd2b50592c65f87185d127b0c4a011dd113fb72f1e8bb44b0c8b7e8f98094e728db25b44778d90a5b
6
+ metadata.gz: d4c9d5be56fcdacca8fe807b471217ad2ea5a8a85ffa20b875d73b21b1adfcdb7ddf7225a1c08297210eb51efbc1d4c744ce465757a4b75fd7a9970ecad6fe61
7
+ data.tar.gz: ba9ea50cf712535d0aa4b95cddf9ad11b1f5c451ee7a57e82b8cff7185645abd98043eba12a8e8235cd6f7e47ce5944583b0389515b5ff52218043d97b5ab868
@@ -28,7 +28,7 @@ module DTK; module Client; class CommandHelper
28
28
 
29
29
  target_repo_dir = local_repo_dir(type,full_name,version,opts)
30
30
  if File.exists?(target_repo_dir)
31
- raise ErrorUsage.new("Directory '#{target_repo_dir}' is not empty; it must be deleted or removed before retrying the command")
31
+ raise ErrorUsage.new("Directory '#{target_repo_dir}' is not empty; it must be deleted or removed before retrying the command")
32
32
  end
33
33
 
34
34
  begin
@@ -60,13 +60,13 @@ module DTK; module Client; class CommandHelper
60
60
  end
61
61
  end
62
62
 
63
- #opts can have the following keys
63
+ # opts can have the following keys
64
64
  #
65
- #:remote_repo
66
- #:remote_branch
67
- #:remote_repo_url
68
- #:local_branch
69
- #:no_fetch
65
+ # :remote_repo
66
+ # :remote_branch
67
+ # :remote_repo_url
68
+ # :local_branch
69
+ # :no_fetch
70
70
  #
71
71
  def push_changes(type,full_module_name,version,opts={})
72
72
  Response.wrap_helper_actions() do
@@ -152,7 +152,7 @@ module DTK; module Client; class CommandHelper
152
152
  local_repo_dir = local_repo_dir(type,full_module_name,version)
153
153
 
154
154
  unless File.directory?(local_repo_dir)
155
- raise ErrorUsage.new("The content for module (#{full_module_name}) should be put in directory (#{local_repo_dir})")
155
+ raise ErrorUsage.new("The content for module (#{full_module_name}) should be put in directory (#{local_repo_dir})",:log_error=>false)
156
156
  end
157
157
 
158
158
  # transfered this part to initialize_client_clone_and_push because if we remove .git folder and
@@ -175,7 +175,6 @@ module DTK; module Client; class CommandHelper
175
175
  end
176
176
 
177
177
  def rename_and_initialize_clone_and_push(type, module_name, new_module_name, branch, repo_url, local_repo_dir, version = nil)
178
-
179
178
  # check to see if the new dir has proper naming e.g. (~/dtk/component_modules/dtk::java)
180
179
  unless local_repo_dir.match(/\/#{new_module_name.gsub(ModuleUtil::NAMESPACE_SEPERATOR,'/')}$/)
181
180
  old_dir = local_repo_dir
@@ -185,13 +184,23 @@ module DTK; module Client; class CommandHelper
185
184
  parent_path = new_dir.gsub(/(\/\w+)$/,'')
186
185
  FileUtils::mkdir_p(parent_path) unless File.directory?(parent_path)
187
186
  # raise ErrorUsage.new("Destination folder already exists '#{new_dir}', aborting initialization.") if File.directory?(new_dir)
188
- FileUtils.mv(old_dir, new_dir)
187
+ if File.directory?(new_dir)
188
+ # return empty response if user does not want to overwrite current directory
189
+ return unless Console.confirmation_prompt("Destination directory #{new_dir} exists already. Do you want to overwrite it with content from #{old_dir}"+'?')
190
+ FileUtils.rm_rf(new_dir)
191
+ end
192
+ # FileUtils.mv(old_dir, new_dir)
193
+ FileUtils.cp_r(old_dir, new_dir)
189
194
  else
190
195
  new_dir = local_repo_dir
191
196
  end
192
197
 
193
198
  # Continue push
194
- initialize_client_clone_and_push(type, new_module_name, branch, repo_url, new_dir, version)
199
+ response = initialize_client_clone_and_push(type, new_module_name, branch, repo_url, new_dir, version)
200
+ return response unless response.ok?
201
+
202
+ response.data.merge!(:old_dir => old_dir)
203
+ response
195
204
  end
196
205
 
197
206
  # makes repo_dir (determined from type and module_name) into a git dir, pulls, adds, content and then pushes
@@ -40,7 +40,7 @@ module DTK::Client
40
40
  print "Importing component module '#{module_name}' ... "
41
41
  new_context_params = ::DTK::Shell::ContextParams.new([module_name])
42
42
  new_context_params.override_method_argument!('option_2', m_module['version'])
43
- new_context_params.forward_options( { "skip_cloning" => true}).merge!(opts)
43
+ new_context_params.forward_options( { "skip_cloning" => false}).merge!(opts)
44
44
 
45
45
  response = ContextRouter.routeTask("component_module", "install", new_context_params, @conn)
46
46
  puts(response.data(:does_not_exist) ? response.data(:does_not_exist) : "Done.")
@@ -67,9 +67,12 @@ module DTK::Client
67
67
  end
68
68
 
69
69
  namespace ||= opts[:default_namespace]
70
+ local_clone_dir_exists = Helper(:git_repo).local_clone_dir_exists?(:service_module, service_module_name, :namespace => namespace)
71
+
70
72
  if namespace
71
73
  post_body.merge!(:namespace => namespace)
72
- post_body.merge!(:local_clone_dir_exists => true) if Helper(:git_repo).local_clone_dir_exists?(:service_module, service_module_name, :namespace => namespace)
74
+ post_body.merge!(:local_clone_dir_exists => true) if local_clone_dir_exists
75
+ # post_body.merge!(:local_clone_dir_exists => true) if Helper(:git_repo).local_clone_dir_exists?(:service_module, service_module_name, :namespace => namespace)
73
76
  end
74
77
 
75
78
  post_body.merge!(:assembly_template_name => assembly_template_name) if assembly_template_name
@@ -78,10 +81,15 @@ module DTK::Client
78
81
  return response unless response.ok?()
79
82
 
80
83
  #synchronize_clone will load new assembly template into service clone on workspace (if it exists)
81
- commit_sha,workspace_branch,namespace,full_module_name = response.data(:commit_sha,:workspace_branch,:module_namespace,:full_module_name)
84
+ commit_sha,workspace_branch,namespace,full_module_name,repo_url,version = response.data(:commit_sha,:workspace_branch,:module_namespace,:full_module_name,:repo_url,:version)
82
85
  service_module_name ||= response.data(:module_name)
83
86
  opts = {:local_branch=>workspace_branch, :namespace => namespace}
84
- response = Helper(:git_repo).synchronize_clone(:service_module,service_module_name,commit_sha,opts)
87
+
88
+ if local_clone_dir_exists
89
+ response = Helper(:git_repo).synchronize_clone(:service_module,service_module_name,commit_sha,opts)
90
+ else
91
+ response = Helper(:git_repo).create_clone_with_branch(:service_module, service_module_name, repo_url, workspace_branch, version, namespace)
92
+ end
85
93
  return response unless response.ok?
86
94
 
87
95
  DTK::Client::OsUtil.print("New assembly template '#{assembly_template_name}' created in service module '#{full_module_name}'.", :yellow) if mode == :create
@@ -38,7 +38,7 @@ module DTK::Client
38
38
  post_body
39
39
  end
40
40
 
41
- def get_remote_module_info_aux(module_type, module_id, remote_namespace, version=nil, module_refs_content=nil)
41
+ def get_remote_module_info_aux(module_type, module_id, remote_namespace, version=nil, module_refs_content=nil, local_namespace=nil)
42
42
  id_field = "#{module_type}_id"
43
43
  rsa_pub_value = SSHUtil.rsa_pub_key_content()
44
44
 
@@ -50,6 +50,7 @@ module DTK::Client
50
50
  }
51
51
  post_body.merge!(:version => version) if version
52
52
  post_body.merge!(:remote_namespace => remote_namespace) if remote_namespace
53
+ post_body.merge!(:local_namespace => local_namespace) if local_namespace
53
54
  post_body.merge!(:module_ref_content => module_refs_content) if module_refs_content && !module_refs_content.empty?
54
55
 
55
56
  response = post(rest_url("#{module_type}/get_remote_module_info"),post_body)
@@ -241,9 +241,11 @@ module DTK::Client
241
241
 
242
242
  repo_url,repo_id,module_id,branch,new_module_name = response.data(:repo_url,:repo_id,:module_id,:workspace_branch,:full_module_name)
243
243
  response = Helper(:git_repo).rename_and_initialize_clone_and_push(module_type.to_sym, local_module_name, new_module_name, branch, repo_url, module_directory)
244
- return response unless response.ok?
245
- repo_obj,commit_sha = response.data(:repo_obj, :commit_sha)
244
+ return response unless (response && response.ok?)
245
+
246
+ repo_obj,commit_sha = response.data(:repo_obj, :commit_sha)
246
247
  module_final_dir = repo_obj.repo_dir
248
+ old_dir = response.data[:old_dir]
247
249
 
248
250
  post_body = {
249
251
  :repo_id => repo_id,
@@ -255,6 +257,9 @@ module DTK::Client
255
257
 
256
258
  unless response.ok?
257
259
  response.set_data_hash({ :full_module_name => new_module_name })
260
+ # remove new directory if import failed
261
+ # DTK-1768: removed below; TODO: see if there is any case where applicable
262
+ # FileUtils.rm_rf(module_final_dir) unless (namespace && git_import)
258
263
  return response
259
264
  end
260
265
 
@@ -277,9 +282,31 @@ module DTK::Client
277
282
  context_params.add_context_to_params(local_module_name, module_type.to_s.gsub!(/\_/,'-').to_sym, module_id)
278
283
  response = push_module_aux(context_params, true)
279
284
 
285
+ unless response.ok?
286
+ # remove new directory if import failed
287
+ # DTK-1768: removed below; TODO: see if there is any case where applicable
288
+ # Also think what should be done is if failure then move the directory back to old dir position
289
+ # (if it has been moved)
290
+ # FileUtils.rm_rf(module_final_dir) unless (namespace && git_import)
291
+ return response
292
+ end
293
+
294
+ # remove the old one if no errors while importing
295
+ # DTK-1768: removed below; and replaced by removing old dir if unequal to final dir
296
+ # was not sure why clause namespace && git_import was in so kept this condition
297
+ # FileUtils.rm_rf(old_dir) unless (namespace && git_import)
298
+ # New:
299
+ if old_dir and (old_dir != module_final_dir)
300
+ FileUtils.rm_rf(old_dir) unless (namespace && git_import)
301
+ end
302
+
280
303
  if git_import
281
304
  response[:module_id] = module_id
282
305
  response.add_data_value!(:external_dependencies, external_dependencies) if external_dependencies
306
+ else
307
+ # if not git-import and user do import from default directory (e.g. import ntp - without namespace) print message
308
+ # module directory moved from (~/dtk/component_module/<module_name>) to (~/dtk/component_module/<default_namespace>/<module_name>)
309
+ DTK::Client::OsUtil.print("Module '#{new_module_name}' has been created and module directory moved to #{module_final_dir}",:yellow) unless namespace
283
310
  end
284
311
 
285
312
  response
@@ -298,7 +325,7 @@ module DTK::Client
298
325
  ignore_component_error = context_params.get_forwarded_options() ? context_params.get_forwarded_options()[:ignore_component_error] : options.ignore?
299
326
  additional_message = context_params.get_forwarded_options()[:additional_message] if context_params.get_forwarded_options()
300
327
 
301
- remote_namespace, local_module_name = get_namespace_and_name(remote_module_name,'/')
328
+ remote_namespace, local_module_name = get_namespace_and_name(remote_module_name,':')
302
329
 
303
330
  if clone_dir = Helper(:git_repo).local_clone_dir_exists?(module_type.to_sym, local_module_name, :namespace => remote_namespace, :version => version)
304
331
  message = "Module's directory (#{clone_dir}) exists on client. To install this needs to be renamed or removed"
@@ -308,7 +335,7 @@ module DTK::Client
308
335
  end
309
336
 
310
337
  post_body = {
311
- :remote_module_name => remote_module_name,
338
+ :remote_module_name => remote_module_name.sub(':','/'),
312
339
  :local_module_name => local_module_name,
313
340
  :rsa_pub_key => SSHUtil.rsa_pub_key_content()
314
341
  }
@@ -386,7 +413,9 @@ module DTK::Client
386
413
  response = post rest_url("#{module_type}/export"), post_body
387
414
  return response unless response.ok?
388
415
 
389
- DTK::Client::RemoteDependencyUtil.print_dependency_warnings(response, "Module has been successfully published!")
416
+ full_module_name = "#{response.data['remote_repo_namespace']}/#{response.data['remote_repo_name']}"
417
+
418
+ DTK::Client::RemoteDependencyUtil.print_dependency_warnings(response, "Module has been successfully published to '#{full_module_name}'!")
390
419
  Response::Ok.new()
391
420
  end
392
421
 
@@ -486,14 +515,14 @@ module DTK::Client
486
515
  raise DtkValidationError, "You have to provide valid catalog to push changes to! Valid catalogs: #{PushCatalogs}" unless catalog
487
516
 
488
517
  module_location = OsUtil.module_location(resolve_module_type(), module_name, version)
489
-
490
518
  reparse_aux(module_location) unless internal_trigger
519
+ local_namespace, local_module_name = get_namespace_and_name(module_name,':')
491
520
 
492
521
  # if catalog.to_s.eql?("origin")
493
522
  # push_clone_changes_aux(:component_module,component_module_id,version,options["message"]||DEFAULT_COMMIT_MSG,internal_trigger)
494
523
  if catalog.to_s.eql?("dtkn")
495
524
  module_refs_content = RemoteDependencyUtil.module_ref_content(module_location) if module_type == :service_module
496
- remote_module_info = get_remote_module_info_aux(module_type.to_sym, module_id, options["namespace"], version, module_refs_content)
525
+ remote_module_info = get_remote_module_info_aux(module_type.to_sym, module_id, options["namespace"], version, module_refs_content, local_namespace)
497
526
  return remote_module_info unless remote_module_info.ok?
498
527
 
499
528
  unless File.directory?(module_location)
@@ -541,6 +570,7 @@ module DTK::Client
541
570
 
542
571
  def delete_assembly_aux(context_params)
543
572
  module_type = get_module_type(context_params)
573
+
544
574
  module_id, assembly_template_id = context_params.retrieve_arguments([REQ_MODULE_ID,:option_1!], method_argument_names)
545
575
  module_name = context_params.retrieve_arguments([:service_module_name],method_argument_names)
546
576
 
@@ -584,7 +614,7 @@ module DTK::Client
584
614
  version = nil
585
615
  commit_msg = "Deleting assembly template #{assembly_template_name.to_s}"
586
616
  internal_trigger = true
587
- push_clone_changes_aux(module_type.to_sym, module_id, version, commit_msg, internal_trigger)
617
+ push_clone_changes_aux(module_type.to_sym, module_id, version, commit_msg, internal_trigger, :skip_cloning => true)
588
618
 
589
619
  Response::Ok.new()
590
620
  end
@@ -15,6 +15,7 @@ module DTK::Client
15
15
  module_location = OsUtil.module_location(module_type,full_module_name,version,opts)
16
16
 
17
17
  unless File.directory?(module_location)
18
+ return if opts[:skip_cloning]
18
19
  if Console.confirmation_prompt("Push not possible, module '#{module_name}#{version && "-#{version}"}' has not been cloned. Would you like to clone module now"+'?')
19
20
  clone_aux(module_type,module_id, version, true, true, opts)
20
21
  else
@@ -46,11 +47,11 @@ module DTK::Client
46
47
  ret = Response::NoOp.new()
47
48
  end
48
49
  end
49
-
50
+
50
51
  # check if server pushed anything that needs to be pulled
51
52
  dsl_updated_info = response.data(:dsl_updated_info)
52
53
  if dsl_updated_info and !dsl_updated_info.empty?
53
- if msg = dsl_updated_info["msg"]
54
+ if msg = dsl_updated_info["msg"]
54
55
  DTK::Client::OsUtil.print(msg,:yellow)
55
56
  end
56
57
  new_commit_sha = dsl_updated_info[:commit_sha]
@@ -67,7 +68,7 @@ module DTK::Client
67
68
  path = dsl_created_info["path"]
68
69
  content = dsl_created_info["content"]
69
70
  if path and content
70
- msg = "A #{path} file has been created for you, located at #{repo_obj.repo_dir}"
71
+ msg = "A #{path} file has been created for you, located at #{repo_obj.repo_dir}"
71
72
  response = Helper(:git_repo).add_file(repo_obj,path,content,msg)
72
73
  return response unless response.ok?
73
74
  end
@@ -154,6 +154,17 @@ module DTK::Client
154
154
  nil
155
155
  end
156
156
 
157
+ desc "set-catalog-credentials", "Sets catalog credentials"
158
+ def set_catalog_credentials(context_params)
159
+ creds = DTK::Client::Configurator.enter_catalog_credentials()
160
+
161
+ response = post rest_url("account/set_catalog_credentials"), { :username => creds[:username], :password => creds[:password] }
162
+ return response unless response.ok?
163
+
164
+ OsUtil.print("Your catalog credentials have been set!", :yellow)
165
+ nil
166
+ end
167
+
157
168
 
158
169
 
159
170
  # Will leave this commented for now until we check if above commands work as expected
@@ -22,7 +22,7 @@ module DTK::Client
22
22
  if response.ok?
23
23
  unless response['data'].nil?
24
24
  response['data'].each do |module_item|
25
- if ("#{service_name.to_s}::#{assembly_template_name.to_s}" == (module_item['display_name']) && service_namespace == module_item['namespace'])
25
+ if ("#{service_name.to_s}/#{assembly_template_name.to_s}" == (module_item['display_name']) && service_namespace == module_item['namespace'])
26
26
  assembly_template_id = module_item['id']
27
27
  break
28
28
  end
@@ -31,7 +31,7 @@ module DTK::Client
31
31
  end
32
32
 
33
33
  raise DTK::Client::DtkError, "Illegal name (#{assembly_template_name}) for assembly." if assembly_template_id.nil?
34
-
34
+
35
35
  return assembly_template_id
36
36
  end
37
37
 
@@ -74,13 +74,13 @@ module DTK::Client
74
74
  assembly_list = []
75
75
  response = get_cached_response(:service, "assembly/list", {})
76
76
  raise DTK::Client::DtkError, "Unable to retreive service list." unless (response.nil? || response.ok?)
77
-
77
+
78
78
  if assemblies = response.data
79
79
  assemblies.each do |assembly|
80
80
  assembly_list << assembly["display_name"]
81
81
  end
82
82
  end
83
-
83
+
84
84
  assembly_list
85
85
  end
86
86
 
@@ -89,19 +89,19 @@ module DTK::Client
89
89
  def info(context_params)
90
90
  assembly_template_id = context_params.retrieve_arguments([:assembly_id!],method_argument_names)
91
91
  data_type = :assembly_template
92
-
92
+
93
93
  post_body = {
94
94
  :assembly_id => assembly_template_id,
95
95
  :subtype => 'template',
96
96
  }
97
-
97
+
98
98
  post rest_url("assembly/info"), post_body
99
99
  end
100
100
 
101
101
  desc "ASSEMBLY-NAME/ID list-nodes [--service SERVICE-NAME]", "List all nodes for given assembly."
102
102
  method_option :list, :type => :boolean, :default => false
103
103
  method_option "service",:aliases => "-s" ,
104
- :type => :string,
104
+ :type => :string,
105
105
  :banner => "SERVICE-LIST-FILTER",
106
106
  :desc => "Service list filter"
107
107
  def list_nodes(context_params)
@@ -112,7 +112,7 @@ module DTK::Client
112
112
  desc "ASSEMBLY-NAME/ID list-components [--service SERVICE-NAME]", "List all components for given assembly."
113
113
  method_option :list, :type => :boolean, :default => false
114
114
  method_option "service",:aliases => "-s" ,
115
- :type => :string,
115
+ :type => :string,
116
116
  :banner => "SERVICE-LIST-FILTER",
117
117
  :desc => "Service list filter"
118
118
  def list_components(context_params)
@@ -133,7 +133,7 @@ module DTK::Client
133
133
  context_params_for_service = DTK::Shell::ContextParams.new
134
134
  context_params_for_service.add_context_to_params("service_module", "service_module", service_id)
135
135
  context_params_for_service.method_arguments = ['assembly',"#{service_id}"]
136
-
136
+
137
137
  response = DTK::Client::ContextRouter.routeTask("service_module", "list", context_params_for_service, @conn)
138
138
  else
139
139
  response = post rest_url("assembly/list"), {:subtype => 'template', :detail_level => 'nodes'}
@@ -143,7 +143,7 @@ module DTK::Client
143
143
  end
144
144
 
145
145
  else
146
-
146
+
147
147
  post_body = {
148
148
  :subtype => 'template',
149
149
  :assembly_id => assembly_template_id,
@@ -153,7 +153,7 @@ module DTK::Client
153
153
  case about
154
154
  when 'nodes'
155
155
  response = post rest_url("assembly/info_about"), post_body
156
- data_type = :node_template
156
+ data_type = :assembly_node_template
157
157
  when 'components'
158
158
  response = post rest_url("assembly/info_about"), post_body
159
159
  data_type = :component
@@ -186,12 +186,12 @@ module DTK::Client
186
186
 
187
187
  desc "ASSEMBLY-NAME/ID stage [INSTANCE-NAME] [-t TARGET-NAME/ID] [--settings SETTINGS-NAME1[,..]]", "Stage assembly in target."
188
188
  method_option "in-target",:aliases => "-t" ,
189
- :type => :string,
189
+ :type => :string,
190
190
  :banner => "TARGET-NAME/ID",
191
- :desc => "Target (id) to create assembly in"
191
+ :desc => "Target (id) to create assembly in"
192
192
  #hidden option
193
193
  method_option "instance-bindings",
194
- :type => :string
194
+ :type => :string
195
195
  method_option :settings, :type => :string, :aliases => '-s'
196
196
  def stage(context_params)
197
197
  assembly_template_id, name = context_params.retrieve_arguments([:assembly_id!, :option_1],method_argument_names)
@@ -202,7 +202,7 @@ module DTK::Client
202
202
  # using this to make sure cache will be invalidated after new assembly is created from other commands e.g.
203
203
  # 'assembly-create', 'install' etc.
204
204
  @@invalidate_map << :assembly
205
-
205
+
206
206
  assembly_template_name = get_assembly_name(assembly_template_id)
207
207
  if assembly_template_name
208
208
  assembly_template_name.gsub!(/(::)|(\/)/,'-')
@@ -218,7 +218,7 @@ module DTK::Client
218
218
  else
219
219
  name = get_assembly_stage_name(assembly_list,assembly_template_name)
220
220
  end
221
-
221
+
222
222
  post_body.merge!(:target_id => in_target) if in_target
223
223
  post_body.merge!(:name => name) if name
224
224
  post_body.merge!(:instance_bindings => instance_bindings) if instance_bindings
@@ -239,13 +239,13 @@ module DTK::Client
239
239
  desc "ASSEMBLY-NAME/ID deploy [INSTANCE-NAME] [--settings SETTINGS-NAME1[,..]] [-m COMMIT-MSG]", "Stage and deploy assembly in target."
240
240
  #hidden option
241
241
  method_option "instance-bindings",
242
- :type => :string
242
+ :type => :string
243
243
  # method_option "in-target",:aliases => "-t" ,
244
244
  # :type => :string,
245
245
  # :banner => "TARGET-NAME/ID",
246
- # :desc => "Target (id) to create assembly in"
246
+ # :desc => "Target (id) to create assembly in"
247
247
  method_option "commit_msg",:aliases => "-m" ,
248
- :type => :string,
248
+ :type => :string,
249
249
  :banner => "COMMIT-MSG",
250
250
  :desc => "Commit message"
251
251
  method_option :settings, :type => :string, :aliases => '-s'
@@ -262,7 +262,7 @@ module DTK::Client
262
262
  # using this to make sure cache will be invalidated after new assembly is created from other commands e.g.
263
263
  # 'assembly-create', 'install' etc.
264
264
  @@invalidate_map << :assembly
265
-
265
+
266
266
  assembly_template_name = get_assembly_name(assembly_template_id)
267
267
  if assembly_template_name
268
268
  assembly_template_name.gsub!(/(::)|(\/)/,'-')
@@ -279,7 +279,7 @@ module DTK::Client
279
279
  else
280
280
  name = get_assembly_stage_name(assembly_list,assembly_template_name)
281
281
  end
282
-
282
+
283
283
  post_body.merge!(:target_id => in_target) if in_target
284
284
  post_body.merge!(:name => name) if name
285
285
  post_body.merge!(:instance_bindings => instance_bindings) if instance_bindings
@@ -292,7 +292,7 @@ module DTK::Client
292
292
  @@invalidate_map << :assembly
293
293
  response
294
294
  end
295
-
295
+
296
296
 
297
297
  desc "delete ASSEMBLY-ID", "Delete assembly"
298
298
  method_option :force, :aliases => '-y', :type => :boolean, :default => false
@@ -308,7 +308,7 @@ module DTK::Client
308
308
  :subtype => :template
309
309
  }
310
310
  response = post rest_url("assembly/delete"), post_body
311
-
311
+
312
312
  # when changing context send request for getting latest assemblies instead of getting from cache
313
313
  @@invalidate_map << :assembly
314
314
  return response unless response.ok?
@@ -130,7 +130,7 @@ TODO: might deprecate
130
130
 
131
131
  post_body = (remote ? { :rsa_pub_key => SSHUtil.rsa_pub_key_content() } : {:detail_to_include => ["remotes"]})
132
132
  post_body[:diff] = options.diff? ? options.diff : {}
133
- post_body.merge!(:module_namespace => options.namespace)
133
+ post_body.merge!(:module_namespace => options.namespace) if options.namespace
134
134
 
135
135
  response = post rest_url("component_module/#{action}"),post_body
136
136
 
@@ -176,7 +176,7 @@ TODO: might deprecate
176
176
  desc "import [NAMESPACE:]COMPONENT-MODULE-NAME", "Create new component module from local clone"
177
177
  def import(context_params)
178
178
  response = import_module_aux(context_params)
179
- @@invalidate_map << :component_module if (response && response.ok?)
179
+ @@invalidate_map << :component_module
180
180
 
181
181
  response
182
182
  end
@@ -52,10 +52,10 @@ module DTK::Client
52
52
  raise ::DTK::Client::DtkValidationError.new("Multiple security groups should be separated with ',' and without spaces between them (e.g. --security_groups gr1,gr2,gr3,...) ") if security_group.end_with?(',')
53
53
 
54
54
  security_groups = security_group.split(',')
55
- iaas_properties.merge!(:keypair_name => keypair)#,:security_group => security_group)
55
+ iaas_properties.merge!(:keypair_name => keypair)
56
56
 
57
57
  if (security_groups.empty? || security_groups.size==1)
58
- iaas_properties.merge!(:security_group => security_group)#,:security_group => security_group)
58
+ iaas_properties.merge!(:security_group => security_group)
59
59
  else
60
60
  iaas_properties.merge!(:security_group_set => security_groups)
61
61
  end
@@ -108,18 +108,35 @@ module DTK::Client
108
108
  end
109
109
 
110
110
 
111
- desc "PROVIDER-ID/NAME create-target [TARGET-NAME] --region REGION", "Create target based on given provider"
111
+ desc "PROVIDER-ID/NAME create-target [TARGET-NAME] --region REGION --keypair KEYPAIR --security-group SECURITY-GROUP(S)", "Create target based on given provider"
112
112
  method_option :region, :type => :string
113
+ method_option :keypair, :type => :string
114
+ method_option :security_group, :type => :string, :aliases => '--security-groups'
113
115
  def create_target(context_params)
114
116
  # we use :target_id but that will retunr provider_id (another name for target template ID)
115
- provider_id, target_name = context_params.retrieve_arguments([:provider_id!,:option_1],method_argument_names)
116
- region = context_params.retrieve_thor_options([:region!], options)
117
+ provider_id, target_name = context_params.retrieve_arguments([:provider_id!, :option_1],method_argument_names)
118
+ region, keypair, security_group = context_params.retrieve_thor_options([:region!, :keypair!, :security_group!], options)
117
119
 
120
+ #TODO: data-driven check if legal provider type and then what options needed depending on provider type
121
+ iaas_properties = Hash.new
118
122
  DTK::Shell::InteractiveWizard.validate_region(region)
119
123
 
124
+ security_groups = []
125
+ raise ::DTK::Client::DtkValidationError.new("Multiple security groups should be separated with ',' and without spaces between them (e.g. --security_groups gr1,gr2,gr3,...) ") if security_group.end_with?(',')
126
+
127
+ security_groups = security_group.split(',')
128
+ iaas_properties.merge!(:keypair => keypair)
129
+
130
+ if (security_groups.empty? || security_groups.size==1)
131
+ iaas_properties.merge!(:security_group => security_group)
132
+ else
133
+ iaas_properties.merge!(:security_group_set => security_groups)
134
+ end
135
+
120
136
  post_body = {
121
137
  :provider_id => provider_id,
122
- :region => region
138
+ :region => region,
139
+ :iaas_properties => iaas_properties
123
140
  }
124
141
  post_body.merge!(:target_name => target_name) if target_name
125
142
  response = post rest_url("target/create"), post_body
@@ -121,7 +121,7 @@ module DTK::Client
121
121
  action = options.remote? ? "list_remote" : "list"
122
122
  post_body = (options.remote? ? { :rsa_pub_key => SSHUtil.rsa_pub_key_content() } : {:detail_to_include => ["remotes"]})
123
123
  post_body[:diff] = options.diff? ? options.diff : {}
124
- post_body.merge!(:module_namespace => options.namespace)
124
+ post_body.merge!(:module_namespace => options.namespace) if options.namespace
125
125
 
126
126
  response = post rest_url("service_module/#{action}"), post_body
127
127
  # If user is on service identifier level, list task can't have '--remote' option.
@@ -421,12 +421,33 @@ module DTK::Client
421
421
  repo_url,repo_id,module_id,branch,new_module_name = [:repo_url,:repo_id,:module_id,:workspace_branch,:full_module_name].map { |k| repo_info[k.to_s] }
422
422
 
423
423
  response = Helper(:git_repo).rename_and_initialize_clone_and_push(:service_module, local_module_name, new_module_name,branch,repo_url,service_directory)
424
- return response unless response.ok?
424
+ return response unless (response && response.ok?)
425
425
 
426
- repo_obj,commit_sha = response.data(:repo_obj,:commit_sha)
426
+ repo_obj,commit_sha = response.data(:repo_obj,:commit_sha)
427
+ module_final_dir = repo_obj.repo_dir
428
+ old_dir = response.data[:old_dir]
427
429
 
428
430
  context_params.add_context_to_params(local_module_name, :"service-module", module_id)
429
- push(context_params,true)
431
+ response = push(context_params,true)
432
+
433
+ unless response.ok?
434
+ # remove new directory if import failed
435
+ # DTK-1768: removed below; TODO: see if need to put a variant back in
436
+ # was not sure why clause namespace is there
437
+ # FileUtils.rm_rf(module_final_dir) unless namespace
438
+ return response
439
+ end
440
+
441
+ # remove the old one if no errors while importing
442
+ # DTK-1768: removed below; and replaced by removing old dir if unequal to final dir
443
+ # was not sure why clause namespace was in so kept this condition
444
+ #FileUtils.rm_rf(old_dir) unless namespace
445
+ if old_dir and (old_dir != module_final_dir)
446
+ FileUtils.rm_rf(old_dir) unless namespace
447
+ end
448
+ DTK::Client::OsUtil.print("Module '#{new_module_name}' has been created and module directory moved to #{repo_obj.repo_dir}",:yellow) unless namespace
449
+
450
+ response
430
451
  end
431
452
 
432
453
 
@@ -84,19 +84,35 @@ module DTK::Client
84
84
  post rest_url("target/install_agents"), post_body
85
85
  end
86
86
 
87
- desc "create-target [TARGET-NAME] --provider PROVIDER --region REGION", "Create target based on given provider"
87
+ desc "create-target [TARGET-NAME] --provider PROVIDER --region REGION --keypair KEYPAIR --security-group SECURITY-GROUP(S)", "Create target based on given provider"
88
88
  method_option :provider, :type => :string
89
89
  method_option :region, :type => :string
90
+ method_option :keypair, :type => :string
91
+ method_option :security_group, :type => :string, :aliases => '--security-groups'
90
92
  def create_target(context_params)
91
93
  # we use :target_id but that will retunr provider_id (another name for target template ID)
92
94
  target_name = context_params.retrieve_arguments([:option_1],method_argument_names)
93
- provider = context_params.retrieve_thor_options([:provider!], options)
94
- region = context_params.retrieve_thor_options([:region], options)
95
+ provider, region, keypair, security_group = context_params.retrieve_thor_options([:provider!, :region, :keypair!, :security_group!], options)
95
96
 
97
+ #TODO: data-driven check if legal provider type and then what options needed depending on provider type
98
+ iaas_properties = Hash.new
96
99
  DTK::Shell::InteractiveWizard.validate_region(region) if region
97
100
 
101
+ security_groups = []
102
+ raise ::DTK::Client::DtkValidationError.new("Multiple security groups should be separated with ',' and without spaces between them (e.g. --security_groups gr1,gr2,gr3,...) ") if security_group.end_with?(',')
103
+
104
+ security_groups = security_group.split(',')
105
+ iaas_properties.merge!(:keypair => keypair)
106
+
107
+ if (security_groups.empty? || security_groups.size==1)
108
+ iaas_properties.merge!(:security_group => security_group)
109
+ else
110
+ iaas_properties.merge!(:security_group_set => security_groups)
111
+ end
112
+
98
113
  post_body = {
99
- :provider_id => provider
114
+ :provider_id => provider,
115
+ :iaas_properties => iaas_properties
100
116
  }
101
117
  post_body.merge!(:target_name => target_name) if target_name
102
118
  post_body.merge!(:region => region) if region
@@ -89,7 +89,7 @@ module DTK::Client
89
89
  desc "import [NAMESPACE:]TEST-MODULE-NAME", "Create new test module from local clone"
90
90
  def import(context_params)
91
91
  response = import_module_aux(context_params)
92
- @@invalidate_map << :test_module if response && response.ok?
92
+ @@invalidate_map << :test_module
93
93
 
94
94
  response
95
95
  end
data/lib/configurator.rb CHANGED
@@ -1,138 +1,156 @@
1
1
  require 'rubygems'
2
-
2
+ require 'fileutils'
3
3
  dtk_require_from_base('util/os_util')
4
4
 
5
5
  module DTK
6
- module Client
7
- class Configurator
8
-
9
- CONFIG_FILE = File.join(OsUtil.dtk_local_folder, "client.conf")
10
- CRED_FILE = File.join(OsUtil.dtk_local_folder, ".connection")
11
- DIRECT_ACCESS = File.join(OsUtil.dtk_local_folder, ".add_direct_access")
12
- NODE_SSH_CREDENTIALS = File.join(OsUtil.dtk_local_folder, "ssh_credentials.yaml")
13
-
14
- require 'fileutils'
15
- FileUtils.mkdir(OsUtil.dtk_local_folder) unless File.directory?(OsUtil.dtk_local_folder)
16
-
17
- def self.check_config_exists
18
- exists = true
19
- if !File.exists?(CONFIG_FILE)
20
- puts "", "Please enter the DTK server address (example: instance.dtk.io)"
21
- header = File.read(File.expand_path('../lib/config/client.conf.header', File.dirname(__FILE__)))
22
- generate_conf_file(CONFIG_FILE, [['server_host', 'Server address']], header)
23
- exists = false
24
- end
25
- if !File.exists?(CRED_FILE)
26
- puts "", "Please enter your DTK login details"
27
- generate_conf_file(CRED_FILE, [['username', 'Username'], ['password', 'Password']], '')
28
- exists = false
29
- end
30
-
31
- exists
32
- end
33
-
34
- def self.check_git
35
- if OsUtil.which('git') == nil
36
- OsUtil.put_warning "[WARNING]", "Can't find the 'git' command in you path. Please make sure git is installed in order to use all features of DTK Client.", :yellow
37
- else
38
- OsUtil.put_warning "[WARNING]", 'Git username not set. This can cause issues while using DTK Client. To set it, run `git config --global user.name "User Name"`', :yellow if `git config --get user.name` == ""
39
- OsUtil.put_warning "[WARNING]", 'Git email not set. This can cause issues while using DTK Client. To set it, run `git config --global user.email "me@here.com"`', :yellow if `git config --get user.email` == ""
40
- end
41
- end
42
-
43
- # return true/false, .add_direct_access file location and ssk key file location
44
- def self.check_direct_access
45
- username_exists = check_for_username_entry(client_username())
46
- ssh_key_path = SSHUtil.default_rsa_pub_key_path()
47
-
48
- {:username_exists => username_exists, :file_path => DIRECT_ACCESS, :ssh_key_path => ssh_key_path}
49
- end
50
-
51
- def self.generate_conf_file(file_path, properties, header)
52
- require 'highline/import'
53
- property_template = []
54
-
55
- properties.each do |p,d|
56
- begin
57
- trap("INT") {
58
- puts "", "Exiting..."
59
- abort
60
- }
61
- end
62
- value = ask("#{d}: ") { |q| q.echo = false if p == 'password'}
63
- property_template << [p,value]
64
- end
65
-
66
- File.open(file_path, 'w') do |f|
67
- f.puts(header)
68
- property_template.each do |prop|
69
- f.puts("#{prop[0]}=#{prop[1]}")
70
- end
71
- end
72
- end
73
-
74
- def self.regenerate_conf_file(file_path, properties, header)
75
- File.open(file_path, 'w') do |f|
76
- f.puts(header)
77
- properties.each do |prop|
78
- f.puts("#{prop[0]}=#{prop[1]}")
79
- end
80
- end
81
- end
82
-
83
- def self.create_missing_clone_dirs
84
- FileUtils.mkdir(OsUtil.component_clone_location) unless File.directory?(OsUtil.component_clone_location)
85
- FileUtils.mkdir(OsUtil.service_clone_location) unless File.directory?(OsUtil.service_clone_location)
86
- FileUtils.mkdir(OsUtil.test_clone_location) unless File.directory?(OsUtil.test_clone_location)
87
- end
88
-
89
-
90
- def self.parse_key_value_file(file)
91
- #adapted from mcollective config
92
- ret = Hash.new
93
- raise DTK::Client::DtkError,"Config file (#{file}) does not exists" unless File.exists?(file)
94
- File.open(file).each do |line|
95
- # strip blank spaces, tabs etc off the end of all lines
96
- line.gsub!(/\s*$/, "")
97
- unless line =~ /^#|^$/
98
- if (line =~ /(.+?)\s*=\s*(.+)/)
99
- key = $1
100
- val = $2
101
- ret[key.to_sym] = val
102
- end
103
- end
104
- end
105
- ret
106
- end
107
- def self.add_current_user_to_direct_access()
108
- username = client_username()
109
-
110
- File.open(DIRECT_ACCESS, 'a') do |file|
111
- file.puts(username)
112
- end
113
-
114
- true
115
- end
116
-
117
- def self.client_username()
6
+ module Client
7
+ class Configurator
8
+
9
+ CONFIG_FILE = File.join(OsUtil.dtk_local_folder, "client.conf")
10
+ CRED_FILE = File.join(OsUtil.dtk_local_folder, ".connection")
11
+ DIRECT_ACCESS = File.join(OsUtil.dtk_local_folder, ".add_direct_access")
12
+ NODE_SSH_CREDENTIALS = File.join(OsUtil.dtk_local_folder, "ssh_credentials.yaml")
13
+
14
+ FileUtils.mkdir(OsUtil.dtk_local_folder) unless File.directory?(OsUtil.dtk_local_folder)
15
+
16
+ def self.check_config_exists
17
+ exists = true
18
+ if !File.exists?(CONFIG_FILE)
19
+ puts "", "Please enter the DTK server address (example: instance.dtk.io)"
20
+ header = File.read(File.expand_path('../lib/config/client.conf.header', File.dirname(__FILE__)))
21
+ generate_conf_file(CONFIG_FILE, [['server_host', 'Server address']], header)
22
+ exists = false
23
+ end
24
+ if !File.exists?(CRED_FILE)
25
+ puts "", "Please enter your DTK login details"
26
+ generate_conf_file(CRED_FILE, [['username', 'Username'], ['password', 'Password']], '')
27
+ exists = false
28
+ end
29
+
30
+ exists
31
+ end
32
+
33
+ def self.check_git
34
+ if OsUtil.which('git') == nil
35
+ OsUtil.put_warning "[WARNING]", "Can't find the 'git' command in you path. Please make sure git is installed in order to use all features of DTK Client.", :yellow
36
+ else
37
+ OsUtil.put_warning "[WARNING]", 'Git username not set. This can cause issues while using DTK Client. To set it, run `git config --global user.name "User Name"`', :yellow if `git config --get user.name` == ""
38
+ OsUtil.put_warning "[WARNING]", 'Git email not set. This can cause issues while using DTK Client. To set it, run `git config --global user.email "me@here.com"`', :yellow if `git config --get user.email` == ""
39
+ end
40
+ end
41
+
42
+ # return true/false, .add_direct_access file location and ssk key file location
43
+ def self.check_direct_access
44
+ username_exists = check_for_username_entry(client_username())
45
+ ssh_key_path = SSHUtil.default_rsa_pub_key_path()
46
+
47
+ {:username_exists => username_exists, :file_path => DIRECT_ACCESS, :ssh_key_path => ssh_key_path}
48
+ end
49
+
50
+ def self.generate_conf_file(file_path, properties, header)
51
+ require 'highline/import'
52
+ property_template = []
53
+
54
+ properties.each do |p,d|
55
+ begin
56
+ trap("INT") {
57
+ puts "", "Exiting..."
58
+ abort
59
+ }
60
+ end
61
+ value = ask("#{d}: ") { |q| q.echo = false if p == 'password'}
62
+ property_template << [p,value]
63
+ end
64
+
65
+ File.open(file_path, 'w') do |f|
66
+ f.puts(header)
67
+ property_template.each do |prop|
68
+ f.puts("#{prop[0]}=#{prop[1]}")
69
+ end
70
+ end
71
+ end
72
+
73
+ def self.regenerate_conf_file(file_path, properties, header)
74
+ File.open(file_path, 'w') do |f|
75
+ f.puts(header)
76
+ properties.each do |prop|
77
+ f.puts("#{prop[0]}=#{prop[1]}")
78
+ end
79
+ end
80
+ end
81
+
82
+ def self.create_missing_clone_dirs
83
+ FileUtils.mkdir(OsUtil.component_clone_location) unless File.directory?(OsUtil.component_clone_location)
84
+ FileUtils.mkdir(OsUtil.service_clone_location) unless File.directory?(OsUtil.service_clone_location)
85
+ FileUtils.mkdir(OsUtil.test_clone_location) unless File.directory?(OsUtil.test_clone_location)
86
+ end
87
+
88
+
89
+ def self.parse_key_value_file(file)
90
+ # adapted from mcollective config
91
+ ret = Hash.new
92
+ raise DTK::Client::DtkError,"Config file (#{file}) does not exists" unless File.exists?(file)
93
+ File.open(file).each do |line|
94
+ # strip blank spaces, tabs etc off the end of all lines
95
+ line.gsub!(/\s*$/, "")
96
+ unless line =~ /^#|^$/
97
+ if (line =~ /(.+?)\s*=\s*(.+)/)
98
+ key = $1
99
+ val = $2
100
+ ret[key.to_sym] = val
101
+ end
102
+ end
103
+ end
104
+ ret
105
+ end
106
+ def self.add_current_user_to_direct_access()
107
+ username = client_username()
108
+
109
+ File.open(DIRECT_ACCESS, 'a') do |file|
110
+ file.puts(username)
111
+ end
112
+
113
+ true
114
+ end
115
+
116
+ def self.client_username()
118
117
  parse_key_value_file(CRED_FILE)[:username]
119
118
  end
120
119
 
121
- #
122
- # Method will check if there is username entry in DIRECT_ACCESS file
123
- #
124
- def self.check_for_username_entry(username)
125
- if File.exists?(DIRECT_ACCESS)
126
- File.open(DIRECT_ACCESS).each do |line|
127
- if line.strip.eql?(username)
128
- return true
129
- end
130
- end
131
- end
132
-
133
- return false
134
- end
135
- end
136
- end
120
+ #
121
+ # Method will check if there is username entry in DIRECT_ACCESS file
122
+ #
123
+ def self.check_for_username_entry(username)
124
+ if File.exists?(DIRECT_ACCESS)
125
+ File.open(DIRECT_ACCESS).each do |line|
126
+ if line.strip.eql?(username)
127
+ return true
128
+ end
129
+ end
130
+ end
131
+
132
+ return false
133
+ end
134
+
135
+ def self.ask_catalog_credentials()
136
+ are_there_creds = Console.confirmation_prompt("Do you have DTK catalog credentials", true)
137
+ property_template = {}
138
+ if are_there_creds
139
+ property_template = self.enter_catalog_credentials()
140
+ end
141
+
142
+ property_template
143
+ end
144
+
145
+ def self.enter_catalog_credentials()
146
+ property_template = {}
147
+ { :username => 'Catalog Username', :password => 'Catalog Password' }.each do |p, v|
148
+ value = ask("#{v}: ") { |q| q.echo = false if p == :password }
149
+ property_template.store(p, value)
150
+ end
151
+ property_template
152
+ end
153
+ end
154
+ end
137
155
  end
138
156
 
data/lib/core.rb CHANGED
@@ -121,6 +121,19 @@ def resolve_direct_access(params, config_exists=nil)
121
121
  return if params[:username_exists]
122
122
 
123
123
  puts "Processing..." if config_exists
124
+ # check to see if catalog credentials are set
125
+ conn = DTK::Client::Session.get_connection()
126
+ response = conn.post DTK::Client::CommandBase.class, conn.rest_url("account/check_catalog_credentials"), {}
127
+
128
+ # set catalog credentails
129
+ if response.ok? && !response.data['catalog_credentials_set']
130
+ # setting up catalog credentials
131
+ catalog_creds = DTK::Client::Configurator.ask_catalog_credentials()
132
+ unless catalog_creds.empty?
133
+ response = conn.post DTK::Client::CommandBase.class, conn.rest_url("account/set_catalog_credentials"), { :username => catalog_creds[:username], :password => catalog_creds[:password]}
134
+ end
135
+ end
136
+
124
137
  # response = DTK::Client::Account.add_access(params[:ssh_key_path])
125
138
  response, matched_pub_key, matched_username = DTK::Client::Account.add_key(params[:ssh_key_path])
126
139
 
@@ -138,7 +151,6 @@ def resolve_direct_access(params, config_exists=nil)
138
151
  DTK::Client::Configurator.add_current_user_to_direct_access()
139
152
  end
140
153
 
141
-
142
154
  response
143
155
  end
144
156
 
@@ -389,17 +401,19 @@ module DTK
389
401
  # to make sure that connection is properly set.
390
402
  #
391
403
  def print_warning
404
+ creds = get_credentials
392
405
  puts "[WARNING] Unable to connect to server, please check you configuration."
393
406
  puts "========================== Configuration =========================="
394
407
  printf "%15s %s\n", "REST endpoint:", rest_url
395
- creds = get_credentials
396
408
  printf "%15s %s\n", "Username:", "#{creds[:username]}"
397
409
  printf "%15s %s\n", "Password:", "#{creds[:password] ? creds[:password].gsub(/./,'*') : 'No password set'}"
398
410
  puts "==================================================================="
399
- error_code = self.connection_error['errors'].first['errors'].first['code']
400
- print " Error code: "
401
- DTK::Client::OsUtil.print(error_code, :red)
402
411
 
412
+ if self.connection_error['errors'].first['errors']
413
+ error_code = self.connection_error['errors'].first['errors'].first['code']
414
+ print " Error code: "
415
+ DTK::Client::OsUtil.print(error_code, :red)
416
+ end
403
417
  end
404
418
 
405
419
  private
@@ -15,9 +15,11 @@ module DTK
15
15
  end
16
16
 
17
17
  def stage_changes()
18
- @git_repo.add(untracked())
19
- @git_repo.add(added())
20
- @git_repo.add(changed())
18
+ handle_git_error do
19
+ @git_repo.add(untracked())
20
+ @git_repo.add(added())
21
+ @git_repo.add(changed())
22
+ end
21
23
  deleted().each do |file|
22
24
  begin
23
25
  @git_repo.remove(file)
@@ -190,7 +192,8 @@ module DTK
190
192
  end
191
193
 
192
194
  def self.clone(repo_url, target_path, branch, opts={})
193
- git_base = Git.clone(repo_url, target_path)
195
+ git_base = handle_git_error{Git.clone(repo_url, target_path)}
196
+
194
197
  unless branch.nil?
195
198
  if opts[:track_remote_branch]
196
199
  # This just tracks remote branch
@@ -256,6 +259,38 @@ module DTK
256
259
  end
257
260
 
258
261
  private
262
+ def handle_git_error(&block)
263
+ self.class.handle_git_error(&block)
264
+ end
265
+ def self.handle_git_error(&block)
266
+ ret = nil
267
+ begin
268
+ ret = yield
269
+ rescue => e
270
+ unless e.respond_to?(:message)
271
+ raise e
272
+ else
273
+ err_msg = e.message
274
+ lines = err_msg.split("\n")
275
+ if lines.last =~ GitErrorPattern
276
+ err_msg = error_msg_when_git_error(lines)
277
+ end
278
+ raise DtkError.new(err_msg)
279
+ end
280
+ end
281
+ ret
282
+ end
283
+ GitErrorPattern = /^fatal:/
284
+ def self.error_msg_when_git_error(lines)
285
+ ret = lines.last.gsub(GitErrorPattern,'').strip()
286
+ # TODO start putting in special cases here
287
+ if ret =~ /adding files failed/
288
+ if lines.first =~ /\.git/
289
+ ret = "Cannot add files that are in a .git directory; remove any nested .git directory"
290
+ end
291
+ end
292
+ ret
293
+ end
259
294
 
260
295
  # Method bellow show different behavior when working with 1.8.7
261
296
  # so based on Hash response we know it it is:
@@ -36,9 +36,6 @@ module DTK
36
36
  Ok.new(results)
37
37
  rescue ErrorUsage => e
38
38
  Error::Usage.new("message"=> e.to_s)
39
- #rescue ::Grit::Git::CommandFailed => e
40
- # remove grit internal error handler
41
- # Error::Usage.new("message"=> "Grit Error: #{e.err.gsub(/^.*:/,'').strip.capitalize}")
42
39
  rescue => e
43
40
  error_hash = {
44
41
  "message"=> e.message,
@@ -1,3 +1,3 @@
1
1
  module DtkClient
2
- VERSION="0.6.2"
2
+ VERSION="0.6.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dtk-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rich PELAVIN
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-13 00:00:00.000000000 Z
11
+ date: 2014-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -338,7 +338,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
338
338
  version: '0'
339
339
  requirements: []
340
340
  rubyforge_project:
341
- rubygems_version: 2.4.1
341
+ rubygems_version: 2.2.2
342
342
  signing_key:
343
343
  specification_version: 4
344
344
  summary: DTK CLI client for DTK server interaction.