dtk-client 0.5.18 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- Y2MwM2Q0NGFmOTdhNmZiYzUzMWNjMGNkMTg4YzM1YWFlN2Y2ZjJlMw==
5
- data.tar.gz: !binary |-
6
- OTY2OWU3ODA4OGFlZTAwMDZlNmUwOGNiMDA3MzVjZWJlYTk4ZjlmNA==
2
+ SHA1:
3
+ metadata.gz: 924cb223833c0f10b4c810b3e1d7f5dc74ce274e
4
+ data.tar.gz: e8c98938d95c03ec4b60d61b613ec35e9e7954c7
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MmIxYjQ4ZGVhMDRlYjViODI5YzdjOTgzNjlmYTI5M2Y1NTdkOTc3YTEzZjk3
10
- YmM2ZjRhYjVkODFmNjQwODRmMjdkZjRmMzY1ZmYyZGMxYzg4ZWM5MWE3MWIy
11
- ZjdlODEyMTIwOWFmM2ViYTUyMzZkMTFmNDU4ZGQ5MGU2ZDg1NTQ=
12
- data.tar.gz: !binary |-
13
- ZWZkYjM2MzIzNmU5NGNlOTA0YTU3Zjk4NzU1MWU0ZDZlOGRmMTllYTFlM2U5
14
- NjVlYjEzNzZkZTJjMzllYzg5ZWQzMmFmYThmM2U4MTM3MGNhYmE2M2UxMWYz
15
- NTViYjlmNjAyOGViMjUyOTVmMjMyNGRhOWU3ZDNjMTNiZTdjZDg=
6
+ metadata.gz: 8a855b4408447bc5545a9ef6f0e879c0c7e07d1436e302d6884c35b632863d59b63934d57e420657cfb0cc43b1a92cfb219f8bbf790f89246988921de3fa886a
7
+ data.tar.gz: ce5d0a8bb741436c1fd73971306a0d6b836208e6b2483f7f63899a6d50532199603dd1c2c4e39d286517b1bc0ee926c6b2c8897208775f812c6ebf5aac213b62
@@ -8,13 +8,14 @@ module DTK::Client
8
8
  Response.wrap_helper_actions do
9
9
  modules_dir = OsUtil.test_clone_location()
10
10
  FileUtils.mkdir_p(modules_dir) unless File.directory?(modules_dir)
11
- module_name = ModuleUtil.filter_module_name(module_name)
12
11
  target_repo_dir = OsUtil.module_location(type,module_name)
12
+
13
13
  begin
14
- FileUtils.mkdir(target_repo_dir)
14
+ FileUtils.mkdir_p(target_repo_dir)
15
15
  generate_model(module_name, target_repo_dir)
16
16
  generate_serverspec_files(module_name, target_repo_dir)
17
17
  rescue => e
18
+ additional_error_msg = ""
18
19
  error_msg = "Create of directory (#{target_repo_dir}) failed."
19
20
  additional_error_msg = "Directory already exists" if e.message.include? "File exists"
20
21
  raise DTK::ErrorUsage.new(error_msg + " " + additional_error_msg,:log_error=>false)
@@ -51,33 +51,41 @@ module DTK::Client
51
51
 
52
52
  # mode will be :create or :update
53
53
  # service_module_name_x can be name or fullname (NS:MOduleName)
54
- def promote_assembly_aux(mode,assembly_or_workspace_id,service_module_name_x=nil,assembly_template_name=nil)
54
+ def promote_assembly_aux(mode,assembly_or_workspace_id,service_module_name_x=nil,assembly_template_name=nil,opts={})
55
+ namespace = nil
55
56
  post_body = {
56
57
  :assembly_id => assembly_or_workspace_id,
57
58
  :mode => mode.to_s
58
59
  }
60
+
59
61
  if service_module_name_x
60
62
  service_module_name = service_module_name_x
61
- namespace = nil
62
63
  if service_module_name_x =~ /(^[^:]+):([^:]+$)/
63
64
  namespace,service_module_name = [$1,$2]
64
65
  end
65
66
  post_body.merge!(:service_module_name => service_module_name)
