dtk-client 0.11.4 → 0.11.5

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: a4fe37c7f760ab997a0789958481c16a3924f8fc
4
- data.tar.gz: 4329e1f91b5b7542cccbe0d27105e831d7b7f498
3
+ metadata.gz: 5de7ced1e236b8558747c61de9dbb0bd99bdec16
4
+ data.tar.gz: 00233bc8aaaa577b2edfdbf494ba39e332004ada
5
5
  SHA512:
6
- metadata.gz: e7ee7ed59d2b153fa7e4815f006f6a7fc42a1ffcf67b67818a9278a4a44c44c9d08a65f9859f0d56f14e7066285f0a49f96677ea916d2f9c12907faae5208372
7
- data.tar.gz: e09ab967d418e7445f6d584682f2059d8a07f06b5e1fde7a09a4541d4bb353c5e5b7b2410cb4efc9066238695b0c81c6528aedb5709673b526f08d5c553084bc
6
+ metadata.gz: 4fb0de210ec0f760c6c36fdea20b740ad197d4d546b36ce66b8d740e523d9b144b22d27fc242805fb11bb8f873fdd323d97e1472d3c69fd9e009db9c25a4ceee
7
+ data.tar.gz: f710986718de80dba1c001cb7e7429dc84ee3c7634e45c9ab57424088ff25cee77e4194c6717651285771d6855b831a7bbab570c13490a524ca925bd541d7f2c
@@ -23,13 +23,14 @@ module DTK::Client
23
23
  command_body c, 'delete-from-dtkn', 'Delete module from the DTK remote catalog (DTKN)' do |sc|
24
24
  sc.flag Token.version
25
25
  sc.switch Token.skip_prompt
26
+ sc.switch Token.force, :desc => 'Force delete'
26
27
 
27
28
  sc.action do |_global_options, options, args|
28
29
  module_ref = module_ref_object_from_options_or_context?(:module_ref => args[0], :version => options[:version])
29
30
  operation_args = {
30
31
  :module_ref => module_ref,
31
- :skip_prompt => options[:skip_prompt]
32
- # :force => options[:f]
32
+ :skip_prompt => options[:skip_prompt],
33
+ :force => options[:f]
33
34
  }
34
35
  Operation::Module.delete_from_remote(operation_args)
35
36
  end
@@ -23,33 +23,30 @@ module DTK::Client
23
23
  command_body c, :stage, 'Create a new service instance to refer to staged infrastructure that then can be deployed' do |sc|
24
24
  sc.flag Token.directory_path, :desc => 'Path to module directory where assembly is being staged from; not needed if in the module directory'
25
25
  sc.flag Token.service_name, :desc => 'If specified, name to use for new service instance; otherwise service instance name is auto-generated'
26
- sc.flag Token.context_service_instance
26
+ sc.flag Token.comma_seperated_contexts
27
27
  sc.switch Token.force
28
28
  sc.switch Token.base
29
- #sc.switch Token.target
30
- # on useful for testing in dev mode
31
- # sc.switch Token.purge, :desc => 'Overwrite any content that presently exists in the service instance directory to be created'
32
- # sc.flag Token.version
33
29
  sc.action do |_global_options, options, args|
34
- module_ref = module_ref_object_from_options_or_context(options)
35
- assembly_name = args[0]
36
- version = options[:version] || module_ref.version
37
- service_name = options[:service_name]
38
- force = options[:f]
39
- directory_path = options[:directory_path] || @base_dsl_file_obj.parent_dir
30
+ module_ref = module_ref_object_from_options_or_context(options)
31
+ assembly_name = args[0]
32
+ service_name = options[:service_name]
33
+ version = options[:version] || module_ref.version
34
+ directory_path = options[:directory_path] || @base_dsl_file_obj.parent_dir
35
+ comma_seperated_contexts = options[:context]
40
36
 
