dtk-client 0.6.8 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/bin/dtk +5 -1
- data/lib/auxiliary.rb +0 -1
- data/lib/commands/common/thor/assembly_workspace.rb +20 -1
- data/lib/commands/common/thor/inventory_parser.rb +1 -1
- data/lib/commands/common/thor/module/import.rb +41 -106
- data/lib/commands/common/thor/module.rb +13 -226
- data/lib/commands/common/thor/poller.rb +48 -0
- data/lib/commands/common/thor/puppet_forge.rb +7 -1
- data/lib/commands/common/thor/purge_clone.rb +2 -1
- data/lib/commands/common/thor/task_status.rb +15 -14
- data/lib/commands/common/thor/test_action_agent.rb +39 -0
- data/lib/commands/thor/component_module.rb +2 -2
- data/lib/commands/thor/node.rb +55 -14
- data/lib/commands/thor/node_group.rb +2 -26
- data/lib/commands/thor/service.rb +31 -11
- data/lib/commands/thor/service_module.rb +3 -1
- data/lib/commands/thor/workspace.rb +13 -3
- data/lib/core.rb +16 -6
- data/lib/domain/git_adapter.rb +0 -3
- data/lib/domain/response.rb +25 -13
- data/lib/dtk-client/version.rb +1 -1
- data/lib/parser/adapters/thor.rb +8 -5
- data/lib/shell/context.rb +8 -19
- data/lib/shell/domain/active_context.rb +169 -0
- data/lib/shell/domain/context_entity.rb +72 -0
- data/lib/shell/domain/context_params.rb +202 -0
- data/lib/shell/domain/override_tasks.rb +71 -0
- data/lib/shell/domain/shadow_entity.rb +59 -0
- data/lib/shell/help_monkey_patch.rb +76 -71
- data/lib/shell/message_queue.rb +2 -0
- data/lib/shell/status_monitor.rb +5 -3
- data/lib/shell.rb +4 -2
- data/lib/util/dtk_puppet.rb +8 -6
- data/lib/util/os_util.rb +5 -1
- data/lib/view_processor/table_print.rb +67 -12
- data/spec/lib/spec_thor.rb +5 -2
- metadata +9 -3
- data/lib/shell/domain.rb +0 -492
@@ -0,0 +1,48 @@
|
|
1
|
+
module DTK::Client
|
2
|
+
module Poller
|
3
|
+
|
4
|
+
PERIOD_WAIT_TIME = 1
|
5
|
+
|
6
|
+
def poller_response(wait_time = PERIOD_WAIT_TIME)
|
7
|
+
begin
|
8
|
+
response = nil
|
9
|
+
thread = Thread.new(self) do |main_thread|
|
10
|
+
begin
|
11
|
+
while true
|
12
|
+
messages_response = main_thread.get main_thread.rest_url("messages/retrieve")
|
13
|
+
print_response(messages_response.data) if messages_response.ok?
|
14
|
+
sleep(wait_time)
|
15
|
+
end
|
16
|
+
rescue => e
|
17
|
+
puts e.message
|
18
|
+
pp e.backtrace
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
response = yield
|
23
|
+
ensure
|
24
|
+
thread.kill
|
25
|
+
end
|
26
|
+
response
|
27
|
+
end
|
28
|
+
|
29
|
+
def print_response(message_array)
|
30
|
+
message_array.each do |msg|
|
31
|
+
DTK::Client::OsUtil.print(msg['message'], resolve_type(msg['type']))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def resolve_type(message_type)
|
36
|
+
case message_type.to_sym
|
37
|
+
when :info
|
38
|
+
:white
|
39
|
+
when :warning
|
40
|
+
:yellow
|
41
|
+
when :error
|
42
|
+
:red
|
43
|
+
else
|
44
|
+
:white
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module DTK::Client
|
2
2
|
module PuppetForgeMixin
|
3
3
|
|
4
|
+
NAME_REGEX = /\w*\-\w/
|
5
|
+
|
4
6
|
def puppet_forge_install_aux(context_params, pf_module_name, module_name, namespace, version, module_type)
|
5
7
|
post_body_hash = {
|
6
8
|
:puppetf_module_name => pf_module_name,
|
@@ -9,7 +11,11 @@ module DTK::Client
|
|
9
11
|
:module_namespace? => namespace
|
10
12
|
}
|
11
13
|
|
12
|
-
|
14
|
+
raise DtkError, "Puppet forge module name should be in format USERNAME-NAME" unless pf_module_name.match(NAME_REGEX)
|
15
|
+
|
16
|
+
response = poller_response do
|
17
|
+
post rest_url("component_module/install_puppet_forge_modules"),PostBody.new(post_body_hash)
|
18
|
+
end
|
13
19
|
|
14
20
|
return response unless response.ok?
|
15
21
|
|
@@ -33,7 +33,8 @@ module DTK::Client
|
|
33
33
|
|
34
34
|
if response.ok?
|
35
35
|
response.data.each do |cmp_mod|
|
36
|
-
|
36
|
+
branch_relationship = cmp_mod['branch_relationship']||''
|
37
|
+
unsaved_modules << "#{cmp_mod['namespace_name']}:#{cmp_mod['display_name']}" if (cmp_mod['local_copy_diff'] && branch_relationship.eql?('local_ahead'))
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
@@ -1,18 +1,12 @@
|
|
1
1
|
module DTK::Client
|
2
2
|
module TaskStatusMixin
|
3
|
-
|
4
|
-
|
5
|
-
if wait_flag
|
3
|
+
def task_status_aux(id,type,opts={})
|
4
|
+
if opts[:wait]
|
6
5
|
# there will be infinite loop until intereputed with CTRL+C
|
7
6
|
begin
|
8
7
|
response = nil
|
9
8
|
loop do
|
10
|
-
|
11
|
-
id_field => id,
|
12
|
-
:format => :table
|
13
|
-
}
|
14
|
-
response = post rest_url("#{type}/task_status"), post_body
|
15
|
-
|
9
|
+
response = task_status_aux_post(id,type,opts)
|
16
10
|
raise DTK::Client::DtkError, "[ERROR] #{response['errors'].first['message']}." if response["status"].eql?('notok')
|
17
11
|
|
18
12
|
# stop pulling when top level task succeds, fails or timeout
|
@@ -57,11 +51,7 @@ module DTK::Client
|
|
57
51
|
response.skip_render = true unless response.nil?
|
58
52
|
end
|
59
53
|
else
|
60
|
-
|
61
|
-
id_field => id,
|
62
|
-
:format => :table
|
63
|
-
}
|
64
|
-
response = post rest_url("#{type}/task_status"), post_body
|
54
|
+
response = task_status_aux_post(id,type,opts)
|
65
55
|
response.print_error_table = true
|
66
56
|
response.render_table(:task_status)
|
67
57
|
end
|
@@ -80,6 +70,17 @@ module DTK::Client
|
|
80
70
|
response.override_command_class("list_task")
|
81
71
|
puts response.render_data
|
82
72
|
end
|
73
|
+
|
74
|
+
private
|
75
|
+
def task_status_aux_post(id,type,opts={})
|
76
|
+
id_field = "#{type}_id".to_sym
|
77
|
+
post_body_hash = {
|
78
|
+
id_field => id,
|
79
|
+
:format => :table,
|
80
|
+
:summarize_node_groups? => opts[:summarize]
|
81
|
+
}
|
82
|
+
post rest_url("#{type}/task_status"), PostBody.new(post_body_hash)
|
83
|
+
end
|
83
84
|
end
|
84
85
|
|
85
86
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module DTK::Client
|
2
|
+
module TestActionAgent
|
3
|
+
|
4
|
+
def test_agent_aux(context_params)
|
5
|
+
service_id, node_id, bash_command = context_params.retrieve_arguments([:service_id!, :node_id!, :option_1!], method_argument_names)
|
6
|
+
|
7
|
+
post_body = {
|
8
|
+
:assembly_id => service_id,
|
9
|
+
:node_id => node_id,
|
10
|
+
:bash_command => bash_command
|
11
|
+
}
|
12
|
+
|
13
|
+
response = post(rest_url("assembly/initiate_action_agent"), post_body)
|
14
|
+
return response unless response.ok?
|
15
|
+
|
16
|
+
|
17
|
+
action_results_id = response.data(:action_results_id)
|
18
|
+
response = nil
|
19
|
+
|
20
|
+
loop do
|
21
|
+
post_body = {
|
22
|
+
:action_results_id => action_results_id,
|
23
|
+
:return_only_if_complete => true,
|
24
|
+
:disable_post_processing => false
|
25
|
+
}
|
26
|
+
|
27
|
+
response = post(rest_url("assembly/get_action_results"),post_body)
|
28
|
+
|
29
|
+
if response.data(:is_complete) || !response.ok?
|
30
|
+
break
|
31
|
+
else
|
32
|
+
sleep(1)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
return response
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -281,8 +281,8 @@ module DTK::Client
|
|
281
281
|
|
282
282
|
desc "COMPONENT-MODULE-NAME/ID add-collaborators", "Add collabrators users or groups comma seperated (--users or --groups)"
|
283
283
|
method_option "namespace", :aliases => "-n", :type => :string, :banner => "NAMESPACE", :desc => "Remote namespace"
|
284
|
-
method_option "users"
|
285
|
-
method_option "groups"
|
284
|
+
method_option "users", :aliases => "-u", :type => :string, :banner => "USERS", :desc => "User collabrators"
|
285
|
+
method_option "groups", :aliases => "-g", :type => :string, :banner => "GROUPS", :desc => "Group collabrators"
|
286
286
|
def add_collaborators(context_params)
|
287
287
|
add_collaborators_module_aux(context_params)
|
288
288
|
end
|
data/lib/commands/thor/node.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
dtk_require_common_commands('thor/task_status')
|
2
2
|
dtk_require_common_commands('thor/set_required_params')
|
3
|
+
dtk_require_common_commands('thor/test_action_agent')
|
4
|
+
|
3
5
|
module DTK::Client
|
4
6
|
class Node < CommandBaseThor
|
5
7
|
|
@@ -8,6 +10,7 @@ module DTK::Client
|
|
8
10
|
no_tasks do
|
9
11
|
include TaskStatusMixin
|
10
12
|
include SetRequiredParamsMixin
|
13
|
+
include TestActionAgent
|
11
14
|
end
|
12
15
|
|
13
16
|
def self.pretty_print_cols()
|
@@ -29,7 +32,7 @@ module DTK::Client
|
|
29
32
|
end
|
30
33
|
|
31
34
|
# using extended_context when we want to use autocomplete from other context
|
32
|
-
# e.g. we are in assembly/apache context and want to create-component we will use extended context to add
|
35
|
+
# e.g. we are in assembly/apache context and want to create-component we will use extended context to add
|
33
36
|
# component-templates to autocomplete
|
34
37
|
def self.extended_context()
|
35
38
|
{
|
@@ -52,7 +55,7 @@ module DTK::Client
|
|
52
55
|
|
53
56
|
def self.validation_list(context_params)
|
54
57
|
assembly_id, workspace_id = context_params.retrieve_arguments([:service_id, :workspace_id])
|
55
|
-
|
58
|
+
|
56
59
|
if (assembly_id || workspace_id)
|
57
60
|
# if assebmly_id is present we're loading nodes filtered by assembly_id
|
58
61
|
post_body = {
|
@@ -81,7 +84,7 @@ module DTK::Client
|
|
81
84
|
}
|
82
85
|
})
|
83
86
|
end
|
84
|
-
|
87
|
+
|
85
88
|
desc "NODE-NAME/ID info","Info about node"
|
86
89
|
def info(context_params)
|
87
90
|
node_id = context_params.retrieve_arguments([:node_id!],method_argument_names)
|
@@ -93,6 +96,39 @@ module DTK::Client
|
|
93
96
|
post rest_url("node/info"), post_body
|
94
97
|
end
|
95
98
|
|
99
|
+
desc "NODE-NAME/ID test-action-agent BASH-COMMAND-LINE", "Run bash command on test action agent"
|
100
|
+
def test_action_agent(context_params)
|
101
|
+
response = test_agent_aux(context_params)
|
102
|
+
return response unless response.ok?
|
103
|
+
|
104
|
+
# this I will fix to have more clear output
|
105
|
+
data = response.data(:results)
|
106
|
+
|
107
|
+
datas = data.values.first['results']
|
108
|
+
errors = data.values.first['errors']
|
109
|
+
|
110
|
+
|
111
|
+
datas.each do |data|
|
112
|
+
OsUtil.print("Command: #{data['description']}, status: #{data['status']}", :yellow)
|
113
|
+
if data['stdout'] && !data['stdout'].empty?
|
114
|
+
print data['stdout']
|
115
|
+
end
|
116
|
+
|
117
|
+
if data['stderr'] && !data['stderr'].empty?
|
118
|
+
print data['stderr']
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
if errors && !errors.empty?
|
123
|
+
puts; puts;
|
124
|
+
OsUtil.print('Some errors have been detected', :white)
|
125
|
+
errors.each_with_index { |err, index| OsUtil.print("#{index+1}. #{err}", :red) }
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
return nil
|
130
|
+
end
|
131
|
+
|
96
132
|
desc "NODE-NAME/ID ssh REMOTE-USER [-i PATH-TO-PEM]","SSH into node, optional parameters are path to indentity file."
|
97
133
|
method_option "--identity-file",:aliases => '-i',:type => :string, :desc => "Identity-File used for connection, if not provided default is used", :banner => "IDENTITY-FILE"
|
98
134
|
def ssh(context_params)
|
@@ -113,8 +149,12 @@ module DTK::Client
|
|
113
149
|
response = info_aux(context_params)
|
114
150
|
|
115
151
|
if response.ok?
|
116
|
-
node_info =
|
117
|
-
|
152
|
+
node_info = {}
|
153
|
+
response.data['nodes'].each do |node|
|
154
|
+
properties = node['node_properties']
|
155
|
+
node_info = properties if node_id == properties['node_id']
|
156
|
+
end
|
157
|
+
public_dns = node_info ? node_info['ec2_public_address'] : nil
|
118
158
|
|
119
159
|
raise ::DTK::Client::DtkError, "Not able to resolve instance address, has instance been stopped?" unless public_dns
|
120
160
|
|
@@ -123,7 +163,7 @@ module DTK::Client
|
|
123
163
|
default_identity_file = OsUtil.dtk_identity_file_location()
|
124
164
|
|
125
165
|
ssh_command = nil
|
126
|
-
|
166
|
+
|
127
167
|
if identity_file_location
|
128
168
|
# provided PEM key
|
129
169
|
ssh_command = "ssh -o \"StrictHostKeyChecking no\" -o \"UserKnownHostsFile /dev/null\" -i #{identity_file_location} #{connection_string}"
|
@@ -165,7 +205,7 @@ module DTK::Client
|
|
165
205
|
method_option :list, :type => :boolean, :default => false
|
166
206
|
def list(context_params)
|
167
207
|
node_id, about = context_params.retrieve_arguments([:node_id,:option_1],method_argument_names)
|
168
|
-
|
208
|
+
|
169
209
|
if node_id.nil?
|
170
210
|
response = post rest_url("node/list")
|
171
211
|
|
@@ -246,7 +286,7 @@ module DTK::Client
|
|
246
286
|
|
247
287
|
desc "NODE-NAME/ID converge [-m COMMIT-MSG]", "Converges service instance"
|
248
288
|
method_option "commit_msg",:aliases => "-m" ,
|
249
|
-
:type => :string,
|
289
|
+
:type => :string,
|
250
290
|
:banner => "COMMIT-MSG",
|
251
291
|
:desc => "Commit message"
|
252
292
|
def converge(context_params)
|
@@ -279,7 +319,7 @@ module DTK::Client
|
|
279
319
|
method_option :wait, :type => :boolean, :default => false
|
280
320
|
def task_status(context_params)
|
281
321
|
node_id = context_params.retrieve_arguments([:node_id!],method_argument_names)
|
282
|
-
task_status_aux(node_id,:node
|
322
|
+
task_status_aux(node_id,:node,:wait => options.wait?)
|
283
323
|
end
|
284
324
|
|
285
325
|
desc "NODE-NAME/ID list-task-info", "Task status details of running or last service task"
|
@@ -334,7 +374,7 @@ module DTK::Client
|
|
334
374
|
# Retrieving assembly_id to stop a node.. TODO create server side method that takes only node id
|
335
375
|
#TODO: Rich: took this out; think it is a bug
|
336
376
|
#assembly_id, node_id = get_assembly_and_node_id(context_params)
|
337
|
-
|
377
|
+
|
338
378
|
node_stop(node_id)
|
339
379
|
end
|
340
380
|
|
@@ -344,7 +384,7 @@ module DTK::Client
|
|
344
384
|
|
345
385
|
post_body = {
|
346
386
|
:node_id => node_id
|
347
|
-
}
|
387
|
+
}
|
348
388
|
|
349
389
|
response = post(rest_url("node/initiate_get_netstats"), post_body)
|
350
390
|
return response unless response.ok?
|
@@ -375,6 +415,7 @@ module DTK::Client
|
|
375
415
|
response.set_data(*response.data(:results))
|
376
416
|
response.render_table(:netstat_data)
|
377
417
|
end
|
418
|
+
|
378
419
|
GETNETSTATSTRIES = 6
|
379
420
|
GETNETSTATSSLEEP = 0.5
|
380
421
|
|
@@ -384,7 +425,7 @@ module DTK::Client
|
|
384
425
|
|
385
426
|
post_body = {
|
386
427
|
:node_id => node_id
|
387
|
-
}
|
428
|
+
}
|
388
429
|
|
389
430
|
response = post(rest_url("node/initiate_get_ps"), post_body)
|
390
431
|
return response unless response.ok?
|
@@ -422,7 +463,7 @@ module DTK::Client
|
|
422
463
|
GETPSSLEEP = 0.5
|
423
464
|
|
424
465
|
no_tasks do
|
425
|
-
def node_start(node_id)
|
466
|
+
def node_start(node_id)
|
426
467
|
post_body = {
|
427
468
|
:node_id => node_id
|
428
469
|
}
|
@@ -472,7 +513,7 @@ module DTK::Client
|
|
472
513
|
response = info(context_params)
|
473
514
|
unless response.ok?
|
474
515
|
raise DTK::Client::DtkError, "Unable to retrive node information, please try again."
|
475
|
-
end
|
516
|
+
end
|
476
517
|
|
477
518
|
return response.data(:assembly_id), response.data(:id)
|
478
519
|
end
|
@@ -15,15 +15,6 @@ module DTK::Client
|
|
15
15
|
return :node_group, "node_group/list", nil
|
16
16
|
end
|
17
17
|
|
18
|
-
# desc "list","List Node groups"
|
19
|
-
# def list(context_params)
|
20
|
-
# search_hash = SearchHash.new()
|
21
|
-
# search_hash.cols = pretty_print_cols()
|
22
|
-
# search_hash.filter = [:oneof, ":type", ["node_group_instance"]]
|
23
|
-
# response = post rest_url("node_group/list"), search_hash.post_body_hash()
|
24
|
-
# response.render_table(:node_group)
|
25
|
-
# end
|
26
|
-
|
27
18
|
desc "NODE-GROUP-NAME/ID set ATTRIBUTE-ID VALUE", "Set node group attribute value"
|
28
19
|
def set(context_params)
|
29
20
|
node_group_id, attr_id, value = context_params.retrieve_arguments([:node_group_id!, :option_1!, :option_2!],method_argument_names)
|
@@ -69,7 +60,7 @@ module DTK::Client
|
|
69
60
|
node_group_id = context_params.retrieve_arguments([:option_1!],method_argument_names)
|
70
61
|
unless options.force?
|
71
62
|
# Ask user if really want to delete node group, if not then return to dtk-shell without deleting
|
72
|
-
return unless Console.confirmation_prompt("Are you sure you want to delete node group '#{node_group_id}'?
|
63
|
+
return unless Console.confirmation_prompt("Are you sure you want to delete node group '#{node_group_id}'"+'?')
|
73
64
|
end
|
74
65
|
|
75
66
|
post_body = {:node_group_id => node_group_id}
|
@@ -188,23 +179,8 @@ module DTK::Client
|
|
188
179
|
method_option :wait, :type => :boolean, :default => false
|
189
180
|
def task_status(context_params)
|
190
181
|
node_group_id = context_params.retrieve_arguments([:node_group_id!],method_argument_names)
|
191
|
-
task_status_aux(node_group_id,:node_group
|
192
|
-
end
|
193
|
-
|
194
|
-
#TODO: may deprecate
|
195
|
-
=begin
|
196
|
-
desc "set-profile NODE-GROUP-ID TEMPLATE-NODE-ID", "Set node group's default node template"
|
197
|
-
def set_profile(node_group_id,template_node_id)
|
198
|
-
post_body_hash = {:node_group_id => node_group_id, :template_node_id => template_node_id}
|
199
|
-
post rest_url("node_group/set_default_template_node"),post_body_hash
|
200
|
-
end
|
201
|
-
|
202
|
-
desc "add-template-node NODE-GROUP-ID", "Copy template node from library and add to node group"
|
203
|
-
def add_template_node(node_group_id)
|
204
|
-
post_body_hash = {:node_group_id => node_group_id}
|
205
|
-
post rest_url("node_group/clone_and_add_template_node"),post_body_hash
|
182
|
+
task_status_aux(node_group_id,:node_group,:wait => options.wait?)
|
206
183
|
end
|
207
|
-
=end
|
208
184
|
|
209
185
|
end
|
210
186
|
end
|
@@ -121,7 +121,7 @@ module DTK::Client
|
|
121
121
|
# :identifier_only => only on identifier level for given entity (command)
|
122
122
|
#
|
123
123
|
def self.override_allowed_methods()
|
124
|
-
|
124
|
+
override_methods = {
|
125
125
|
:all => {
|
126
126
|
# :node => [
|
127
127
|
# ['delete-component',"delete-component COMPONENT-ID","# Delete component from assembly's node"],
|
@@ -130,10 +130,6 @@ module DTK::Client
|
|
130
130
|
# ],
|
131
131
|
:component => [
|
132
132
|
['list-attributes',"list-attributes","# List attributes associated with given component."]
|
133
|
-
=begin
|
134
|
-
TODO: overlaps with different meaning
|
135
|
-
['create-attribute',"create-attribute SERVICE-TYPE DEP-ATTR ARROW BASE-ATTR","# Create an attribute to service link."],
|
136
|
-
=end
|
137
133
|
]
|
138
134
|
},
|
139
135
|
:command_only => {
|
@@ -161,7 +157,6 @@ TODO: overlaps with different meaning
|
|
161
157
|
['add-component',"add-component COMPONENT","# Add a component to the node."],
|
162
158
|
['delete-component',"delete-component COMPONENT-NAME [-y]","# Delete component from service's node"],
|
163
159
|
['info',"info","# Return info about node instance belonging to given workspace."],
|
164
|
-
# ['link-attributes', "link-attributes TARGET-ATTR-TERM SOURCE-ATTR-TERM", "# Set TARGET-ATTR-TERM to SOURCE-ATTR-TERM."],
|
165
160
|
['list-attributes',"list-attributes","# List attributes associated with service's node."],
|
166
161
|
['list-components',"list-components","# List components associated with service's node."],
|
167
162
|
['set-attribute',"set-attribute ATTRIBUTE-NAME [VALUE] [-u]","# (Un)Set attribute value. The option -u will unset the attribute's value."],
|
@@ -169,10 +164,14 @@ TODO: overlaps with different meaning
|
|
169
164
|
['stop', "stop", "# Stop node instance."],
|
170
165
|
['ssh', "ssh REMOTE-USER [-i PATH-TO-PEM]","# SSH into node, optional parameters are path to identity file."]
|
171
166
|
],
|
167
|
+
:node_group => [
|
168
|
+
['start', "start", "# 2Start node instance."],
|
169
|
+
['stop', "stop", "# 2Stop node instance."],
|
170
|
+
['ssh', "ssh REMOTE-USER [-i PATH-TO-PEM]","# 2SSH into node, optional parameters are path to identity file."]
|
171
|
+
],
|
172
172
|
:component => [
|
173
173
|
['info',"info","# Return info about component instance belonging to given node."],
|
174
174
|
['edit',"edit","# Edit component module related to given component."],
|
175
|
-
# ['edit-dsl',"edit-dsl","# Edit component module dsl file related to given component."],
|
176
175
|
['link-components',"link-components ANTECEDENT-CMP-NAME [DEPENDENCY-NAME]","#Link components to satisfy component dependency relationship."],
|
177
176
|
['list-component-links',"list-component-links","# List component's links to other components."],
|
178
177
|
['unlink-components',"unlink-components SERVICE-TYPE","# Delete service link on component."]
|
@@ -181,7 +180,13 @@ TODO: overlaps with different meaning
|
|
181
180
|
['info',"info","# Return info about attribute instance belonging to given component."]
|
182
181
|
]
|
183
182
|
}
|
184
|
-
}
|
183
|
+
}
|
184
|
+
|
185
|
+
if ::DTK::Configuration.get(:development_mode)
|
186
|
+
override_methods[:identifier_only][:node] << ['test-action-agent', "test-action-agent BASH-COMMAND-LINE", "Run bash command on test action agent"]
|
187
|
+
end
|
188
|
+
|
189
|
+
return DTK::Shell::OverrideTasks.new(override_methods, [:utils])
|
185
190
|
end
|
186
191
|
|
187
192
|
desc "SERVICE-NAME/ID destroy-and-reset-nodes [-y]", "Terminates all nodes, but keeps config state so they can be spun up from scratch."
|
@@ -207,7 +212,10 @@ TODO: overlaps with different meaning
|
|
207
212
|
cancel_task_aux(context_params)
|
208
213
|
end
|
209
214
|
|
210
|
-
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."
|
215
|
+
desc "SERVICE-NAME/ID create-assembly [NAMESPACE:]SERVICE-MODULE-NAME ASSEMBLY-NAME [-m DESCRIPTION]", "Create a new assembly from this service instance in the designated service module."
|
216
|
+
method_option "description",:aliases => "-m" ,
|
217
|
+
:type => :string,
|
218
|
+
:banner => "DESCRIPTION"
|
211
219
|
def create_assembly(context_params)
|
212
220
|
assembly_id, service_module_name, assembly_template_name = context_params.retrieve_arguments([:service_id!,:option_1!,:option_2!],method_argument_names)
|
213
221
|
|
@@ -216,7 +224,9 @@ TODO: overlaps with different meaning
|
|
216
224
|
return resp unless resp.ok?
|
217
225
|
default_namespace = resp.data
|
218
226
|
|
219
|
-
|
227
|
+
opts = {:default_namespace => default_namespace}
|
228
|
+
opts.merge!(:description => options.description) if options.description
|
229
|
+
response = promote_assembly_aux(:create,assembly_id,service_module_name,assembly_template_name,opts)
|
220
230
|
return response unless response.ok?
|
221
231
|
|
222
232
|
@@invalidate_map << :assembly
|
@@ -318,12 +328,17 @@ TODO: will put in dot release and will rename to 'extend'
|
|
318
328
|
end
|
319
329
|
=end
|
320
330
|
|
321
|
-
desc "SERVICE-NAME/ID task-status [--wait]", "Get the task status of the running or last running service task."
|
331
|
+
desc "SERVICE-NAME/ID task-status [--wait] [--summarize]", "Get the task status of the running or last running service task."
|
322
332
|
method_option :wait, :type => :boolean, :default => false
|
333
|
+
method_option :summarize, :type => :boolean, :default => false, :aliases => '-s'
|
323
334
|
def task_status(context_params)
|
324
335
|
task_status_aw_aux(context_params)
|
325
336
|
end
|
326
337
|
|
338
|
+
desc "SERVICE-NAME/ID task-action-detail", "Get the task info of the running or last running service task."
|
339
|
+
def task_action_detail(context_params)
|
340
|
+
task_action_detail_aw_aux(context_params)
|
341
|
+
end
|
327
342
|
|
328
343
|
desc "SERVICE-NAME/ID list-nodes","List nodes associated with service."
|
329
344
|
def list_nodes(context_params)
|
@@ -364,6 +379,11 @@ TODO: will put in dot release and will rename to 'extend'
|
|
364
379
|
list_violations_aux(context_params)
|
365
380
|
end
|
366
381
|
|
382
|
+
desc "SERVICE-NAME/ID print-includes", "Finds includes in the service."
|
383
|
+
def print_includes(context_params)
|
384
|
+
print_includes_aux(context_params)
|
385
|
+
end
|
386
|
+
|
367
387
|
desc "SERVICE-NAME/ID workflow-info", "Get the structure of the workflow associated with service."
|
368
388
|
def workflow_info(context_params)
|
369
389
|
workflow_info_aux(context_params)
|
@@ -7,6 +7,7 @@ dtk_require_from_base("commands/thor/assembly")
|
|
7
7
|
dtk_require_from_base('command_helpers/service_importer')
|
8
8
|
dtk_require_common_commands('thor/common')
|
9
9
|
dtk_require_common_commands('thor/module')
|
10
|
+
dtk_require_common_commands('thor/poller')
|
10
11
|
|
11
12
|
module DTK::Client
|
12
13
|
class ServiceModule < CommandBaseThor
|
@@ -17,6 +18,7 @@ module DTK::Client
|
|
17
18
|
include ReparseMixin
|
18
19
|
include ServiceImporter
|
19
20
|
include ModuleMixin
|
21
|
+
include Poller
|
20
22
|
|
21
23
|
def get_service_module_name(service_module_id)
|
22
24
|
get_name_from_id_helper(service_module_id)
|
@@ -144,7 +146,7 @@ module DTK::Client
|
|
144
146
|
end
|
145
147
|
response = post rest_url("service_module/#{action}"), { :service_module_id => service_module_id }
|
146
148
|
end
|
147
|
-
|
149
|
+
|
148
150
|
response.render_table(data_type) unless response.nil?
|
149
151
|
|
150
152
|
response
|
@@ -198,9 +198,12 @@ module DTK::Client
|
|
198
198
|
Response::Ok.new()
|
199
199
|
end
|
200
200
|
|
201
|
-
desc "WORKSPACE-NAME/ID create-assembly [NAMESPACE:]SERVICE-MODULE-NAME ASSEMBLY-NAME [-p]", "Create a new assembly from the workspace instance in the designated service module."
|
201
|
+
desc "WORKSPACE-NAME/ID create-assembly [NAMESPACE:]SERVICE-MODULE-NAME ASSEMBLY-NAME [-p] [-m DESCRIPTION]", "Create a new assembly from the workspace instance in the designated service module."
|
202
202
|
# The option -p will purge the workspace after assembly creation."
|
203
203
|
method_option :purge, :aliases => '-p', :type => :boolean, :default => false
|
204
|
+
method_option "description",:aliases => "-m" ,
|
205
|
+
:type => :string,
|
206
|
+
:banner => "DESCRIPTION"
|
204
207
|
def create_assembly(context_params)
|
205
208
|
workspace_id, service_module_full_name, assembly_template_name = context_params.retrieve_arguments([:workspace_id!,:option_1!,:option_2!],method_argument_names)
|
206
209
|
|
@@ -209,7 +212,9 @@ module DTK::Client
|
|
209
212
|
return resp unless resp.ok?
|
210
213
|
default_namespace = resp.data
|
211
214
|
|
212
|
-
|
215
|
+
opts = {:default_namespace => default_namespace}
|
216
|
+
opts.merge!(:description => options.description) if options.description
|
217
|
+
response = promote_assembly_aux(:create,workspace_id,service_module_full_name,assembly_template_name,opts)
|
213
218
|
return response unless response.ok?
|
214
219
|
|
215
220
|
if options.purge?
|
@@ -475,12 +480,17 @@ module DTK::Client
|
|
475
480
|
tail_aux(context_params)
|
476
481
|
end
|
477
482
|
|
478
|
-
desc "WORKSPACE-NAME/ID task-status [--wait]", "Get the task status of the running or last running workspace task."
|
483
|
+
desc "WORKSPACE-NAME/ID task-status [--wait] [--summarize]", "Get the task status of the running or last running workspace task."
|
479
484
|
method_option :wait, :type => :boolean, :default => false
|
485
|
+
method_option :summarize, :type => :boolean, :default => false, :aliases => '-s'
|
480
486
|
def task_status(context_params)
|
481
487
|
task_status_aw_aux(context_params)
|
482
488
|
end
|
483
489
|
|
490
|
+
desc "WORKSPACE-NAME/ID task-action-detail", "Get the task info of the running or last running workspace task."
|
491
|
+
def task_action_detail(context_params)
|
492
|
+
task_action_detail_aw_aux(context_params)
|
493
|
+
end
|
484
494
|
end
|
485
495
|
end
|
486
496
|
|
data/lib/core.rb
CHANGED
@@ -6,6 +6,10 @@ require 'restclient'
|
|
6
6
|
require 'colorize'
|
7
7
|
require 'json'
|
8
8
|
require 'pp'
|
9
|
+
|
10
|
+
if ::DTK::Configuration.get(:development_mode)
|
11
|
+
require 'ap'
|
12
|
+
end
|
9
13
|
#TODO: for testing; fix by pass in commadn line argument
|
10
14
|
#RestClient.log = STDOUT
|
11
15
|
|
@@ -134,7 +138,10 @@ def resolve_direct_access(params, config_exists=nil)
|
|
134
138
|
# setting up catalog credentials
|
135
139
|
catalog_creds = DTK::Client::Configurator.ask_catalog_credentials()
|
136
140
|
unless catalog_creds.empty?
|
137
|
-
response = conn.post DTK::Client::CommandBase.class, conn.rest_url("account/set_catalog_credentials"), { :username => catalog_creds[:username], :password => catalog_creds[:password]}
|
141
|
+
response = conn.post DTK::Client::CommandBase.class, conn.rest_url("account/set_catalog_credentials"), { :username => catalog_creds[:username], :password => catalog_creds[:password], :validate => true}
|
142
|
+
if errors = response['errors']
|
143
|
+
DTK::Client::OsUtil.print("#{errors.first['message']} You will have to set catalog credentials manually ('dtk account set-catalog-credentials').", :yellow)
|
144
|
+
end
|
138
145
|
end
|
139
146
|
end
|
140
147
|
|
@@ -446,11 +453,14 @@ module DTK
|
|
446
453
|
end
|
447
454
|
|
448
455
|
def get_credentials()
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
456
|
+
unless @parsed_credentials
|
457
|
+
cred_file = Config::CRED_FILE
|
458
|
+
raise DTK::Client::DtkError,"Authorization configuration file (#{cred_file}) does not exist" unless File.exists?(cred_file)
|
459
|
+
ret = parse_key_value_file(cred_file)
|
460
|
+
[:username,:password].each{ |k| raise DTK::Client::DtkError,"cannot find #{k}" unless ret[k] }
|
461
|
+
@parsed_credentials = ret
|
462
|
+
end
|
463
|
+
@parsed_credentials
|
454
464
|
end
|
455
465
|
|
456
466
|
####
|
data/lib/domain/git_adapter.rb
CHANGED
@@ -140,9 +140,6 @@ module DTK
|
|
140
140
|
when :remote_branch
|
141
141
|
@git_repo.branches.remote.find { |r| "#{r.remote}/#{r.name}" == ref }
|
142
142
|
when :local_branch
|
143
|
-
# DEBUG SNIPPET >>>> REMOVE <<<<
|
144
|
-
# TODO: HARIS LOOK INTO THIS
|
145
|
-
# raise "Invalid ref #{ref}"
|
146
143
|
@git_repo.branches.find { |b| b.name == ref }
|
147
144
|
else
|
148
145
|
raise Error.new("Illegal type parameter (#{type}) passed to merge_relationship")
|