dtk-client 0.5.18 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,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.