37
+ context_service_names = comma_seperated_contexts && Validation.process_comma_seperated_contexts(comma_seperated_contexts)
41
38
  Validation.validate_name(service_name) if service_name
42
39
 
43
40
  args = {
44
- :module_ref => module_ref,
45
- :assembly_name => assembly_name,
46
- :service_name => service_name,
47
- :version => version,
48
- :context_service => options[:context_service_instance],
49
- :remove_existing => options[:purge],
50
- :is_target => options[:base],
51
- :force => force,
52
- :directory_path => directory_path
41
+ :module_ref => module_ref,
42
+ :assembly_name => assembly_name,
43
+ :service_name => service_name,
44
+ :version => version,
45
+ :context_service_names => context_service_names,
46
+ :remove_existing => options[:purge],
47
+ :is_base => options[:base],
48
+ :force => options[:f],
49
+ :directory_path => directory_path
53
50
  }
54
51
  Operation::Module.stage(args)
55
52
  end
@@ -57,4 +54,4 @@ module DTK::Client
57
54
  end
58
55
  end
59
56
  end
60
- end
57
+ end
@@ -25,8 +25,10 @@ module DTK::Client
25
25
  sc.flag Token.directory_path
26
26
  sc.flag Token.version
27
27
  sc.flag Token.uninstall_name
28
+ sc.switch Token.force
28
29
  sc.action do |_global_options, options, args|
29
30
  version = options[:version]
31
+ force = options["force"]
30
32
 
31
33
  module_refs_opts = {:ignore_parsing_errors => true}
32
34
  if options[:uninstall_name].nil?
@@ -42,7 +44,7 @@ module DTK::Client
42
44
 
43
45
  raise Error::Usage, "You can use version only with 'namespace/name' provided" if version && module_name.nil?
44
46
 
45
- Operation::Module.uninstall(:module_ref => module_ref, :skip_prompt => options[:skip_prompt], :name => options[:uninstall_name] || module_name, :version => version)
47
+ Operation::Module.uninstall(:module_ref => module_ref, :force => force, :skip_prompt => options[:skip_prompt], :name => options[:uninstall_name] || module_name, :version => version)
46
48
  end
47
49
  end
48
50
  end
@@ -22,19 +22,19 @@ module DTK::Client
22
22
  include Command::Mixin
23
23
 
24
24
  ALL_SUBCOMMANDS = [
25
+ 'delete-from-remote',
25
26
  'install',
26
27
  'list',
27
28
  'list-assemblies',
28
- 'push',
29
- 'uninstall',
30
- # 'clone',
31
29
  'list-remotes',
30
+ 'publish',
31
+ 'pull-dtkn',
32
+ 'push',
32
33
  'push-dtkn',
33
34
  'stage',
34
- 'pull-dtkn',
35
- 'publish',
36
- 'delete-from-remote'
35
+ 'uninstall'
37
36
  ]
37
+
38
38
  command_def :desc => 'Subcommands for interacting with DTK modules'
39
39
  ALL_SUBCOMMANDS.each { |subcommand| require_relative("module/#{subcommand.gsub(/-/,'_')}") }
40
40
  end
@@ -23,34 +23,37 @@ module DTK::Client
23
23
 
24
24
  include Command::Mixin