66
- if namespace
67
- post_body.merge!(:namespace => namespace)
68
- end
69
67
  end
68
+
69
+ namespace ||= opts[:default_namespace]
70
+ if namespace
71
+ 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)
73
+ end
74
+
70
75
  post_body.merge!(:assembly_template_name => assembly_template_name) if assembly_template_name
76
+ post_body.merge!(:use_module_namespace => true) if opts[:use_module_namespace]
71
77
  response = post rest_url("assembly/promote_to_template"), post_body
72
- # when changing context send request for getting latest assembly_templates instead of getting from cache
73
- # @@invalidate_map << :assembly_template
74
-
75
78
  return response unless response.ok?()
79
+
76
80
  #synchronize_clone will load new assembly template into service clone on workspace (if it exists)
77
- commit_sha,workspace_branch,namespace = response.data(:commit_sha,:workspace_branch,:module_namespace)
81
+ commit_sha,workspace_branch,namespace,full_module_name = response.data(:commit_sha,:workspace_branch,:module_namespace,:full_module_name)
78
82
  service_module_name ||= response.data(:module_name)
79
83
  opts = {:local_branch=>workspace_branch, :namespace => namespace}
80
- Helper(:git_repo).synchronize_clone(:service_module,service_module_name,commit_sha,opts)
84
+ response = Helper(:git_repo).synchronize_clone(:service_module,service_module_name,commit_sha,opts)
85
+ return response unless response.ok?
86
+
87
+ DTK::Client::OsUtil.print("New assembly template '#{assembly_template_name}' created in service module '#{full_module_name}'.", :yellow) if mode == :create
88
+ response
81
89
  end
82
90
 
83
91
  def list_violations_aux(context_params)
@@ -631,6 +639,15 @@ module DTK::Client
631
639
  return unless Console.confirmation_prompt("Are you sure you want to delete and destroy all nodes in the workspace"+'?')
632
640
  end
633
641
 
642
+ unsaved_modules = check_if_unsaved_changes(assembly_or_workspace_id)
643
+ unless unsaved_modules.empty?
644
+ return unless Console.confirmation_prompt("Purging the workspace will cause unsaved changes in component module(s) '#{unsaved_modules.join(',')}' to be lost. Do you still want to proceed"+'?')
645
+ end
646
+
647
+ # purge local clone
648
+ response = purge_clone_aux(:all,:assembly_module => {:assembly_name => 'workspace'})
649
+ return response unless response.ok?
650
+
634
651
  post_body = {
635
652
  :assembly_id => assembly_or_workspace_id
636
653
  }
@@ -848,7 +865,7 @@ module DTK::Client
848
865
  filtered.reject! do |r|
849
866
  match = r.to_s.include?(filter_pattern)
850
867
  if r["node_id"] && r["node_id"] != node_id
851
- node_id = r["node_id"]
868
+ node_id = (r["node_id"] && r["node_id"].to_s)
852
869
  node_name = r["node_name"]
853
870
  end
854
871
 
@@ -187,7 +187,7 @@ module DTK::Client
187
187
  namespace, local_module_name = get_namespace_and_name(module_name, ModuleUtil::NAMESPACE_SEPERATOR)
188
188
 
189
189
  # Create component module from user's input git repo
190
- response = Helper(:git_repo).create_clone_with_branch(module_type.to_sym, local_module_name, git_repo_url)
190
+ response = Helper(:git_repo).create_clone_with_branch(module_type.to_sym, local_module_name, git_repo_url, nil, nil, namespace)
191
191
 
192
192
  # Raise error if git repository is invalid
193
193
  # raise DtkError,"Git repository URL '#{git_repo_url}' is invalid." unless response.ok?
@@ -22,5 +22,23 @@ module DTK::Client
22
22
  end
23
23
  response
24
24
  end
