dtk-client 0.7.4.1 → 0.7.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 +4 -4
- data/bin/dtk +10 -3
- data/bin/dtk-shell +1 -1
- data/lib/command_helpers/git_repo.rb +26 -20
- data/lib/command_helpers/jenkins_client.rb +4 -3
- data/lib/command_helpers/service_importer.rb +37 -25
- data/lib/commands.rb +2 -2
- data/lib/commands/common/thor/assembly_workspace.rb +185 -173
- data/lib/commands/common/thor/base_command_helper.rb +42 -0
- data/lib/commands/common/thor/clone.rb +1 -1
- data/lib/commands/common/thor/module.rb +37 -58
- data/lib/commands/common/thor/module/import.rb +1 -1
- data/lib/commands/common/thor/pull_from_remote.rb +7 -12
- data/lib/commands/common/thor/purge_clone.rb +1 -1
- data/lib/commands/common/thor/push_clone_changes.rb +3 -1
- data/lib/commands/common/thor/task_status.rb +52 -75
- data/lib/commands/common/thor/task_status/refresh_mode.rb +56 -0
- data/lib/commands/common/thor/task_status/snapshot_mode.rb +11 -0
- data/lib/commands/common/thor/task_status/stream_mode.rb +31 -0
- data/lib/commands/common/thor/task_status/stream_mode/element.rb +90 -0
- data/lib/commands/common/thor/task_status/stream_mode/element/no_results.rb +10 -0
- data/lib/commands/common/thor/task_status/stream_mode/element/render.rb +88 -0
- data/lib/commands/common/thor/task_status/stream_mode/element/stage.rb +13 -0
- data/lib/commands/common/thor/task_status/stream_mode/element/task_end.rb +10 -0
- data/lib/commands/common/thor/task_status/stream_mode/element/task_start.rb +10 -0
- data/lib/commands/thor/account.rb +10 -8
- data/lib/commands/thor/assembly.rb +9 -2
- data/lib/commands/thor/component_module.rb +0 -52
- data/lib/commands/thor/library.rb +1 -0
- data/lib/commands/thor/node.rb +1 -36
- data/lib/commands/thor/node_template.rb +4 -47
- data/lib/commands/thor/service.rb +57 -46
- data/lib/commands/thor/service_module.rb +2 -49
- data/lib/commands/thor/target.rb +7 -7
- data/lib/commands/thor/workspace.rb +44 -27
- data/lib/context_router.rb +4 -0
- data/lib/core.rb +71 -99
- data/lib/domain/response.rb +9 -0
- data/lib/domain/response/error_handler.rb +61 -0
- data/lib/dtk-client/version.rb +1 -1
- data/lib/dtk_client.rb +14 -0
- data/lib/dtk_error.rb +91 -0
- data/lib/error.rb +3 -9
- data/lib/execute/cli_pure/cli_rerouter.rb +82 -0
- data/lib/parser/adapters/thor.rb +3 -0
- data/lib/shell.rb +2 -1
- data/lib/shell/domain/context_params.rb +2 -0
- data/lib/util/console.rb +1 -1
- data/lib/util/os_util.rb +1 -0
- data/lib/util/remote_dependency_util.rb +20 -3
- data/lib/view_processor/table_print.rb +7 -25
- metadata +17 -5
- data/lib/commands/common/thor/test_action_agent.rb +0 -39
- data/lib/commands/thor/repo.rb +0 -35
@@ -0,0 +1,56 @@
|
|
1
|
+
module DTK::Client
|
2
|
+
class TaskStatus
|
3
|
+
class RefreshMode < self
|
4
|
+
def task_status(opts={})
|
5
|
+
begin
|
6
|
+
response = nil
|
7
|
+
loop do
|
8
|
+
response = post_call(opts)
|
9
|
+
return response unless response.ok?
|
10
|
+
|
11
|
+
# stop pulling when top level task succeds, fails or timeout
|
12
|
+
if response and response.data and response.data.first
|
13
|
+
#TODO: may fix in server, but now top can have non executing state but a concurrent branch can execute; so
|
14
|
+
#chanding bloew for time being
|
15
|
+
#break unless response.data.first["status"].eql? "executing"
|
16
|
+
# TODO: There is bug where we do not see executing status on start so we have to wait until at
|
17
|
+
# least one 'successed' has been found
|
18
|
+
|
19
|
+
top_task_failed = response.data.first['status'].eql?('failed')
|
20
|
+
is_pending = (response.data.select {|r|r["status"].nil? }).size > 0
|
21
|
+
is_executing = (response.data.select {|r|r["status"].eql? "executing"}).size > 0
|
22
|
+
is_failed = (response.data.select {|r|r["status"].eql? "failed"}).size > 0
|
23
|
+
is_cancelled = response.data.first["status"].eql?("cancelled")
|
24
|
+
|
25
|
+
# commented out because of DTK-1804
|
26
|
+
# when some of the converge tasks fail, stop task-status --wait and set task status to '' for remaining tasks which are not executed
|
27
|
+
# if is_failed
|
28
|
+
# response.data.each {|r| (r["status"] = "") if r["status"].eql?("executing")}
|
29
|
+
# is_cancelled = true
|
30
|
+
# end
|
31
|
+
is_cancelled = true if top_task_failed
|
32
|
+
|
33
|
+
unless (is_executing || is_pending) && !is_cancelled
|
34
|
+
system('clear')
|
35
|
+
response.print_error_table = true
|
36
|
+
response.render_table(:task_status)
|
37
|
+
return response
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
response.render_table(:task_status)
|
42
|
+
system('clear')
|
43
|
+
response.render_data(true)
|
44
|
+
|
45
|
+
Console.wait_animation("Watching '#{@object_type}' task status [ #{DEBUG_SLEEP_TIME} seconds refresh ] ", DEBUG_SLEEP_TIME)
|
46
|
+
end
|
47
|
+
rescue Interrupt => e
|
48
|
+
puts ""
|
49
|
+
# this tells rest of the flow to skip rendering of this response
|
50
|
+
response.skip_render = true unless response.nil?
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'hirb'
|
2
|
+
module DTK::Client
|
3
|
+
class TaskStatus
|
4
|
+
class StreamMode < self
|
5
|
+
require File.expand_path('stream_mode/element',File.dirname(__FILE__))
|
6
|
+
|
7
|
+
def get_and_render()
|
8
|
+
Element.get_and_render_task_start(self)
|
9
|
+
Element.get_and_render_stages(self,:wait => WaitWhenNoResults)
|
10
|
+
Response::Ok.new()
|
11
|
+
end
|
12
|
+
|
13
|
+
WaitWhenNoResults = 5 #in seconds
|
14
|
+
# making this public for this class and its children
|
15
|
+
def post_call(*args)
|
16
|
+
super
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
# This uses a cursor based interface to the server
|
22
|
+
# start_index: START_INDEX
|
23
|
+
# end_index: END_INDEX
|
24
|
+
# convention is start_position = 0 and end_position = 0 means top level task with start time
|
25
|
+
def post_body(opts={})
|
26
|
+
ret = super(opts)
|
27
|
+
ret.merge(:start_index => opts[:start_index], :end_index => opts[:end_index])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module DTK::Client; class TaskStatus::StreamMode
|
2
|
+
class Element
|
3
|
+
require File.expand_path('element/task_start',File.dirname(__FILE__))
|
4
|
+
require File.expand_path('element/task_end',File.dirname(__FILE__))
|
5
|
+
require File.expand_path('element/stage',File.dirname(__FILE__))
|
6
|
+
require File.expand_path('element/no_results',File.dirname(__FILE__))
|
7
|
+
require File.expand_path('element/render',File.dirname(__FILE__))
|
8
|
+
include RenderMixin
|
9
|
+
|
10
|
+
def initialize(response_element)
|
11
|
+
@response_element = response_element
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.get_and_render_task_start(task_status_handle)
|
15
|
+
render_elements(TaskStart.get(task_status_handle))
|
16
|
+
end
|
17
|
+
|
18
|
+
# opts has
|
19
|
+
# :wait - amount to wait if get no results (required)
|
20
|
+
def self.get_and_render_stages(task_status_handle,opts={})
|
21
|
+
unless wait = opts[:wait]
|
22
|
+
raise DtkError::Client, "opts[:wait] must be set"
|
23
|
+
end
|
24
|
+
|
25
|
+
stage = 1
|
26
|
+
task_end = false
|
27
|
+
until task_end do
|
28
|
+
elements = Stage.get(task_status_handle,stage)
|
29
|
+
if no_results_yet?(elements)
|
30
|
+
sleep wait
|
31
|
+
next
|
32
|
+
end
|
33
|
+
|
34
|
+
render_elements(elements)
|
35
|
+
|
36
|
+
if task_end?(elements)
|
37
|
+
task_end = true
|
38
|
+
else
|
39
|
+
stage += 1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def render()
|
45
|
+
#TODO: stub
|
46
|
+
#TODO: make this nil and overwride all elements types to render
|
47
|
+
pp [:element,self.class,self]
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
# opts will have
|
52
|
+
# :start_index
|
53
|
+
# :end_index
|
54
|
+
def self.get_task_status_elements(task_status_handle,element_type,opts={})
|
55
|
+
response = task_status_handle.post_call(opts.merge(:form => :stream_form))
|
56
|
+
create_elements(response)
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.create_elements(response)
|
60
|
+
response_elements = response.data
|
61
|
+
unless response_elements.kind_of?(Array)
|
62
|
+
raise DtkError::Client.new("Unexpected that response.data no at array")
|
63
|
+
end
|
64
|
+
response_elements.map{|el|create(el)}
|
65
|
+
end
|
66
|
+
def self.create(response_element)
|
67
|
+
type = response_element['type']
|
68
|
+
case type && type.to_sym
|
69
|
+
when :task_start then TaskStart.new(response_element)
|
70
|
+
when :task_end then TaskEnd.new(response_element)
|
71
|
+
when :stage then Stage.new(response_element)
|
72
|
+
when :no_results then NoResults.new(response_element)
|
73
|
+
else raise DtkError::Client.new("Unexpected element type '#{type}'")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.task_end?(elements)
|
78
|
+
elements.empty? or elements.last.kind_of?(TaskEnd)
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.no_results_yet?(elements)
|
82
|
+
elements.find{|el|el.kind_of?(NoResults)}
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.render_elements(elements)
|
86
|
+
elements.each{|el|el.render()}
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end; end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module DTK::Client; class TaskStatus::StreamMode
|
2
|
+
class Element
|
3
|
+
module RenderMixin
|
4
|
+
end
|
5
|
+
end
|
6
|
+
end; end
|
7
|
+
|
8
|
+
=begin
|
9
|
+
def task_status_old()
|
10
|
+
current_index = 1
|
11
|
+
last_printed_index = 0
|
12
|
+
success_indices = []
|
13
|
+
loop do
|
14
|
+
response = post_call(:form => :stream_form)
|
15
|
+
return response unless response.ok?
|
16
|
+
|
17
|
+
current_tasks = response.data.select { |el| el['index'] == current_index }
|
18
|
+
main_task = current_tasks.find { |el| el['sub_index'].nil? }
|
19
|
+
|
20
|
+
# this means this is last tasks
|
21
|
+
unless main_task
|
22
|
+
print_succeeded_tasks(response.data, success_indices)
|
23
|
+
return Response::Ok.new()
|
24
|
+
end
|
25
|
+
|
26
|
+
case main_task['status']
|
27
|
+
when 'executing'
|
28
|
+
if (last_printed_index != current_index)
|
29
|
+
OsUtil.clear_screen
|
30
|
+
print_succeeded_tasks(response.data, success_indices)
|
31
|
+
print_tasks(current_tasks)
|
32
|
+
last_printed_index = current_index
|
33
|
+
end
|
34
|
+
when 'succeeded'
|
35
|
+
success_indices << current_index
|
36
|
+
current_index += 1
|
37
|
+
when nil
|
38
|
+
# ignore
|
39
|
+
else
|
40
|
+
errors = current_tasks.collect { |ct| ct['errors'] }.compact
|
41
|
+
error_msg = errors.collect { |err| err['message'] }.uniq.join(', ')
|
42
|
+
raise DtkError, "We've run into an error on task '#{main_task['type']}' status '#{main_task['status']}', error: #{error_msg}"
|
43
|
+
end
|
44
|
+
|
45
|
+
sleep(5)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
def print_tasks(tasks)
|
51
|
+
hirb_options = {
|
52
|
+
:headers => nil,
|
53
|
+
:filters => [Proc.new { |a| append_to(25, a) },
|
54
|
+
Proc.new { |a| append_to(15, a)},
|
55
|
+
Proc.new { |a| append_to(15, a)},
|
56
|
+
Proc.new { |a| append_to(8, a)}],
|
57
|
+
:unicode => true,
|
58
|
+
:description => false
|
59
|
+
}
|
60
|
+
|
61
|
+
tasks.each do |task|
|
62
|
+
node_name = task['node'] ? task['node']['name'] : ''
|
63
|
+
|
64
|
+
puts Hirb::Helpers::AutoTable.render([[task['type'], task['status'], node_name, task['duration'], parse_date(task['started_at']), parse_date(task['ended_at'])]], hirb_options)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def print_succeeded_tasks(tasks, success_indices)
|
69
|
+
succeeded_tasks = tasks.select { |task| success_indices.include?(task['index']) }
|
70
|
+
print_tasks(succeeded_tasks)
|
71
|
+
end
|
72
|
+
|
73
|
+
def parse_date(string_date)
|
74
|
+
string_date.nil? ? (' ' * 17) : DateTime.parse(string_date).strftime('%H:%M:%S %d/%m/%y')
|
75
|
+
end
|
76
|
+
|
77
|
+
def append_to(number_of_chars, value)
|
78
|
+
value ||= ''
|
79
|
+
value.strip!
|
80
|
+
appending_str = ' ' * (number_of_chars - value.size)
|
81
|
+
value.insert(0, appending_str)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
=end
|
88
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module DTK::Client; class TaskStatus::StreamMode
|
2
|
+
class Element
|
3
|
+
class Stage < self
|
4
|
+
def self.get(task_status_handle,stage_num)
|
5
|
+
get_stages(task_status_handle,stage_num,stage_num)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.get_stages(task_status_handle,start_stage_num,end_stage_num)
|
9
|
+
get_task_status_elements(task_status_handle,:stage,:start_index => start_stage_num, :end_index => end_stage_num)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end; end
|
@@ -33,7 +33,7 @@ module DTK::Client
|
|
33
33
|
[response, key_exists_already]
|
34
34
|
end
|
35
35
|
|
36
|
-
def self.add_key(path_to_key, name='dtk-client')
|
36
|
+
def self.add_key(path_to_key, first_registration=false, name='dtk-client')
|
37
37
|
match, matched_username = nil, nil
|
38
38
|
|
39
39
|
unless File.file?(path_to_key)
|
@@ -45,6 +45,7 @@ module DTK::Client
|
|
45
45
|
|
46
46
|
post_body = { :rsa_pub_key => rsa_pub_key.chomp }
|
47
47
|
post_body.merge!(:username => name.chomp) if name
|
48
|
+
post_body.merge!(:first_registration => first_registration)
|
48
49
|
|
49
50
|
proper_response = nil
|
50
51
|
response, key_exists_already = Account.internal_add_user_access("account/add_user_direct_access", post_body, 'service module')
|
@@ -58,7 +59,8 @@ module DTK::Client
|
|
58
59
|
repo_manager_fingerprint,repo_manager_dns = response.data_ret_and_remove!(:repo_manager_fingerprint,:repo_manager_dns)
|
59
60
|
|
60
61
|
SSHUtil.update_ssh_known_hosts(repo_manager_dns,repo_manager_fingerprint)
|
61
|
-
name
|
62
|
+
name = response.data["new_username"]
|
63
|
+
|
62
64
|
OsUtil.print("SSH key '#{name}' added successfully!", :yellow)
|
63
65
|
|
64
66
|
end
|
@@ -117,7 +119,7 @@ module DTK::Client
|
|
117
119
|
name, path_to_key = context_params.retrieve_arguments([:option_1!, :option_2],method_argument_names)
|
118
120
|
path_to_key ||= SSHUtil.default_rsa_pub_key_path()
|
119
121
|
|
120
|
-
response, matched, matched_username = Account.add_key(path_to_key, name)
|
122
|
+
response, matched, matched_username = Account.add_key(path_to_key, false, name)
|
121
123
|
|
122
124
|
if matched
|
123
125
|
DTK::Client::OsUtil.print("Provided SSH pub key has already been added.", :yellow)
|
@@ -127,8 +129,8 @@ module DTK::Client
|
|
127
129
|
DTK::Client::Configurator.add_current_user_to_direct_access() if response.ok?
|
128
130
|
end
|
129
131
|
|
130
|
-
if response.ok? &&
|
131
|
-
OsUtil.print("Warning: We were not able to register your key with remote catalog!
|
132
|
+
if response.ok? && response.data(:repoman_registration_error)
|
133
|
+
OsUtil.print("Warning: We were not able to register your key with remote catalog! #{response.data(:repoman_registration_error)}", :yellow)
|
132
134
|
end
|
133
135
|
|
134
136
|
response.ok? ? nil : response
|
@@ -147,8 +149,8 @@ module DTK::Client
|
|
147
149
|
response = post rest_url("account/remove_user_direct_access"), { :username => name.chomp }
|
148
150
|
return response unless response.ok?
|
149
151
|
|
150
|
-
if response.ok? &&
|
151
|
-
OsUtil.print("Warning: We were not able to unregister your key with remote catalog!", :yellow)
|
152
|
+
if response.ok? && response.data(:repoman_registration_error)
|
153
|
+
OsUtil.print("Warning: We were not able to unregister your key with remote catalog! #{response.data(:repoman_registration_error)}", :yellow)
|
152
154
|
end
|
153
155
|
|
154
156
|
OsUtil.print("SSH key '#{name}' removed successfully!", :yellow)
|
@@ -171,7 +173,7 @@ module DTK::Client
|
|
171
173
|
def set_catalog_credentials(context_params)
|
172
174
|
creds = DTK::Client::Configurator.enter_catalog_credentials()
|
173
175
|
|
174
|
-
response = post rest_url("account/set_catalog_credentials"), { :username => creds[:username], :password => creds[:password] }
|
176
|
+
response = post rest_url("account/set_catalog_credentials"), { :username => creds[:username], :password => creds[:password], :validate => true }
|
175
177
|
return response unless response.ok?
|
176
178
|
|
177
179
|
OsUtil.print("Your catalog credentials have been set!", :yellow)
|
@@ -194,11 +194,14 @@ module DTK::Client
|
|
194
194
|
:type => :string
|
195
195
|
method_option :settings, :type => :string, :aliases => '-s'
|
196
196
|
def stage(context_params)
|
197
|
-
assembly_template_id, name = context_params.retrieve_arguments([:assembly_id!, :option_1],method_argument_names)
|
197
|
+
assembly_template_id, service_module_id, name = context_params.retrieve_arguments([:assembly_id!, :service_module_id, :option_1],method_argument_names)
|
198
198
|
post_body = {
|
199
199
|
:assembly_id => assembly_template_id
|
200
200
|
}
|
201
201
|
|
202
|
+
# special case when we need service module id
|
203
|
+
post_body[:service_module_id] = service_module_id if context_params.pure_cli_mode
|
204
|
+
|
202
205
|
# using this to make sure cache will be invalidated after new assembly is created from other commands e.g.
|
203
206
|
# 'assembly-create', 'install' etc.
|
204
207
|
@@invalidate_map << :assembly
|
@@ -251,10 +254,14 @@ module DTK::Client
|
|
251
254
|
method_option :settings, :type => :string, :aliases => '-s'
|
252
255
|
def deploy(context_params)
|
253
256
|
context_params.forward_options(options)
|
254
|
-
assembly_template_id, name = context_params.retrieve_arguments([:assembly_id!, :option_1],method_argument_names)
|
257
|
+
assembly_template_id, service_module_id, name = context_params.retrieve_arguments([:assembly_id!, :service_module_id, :option_1],method_argument_names)
|
255
258
|
post_body = {
|
256
259
|
:assembly_id => assembly_template_id
|
257
260
|
}
|
261
|
+
|
262
|
+
# special case when we need service module id
|
263
|
+
post_body[:service_module_id] = service_module_id if context_params.pure_cli_mode
|
264
|
+
|
258
265
|
if commit_msg = options["commit_msg"]
|
259
266
|
post_body.merge!(:commit_msg => commit_msg)
|
260
267
|
end
|
@@ -326,58 +326,6 @@ module DTK::Client
|
|
326
326
|
list_collaborators_module_aux(context_params)
|
327
327
|
end
|
328
328
|
|
329
|
-
|
330
|
-
#### end: commands to interact with remote repo ###
|
331
|
-
|
332
|
-
#### commands to manage workspace and versioning ###
|
333
|
-
=begin
|
334
|
-
desc "COMPONENT-MODULE-NAME/ID create-version VERSION", "Snapshot current state of component module as a new version"
|
335
|
-
def create_version(context_params)
|
336
|
-
component_module_id,version = context_params.retrieve_arguments([:component_module_id!,:option_1!],method_argument_names)
|
337
|
-
|
338
|
-
post_body = {
|
339
|
-
:component_module_id => component_module_id,
|
340
|
-
:rsa_pub_key => SSHUtil.rsa_pub_key_content()
|
341
|
-
}
|
342
|
-
response = post rest_url("component_module/versions"), post_body
|
343
|
-
return response unless response.ok?
|
344
|
-
versions = (response.data.first && response.data.first['versions'])||Array.new
|
345
|
-
if versions.include?(version)
|
346
|
-
return Response::Error::Usage.new("Version #{version} exists already")
|
347
|
-
end
|
348
|
-
|
349
|
-
component_module_name = get_module_name(component_module_id)
|
350
|
-
module_location = OsUtil.module_location(:component_module,component_module_name,version)
|
351
|
-
if File.directory?(module_location)
|
352
|
-
return Response::Error::Usage.new("Target component module directory for version #{version} (#{module_location}) exists already; it must be deleted and this comamnd retried")
|
353
|
-
end
|
354
|
-
|
355
|
-
post_body = {
|
356
|
-
:component_module_id => component_module_id,
|
357
|
-
:version => version
|
358
|
-
}
|
359
|
-
response = post rest_url("component_module/create_new_version"), post_body
|
360
|
-
return response unless response.ok?
|
361
|
-
|
362
|
-
internal_trigger = omit_output = true
|
363
|
-
clone_aux(:component_module,component_module_id,version,internal_trigger,omit_output)
|
364
|
-
end
|
365
|
-
=end
|
366
|
-
=begin
|
367
|
-
desc "COMPONENT-MODULE-NAME/ID list-versions","List all versions associated with this component module."
|
368
|
-
def list_versions(context_params)
|
369
|
-
component_module_id = context_params.retrieve_arguments([:component_module_id!],method_argument_names)
|
370
|
-
post_body = {
|
371
|
-
:component_module_id => component_module_id,
|
372
|
-
:detail_to_include => ["remotes"],
|
373
|
-
:rsa_pub_key => SSHUtil.rsa_pub_key_content()
|
374
|
-
}
|
375
|
-
response = post rest_url("component_module/versions"), post_body
|
376
|
-
|
377
|
-
response.render_table(:module_version)
|
378
|
-
end
|
379
|
-
=end
|
380
|
-
|
381
329
|
##
|
382
330
|
#
|
383
331
|
# internal_trigger: this flag means that other method (internal) has trigger this.
|