25
25
  ALL_SUBCOMMANDS = [
26
+ 'cancel-task',
26
27
  'clone',
28
+ 'converge',
27
29
  'delete',
28
- 'uninstall',
29
30
  'edit',
30
- 'push',
31
- 'pull',
32
- 'converge',
33
- 'task-status',
31
+ 'eject',
32
+ 'exec',
33
+ 'exec-sync',
34
+ 'link',
34
35
  'list',
35
36
  'list-actions',
36
37
  'list-attributes',
37
38
  'list-component-links',
38
- 'list-dependencies',
39
39
  'list-components',
40
+ 'list-dependencies',
40
41
  'list-nodes',
41
42
  'list-violations',
42
- 'link',
43
- # 'start',
44
- # 'stop',
45
- 'cancel-task',
46
- 'ssh',
47
- 'set-required-attributes',
43
+ 'pull',
44
+ 'push',
48
45
  'set-attribute',
49
- 'exec',
50
- 'exec-sync',
51
46
  'set-default-target',
52
- 'eject'
53
- ]
47
+ 'set-required-attributes',
48
+ 'ssh',
49
+ # TODO: put back in
50
+ # 'start',
51
+ # 'stop',
52
+
53
+ 'task-status',
54
+ 'uninstall'
55
+ ]
56
+
54
57
  command_def :desc => 'Subcommands for creating and interacting with DTK service instances'
55
58
  ALL_SUBCOMMANDS.each { |subcommand| require_relative("service/#{subcommand.gsub(/-/,'_')}") }
56
59
  end