25
+
26
+ def check_if_unsaved_changes(assembly_or_workspace_id, opts={})
27
+ unsaved_modules = []
28
+ post_body = {
29
+ :assembly_id => assembly_or_workspace_id,
30
+ :subtype => 'instance'
31
+ }
32
+ response = post rest_url("assembly/get_component_modules"), post_body
33
+
34
+ if response.ok?
35
+ response.data.each do |cmp_mod|
36
+ unsaved_modules << "#{cmp_mod['namespace_name']}:#{cmp_mod['display_name']}" if cmp_mod['local_copy_diff']
37
+ end
38
+ end
39
+
40
+ unsaved_modules
41
+ end
42
+
25
43
  end
26
44
  end
@@ -267,7 +267,7 @@ module DTK::Client
267
267
  # we check current options and forwarded options (from deploy method)
268
268
  in_target = options["in-target"] || context_params.get_forwarded_thor_option("in-target")
269
269
  instance_bindings = options["instance-bindings"]
270
- settings = options["settings"]
270
+ settings = parse_service_settings(options["settings"])
271
271
  assembly_list = Assembly.assembly_list()
272
272
 
273
273
  if name
@@ -16,25 +16,7 @@ module DTK::Client
16
16
  def self.validation_list(context_params)
17
17
  get_cached_response(:node_template, "node/list", {:subtype => 'template'})
18
18
  end
19
- =begin
20
- #Not implemented yet
21
- desc "NODE-TEMPLATE-NAME/ID info", "Get information about given node template."
22
- method_option :list, :type => :boolean, :default => false
23
- def info(context_params)
24
- node_template_id = context_params.retrieve_arguments([:node_template_id!],method_argument_names)
25
- data_type = :node
26
19
 
27
- post_body = {
28
- :node_id => node_template_id,
29
- :subtype => 'template'
30
- }
31
- response = post rest_url("node/info"), post_body
32
-
33
- response.render_table(data_type) unless options.list?
34
-
35
- return response
36
- end
37
- =end
38
20
  # desc "list --all -t [TARGET-NAME]", "List all node templates."
39
21
  desc "list", "List all node templates."
40
22
  method_option :all, :type => :boolean, :default => false
@@ -62,6 +44,50 @@ module DTK::Client
62
44
  }
63
45
  post rest_url("node/image_upgrade"), post_body
64
46
  end
47
+
48
+ desc "add-node-template NODE-TEMPLATE-NAME TARGET-NAME/ID --os OS --image-id IMAGE-ID --size SIZE[,SIZE2,..]", "Add new node template"
49
+ method_option "os"
50
+ method_option "image-id",:aliases => "-i"
51
+ method_option "size",:aliases => "-s"
52
+ def add_node_template(context_params)
53
+ node_template_name, target_id = context_params.retrieve_arguments([:option_1!, :option_2!],method_argument_names)
54
+ missing_opts = ['os','image-id'].reject{|k|options.has_key?(k)}
55
+ unless missing_opts.empty?
56
+ pl = (missing_opts.size > 1)
57
+ missing = missing_opts.map{|o|"--#{o}"}.join(',')
58
+ raise DtkError, "[ERROR] The mandatory #{plural?(pl,'option')} (#{missing}) #{plural?(pl,'is/are')} missing"
59
+ end
60
+ size_array = options[:size] && options[:size].split(',')
61
+ post_body = post_body(
62
+ :node_template_name => node_template_name,
63
+ :target_id => target_id,
64
+ :operating_system => options['os'],
65
+ :image_id => options['image-id'],
66
+ :size_array => size_array
67
+ )
68
+ post rest_url("node/add_node_template"), post_body
69
+ end
70
+
71
+ =begin
72
+ #Not implemented yet
73
+ desc "NODE-TEMPLATE-NAME/ID info", "Get information about given node template."
74
+ method_option :list, :type => :boolean, :default => false
75
+ def info(context_params)
76
+ node_template_id = context_params.retrieve_arguments([:node_template_id!],method_argument_names)
77
+ data_type = :node
78
+
79
+ post_body = {
80
+ :node_id => node_template_id,
81
+ :subtype => 'template'
82
+ }
83
+ response = post rest_url("node/info"), post_body
84
+
85
+ response.render_table(data_type) unless options.list?
86
+
87
+ return response
88
+ end
89
+ =end
90
+
65
91
  =begin
