foreman_acd 0.0.6 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/foreman_acd/api/v2/app_definitions_controller.rb +1 -2
- data/app/controllers/foreman_acd/app_definitions_controller.rb +29 -1
- data/app/controllers/foreman_acd/app_instances_controller.rb +70 -21
- data/app/controllers/foreman_acd/concerns/app_definition_parameters.rb +1 -1
- data/app/controllers/foreman_acd/concerns/app_instance_parameters.rb +1 -1
- data/app/controllers/ui_acd_controller.rb +0 -1
- data/app/models/foreman_acd/app_definition.rb +0 -1
- data/app/views/foreman_acd/app_definitions/_form.html.erb +6 -14
- data/app/views/foreman_acd/app_definitions/import.html.erb +18 -0
- data/app/views/foreman_acd/app_definitions/index.html.erb +9 -5
- data/app/views/foreman_acd/app_instances/_form.html.erb +5 -5
- data/app/views/foreman_acd/app_instances/deploy.html.erb +19 -0
- data/app/views/foreman_acd/app_instances/index.html.erb +6 -5
- data/app/views/foreman_acd/app_instances/report.html.erb +19 -0
- data/app/views/ui_acd/app_definition.json.rabl +1 -1
- data/config/routes.rb +7 -0
- data/db/migrate/20190610202252_create_app_definitions.rb +1 -3
- data/db/migrate/20190625140305_create_app_instances.rb +1 -1
- data/lib/foreman_acd/plugin.rb +19 -2
- data/lib/foreman_acd/version.rb +1 -1
- data/webpack/components/ApplicationDefinition/ApplicationDefinition.js +261 -0
- data/webpack/components/ApplicationDefinition/ApplicationDefinition.scss +1 -0
- data/webpack/components/ApplicationDefinition/ApplicationDefinitionActions.js +211 -0
- data/webpack/components/ApplicationDefinition/ApplicationDefinitionConstants.js +9 -0
- data/webpack/components/ApplicationDefinition/ApplicationDefinitionReducer.js +147 -0
- data/webpack/components/ApplicationDefinition/ApplicationDefinitionSelectors.js +6 -0
- data/webpack/components/ApplicationDefinition/index.js +29 -0
- data/webpack/components/ApplicationInstance/ApplicationInstance.js +342 -0
- data/webpack/components/ApplicationInstance/ApplicationInstance.scss +11 -0
- data/webpack/components/ApplicationInstance/ApplicationInstanceActions.js +210 -0
- data/webpack/components/ApplicationInstance/ApplicationInstanceConstants.js +12 -0
- data/webpack/components/ApplicationInstance/ApplicationInstanceReducer.js +223 -0
- data/webpack/components/ApplicationInstance/ApplicationInstanceSelectors.js +8 -0
- data/webpack/components/ApplicationInstance/components/AppDefinitionSelector.js +49 -0
- data/webpack/components/ApplicationInstance/components/Service.js +30 -0
- data/webpack/components/ApplicationInstance/components/ServiceCounter.js +37 -0
- data/webpack/components/ApplicationInstance/index.js +33 -0
- data/webpack/components/ApplicationInstanceReport/ApplicationInstanceReport.js +155 -0
- data/webpack/components/ApplicationInstanceReport/ApplicationInstanceReport.scss +27 -0
- data/webpack/components/ApplicationInstanceReport/ApplicationInstanceReportActions.js +86 -0
- data/webpack/components/ApplicationInstanceReport/ApplicationInstanceReportConstants.js +4 -0
- data/webpack/components/ApplicationInstanceReport/ApplicationInstanceReportReducer.js +52 -0
- data/webpack/components/ApplicationInstanceReport/ApplicationInstanceReportSelectors.js +5 -0
- data/webpack/components/ApplicationInstanceReport/components/ReportViewer.js +26 -0
- data/webpack/components/ApplicationInstanceReport/index.js +27 -0
- data/webpack/components/ParameterSelection/ParameterSelection.js +65 -161
- data/webpack/components/ParameterSelection/ParameterSelection.scss +9 -0
- data/webpack/components/ParameterSelection/ParameterSelectionActions.js +42 -71
- data/webpack/components/ParameterSelection/ParameterSelectionConstants.js +12 -19
- data/webpack/components/ParameterSelection/ParameterSelectionHelper.js +3 -3
- data/webpack/components/ParameterSelection/ParameterSelectionReducer.js +76 -75
- data/webpack/components/ParameterSelection/ParameterSelectionSelectors.js +2 -6
- data/webpack/components/ParameterSelection/__fixtures__/parameterSelection.fixtures.js +12 -21
- data/webpack/components/ParameterSelection/__fixtures__/parameterSelectionData_1.fixtures.js +1 -1
- data/webpack/components/ParameterSelection/__fixtures__/parameterSelectionReducer.fixtures.js +3 -45
- data/webpack/components/ParameterSelection/__tests__/ParameterSelection.test.js +20 -0
- data/webpack/components/ParameterSelection/__tests__/ParameterSelectionReducer.test.js +22 -46
- data/webpack/components/ParameterSelection/__tests__/ParameterSelectionSelectors.test.js +6 -6
- data/webpack/components/ParameterSelection/__tests__/__snapshots__/ParameterSelection.test.js.snap +40 -265
- data/webpack/components/ParameterSelection/__tests__/__snapshots__/ParameterSelectionReducer.test.js.snap +11 -96
- data/webpack/components/ParameterSelection/__tests__/__snapshots__/ParameterSelectionSelectors.test.js.snap +3 -9
- data/webpack/components/ParameterSelection/index.js +4 -6
- data/webpack/components/common/AddTableEntry.js +30 -0
- data/webpack/components/common/DeleteTableEntry.js +39 -0
- data/webpack/components/common/ExtSelect.js +43 -0
- data/webpack/components/common/RailsData.js +27 -0
- data/webpack/components/common/__tests__/AddTableEntry.test.js +26 -0
- data/webpack/components/common/__tests__/DeleteTableEntry.test.js +29 -0
- data/webpack/components/common/__tests__/ExtSelect.test.js +38 -0
- data/webpack/components/common/__tests__/RailsData.test.js +16 -0
- data/webpack/components/common/__tests__/__snapshots__/AddParameter.test.js.snap +35 -0
- data/webpack/components/common/__tests__/__snapshots__/AddTableEntry.test.js.snap +35 -0
- data/webpack/components/common/__tests__/__snapshots__/DeleteParameter.test.js.snap +41 -0
- data/webpack/components/common/__tests__/__snapshots__/DeleteTableEntry.test.js.snap +41 -0
- data/webpack/components/common/__tests__/__snapshots__/ExtSelect.test.js.snap +18 -0
- data/webpack/components/common/__tests__/__snapshots__/RailsData.test.js.snap +10 -0
- data/webpack/helper.js +20 -0
- data/webpack/index.js +6 -0
- data/webpack/reducer.js +40 -3
- metadata +47 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef0b36ad161877bede4fe9a9df532a8201fc31710b1f42ab988152aeba863cac
|
4
|
+
data.tar.gz: a629384ff81f18c21883ea4a09a76828988bff02e6a709a7f2151e77fff46836
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c8843594e0cbad7c6b85398c8b4d2c8fe18703ef7dc5c2ebd4fd46ccd0690a3cf30588e13dcef66e9d568fa4c5ca97fd272ebb5f5107e3f2ad1258f9fb9d35f
|
7
|
+
data.tar.gz: 99181b0218e89485fffedfdd1374b095c1830614718332246f72238af50adb65610e03fdaa0a035f6cd68208d8f72679b141eac2b558dc1824abb30b21120b56
|
@@ -24,8 +24,7 @@ module ForemanAcd
|
|
24
24
|
param :app_definition, Hash, :required => true, :action_aware => true do
|
25
25
|
param :name, String, :required => true
|
26
26
|
param :description, String, :required => true
|
27
|
-
param :
|
28
|
-
param :parameters, String, :required => true
|
27
|
+
param :services, String, :required => true
|
29
28
|
end
|
30
29
|
end
|
31
30
|
|
@@ -6,7 +6,8 @@ module ForemanAcd
|
|
6
6
|
include Foreman::Controller::AutoCompleteSearch
|
7
7
|
include ::ForemanAcd::Concerns::AppDefinitionParameters
|
8
8
|
|
9
|
-
before_action :find_resource, :only => [:edit, :update, :destroy]
|
9
|
+
before_action :find_resource, :only => [:edit, :update, :destroy, :export]
|
10
|
+
before_action :handle_file_upload, :only => [:create]
|
10
11
|
|
11
12
|
def index
|
12
13
|
@app_definitions = resource_base.search_for(params[:search], :order => params[:order]).paginate(:page => params[:page])
|
@@ -49,5 +50,32 @@ module ForemanAcd
|
|
49
50
|
process_error
|
50
51
|
end
|
51
52
|
end
|
53
|
+
|
54
|
+
def action_permission
|
55
|
+
case params[:action]
|
56
|
+
when 'export'
|
57
|
+
:export
|
58
|
+
else
|
59
|
+
super
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def import
|
64
|
+
read_hostgroups
|
65
|
+
@app_definition = AppDefinition.new
|
66
|
+
end
|
67
|
+
|
68
|
+
def export
|
69
|
+
filename = "#{@app_definition.name}.yaml"
|
70
|
+
data = JSON.parse(@app_definition.services).to_yaml
|
71
|
+
send_data data, :type => 'text/yaml', :disposition => 'attachment', :filename => filename
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def handle_file_upload
|
77
|
+
return unless params[:foreman_acd_app_definition] && raw_file = params[:foreman_acd_app_definition][:app_definition_file]
|
78
|
+
params[:foreman_acd_app_definition][:services] = YAML.load_file(raw_file.tempfile).to_json
|
79
|
+
end
|
52
80
|
end
|
53
81
|
end
|
@@ -6,7 +6,7 @@ module ForemanAcd
|
|
6
6
|
include Foreman::Controller::AutoCompleteSearch
|
7
7
|
include ::ForemanAcd::Concerns::AppInstanceParameters
|
8
8
|
|
9
|
-
before_action :find_resource, :only => [:edit, :update, :destroy, :deploy]
|
9
|
+
before_action :find_resource, :only => [:edit, :update, :destroy, :deploy, :report]
|
10
10
|
|
11
11
|
def index
|
12
12
|
@app_instances = resource_base.search_for(params[:search], :order => params[:order]).paginate(:page => params[:page])
|
@@ -54,26 +54,76 @@ module ForemanAcd
|
|
54
54
|
case params[:action]
|
55
55
|
when 'deploy'
|
56
56
|
:deploy
|
57
|
+
when 'report'
|
58
|
+
:report
|
57
59
|
else
|
58
60
|
super
|
59
61
|
end
|
60
62
|
end
|
61
63
|
|
62
64
|
def deploy
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
65
|
+
services = JSON.parse(@app_instance.app_definition.services)
|
66
|
+
@deploy_hosts = []
|
67
|
+
|
68
|
+
app_hosts = JSON.parse(@app_instance.hosts)
|
69
|
+
|
70
|
+
app_hosts.each do |host_data|
|
71
|
+
begin
|
72
|
+
service_data = services.select { |k| k['id'] == host_data['service'].to_i }.first
|
73
|
+
host_params = set_host_params(host_data, service_data)
|
74
|
+
|
75
|
+
host = nil
|
76
|
+
if host_data.has_key?('foreman_host_id')
|
77
|
+
logger.debug("Try to find host with id #{host_data['foreman_host_id']}")
|
78
|
+
begin
|
79
|
+
host = Host.find(host_data['foreman_host_id'])
|
80
|
+
rescue ActiveRecord::RecordNotFound
|
81
|
+
logger.info("Host with id #{host_data['foreman_host_id']} couldn\'t be found, create a new one!")
|
82
|
+
host = nil
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
if host.nil?
|
87
|
+
logger.info("Host creation parameters for #{host_data['hostname']}:\n#{params}\n")
|
88
|
+
params = host_attributes(host_params)
|
89
|
+
host = Host.new(params)
|
90
|
+
else
|
91
|
+
logger.info("Update parameters and re-deploy host #{host_data['hostname']}")
|
92
|
+
host.attributes = host_attributes(host_params, host)
|
93
|
+
host.setBuild
|
94
|
+
host.power.reset
|
95
|
+
end
|
96
|
+
|
97
|
+
# REMOVE ME (but very nice for testing)
|
98
|
+
#host.mac = "00:11:22:33:44:55"
|
99
|
+
|
100
|
+
apply_compute_profile(host)
|
101
|
+
host.suggest_default_pxe_loader
|
102
|
+
host.save
|
103
|
+
|
104
|
+
# save the foreman host id
|
105
|
+
host_data['foreman_host_id'] = host.id
|
106
|
+
|
107
|
+
@deploy_hosts.push({ id: host.id, name: host_data['hostname'], hostname: host.hostname, hostUrl: host_path(h), progress_report_id: host.progress_report_id})
|
108
|
+
rescue StandardError => e
|
109
|
+
logger.error("Failed to initiate host creation: #{e.backtrace.join($INPUT_RECORD_SEPARATOR)}")
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# save any change to the app_hosts json
|
114
|
+
@app_instance.hosts = app_hosts.to_json
|
115
|
+
@app_instance.save
|
116
|
+
end
|
117
|
+
|
118
|
+
def report
|
119
|
+
@report_hosts = []
|
120
|
+
app_hosts = JSON.parse(@app_instance.hosts)
|
121
|
+
app_hosts.each do |host_data|
|
122
|
+
h = Host.find(host_data['foreman_host_id'])
|
123
|
+
@report_hosts.push({id: h.id, name: host_data['hostname'], hostname: h.hostname, hostUrl: host_path(h), powerStatusUrl: power_api_host_path(h) })
|
124
|
+
end
|
125
|
+
|
126
|
+
logger.debug("deploy report hosts are: #{@report_hosts.inspect}")
|
77
127
|
end
|
78
128
|
|
79
129
|
private
|
@@ -117,10 +167,12 @@ module ForemanAcd
|
|
117
167
|
result
|
118
168
|
end
|
119
169
|
|
120
|
-
def set_host_params
|
170
|
+
def set_host_params(host_data, service_data)
|
121
171
|
result = hardcoded_params
|
122
|
-
result['
|
123
|
-
|
172
|
+
result['name'] = host_data['hostname']
|
173
|
+
result['hostgroup_id'] = service_data['hostgroup']
|
174
|
+
|
175
|
+
host_data['parameters'].each do |param|
|
124
176
|
case param['type']
|
125
177
|
|
126
178
|
when 'computeprofile'
|
@@ -129,9 +181,6 @@ module ForemanAcd
|
|
129
181
|
when 'domain'
|
130
182
|
result['domain_id'] = param['value']
|
131
183
|
|
132
|
-
when 'hostname'
|
133
|
-
result['name'] = param['value']
|
134
|
-
|
135
184
|
when 'hostparam'
|
136
185
|
result['host_parameters_attributes'].push(:name => param['name'], :value => param['value'])
|
137
186
|
|
@@ -9,7 +9,7 @@ module ForemanAcd
|
|
9
9
|
class_methods do
|
10
10
|
def app_definition_params_filter
|
11
11
|
Foreman::ParameterFilter.new(::ForemanAcd::AppDefinition).tap do |filter|
|
12
|
-
filter.permit(:name, :description, :
|
12
|
+
filter.permit(:name, :description, :services)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -9,7 +9,7 @@ module ForemanAcd
|
|
9
9
|
class_methods do
|
10
10
|
def app_instance_params_filter
|
11
11
|
Foreman::ParameterFilter.new(::ForemanAcd::AppInstance).tap do |filter|
|
12
|
-
filter.permit(:name, :app_definition_id, :description, :
|
12
|
+
filter.permit(:name, :app_definition_id, :description, :hosts)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -8,7 +8,6 @@ module ForemanAcd
|
|
8
8
|
friendly_id :name
|
9
9
|
|
10
10
|
validates :name, :presence => true, :uniqueness => true
|
11
|
-
belongs_to :hostgroup, :class_name => '::Hostgroup'
|
12
11
|
has_many :app_instances, :inverse_of => :app_definition, :dependent => :destroy
|
13
12
|
scoped_search :on => :name
|
14
13
|
|
@@ -3,21 +3,13 @@
|
|
3
3
|
"organization": current_organization,
|
4
4
|
"location": current_location,
|
5
5
|
"hostgroups": @hostgroups,
|
6
|
-
"loadForemanDataUrl": ui_acd_fdata_path("__id__")
|
6
|
+
"loadForemanDataUrl": ui_acd_fdata_path("__id__"),
|
7
|
+
"services": [],
|
7
8
|
}
|
8
9
|
|
9
|
-
if
|
10
|
-
json["
|
11
|
-
else
|
12
|
-
json["mode"] = "editDefinition"
|
13
|
-
json["appDefinition"] = {
|
14
|
-
"id": @app_definition.id,
|
15
|
-
"name": @app_definition.name,
|
16
|
-
"hostgroup_id": @app_definition.hostgroup_id,
|
17
|
-
}
|
18
|
-
json["parameters"] = JSON.parse(@app_definition.parameters)
|
10
|
+
if !@app_definition.name.empty?
|
11
|
+
json["services"] = JSON.parse(@app_definition.services)
|
19
12
|
end
|
20
|
-
|
21
13
|
%>
|
22
14
|
|
23
15
|
<%= form_for @app_definition, :url => (@app_definition.new_record? ? app_definitions_path : app_definition_path(:id => @app_definition.id)) do |f| %>
|
@@ -31,8 +23,8 @@
|
|
31
23
|
<%= text_f f, :name %>
|
32
24
|
<%= text_f f, :description %>
|
33
25
|
|
34
|
-
<div id='
|
35
|
-
<%= mount_react_component('
|
26
|
+
<div id='app_definition'></div>
|
27
|
+
<%= mount_react_component('ApplicationDefinition', "#app_definition", json.to_json) %>
|
36
28
|
</div>
|
37
29
|
</div>
|
38
30
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% title _('Import Application Definition') %>
|
2
|
+
|
3
|
+
<%= form_for @app_definition, :url => (app_definitions_path), :html => { :multipart => true } do |f| %>
|
4
|
+
<%= base_errors_for @app_definition %>
|
5
|
+
<ul class="nav nav-tabs" data-tabs="tabs">
|
6
|
+
<li class="active"><a href="#primary" data-toggle="tab"><%= _('Application Definitions') %></a></li>
|
7
|
+
</ul>
|
8
|
+
|
9
|
+
<div class="tab-content">
|
10
|
+
<div class="tab-pane active" id="primary">
|
11
|
+
<%= text_f f, :name %>
|
12
|
+
<%= text_f f, :description %>
|
13
|
+
<%= file_field_f f, :app_definition_file, :label_help => _("Application Definition file") %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<%= submit_or_cancel f %>
|
18
|
+
<% end %>
|
@@ -1,22 +1,26 @@
|
|
1
1
|
<% title _('Application Definitions') %>
|
2
2
|
|
3
|
-
<% title_actions button_group(
|
3
|
+
<% title_actions button_group(
|
4
|
+
new_link(_('New Application Definition')),
|
5
|
+
display_link_if_authorized(_("Import"), hash_for_import_app_definitions_path, :class => 'btn btn-default')
|
6
|
+
) %>
|
4
7
|
|
5
8
|
<table class="table table-bordered table-striped">
|
6
9
|
<tr>
|
7
10
|
<th><%= sort :name, :as => s_('AppDefinition|Name') %></th>
|
8
11
|
<th><%= _('Description') %></th>
|
9
|
-
<th><%= sort :hostgroup, :as => _('Host groups'), :default => 'DESC' %></th>
|
10
12
|
<th></th>
|
11
13
|
</tr>
|
12
14
|
<% for app_definition in @app_definitions %>
|
13
15
|
<tr>
|
14
16
|
<td><%=link_to_if_authorized h(app_definition.name), hash_for_edit_app_definition_path(:id => app_definition).merge(:auth_object => app_definition, :authorizer => authorizer) %></td>
|
15
17
|
<td><%= app_definition.description %></td>
|
16
|
-
<td><%= app_definition.hostgroup %></td>
|
17
18
|
<td>
|
18
|
-
|
19
|
-
|
19
|
+
<%= action_buttons(
|
20
|
+
display_delete_if_authorized(hash_for_app_definition_path(:id => app_definition).merge(:auth_object => app_definition, :authorizer => authorizer),
|
21
|
+
:data => { 'confirm': _('Delete %s?') % app_definition.name }),
|
22
|
+
display_link_if_authorized(_("Export"), hash_for_export_app_definition_path(:id => app_definition).merge(:auth_object => app_definition, :authorizer => authorizer))
|
23
|
+
) %>
|
20
24
|
</td>
|
21
25
|
</tr>
|
22
26
|
<% end %>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
"organization": current_organization,
|
6
6
|
"location": current_location,
|
7
7
|
"applications": @applications,
|
8
|
-
"
|
8
|
+
"loadAppDefinitionUrl": ui_acd_app_path("__id__"),
|
9
9
|
"loadForemanDataUrl": ui_acd_fdata_path("__id__"),
|
10
10
|
}
|
11
11
|
else
|
@@ -13,13 +13,13 @@
|
|
13
13
|
"mode": "editInstance",
|
14
14
|
"organization": current_organization,
|
15
15
|
"location": current_location,
|
16
|
+
"loadAppDefinitionUrl": ui_acd_app_path("__id__"),
|
16
17
|
"loadForemanDataUrl": ui_acd_fdata_path("__id__"),
|
17
18
|
"appDefinition": {
|
18
19
|
"id": @app_instance.app_definition.id,
|
19
20
|
"name": @app_instance.app_definition.name,
|
20
|
-
"hostgroup_id": @app_instance.app_definition.hostgroup_id,
|
21
21
|
},
|
22
|
-
"
|
22
|
+
"hosts": JSON.parse(@app_instance.hosts),
|
23
23
|
}
|
24
24
|
end
|
25
25
|
%>
|
@@ -35,8 +35,8 @@
|
|
35
35
|
<%= text_f f, :name %>
|
36
36
|
<%= text_f f, :description %>
|
37
37
|
|
38
|
-
<div id='
|
39
|
-
<%= mount_react_component('
|
38
|
+
<div id='app_instance'></div>
|
39
|
+
<%= mount_react_component('ApplicationInstance', "#app_instance", json.to_json) %>
|
40
40
|
</div>
|
41
41
|
</div>
|
42
42
|
</div>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<% title _("Deploy Application Instance #{@app_instance}") %>
|
2
|
+
|
3
|
+
<% content_for(:javascripts) do %>
|
4
|
+
<%= webpacked_plugins_js_for :foreman_acd %>
|
5
|
+
<% end %>
|
6
|
+
<% content_for(:stylesheets) do %>
|
7
|
+
<%= webpacked_plugins_css_for :foreman_acd %>
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
<%
|
11
|
+
json = {
|
12
|
+
"mode": 'liveReport',
|
13
|
+
"hosts": @deploy_hosts
|
14
|
+
}
|
15
|
+
%>
|
16
|
+
|
17
|
+
<div id='deploy'></div>
|
18
|
+
<%= mount_react_component('ApplicationInstanceReport', "#deploy", json.to_json) %>
|
19
|
+
</div
|
@@ -15,11 +15,12 @@
|
|
15
15
|
<td><%= app_instance.app_definition %></td>
|
16
16
|
<td><%= app_instance.description %></td>
|
17
17
|
<td>
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
:title => _("
|
22
|
-
|
18
|
+
<%= action_buttons(display_link_if_authorized(_("Deploy"), hash_for_deploy_app_instance_path(:id => app_instance), :method => :post,
|
19
|
+
:title => _("Deploy application #{app_instance}")),
|
20
|
+
display_link_if_authorized(_("Report"), hash_for_report_app_instance_path(:id => app_instance), :method => :get,
|
21
|
+
:title => _("Show last deployment report for application #{app_instance}")),
|
22
|
+
display_delete_if_authorized(hash_for_app_instance_path(:id => app_instance).merge(:auth_object => app_instance, :authorizer => authorizer),
|
23
|
+
:data => { 'confirm': _('Delete %s?') % app_instance.name })) %>
|
23
24
|
</td>
|
24
25
|
</tr>
|
25
26
|
<% end %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<% title _("Deployment Report for Application Instance #{@app_instance}") %>
|
2
|
+
|
3
|
+
<% content_for(:javascripts) do %>
|
4
|
+
<%= webpacked_plugins_js_for :foreman_acd %>
|
5
|
+
<% end %>
|
6
|
+
<% content_for(:stylesheets) do %>
|
7
|
+
<%= webpacked_plugins_css_for :foreman_acd %>
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
<%
|
11
|
+
json = {
|
12
|
+
"mode": 'lastReport',
|
13
|
+
"hosts": @report_hosts
|
14
|
+
}
|
15
|
+
%>
|
16
|
+
|
17
|
+
<div id='report'></div>
|
18
|
+
<%= mount_react_component('ApplicationInstanceReport', "#report", json.to_json) %>
|
19
|
+
</div
|
data/config/routes.rb
CHANGED
@@ -5,7 +5,13 @@ Rails.application.routes.draw do
|
|
5
5
|
resources :app_definitions, :controller => 'foreman_acd/app_definitions' do
|
6
6
|
collection do
|
7
7
|
get 'auto_complete_search'
|
8
|
+
get 'import'
|
8
9
|
end
|
10
|
+
|
11
|
+
member do
|
12
|
+
get 'export'
|
13
|
+
end
|
14
|
+
|
9
15
|
end
|
10
16
|
|
11
17
|
resources :app_instances, :controller => 'foreman_acd/app_instances' do
|
@@ -15,6 +21,7 @@ Rails.application.routes.draw do
|
|
15
21
|
|
16
22
|
member do
|
17
23
|
post 'deploy'
|
24
|
+
get 'report'
|
18
25
|
end
|
19
26
|
end
|
20
27
|
|
@@ -6,11 +6,9 @@ class CreateAppDefinitions < ActiveRecord::Migration[5.2]
|
|
6
6
|
create_table :app_definitions do |t|
|
7
7
|
t.string :name, :default => '', :null => false, :limit => 255, :unique => true
|
8
8
|
t.text :description
|
9
|
-
t.
|
10
|
-
t.text :parameters
|
9
|
+
t.text :services
|
11
10
|
t.timestamps :null => true
|
12
11
|
end
|
13
|
-
add_foreign_key :app_definitions, :hostgroups
|
14
12
|
end
|
15
13
|
|
16
14
|
def down
|