dtk-client 0.7.6 → 0.7.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/bin/dtk-shell +1 -1
- data/dtk-client.gemspec +1 -1
- data/lib/command_helpers/git_repo/merge.rb +30 -33
- data/lib/command_helpers/service_importer.rb +12 -8
- data/lib/commands/common/thor/assembly_workspace.rb +1 -0
- data/lib/commands/common/thor/clone.rb +1 -1
- data/lib/commands/common/thor/module.rb +2 -1
- data/lib/commands/common/thor/node.rb +36 -0
- data/lib/commands/common/thor/pull_from_remote.rb +0 -3
- data/lib/commands/common/thor/push_clone_changes.rb +38 -15
- data/lib/commands/thor/assembly.rb +11 -6
- data/lib/commands/thor/component_module.rb +11 -14
- data/lib/commands/thor/node.rb +29 -34
- data/lib/commands/thor/service_module.rb +3 -2
- data/lib/commands/thor/test_module.rb +3 -1
- data/lib/dtk-client/version.rb +1 -1
- data/lib/view_processor/table_print.rb +1 -1
- metadata +18 -17
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
M2QzNTFhNjlhMWNlN2YwMmM5NGMwYzY5YTViMjQ4Y2ZkYmIwNmZjOA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZWIyZTI1NjYzYTY3MTU3NjU2MTZhY2I5YTU1N2I3NmI4OTE5OWI4ZA==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ODRlMzA2ZmQxMWE3NjQxMjEwN2U5YzNjOTlhYTYxNzhhMzI3MzFlZDFhOWYz
|
10
|
+
NDg1ZDRjMzNlYWMwZDY0YWYyMGU5ZjBlN2Y0NjFlYWY1Y2JkYmM0M2JhZGVi
|
11
|
+
Y2E0MzlkM2VkYzMwOGVlMjM4YWY3NTYxZDdhOTVhZDE3MDllNzI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
M2E5YzEwMTFiMDI5ODdhYjQ0MTllNDg2YmJmMDM0MmMxM2JlYmI1NjA2MTc0
|
14
|
+
ZDRkN2M5ZGQzNzNlYzA2MjFlYTJiNGE3M2VkNGE0YmVjMGFhMDVjNTM5Y2Iw
|
15
|
+
MTYzNzcxNjdhOGNhYmVlZTAyYzRmYTViMmI2YmUwM2FiNDdlMDI=
|
data/bin/dtk-shell
CHANGED
@@ -11,4 +11,4 @@ config_exists = ::DTK::Client::Configurator.check_config_exists
|
|
11
11
|
# check if .add_direct_access file exists, if not then add direct access and create .add_direct_access file
|
12
12
|
resolve_direct_access(::DTK::Client::Configurator.check_direct_access, config_exists)
|
13
13
|
|
14
|
-
run_shell_command()
|
14
|
+
run_shell_command()
|
data/dtk-client.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
21
21
|
gem.name = "dtk-client"
|
22
22
|
gem.require_paths = ["lib"]
|
23
|
-
gem.version =
|
23
|
+
gem.version = DtkClient::VERSION
|
24
24
|
|
25
25
|
gem.add_dependency 'mime-types','~> 1.25'
|
26
26
|
gem.add_dependency 'bundler','>= 1.2.4'
|
@@ -1,22 +1,24 @@
|
|
1
1
|
module DTK; module Client; class CommandHelper
|
2
2
|
class GitRepo
|
3
3
|
class Merge
|
4
|
+
|
4
5
|
def initialize(repo, remote_branch_ref, opts = {})
|
5
|
-
@repo
|
6
|
+
@repo = repo
|
6
7
|
@remote_branch_ref = remote_branch_ref
|
7
|
-
@local_branch
|
8
|
+
@local_branch = repo.local_branch_name
|
9
|
+
|
8
10
|
# options
|
9
11
|
@opts_commit_sha = opts[:commit_sha]
|
10
12
|
@opts_force = opts[:force]
|
11
|
-
@opts_merge_if_no_conflict = opts[:merge_if_no_conflict]
|
12
13
|
@opts_ignore_dependency_merge_conflict = opts[:ignore_dependency_merge_conflict]
|
13
14
|
@opts_full_module_name = opts[:full_module_name]
|
15
|
+
@opts_command = opts[:command]
|
14
16
|
end
|
15
17
|
|
16
18
|
def self.merge(repo, remote_branch_ref, opts = {})
|
17
19
|
new(repo, remote_branch_ref, opts).merge
|
18
20
|
end
|
19
|
-
|
21
|
+
|
20
22
|
def merge
|
21
23
|
if @opts_force
|
22
24
|
merge_force()
|
@@ -24,18 +26,18 @@ module DTK; module Client; class CommandHelper
|
|
24
26
|
# check if merge needed
|
25
27
|
merge_rel = merge_relationship()
|
26
28
|
case merge_rel
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
29
|
+
when :equal
|
30
|
+
response__no_diffs()
|
31
|
+
when :local_ahead, :branchpoint
|
32
|
+
merge_not_fast_forward(merge_rel)
|
33
|
+
when :local_behind
|
34
|
+
merge_simple()
|
35
|
+
else
|
36
|
+
raise Error.new("Unexpected merge_rel (#{merge_rel})")
|
35
37
|
end
|
36
38
|
end
|
37
39
|
end
|
38
|
-
|
40
|
+
|
39
41
|
private
|
40
42
|
|
41
43
|
def merge_force
|
@@ -46,31 +48,25 @@ module DTK; module Client; class CommandHelper
|
|
46
48
|
end
|
47
49
|
|
48
50
|
def merge_not_fast_forward(merge_rel)
|
49
|
-
if
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
if any_conflicts?
|
52
|
+
# @opts_ignore_dependency_merge_conflict means called indirectly
|
53
|
+
if @opts_ignore_dependency_merge_conflict
|
54
|
+
# TODO: hard-wired that dependency is a component module in message: 'component-module/..
|
55
|
+
custom_message = "Unable to do fast-forward merge. You can go to 'component-module/#{@opts_full_module_name}' and pull with --force option but all local changes will be lost."
|
56
|
+
response(compute_diffs, :custom_message => custom_message)
|
55
57
|
else
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
58
|
+
err_msg = 'Unable to do fast-forward merge. You can use --force'
|
59
|
+
err_msg << " on #{@opts_command}" if @opts_command
|
60
|
+
err_msg << ', but all local changes will be lost on target that is being pushed to.'
|
61
|
+
raise ErrorUsage.new(err_msg)
|
61
62
|
end
|
62
|
-
elsif
|
63
|
-
|
64
|
-
elsif @opts_ignore_dependency_merge_conflict
|
65
|
-
custom_message = "Unable to do fast-forward merge. You can go to '#{@opts_full_module_name}' and pull with --force option but all changes will be lost."
|
66
|
-
# TODO: should this instead by ErrorUsage.new like below
|
67
|
-
response(:custom_message => :custom_message)
|
63
|
+
elsif merge_rel == :local_ahead
|
64
|
+
response__no_diffs(:custom_message => 'No op because local module is ahead')
|
68
65
|
else
|
69
|
-
|
70
|
-
raise ErrorUsage.new('Unable to do fast-forward merge. You can use --force on pull-dtkn, but all local changes will be lost.')
|
66
|
+
merge_simple()
|
71
67
|
end
|
72
68
|
end
|
73
|
-
|
69
|
+
|
74
70
|
def merge_simple
|
75
71
|
# see if any diffs between fetched remote and local branch
|
76
72
|
# this has be done after commit
|
@@ -134,6 +130,7 @@ module DTK; module Client; class CommandHelper
|
|
134
130
|
nil
|
135
131
|
end
|
136
132
|
end
|
133
|
+
|
137
134
|
end
|
138
135
|
end
|
139
136
|
end; end; end
|
@@ -7,12 +7,16 @@ module DTK::Client
|
|
7
7
|
#
|
8
8
|
module ServiceImporter
|
9
9
|
def create_missing_clone_dirs()
|
10
|
-
|
10
|
+
Configurator.create_missing_clone_dirs
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.error_message(name, errors)
|
14
|
-
|
15
|
-
|
13
|
+
def self.error_message(name, errors, opts = {})
|
14
|
+
prefix = ''
|
15
|
+
unless opts[:module_type] == :service_module
|
16
|
+
prefix = "Module '#{name}' has errors:\n "
|
17
|
+
end
|
18
|
+
command = opts[:command] || 'edit'
|
19
|
+
"#{prefix}#{errors.to_s}\nYou can fix errors by invoking the '#{command}' command.\n"
|
16
20
|
end
|
17
21
|
|
18
22
|
##
|
@@ -42,7 +46,7 @@ module DTK::Client
|
|
42
46
|
if opts[:do_not_raise]
|
43
47
|
OsUtil.print("#{response.error_message}", :red)
|
44
48
|
else
|
45
|
-
raise
|
49
|
+
raise DtkError, response.error_message
|
46
50
|
end
|
47
51
|
end
|
48
52
|
end
|
@@ -114,7 +118,7 @@ module DTK::Client
|
|
114
118
|
|
115
119
|
ignore_component_error = (new_context_params.get_forwarded_options() || {})[:ignore_component_error] && module_type.eql?('component_module')
|
116
120
|
puts(response.data(:does_not_exist) ? response.data(:does_not_exist) : 'Done.')
|
117
|
-
raise
|
121
|
+
raise DtkError, response.error_message if !response.ok? && !ignore_component_error
|
118
122
|
end
|
119
123
|
|
120
124
|
Response::Ok.new()
|
@@ -161,7 +165,7 @@ module DTK::Client
|
|
161
165
|
|
162
166
|
begin
|
163
167
|
response = ContextRouter.routeTask("component_module", "clone", new_context_params, @conn)
|
164
|
-
rescue
|
168
|
+
rescue DtkValidationError => e
|
165
169
|
# ignoring this
|
166
170
|
end
|
167
171
|
# puts "Done."
|
@@ -192,7 +196,7 @@ module DTK::Client
|
|
192
196
|
private
|
193
197
|
|
194
198
|
def full_module_name(module_hash)
|
195
|
-
|
199
|
+
ModuleUtil.join_name(module_hash['name'], module_hash['namespace'])
|
196
200
|
end
|
197
201
|
|
198
202
|
end
|
@@ -277,6 +277,7 @@ module DTK::Client
|
|
277
277
|
|
278
278
|
assembly_name,service_module_id,service_module_name,version,repo_url,branch,branch_head_sha,edit_file = response.data(:assembly_name,:module_id,:full_module_name,:version,:repo_url,:workspace_branch,:branch_head_sha,:edit_file)
|
279
279
|
edit_opts = {
|
280
|
+
:command => 'edit-workflow',
|
280
281
|
:automatically_clone => true,
|
281
282
|
:assembly_module => {
|
282
283
|
:assembly_name => assembly_name,
|
@@ -167,6 +167,7 @@ module DTK::Client
|
|
167
167
|
git_import = opts[:git_import]
|
168
168
|
opts.merge!(:update_from_includes => true, :force_parse => true) unless git_import
|
169
169
|
opts.merge!(:force => options.force?)
|
170
|
+
opts.merge!(:generate_docs => options.docs?)
|
170
171
|
|
171
172
|
reparse_aux(module_location)
|
172
173
|
push_clone_changes_aux(module_type.to_sym, module_id, version, options['message'] || DEFAULT_COMMIT_MSG, internal_trigger, opts)
|
@@ -350,7 +351,7 @@ module DTK::Client
|
|
350
351
|
response = pull_from_remote_aux(module_type.to_sym, module_id, opts)
|
351
352
|
return response unless response.ok?
|
352
353
|
|
353
|
-
push_clone_changes_aux(module_type.to_sym, module_id, version, nil, true) if File.directory?(module_location)
|
354
|
+
push_clone_changes_aux(module_type.to_sym, module_id, version, nil, true, {:update_from_includes => true}) if File.directory?(module_location)
|
354
355
|
response.skip_render = true
|
355
356
|
response
|
356
357
|
else
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module DTK::Client
|
2
|
+
module NodeMixin
|
3
|
+
def get_node_info_for_ssh_login(node_id, context_params)
|
4
|
+
context_params.forward_options(:json_return => true)
|
5
|
+
response = info_aux(context_params)
|
6
|
+
return response unless response.ok?
|
7
|
+
# Should only have info about the specfic node_id
|
8
|
+
|
9
|
+
unless node_info = response.data(:nodes).find{ |node| node_id == (node['node_properties'] || {})['node_id'] }
|
10
|
+
raise DtkError, "Cannot find info about node with id '#{node_id}'"
|
11
|
+
end
|
12
|
+
|
13
|
+
data = {}
|
14
|
+
node_properties = node_info['node_properties'] || {}
|
15
|
+
if public_dns = node_properties['ec2_public_address']
|
16
|
+
data.merge!('public_dns' => public_dns)
|
17
|
+
end
|
18
|
+
if default_login_user = NodeMixin.default_login_user?(node_properties)
|
19
|
+
data.merge!('default_login_user' => default_login_user)
|
20
|
+
end
|
21
|
+
|
22
|
+
Response::Ok.new(data)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.default_login_user?(node_properties)
|
26
|
+
if os_type = node_properties['os_type']
|
27
|
+
DefaultLoginByOSType[os_type]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
DefaultLoginByOSType = {
|
32
|
+
'ubuntu' => 'ubuntu',
|
33
|
+
'amazon-linux' => 'ec2-user'
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
@@ -34,12 +34,9 @@ module DTK::Client
|
|
34
34
|
unless rsa_pub_key
|
35
35
|
raise DtkError,"No File found at (#{path_to_key}). Path is wrong or it is necessary to generate the public rsa key (e.g., run ssh-keygen -t rsa)"
|
36
36
|
end
|
37
|
-
# making :merge_if_no_conflict the default (when force not set)
|
38
|
-
merge_if_no_conflict = (opts[:force] ? nil : true)
|
39
37
|
opts_perform_locally = remote_params.merge(
|
40
38
|
:full_module_name => full_module_name,
|
41
39
|
:force => opts[:force],
|
42
|
-
:merge_if_no_conflict => merge_if_no_conflict,
|
43
40
|
:do_not_raise => opts[:do_not_raise],
|
44
41
|
:ignore_dependency_merge_conflict => opts[:ignore_dependency_merge_conflict]
|
45
42
|
)
|
@@ -40,6 +40,7 @@ module DTK::Client
|
|
40
40
|
post_body.merge!(:current_branch_sha => opts[:current_branch_sha]) if opts[:current_branch_sha]
|
41
41
|
post_body.merge!(:force => opts[:force]) if opts[:force]
|
42
42
|
post_body.merge!(:task_action => opts[:task_action]) if opts[:task_action]
|
43
|
+
post_body.merge!(:generate_docs => true) if opts[:generate_docs]
|
43
44
|
|
44
45
|
if opts[:set_parsed_false]
|
45
46
|
post_body.merge!(:set_parsed_false => true)
|
@@ -49,21 +50,35 @@ module DTK::Client
|
|
49
50
|
response = post(rest_url("#{module_type}/update_model_from_clone"), post_body)
|
50
51
|
return response unless response.ok?
|
51
52
|
|
53
|
+
external_dependencies = response.data(:external_dependencies)
|
54
|
+
dsl_parse_error = response.data(:dsl_parse_error)
|
55
|
+
dsl_updated_info = response.data(:dsl_updated_info)
|
56
|
+
dsl_created_info = response.data(:dsl_created_info)
|
57
|
+
component_module_refs = response.data(:component_module_refs)
|
58
|
+
|
52
59
|
ret = Response::Ok.new()
|
53
|
-
external_dependencies = response.data('external_dependencies')
|
54
60
|
|
55
61
|
# check if any errors
|
56
|
-
if dsl_parse_error
|
62
|
+
if dsl_parse_error
|
57
63
|
if parsed_external_dependencies = dsl_parse_error['external_dependencies']
|
58
64
|
external_dependencies = parsed_external_dependencies
|
59
|
-
|
60
|
-
|
61
|
-
|
65
|
+
else
|
66
|
+
err_msg_opts = { :module_type => module_type }
|
67
|
+
err_msg_opts.merge!(:command => opts[:command]) if opts[:command]
|
68
|
+
if err_message = ServiceImporter.error_message(module_name, dsl_parse_error, err_msg_opts)
|
69
|
+
DTK::Client::OsUtil.print(err_message, :red)
|
70
|
+
ret = Response::NoOp.new()
|
71
|
+
end
|
62
72
|
end
|
63
73
|
end
|
64
74
|
|
75
|
+
has_code_been_pulled = false
|
76
|
+
|
65
77
|
# check if server pushed anything that needs to be pulled
|
66
|
-
|
78
|
+
|
79
|
+
# we need to pull latest code in case docs where generated
|
80
|
+
OsUtil.print("Pulling generated documentation on your local repository ...", :yellow) if opts[:generate_docs]
|
81
|
+
|
67
82
|
if dsl_updated_info and !dsl_updated_info.empty?
|
68
83
|
if msg = dsl_updated_info["msg"]
|
69
84
|
DTK::Client::OsUtil.print(msg,:yellow)
|
@@ -72,10 +87,18 @@ module DTK::Client
|
|
72
87
|
unless new_commit_sha and new_commit_sha == commit_sha
|
73
88
|
opts_pull = opts.merge(:local_branch => branch,:namespace => module_namespace)
|
74
89
|
resp = Helper(:git_repo).pull_changes(module_type, module_name, opts_pull)
|
90
|
+
has_code_been_pulled = true
|
75
91
|
return resp unless resp.ok?
|
76
92
|
end
|
77
93
|
end
|
78
94
|
|
95
|
+
# unless DSL was updated we pull latest code due to changes on documentation
|
96
|
+
if opts[:generate_docs] && !has_code_been_pulled
|
97
|
+
opts_pull = opts.merge(:local_branch => branch,:namespace => module_namespace)
|
98
|
+
resp = Helper(:git_repo).pull_changes(module_type, module_name, opts_pull)
|
99
|
+
return resp unless resp.ok?
|
100
|
+
end
|
101
|
+
|
79
102
|
if opts[:print_dependencies] || !internal_trigger
|
80
103
|
if external_dependencies
|
81
104
|
ambiguous = external_dependencies["ambiguous"]||[]
|
@@ -89,7 +112,6 @@ module DTK::Client
|
|
89
112
|
end
|
90
113
|
|
91
114
|
# check if server sent any file that should be added
|
92
|
-
dsl_created_info = response.data(:dsl_created_info)
|
93
115
|
if dsl_created_info and !dsl_created_info.empty?
|
94
116
|
path = dsl_created_info["path"]
|
95
117
|
content = dsl_created_info["content"]
|
@@ -100,22 +122,23 @@ module DTK::Client
|
|
100
122
|
end
|
101
123
|
end
|
102
124
|
|
103
|
-
|
104
|
-
|
105
|
-
print_using_dependencies(service_component_refs)
|
125
|
+
unless (component_module_refs||{}).empty?
|
126
|
+
print_using_dependencies(component_module_refs)
|
106
127
|
end
|
107
128
|
|
108
129
|
ret
|
109
130
|
end
|
110
131
|
|
111
132
|
private
|
133
|
+
|
112
134
|
def print_using_dependencies(component_refs)
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
135
|
+
# TODO: This just prints out dircetly included modules
|
136
|
+
unless component_refs.empty?
|
137
|
+
puts 'Using component modules:'
|
138
|
+
component_refs.values.map { |r| "#{r['namespace_info']}:#{r['module_name']}" }.sort.each do |name|
|
139
|
+
puts " #{name}"
|
140
|
+
end
|
117
141
|
end
|
118
142
|
end
|
119
|
-
|
120
143
|
end
|
121
144
|
end
|
@@ -184,15 +184,16 @@ module DTK::Client
|
|
184
184
|
response
|
185
185
|
end
|
186
186
|
|
187
|
-
desc "ASSEMBLY-NAME/ID stage [INSTANCE-NAME] [-t TARGET-NAME/ID] [--
|
187
|
+
desc "ASSEMBLY-NAME/ID stage [INSTANCE-NAME] [-t TARGET-NAME/ID] [--node-size NODE-SIZE-SPEC] [--os-type OS-TYPE]", "Stage assembly in target."
|
188
188
|
method_option "in-target",:aliases => "-t" ,
|
189
189
|
:type => :string,
|
190
190
|
:banner => "TARGET-NAME/ID",
|
191
191
|
:desc => "Target (id) to create assembly in"
|
192
192
|
#hidden option
|
193
|
-
method_option "instance-bindings",
|
194
|
-
:type => :string
|
193
|
+
method_option "instance-bindings", :type => :string
|
195
194
|
method_option :settings, :type => :string, :aliases => '-s'
|
195
|
+
method_option :node_size, :type => :string, :aliases => "--node-size"
|
196
|
+
method_option :os_type, :type => :string, :aliases => "--os-type"
|
196
197
|
def stage(context_params)
|
197
198
|
assembly_template_id, service_module_id, name = context_params.retrieve_arguments([:assembly_id!, :service_module_id, :option_1],method_argument_names)
|
198
199
|
post_body = {
|
@@ -211,10 +212,12 @@ module DTK::Client
|
|
211
212
|
assembly_template_name.gsub!(/(::)|(\/)/,'-')
|
212
213
|
end
|
213
214
|
|
214
|
-
in_target
|
215
|
+
in_target = options["in-target"]
|
215
216
|
instance_bindings = options["instance-bindings"]
|
216
|
-
settings
|
217
|
-
|
217
|
+
settings = parse_service_settings(options["settings"])
|
218
|
+
node_size = options.node_size
|
219
|
+
os_type = options.os_type
|
220
|
+
assembly_list = Assembly.assembly_list()
|
218
221
|
|
219
222
|
if name
|
220
223
|
raise DTK::Client::DtkValidationError, "Unable to stage service with name '#{name}'. Service with specified name exists already!" if assembly_list.include?(name)
|
@@ -226,6 +229,8 @@ module DTK::Client
|
|
226
229
|
post_body.merge!(:name => name) if name
|
227
230
|
post_body.merge!(:instance_bindings => instance_bindings) if instance_bindings
|
228
231
|
post_body.merge!(:settings_json_form => JSON.generate(settings)) if settings
|
232
|
+
post_body.merge!(:node_size => node_size) if node_size
|
233
|
+
post_body.merge!(:os_type => os_type) if os_type
|
229
234
|
|
230
235
|
response = post rest_url("assembly/stage"), post_body
|
231
236
|
return response unless response.ok?
|
@@ -336,8 +336,6 @@ module DTK::Client
|
|
336
336
|
# version_method_option
|
337
337
|
desc "COMPONENT-MODULE-NAME/ID clone [-n]", "Locally clone component module and component files. Use -n to skip edit prompt"
|
338
338
|
method_option :skip_edit, :aliases => '-n', :type => :boolean, :default => false
|
339
|
-
# DEBUG SNIPPET >>> REMOVE <<<
|
340
|
-
# REMOVE TRIGGER!!!!
|
341
339
|
def clone(context_params, internal_trigger=true)
|
342
340
|
clone_module_aux(context_params, internal_trigger)
|
343
341
|
end
|
@@ -349,19 +347,18 @@ module DTK::Client
|
|
349
347
|
edit_module_aux(context_params)
|
350
348
|
end
|
351
349
|
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
def push(context_params, internal_trigger=false)
|
350
|
+
desc "COMPONENT-MODULE-NAME/ID push [--force] [--docs]", "Push changes from local copy of component module to server"
|
351
|
+
version_method_option
|
352
|
+
method_option "message",:aliases => "-m" ,
|
353
|
+
:type => :string,
|
354
|
+
:banner => "COMMIT-MSG",
|
355
|
+
:desc => "Commit message"
|
356
|
+
# hidden option for dev
|
357
|
+
method_option :force, :type => :boolean, :default => false, :aliases => '-f'
|
358
|
+
method_option :docs, :type => :boolean, :default => false, :aliases => '-d'
|
359
|
+
def push(context_params, internal_trigger=false)
|
363
360
|
push_module_aux(context_params, internal_trigger)
|
364
|
-
|
361
|
+
end
|
365
362
|
|
366
363
|
# desc "COMPONENT-MODULE-NAME/ID push-dtkn [-n NAMESPACE] [-m COMMIT-MSG]", "Push changes from local copy of component module to remote repository (dtkn)."
|
367
364
|
desc "COMPONENT-MODULE-NAME/ID push-dtkn [-n NAMESPACE] [--force]", "Push changes from local copy of component module to remote repository (dtkn)."
|
data/lib/commands/thor/node.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
dtk_require_from_base('task_status')
|
2
|
+
dtk_require_common_commands('thor/node')
|
2
3
|
dtk_require_common_commands('thor/set_required_attributes')
|
3
4
|
dtk_require_common_commands('thor/assembly_workspace')
|
4
5
|
|
@@ -6,6 +7,7 @@ module DTK::Client
|
|
6
7
|
class Node < CommandBaseThor
|
7
8
|
|
8
9
|
include AssemblyWorkspaceMixin
|
10
|
+
include NodeMixin
|
9
11
|
|
10
12
|
no_tasks do
|
11
13
|
include TaskStatusMixin
|
@@ -95,7 +97,7 @@ module DTK::Client
|
|
95
97
|
post rest_url("node/info"), post_body
|
96
98
|
end
|
97
99
|
|
98
|
-
desc "NODE-NAME/ID ssh
|
100
|
+
desc "NODE-NAME/ID ssh [LINUX-LOGIN-USER] [-i PATH-TO-PEM]","SSH into node."
|
99
101
|
method_option "--identity-file",:aliases => '-i',:type => :string, :desc => "Identity-File used for connection, if not provided default is used", :banner => "IDENTITY-FILE"
|
100
102
|
def ssh(context_params)
|
101
103
|
if OsUtil.is_windows?
|
@@ -103,11 +105,11 @@ module DTK::Client
|
|
103
105
|
return
|
104
106
|
end
|
105
107
|
|
106
|
-
node_id,
|
108
|
+
node_id, login_user = context_params.retrieve_arguments([:node_id!,:option_1],method_argument_names)
|
107
109
|
|
108
110
|
if identity_file_location = options['identity-file']
|
109
111
|
unless File.exists?(identity_file_location)
|
110
|
-
raise
|
112
|
+
raise DtkError, "Not able to find identity file, '#{identity_file_location}'"
|
111
113
|
end
|
112
114
|
elsif default_identity_file = OsUtil.dtk_identity_file_location()
|
113
115
|
if File.exists?(default_identity_file)
|
@@ -115,42 +117,35 @@ module DTK::Client
|
|
115
117
|
end
|
116
118
|
end
|
117
119
|
|
118
|
-
|
119
|
-
|
120
|
-
# also info that comes back should indicate whether a node group and if so error message is that
|
121
|
-
# ssh cannot be called on node group
|
122
|
-
response = info_aux(context_params)
|
123
|
-
if response.ok?
|
124
|
-
node_info = {}
|
125
|
-
response.data['nodes'].each do |node|
|
126
|
-
properties = node['node_properties']
|
127
|
-
node_info = properties if node_id == properties['node_id']
|
128
|
-
end
|
129
|
-
public_dns = node_info ? node_info['ec2_public_address'] : nil
|
130
|
-
|
131
|
-
raise ::DTK::Client::DtkError, "Not able to resolve instance address, has instance been stopped?" unless public_dns
|
132
|
-
|
133
|
-
connection_string = "#{remote_user}@#{public_dns}"
|
120
|
+
response = get_node_info_for_ssh_login(node_id, context_params)
|
121
|
+
return response unless response.ok?
|
134
122
|
|
123
|
+
unless public_dns = response.data(:public_dns)
|
124
|
+
raise DtkError, "Not able to resolve instance address, has instance been stopped?"
|
125
|
+
end
|
126
|
+
|
127
|
+
unless login_user ||= response.data(:default_login_user)
|
128
|
+
raise DtkError, "Retry command with a specfic login user (a default login user could not be computed)"
|
129
|
+
end
|
135
130
|
|
136
|
-
|
131
|
+
connection_string = "#{login_user}@#{public_dns}"
|
137
132
|
|
133
|
+
ssh_command =
|
138
134
|
if identity_file_location
|
139
135
|
# provided PEM key
|
140
|
-
|
141
|
-
elsif SSHUtil.ssh_reachable?(
|
136
|
+
"ssh -o \"StrictHostKeyChecking no\" -o \"UserKnownHostsFile /dev/null\" -i #{identity_file_location} #{connection_string}"
|
137
|
+
elsif SSHUtil.ssh_reachable?(login_user, public_dns)
|
142
138
|
# it has PUB key access
|
143
|
-
|
139
|
+
"ssh -o \"StrictHostKeyChecking no\" -o \"UserKnownHostsFile /dev/null\" #{connection_string}"
|
144
140
|
end
|
145
141
|
|
146
|
-
|
147
|
-
|
148
|
-
OsUtil.print("You are entering SSH terminal (#{connection_string}) ...", :yellow)
|
149
|
-
Kernel.system(ssh_command)
|
150
|
-
OsUtil.print("You are leaving SSH terminal, and returning to DTK Shell ...", :yellow)
|
151
|
-
else
|
152
|
-
response
|
142
|
+
unless ssh_command
|
143
|
+
raise DtkError, "No public key access or PEM provided, please grant access or provide valid PEM key"
|
153
144
|
end
|
145
|
+
|
146
|
+
OsUtil.print("You are entering SSH terminal (#{connection_string}) ...", :yellow)
|
147
|
+
Kernel.system(ssh_command)
|
148
|
+
OsUtil.print("You are leaving SSH terminal, and returning to DTK Shell ...", :yellow)
|
154
149
|
end
|
155
150
|
|
156
151
|
desc "NODE-NAME/ID list-components","List components that are on the node instance."
|
@@ -267,7 +262,7 @@ module DTK::Client
|
|
267
262
|
if response.data and response.data.size > 0
|
268
263
|
#TODO: may not directly print here; isntead use a lower level fn
|
269
264
|
error_message = "The following violations were found; they must be corrected before the node can be converged"
|
270
|
-
|
265
|
+
OsUtil.print(error_message, :red)
|
271
266
|
return response.render_table(:violation)
|
272
267
|
end
|
273
268
|
|
@@ -310,7 +305,7 @@ module DTK::Client
|
|
310
305
|
}
|
311
306
|
unless options.force?
|
312
307
|
# Ask user if really want to delete and destroy, if not then return to dtk-shell without deleting
|
313
|
-
return unless Console.confirmation_prompt("Are you sure you want to destroy and delete node '#{node_id}'?")
|
308
|
+
return unless Console.confirmation_prompt("Are you sure you want to destroy and delete node '#{node_id}'"+"?")
|
314
309
|
end
|
315
310
|
|
316
311
|
response = post rest_url("node/destroy_and_delete"), post_body
|
@@ -460,7 +455,7 @@ module DTK::Client
|
|
460
455
|
end
|
461
456
|
|
462
457
|
if response.data(:result).nil?
|
463
|
-
raise
|
458
|
+
raise DtkError, "Server seems to be taking too long to start node(s)."
|
464
459
|
end
|
465
460
|
|
466
461
|
task_id = response.data(:result)['task_id']
|
@@ -478,7 +473,7 @@ module DTK::Client
|
|
478
473
|
def get_assembly_and_node_id(context_params)
|
479
474
|
response = info(context_params)
|
480
475
|
unless response.ok?
|
481
|
-
raise
|
476
|
+
raise DtkError, "Unable to retrive node information, please try again."
|
482
477
|
end
|
483
478
|
|
484
479
|
return response.data(:assembly_id), response.data(:id)
|
@@ -76,7 +76,7 @@ module DTK::Client
|
|
76
76
|
],
|
77
77
|
:assembly => [
|
78
78
|
["info","info","# Info for given assembly in current service module."],
|
79
|
-
["stage", "stage [INSTANCE-NAME] [-t TARGET-NAME/ID]", "# Stage assembly in target."],
|
79
|
+
["stage", "stage [INSTANCE-NAME] [-t TARGET-NAME/ID] [--node-size NODE-SIZE-SPEC] [--os-type OS-TYPE]", "# Stage assembly in target."],
|
80
80
|
# ["deploy","deploy [-v VERSION] [INSTANCE-NAME] [-t TARGET-NAME/ID] [-m COMMIT-MSG]", "# Stage and deploy assembly in target."],
|
81
81
|
# ["deploy","deploy [INSTANCE-NAME] [-t TARGET-NAME/ID] [-m COMMIT-MSG]", "# Stage and deploy assembly in target."],
|
82
82
|
["deploy","deploy [INSTANCE-NAME] [-m COMMIT-MSG]", "# Stage and deploy assembly in target."],
|
@@ -478,12 +478,13 @@ module DTK::Client
|
|
478
478
|
=end
|
479
479
|
|
480
480
|
# desc "SERVICE-MODULE-NAME/ID push [-m COMMIT-MSG]", "Push changes from local copy to server (origin)."
|
481
|
-
desc "SERVICE-MODULE-NAME/ID push [--force]", "Push changes from local copy to server."
|
481
|
+
desc "SERVICE-MODULE-NAME/ID push [--force] [--docs]", "Push changes from local copy to server."
|
482
482
|
method_option "message",:aliases => "-m" ,
|
483
483
|
:type => :string,
|
484
484
|
:banner => "COMMIT-MSG",
|
485
485
|
:desc => "Commit message"
|
486
486
|
method_option :force, :type => :boolean, :default => false, :aliases => '-f'
|
487
|
+
method_option :docs, :type => :boolean, :default => false, :aliases => '-d'
|
487
488
|
def push(context_params, internal_trigger=false)
|
488
489
|
push_module_aux(context_params, internal_trigger)
|
489
490
|
end
|
@@ -214,7 +214,7 @@ module DTK::Client
|
|
214
214
|
edit_module_aux(context_params)
|
215
215
|
end
|
216
216
|
|
217
|
-
desc "TEST-MODULE-NAME/ID push", "Push changes from local copy of test module to server"
|
217
|
+
desc "TEST-MODULE-NAME/ID push [--force] [--docs]", "Push changes from local copy of test module to server"
|
218
218
|
version_method_option
|
219
219
|
method_option "message",:aliases => "-m" ,
|
220
220
|
:type => :string,
|
@@ -222,6 +222,8 @@ module DTK::Client
|
|
222
222
|
:desc => "Commit message"
|
223
223
|
# hidden option for dev
|
224
224
|
method_option 'force-parse', :aliases => '-f', :type => :boolean, :default => false
|
225
|
+
method_option :force, :type => :boolean, :default => false
|
226
|
+
method_option :docs, :type => :boolean, :default => false, :aliases => '-d'
|
225
227
|
def push(context_params, internal_trigger=false)
|
226
228
|
push_module_aux(context_params, internal_trigger)
|
227
229
|
end
|
data/lib/dtk-client/version.rb
CHANGED
@@ -112,7 +112,7 @@ module DTK
|
|
112
112
|
|
113
113
|
val = value_of(structured_element,'dtk_type')||''
|
114
114
|
# extract e.g. 3.1.1.1 from '3.1.1.1 action' etc.
|
115
|
-
error_index = "[ #{val.scan( /\d+[,.]
|
115
|
+
error_index = "[ #{val.scan( /\d+[,.]?\d?[,.]?\d?[,.]?\d?[,.]?\d?/ ).first} ]"
|
116
116
|
|
117
117
|
# original table takes that index
|
118
118
|
evaluated_element.send("#{k}=", error_index)
|
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dtk-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rich PELAVIN
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mime-types
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.25'
|
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.25'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ! '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 1.2.4
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.2.4
|
41
41
|
- !ruby/object:Gem::Dependency
|
@@ -70,42 +70,42 @@ dependencies:
|
|
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
|
@@ -140,14 +140,14 @@ dependencies:
|
|
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
|
@@ -225,6 +225,7 @@ files:
|
|
225
225
|
- lib/commands/common/thor/list_diffs.rb
|
226
226
|
- lib/commands/common/thor/module.rb
|
227
227
|
- lib/commands/common/thor/module/import.rb
|
228
|
+
- lib/commands/common/thor/node.rb
|
228
229
|
- lib/commands/common/thor/poller.rb
|
229
230
|
- lib/commands/common/thor/pull_clone_changes.rb
|
230
231
|
- lib/commands/common/thor/pull_from_remote.rb
|
@@ -381,17 +382,17 @@ require_paths:
|
|
381
382
|
- lib
|
382
383
|
required_ruby_version: !ruby/object:Gem::Requirement
|
383
384
|
requirements:
|
384
|
-
- -
|
385
|
+
- - ! '>='
|
385
386
|
- !ruby/object:Gem::Version
|
386
387
|
version: '0'
|
387
388
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
388
389
|
requirements:
|
389
|
-
- -
|
390
|
+
- - ! '>='
|
390
391
|
- !ruby/object:Gem::Version
|
391
392
|
version: '0'
|
392
393
|
requirements: []
|
393
394
|
rubyforge_project:
|
394
|
-
rubygems_version: 2.4.
|
395
|
+
rubygems_version: 2.4.8
|
395
396
|
signing_key:
|
396
397
|
specification_version: 4
|
397
398
|
summary: DTK CLI client for DTK server interaction.
|