66
92
  #TODO: move to form desc "NODE-TEMPLATE-NAME/ID stage [INSTANCE-NAME]"
67
93
  #will then have to reverse arguments
@@ -205,7 +205,13 @@ TODO: overlaps with different meaning
205
205
  desc "SERVICE-NAME/ID create-assembly [NAMESPACE:]SERVICE-MODULE-NAME ASSEMBLY-NAME", "Create a new assembly from this service instance in the designated service module."
206
206
  def create_assembly(context_params)
207
207
  assembly_id, service_module_name, assembly_template_name = context_params.retrieve_arguments([:service_id!,:option_1!,:option_2!],method_argument_names)
208
- response = promote_assembly_aux(:create,assembly_id,service_module_name,assembly_template_name)
208
+
209
+ # need default_namespace for create-assembly because need to check if local service-module directory existst in promote_assembly_aux
210
+ resp = post rest_url("namespace/default_namespace_name")
211
+ return resp unless resp.ok?
212
+ default_namespace = resp.data
213
+
214
+ response = promote_assembly_aux(:create,assembly_id,service_module_name,assembly_template_name,{:default_namespace=>default_namespace})
209
215
  return response unless response.ok?
210
216
 
211
217
  @@invalidate_map << :assembly
@@ -236,7 +242,8 @@ TODO: overlaps with different meaning
236
242
  else
237
243
  [nil,nil]
238
244
  end
239
- response = promote_assembly_aux(:update,assembly_id, service_module_name, assembly_template_name)
245
+
246
+ response = promote_assembly_aux(:update,assembly_id, service_module_name, assembly_template_name,{:use_module_namespace=>true})
240
247
  return response unless response.ok?
241
248
  @@invalidate_map << :assembly
242
249
  Response::Ok.new()
@@ -525,6 +532,11 @@ TODO: will put in dot release and will rename to 'extend'
525
532
  return unless Console.confirmation_prompt("Are you sure you want to delete and destroy service '#{assembly_name}' and its nodes"+'?')
526
533
  end
527
534
 
535
+ unsaved_modules = check_if_unsaved_changes(assembly_id)
536
+ unless unsaved_modules.empty?
537
+ return unless Console.confirmation_prompt("Deleting this service will cause unsaved changes in component module(s) '#{unsaved_modules.join(',')}' to be lost. Do you still want to proceed"+'?')
538
+ end
539
+
528
540
  # purge local clone
529
541
  response = purge_clone_aux(:all,:assembly_module => {:assembly_name => assembly_name})
530
542
  return response unless response.ok?
@@ -198,8 +198,15 @@ module DTK::Client
198
198
  method_option :purge, :aliases => '-p', :type => :boolean, :default => false
199
199
  def create_assembly(context_params)
200
200
  workspace_id, service_module_full_name, assembly_template_name = context_params.retrieve_arguments([:workspace_id!,:option_1!,:option_2!],method_argument_names)
201
- response = promote_assembly_aux(:create,workspace_id,service_module_full_name,assembly_template_name)
201
+
202
+ # need default_namespace for create-assembly because need to check if local service-module directory existst in promote_assembly_aux
203
+ resp = post rest_url("namespace/default_namespace_name")
204
+ return resp unless resp.ok?
205
+ default_namespace = resp.data
206
+
207
+ response = promote_assembly_aux(:create,workspace_id,service_module_full_name,assembly_template_name,{:default_namespace=>default_namespace})
202
208
  return response unless response.ok?
209
+
203
210
  if options.purge?
204
211
  response = purge_aux(context_params)
205
212
  return response unless response.ok?
@@ -425,6 +432,12 @@ module DTK::Client
425
432
  set_attribute_aux(context_params)
426
433
  end
427
434
 
435
+ desc "WORKSPACE-NAME/ID set-required-params", "Interactive dialog to set required params that are not currently set"
436
+ def set_required_params(context_params)
437
+ workspace_id = context_params.retrieve_arguments([:workspace_id!],method_argument_names)
438
+ set_required_params_aux(workspace_id,:assembly,:instance)
439
+ end
440
+
428
441
  # desc "WORKSPACE-NAME/ID start [NODE-ID-PATTERN]", "Starts all workspace's nodes, specific nodes can be selected via node id regex."