@@ -32,25 +32,24 @@ module DTK::Client
32
32
  TOKENS = {
33
33
  # flags
34
34
  # Flag constructor args order: key, arg_name, desc, opts={}
35
- :commit_message => Flag.new(:m, 'COMMIT-MSG', 'Commit message'),
36
- :directory_path => Flag.new(:d, 'DIRECTORY-PATH', 'Directory path'),
37
- :parent_service_instance => Flag.new(:parent, 'PARENT', 'Parent service instance; if not specified, the default context service instance serves as parent'),
38
- :context_service_instance => Flag.new(:context, 'CONTEXT' ,'Context service instance; if not specified, the default service instance serves as context'),
39
- :module_ref => Flag.new(:m, ModuleRef::NamespaceModuleName.legal_form, 'Module name with namespace; not needed if command is executed from within the module directory'),
40
- :relative_path => Flag.new(:f, 'RELATIVE-FILE-PATH', 'Relative file path'),
41
- :service_instance => Flag.new(:s, 'SERVICE-INSTANCE', 'Service instance name'),
42
- :service_name => Flag.new(:n, 'SERVICE-NAME', 'Service name'),
43
- :version => Flag.new(:v, 'VERSION', 'Version'),
44
- :type => Flag.new(:type, 'TYPE', 'Type'),
45
- :node => Flag.new(:n, 'NODE', 'Node'),
46
- :component => Flag.new(:c, 'COMPONENT', 'Component'),
47
- :remote_user => Flag.new(:u, 'REMOTE-USER', 'Remote user'),
48
- :identity_file => Flag.new(:i, 'PATH-TO-PEM', 'Path to pem file'),
49
- :mode => Flag.new(:mode, 'MODE', 'Mode'),
50
- :namespace => Flag.new(:n, 'NAMESPACE', 'Namespace'),
51
- :uninstall_name => Flag.new(:name, 'NAME', 'Module name to uninstall'),
52
- :link_name => Flag.new([:l, :link_name], 'link-name', 'Specify link name'),
53
- :format => Flag.new(:format, 'FORMAT', 'Choose in which format to display data (ex. TABLE, YAML)'),
35
+ :commit_message => Flag.new(:m, 'COMMIT-MSG', 'Commit message'),
36
+ :directory_path => Flag.new(:d, 'DIRECTORY-PATH', 'Directory path'),
37
+ :comma_seperated_contexts => Flag.new(:context, 'CONTEXT1,CONTEXT2,...' ,'Comma-seperated context service instance(s); if not specified, the default service instance serves as the context'),
38
+ :module_ref => Flag.new(:m, ModuleRef::NamespaceModuleName.legal_form, 'Module name with namespace; not needed if command is executed from within the module directory'),
39
+ :relative_path => Flag.new(:f, 'RELATIVE-FILE-PATH', 'Relative file path'),
40
+ :service_instance => Flag.new(:s, 'SERVICE-INSTANCE', 'Service instance name'),
41
+ :service_name => Flag.new(:n, 'SERVICE-NAME', 'Service name'),
42
+ :version => Flag.new(:v, 'VERSION', 'Version'),
43
+ :type => Flag.new(:type, 'TYPE', 'Type'),
44
+ :node => Flag.new(:n, 'NODE', 'Node'),
45
+ :component => Flag.new(:c, 'COMPONENT', 'Component'),
46
+ :remote_user => Flag.new(:u, 'REMOTE-USER', 'Remote user'),
47
+ :identity_file => Flag.new(:i, 'PATH-TO-PEM', 'Path to pem file'),
48
+ :mode => Flag.new(:mode, 'MODE', 'Mode'),
49
+ :namespace => Flag.new(:n, 'NAMESPACE', 'Namespace'),
50
+ :uninstall_name => Flag.new(:name, 'NAME', 'Module name to uninstall'),
51
+ :link_name => Flag.new([:l, :link_name], 'link-name', 'Specify link name'),
52
+ :format => Flag.new(:format, 'FORMAT', 'Choose in which format to display data (ex. TABLE, YAML)'),
54
53
 
55
54
  # switches
56
55
  # Switch constructor args order: key, desc, opts={}
data/lib/cli/version.rb CHANGED
@@ -18,7 +18,7 @@
18
18
  module DTK
19
19
  module Client
20
20
  module CLI
21
- VERSION="0.11.4"
21
+ VERSION="0.11.5"
22
22
  end
23
23
  end
24
24
  end
@@ -37,8 +37,8 @@ module DTK::Client
37
37
  query_string_hash = QueryStringHash.new(
38
38
  :module_name => module_ref.module_name,
39
39
  :namespace => module_ref.namespace,
40
- :rsa_pub_key => SSHUtil.rsa_pub_key_content
41
- # :force? => opts[:force]
40
+ :rsa_pub_key => SSHUtil.rsa_pub_key_content,
41
+ :force? => opts[:force]
42
42
  )
43
43
 
44
44
  unless version = module_ref.version
@@ -67,7 +67,6 @@ module DTK::Client
67
67
  module_ref_opts.merge!(:version => version) unless version.eql?('all')
68
68
  return unless Console.prompt_yes_no("Are you sure you want to delete module '#{DTK::Common::PrettyPrintForm.module_ref(module_ref.module_name, module_ref_opts)}' from repo manager?", :add_options => true)
69
69
  end
70
-
71
70
  rest_post "#{BaseRoute}/delete_from_remote", query_string_hash
72
71
 
73
72
  nil
@@ -27,12 +27,12 @@ module DTK::Client
27
27
  directory_path = args[:directory_path]
28
28
 
29
29
  post_body = PostBody.new(
30
- :namespace => module_ref.namespace,
31
- :module_name => module_ref.module_name,
32
- :assembly_name? => args.required(:assembly_name),
33
- :version? => args[:version],
34
- :target_service? => args[:context_service],
35
- :is_target? => args[:is_target]
30
+ :namespace => module_ref.namespace,
31
+ :module_name => module_ref.module_name,
32
+ :assembly_name? => args.required(:assembly_name),
33
+ :version? => args[:version],
34
+ :context_service_names? => args[:context_service_names],
35
+ :is_base? => args[:is_base]
36
36
  )
37
37
 
38
38
  error_msg = "To allow stage to go through, invoke 'dtk push' to push the changes to server before invoking stage again"
@@ -23,6 +23,7 @@ module DTK::Client
23
23
  module_ref = args.required(:module_ref)
24
24
  name = args.required(:name)
25
25
  version = args.required(:version)
26
+ force = args.required(:force)
26
27
 
27
28
  unless name.nil?
28
29
  query_string_hash = QueryStringHash.new(
@@ -46,8 +47,8 @@ module DTK::Client
46
47
  end
47
48
 
48
49
  end
49
-
50
50
  post_body = module_ref_post_body(module_ref)
51
+ post_body.merge!(:force => force)
51
52
  rest_post("#{BaseRoute}/delete", post_body)
52
53
 
53
54
  error_msg =
@@ -19,19 +19,19 @@ module DTK::Client
19
19
  class Operation
20
20
  class Module < self
21
21
  OPERATIONS = [
22
+ :clone_module,
23
+ :delete_from_remote,
22
24
  :install,
25
+ :install_from_catalog,
23
26
  :list,
24
27
  :list_assemblies,
25
28
  :list_remotes,
29
+ :publish,
30
+ :pull_dtkn,
26
31
  :push,
27
- :uninstall,
28
- :clone_module,
29
- :install_from_catalog,
30
32
  :push_dtkn,
31
33
  :stage,
32
- :pull_dtkn,
33
- :publish,
34
- :delete_from_remote
34
+ :uninstall
35
35
  ]
36
36
  OPERATIONS.each { |operation| require_relative("module/#{operation}") }
37
37
 
@@ -31,6 +31,7 @@ module DTK::Client; class Operation::Service::TaskStatus::StreamMode::Element::H
31
31
  render_empty_line
32
32
  results_per_node.each { |result| result.render }
33
33
  else
34
+ render_info(results_per_node)
34
35
  render_errors(results_per_node)
35
36
  end
36
37
  end
@@ -20,6 +20,7 @@ module DTK::Client; class Operation::Service::TaskStatus::StreamMode::Element::H
20
20
  class Components < self
21
21
  def render_results(results_per_node)
22
22
  render_errors(results_per_node)
23
+ render_info(results_per_node)
23
24
  end
24
25
  end
25
26
  end
@@ -25,6 +25,7 @@ module DTK::Client; class Operation::Service::TaskStatus::StreamMode::Element
25
25
  def initialize(element, hash)
26
26
  super
27
27
  @errors = hash['errors'] || []
28
+ @info = hash['info'] || []
28
29
  end
29
30
 
30
31
  # This can be over-written
@@ -42,6 +43,7 @@ module DTK::Client; class Operation::Service::TaskStatus::StreamMode::Element
42
43
  protected
43
44
 
44
45
  attr_reader :errors
46
+ attr_reader :info
45
47
 
46
48
  def render_errors(results_per_node)
47
49
  return unless results_per_node.find { |result| not result.errors.empty?}
@@ -55,12 +57,38 @@ module DTK::Client; class Operation::Service::TaskStatus::StreamMode::Element
55
57
  end
56
58
  end
57
59
 
60
+ def render_info(results_per_node)
61
+ return unless results_per_node.find do |result|
62
+ not result.info.empty? and result.errors.empty?
63
+ end
64
+ # { |result| not result.errors.empty?}
65
+ first_time = true
66
+ results_per_node.each do |result|
67
+ if first_time
68
+ render_line 'INFO:'
69
+ first_time = false
70
+ end
71
+ result.render_node_info
72
+ end
73
+ end
74
+
58
75
  def render_node_errors
59
76
  return if @errors.empty?
60
77
  render_node_term
61
78
  @errors.each do |error|
62
79
  if err_msg = error['message']
63
- render_error_line err_msg
80
+ render_error_line err_msg
81
+ render_empty_line
82
+ end
83
+ end
84
+ end
85
+
86
+ def render_node_info
87
+ return if @info.empty? || !@errors.empty?
88
+ @info.each do |info|
89
+ if err_msg = info[1]
90
+ #err_msg.colorize(:yellow)
91
+ render_info_line err_msg
64
92
  render_empty_line
65
93
  end
66
94
  end
@@ -69,6 +97,10 @@ module DTK::Client; class Operation::Service::TaskStatus::StreamMode::Element
69
97
  def render_error_line(line, opts = {})
70
98
  render_line(line, ErrorRenderOpts.merge(opts))
71
99
  end
100
+
101
+ def render_info_line(line, opts = {})
102
+ render_line(line)
103
+ end
72
104
  ErrorRenderOpts = { :tabs => 1}
73
105
 
74
106
  end
@@ -32,6 +32,14 @@ class DTK::Client::Operation::Service::TaskStatus::StreamMode::Element
32
32
  @formatter.formatted_duration?(field?(:duration))
33
33
  end
34
34
 
35
+ def current_status
36
+ if @response_element["status"] == 'debugging' && @response_element["type"].include?("stage_end")
37
+ return true
38
+ else
39
+ return false
40
+ end
41
+ end
42
+
35
43
  def render_duration_line
36
44
  render_line(@formatter.duration_msg?(field?(:duration)))
37
45
  end
@@ -31,8 +31,7 @@ module DTK::Client; class Operation::Service::TaskStatus::StreamMode
31
31
  def self.get_and_render_stages(task_status_handle, opts = {})
32
32
  unless wait = opts[:wait]
33
33
  raise Error, "opts[:wait] must be set"
34
- end
35
-
34
+ end
36
35
  cursor = Cursor.new
37
36
  until cursor.task_end? do
38
37
  elements = get_single_stage(task_status_handle, cursor.stage, {:wait_for => cursor.wait_for}.merge(opts))
@@ -41,10 +40,15 @@ module DTK::Client; class Operation::Service::TaskStatus::StreamMode
41
40
  next
42
41
  end
43
42
  render_elements(elements)
44
- cursor.advance!(task_end?(elements))
43
+ # Can there be more than 1 element in elements array?
44
+ if elements.first.current_status
45
+ cursor.advance!(true)
46
+ else
47
+ cursor.advance!(task_end?(elements))
48
+ end
45
49
  end
46
50
  end
47
-
51
+
48
52
  class Cursor
49
53
  def initialize
50
54
  @stage = 1
@@ -55,7 +55,7 @@ module DTK::Client; class Operation::Service::TaskStatus::StreamMode
55
55
  # opts can have
56
56
  # :ignore_stage_level_info - Boolean
57
57
  def self.create_elements(response, opts = {})
58
- response_elements = response.data
58
+ response_elements = response.data
59
59
  unless response_elements.kind_of?(Array)
60
60
  raise Error.new("Unexpected that response.data no at array")
61
61
  end
@@ -82,8 +82,31 @@ module DTK::Client; class Operation::Service::TaskStatus::StreamMode
82
82
  elements.find{|el|el.kind_of?(NoResults)}
83
83
  end
84
84
 
85
+ def self.debug_mode?(response)
86
+ debug_mode_rows(response).size > 0
87
+ end
88
+
89
+ def self.debug_mode_rows(response)
90
+ response['data'].select do |data_row|
91
+ data_row['status'] == 'debugging'
92
+ end
93
+ #{ |data_row| data_row['status'] == 'debugging' }
94
+ end
95
+
96
+ def self.add_info_if_debug_mode!(response)
97
+ debug_info_rows = debug_mode_rows(response).select { |row| (row['info'] || {}) }
98
+ if debug_info_rows.size > 0
99
+ info_message = debug_info_rows.last['info']['message']
100
+ #response.set_render_as_table!(nil, info_message)
101
+ else
102
+ #response.set_render_as_table!
103
+ end
104
+ end
105
+
85
106
  def self.render_elements(elements)
86
- elements.each{ |el| el.render }
107
+ elements.each do |el| #{ |el| el.render }
108
+ el.render
109
+ end
87
110
  end
88
111
 
89
112
  def render_stage_steps(subtasks)
@@ -18,34 +18,35 @@
18
18
  module DTK::Client
19
19
  class Operation
20
20
  class Service < self
21
+ # TODO: remove deprecated operations
21
22
  OPERATIONS = [
22
- :commit_and_push,
23
+ :cancel_task,
23
24
  :clone_service,
25
+ :commit_and_push,
26
+ :converge,
27
+ # :create_workspace TODO: put this back in
24
28
  :delete,
25
- :uninstall,
26
29
  :edit,
27
- :pull,
28
- :converge,
29
- :task_status,
30
+ :eject,
31
+ :exec,
32
+ :link,
30
33
  :list,
31
34
  :list_actions,
32
35
  :list_attributes,
33
36
  :list_component_links,
34
- :list_dependencies,
35
37
  :list_components,
38
+ :list_dependencies,
36
39
  :list_nodes,
37
40
  :list_violations,
38
- :link,
39
- :start,
40
- :stop,
41
- :cancel_task,
42
- :ssh,
43
- :set_required_attributes,
41
+ :pull,
44
42
  :set_attribute,
45
- :exec,
46
43
  :set_default_target,
47
- :eject
48
- # :create_workspace
44
+ :set_required_attributes,
45
+ :ssh,
46
+ :start,
47
+ :stop,
48
+ :task_status,
49
+ :uninstall
49
50
  ]
50
51
  OPERATIONS.each { |operation| require_relative("service/#{operation}") }
51
52
 
@@ -17,12 +17,31 @@
17
17
  #
18
18
  module DTK::Client
19
19
  module Validation
20
- ValidNameCharacters = ['letters', 'numbers', '-', '_', '.']
21
-
22
20
  def self.validate_name(name)
23
- unless name.to_s.match(/\A[\w\-\.]+\z/)
24
- raise Error::Usage, "Name '#{name}' contains invalid characters! Valid characters are: '#{ValidNameCharacters.join("', '")}'."
21
+ raise Error::Usage, "Name '#{name}' contains invalid characters! Valid characters are: #{valid_characters}" unless valid_name?(name)
22
+ name
23
+ end
24
+
25
+ def self.process_comma_seperated_contexts(comma_seperated_contexts)
26
+ if comma_seperated_contexts
27
+ comma_seperated_contexts.split(',').map do |service_instance_name|
28
+ service_instance_name.gsub!(' ', '')
29
+ raise Error::Usage, "Name '#{name}' in context contains invalid characters! Valid characters are: #{valid_characters}" unless valid_name?(service_instance_name)
30
+ service_instance_name
31
+ end.reject(&:empty?)
25
32
  end
26
33
  end
34
+
35
+ private
36
+
37
+ def self.valid_name?(name)
38
+ name.to_s.match(/\A[\w\-\.]+\z/)
39
+ end
40
+
41
+ VALID_NAME_CHARACTERS = ['letters', 'numbers', '-', '_', '.']
42
+ def self.valid_characters
43
+ VALID_NAME_CHARACTERS.join("', '")
44
+ end
45
+
27
46
  end
28
47
  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.11.4
4
+ version: 0.11.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reactor8
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-05 00:00:00.000000000 Z
11
+ date: 2017-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dtk-common-core
@@ -197,7 +197,6 @@ files:
197
197
  - lib/cli/command/service/set_default_target.rb
198
198
  - lib/cli/command/service/set_required_attributes.rb
199
199
  - lib/cli/command/service/ssh.rb
200
- - lib/cli/command/service/stage.rb
201
200
  - lib/cli/command/service/start.rb
202
201
  - lib/cli/command/service/stop.rb
203
202
  - lib/cli/command/service/task_status.rb
@@ -307,7 +306,6 @@ files:
307
306
  - lib/client/operation/service/set_default_target.rb
308
307
  - lib/client/operation/service/set_required_attributes.rb
309
308
  - lib/client/operation/service/ssh.rb
310
- - lib/client/operation/service/stage.rb
311
309
  - lib/client/operation/service/start.rb
312
310
  - lib/client/operation/service/stop.rb
313
311
  - lib/client/operation/service/task_status.rb
@@ -1,59 +0,0 @@
1
- #
2
- # Copyright (C) 2010-2016 dtk contributors
3
- #
4
- # This file is part of the dtk project.
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
- module DTK::Client
19
- module CLI::Command
20
- module Service
21
- subcommand_def 'stage' do |c|
22
- c.arg Token::Arg.assembly_name, :optional => true
23
- command_body c, :stage, 'Create a new service instance to refer to staged infrastructure that then can be deployed' do |sc|
24
- sc.flag Token.directory_path, :desc => 'Path to module directory where assembly is being staged from; not needed if in the module directory'
25
- sc.flag Token.service_name, :desc => 'If specified, name to use for new service instance; otherwise service instance name is auto-generated'
26
- sc.flag Token.parent_service_instance
27
- sc.switch Token.force
28
- sc.switch Token.target
29
- # on useful for testing in dev mode
30
- # sc.switch Token.purge, :desc => 'Overwrite any content that presently exists in the service instance directory to be created'
31
- # sc.flag Token.version
32
- sc.action do |_global_options, options, args|
33
- module_ref = module_ref_object_from_options_or_context(options)
34
- assembly_name = args[0]
35
- version = options[:version] || module_ref.version
36
- service_name = options[:service_name]
37
- force = options[:f]
38
- directory_path = options[:directory_path]
39
-
40
- Validation.validate_name(service_name) if service_name
41
-
42
- args = {
43
- :module_ref => module_ref,
44
- :assembly_name => assembly_name,
45
- :service_name => service_name,
46
- :version => version,
47
- :target_service => options[:parent_service_instance],
48
- :remove_existing => options[:purge],
49
- :is_target => options[:target],
50
- :force => force,
51
- :directory_path => directory_path
52
- }
53
- Operation::Service.stage(args)
54
- end
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,64 +0,0 @@
1
- #
2
- # Copyright (C) 2010-2016 dtk contributors
3
- #
4
- # This file is part of the dtk project.
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
- module DTK::Client
19
- class Operation::Service
20
- class Stage < self
21
- def self.execute(args = Args.new)
22
- wrap_operation(args) do |args|
23
- module_ref = args.required(:module_ref)
24
- remove_existing = args[:remove_existing]
25
- service_name = args[:service_name]
26
- force = args[:force]
27
- directory_path = args[:directory_path]
28
-
29
- post_body = PostBody.new(
30
- :namespace => module_ref.namespace,
31
- :module_name => module_ref.module_name,
32
- :assembly_name? => args.required(:assembly_name),
33
- :version? => args[:version],
34
- :target_service? => args[:target_service],
35
- :is_target? => args[:is_target]
36
- )
37
-
38
- GitRepo.modified?(directory_path || OsUtil.current_dir) unless force
39
- service_name ||= rest_post("#{BaseRoute}/generate_service_name", post_body).data
40
- base_path = ClientModuleDir.ret_base_path(:service, service_name)
41
-
42
- raise Error::Usage, "Directory '#{base_path}' is not empty; it must be deleted or moved before retrying the command" if ClientModuleDir.local_dir_exists?(:service, service_name)
43
-
44
- post_body.merge!(:service_name => service_name)
45
- response = rest_post("#{BaseRoute}/create", post_body)
46
-
47
- service_instance = response.required(:service, :name)
48
-
49
- clone_args = {
50
- :module_ref => module_ref,
51
- :repo_url => response.required(:repo, :url),
52
- :branch => response.required(:branch, :name),
53
- :service_instance => service_instance,
54
- :remove_existing => remove_existing
55
- }
56
- message = ClientModuleDir::GitRepo.clone_service_repo(clone_args)
57
- target_dir = message.data(:target_repo_dir)
58
-
59
- OsUtil.print_info("Service instance '#{service_instance}' has been created. In order to work with service instance, please navigate to: #{target_dir}")
60
- end
61
- end
62
- end
63
- end
64
- end