429
442
  desc "WORKSPACE-NAME/ID start [NODE-NAME]", "Starts all the workspace nodes. A single node can be selected."
430
443
  def start(context_params)
@@ -1,3 +1,3 @@
1
1
  module DtkClient
2
- VERSION="0.5.18"
2
+ VERSION="0.6.0"
3
3
  end
@@ -414,6 +414,21 @@ module DTK
414
414
  !possible_id.to_s.match(/^[0-9]+$/).nil?
415
415
  end
416
416
 
417
+ # helper for error messages; prints singular or plural version
418
+ # tem will be of form singural/plural or simple term in which case plural formed by adding 's'
419
+ def plural?(is_plural,term)
420
+ singular_plural = term.split('/')
421
+ if singular_plural.size == 1
422
+ singular_plural << "#{singular_plural[0]}s"
423
+ end
424
+ singular_plural[is_plural ? 1 : 0]
425
+ end
426
+
427
+ # removes nil values
428
+ def post_body(hash)
429
+ hash.inject(Hash.new){|h,(k,v)|v.nil? ? h : h.merge(k => v)}
430
+ end
431
+
417
432
  # User input prompt
418
433
  def user_input(message)
419
434
  trap("INT", "SIG_IGN")
@@ -431,10 +446,17 @@ module DTK
431
446
  return about, about[0..-2].to_sym
432
447
  end
433
448
 
434
- # check for delimiter '/', if present returns namespace and name for module/service
449
+ # check for delimiter, if present returns namespace and name for module/service
435
450
  # returns: namespace, name
436
451
  def get_namespace_and_name(input_remote_name, delimiter)
437
- (input_remote_name||'').include?(delimiter) ? input_remote_name.split(delimiter) : [nil, input_remote_name]
452
+ if (input_remote_name||'').include?(delimiter)
453
+ input_remote_name.split(delimiter)
454
+ # support ns/name as well as ns:name
455
+ elsif (input_remote_name||'').include?('/')
456
+ input_remote_name.split('/')
457
+ else
458
+ [nil, input_remote_name]
459
+ end
438
460
  end
439
461
 
440
462
  def get_namespace_and_name_for_component(component_full_name)
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dtk-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.18
4
+ version: 0.6.0
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-09-19 00:00:00.000000000 Z
11
+ date: 2014-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.2.4
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.2.4
27
27
  - !ruby/object:Gem::Dependency
@@ -56,98 +56,98 @@ dependencies:
56
56
  name: mime-types
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1.25'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.25'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: hirb
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: 0.7.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.7.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: thor
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: 0.15.4
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: 0.15.4
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: erubis
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ~>
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
103
  version: 2.7.0
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ~>
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: 2.7.0
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: dtk-common-core
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ~>
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
117
  version: 0.5.10
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ~>
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: 0.5.10
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: git
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ~>
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
131
  version: 1.2.6
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ~>
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: 1.2.6
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: colorize
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ~>
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
145
  version: 0.5.8
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ~>
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: 0.5.8
153
153
  - !ruby/object:Gem::Dependency
@@ -328,17 +328,17 @@ require_paths:
328
328
  - lib
329
329
  required_ruby_version: !ruby/object:Gem::Requirement
330
330
  requirements:
331
- - - ! '>='
331
+ - - ">="
332
332
  - !ruby/object:Gem::Version
333
333
  version: '0'
334
334
  required_rubygems_version: !ruby/object:Gem::Requirement
335
335
  requirements:
336
- - - ! '>='
336
+ - - ">="
337
337
  - !ruby/object:Gem::Version
338
338
  version: '0'
339
339
  requirements: []
340
340
  rubyforge_project:
341
- rubygems_version: 2.2.2
341
+ rubygems_version: 2.4.1
342
342
  signing_key:
343
343
  specification_version: 4
344
344
  summary: DTK CLI client for DTK server interaction.