foreman-katello-engine 0.0.5 → 0.0.6
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.
- data/README.md +4 -35
- data/app/controllers/foreman_katello_engine/activation_keys_controller.rb +12 -0
- data/app/controllers/foreman_katello_engine/api/environments_controller.rb +35 -0
- data/app/helpers/foreman_katello_engine/hosts_and_hostgroups_helper.rb +48 -0
- data/app/models/foreman_katello_engine/environment.rb +39 -0
- data/app/models/setting/katello.rb +14 -0
- data/app/overrides/add_activation_keys_input.rb +10 -2
- data/app/views/foreman_katello_engine/activation_keys/_host_environment_select.html.erb +13 -0
- data/app/views/foreman_katello_engine/activation_keys/_host_tab.html.erb +3 -0
- data/app/views/{activation_keys → foreman_katello_engine/activation_keys}/_host_tab_pane.html.erb +50 -64
- data/config/routes.rb +7 -1
- data/db/migrate/20130419110332_update_environments_add_katello_id.rb +10 -0
- data/foreman-katello-engine.gemspec +1 -1
- data/lib/foreman_katello_engine/bindings.rb +18 -3
- data/lib/foreman_katello_engine/engine.rb +3 -2
- data/lib/foreman_katello_engine/settings.rb +0 -13
- data/test/functional/activation_keys_controller_test.rb +28 -10
- data/test/functional/api/environments_controller_test.rb +96 -0
- data/test/lib/bindings_test.rb +5 -5
- data/test/lib/settings_test.rb +3 -6
- data/test/test_helper.rb +10 -0
- metadata +10 -5
- data/app/controllers/activation_keys_controller.rb +0 -12
- data/app/models/activation_key.rb +0 -5
- data/app/views/activation_keys/_host_tab.html.erb +0 -3
data/README.md
CHANGED
@@ -26,24 +26,11 @@ Modified functionality
|
|
26
26
|
|
27
27
|
### Host Group forms
|
28
28
|
|
29
|
-
New tab '
|
30
|
-
box for
|
29
|
+
New tab 'Activation Keys is added to the host groups form, exposing a select
|
30
|
+
box for activation keys.
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
organizations like this:
|
35
|
-
|
36
|
-
```
|
37
|
-
Foreman Organization | Katello Entity
|
38
|
-
-----------------------------------------------------------------
|
39
|
-
kt-[ACME_Corporation] | organization ACME_Corporation
|
40
|
-
kt-[ACME_Corporation][Dev] | environment Dev in ACME_Corporation
|
41
|
-
```
|
42
|
-
|
43
|
-
These organizations are hidden from the 'Organizations' tab and put
|
44
|
-
into the 'Katello Environment' select box. Before submitting the form,
|
45
|
-
the changed are reflected back to the Foreman organizations
|
46
|
-
checkboxes.
|
32
|
+
Also environments select box is improved to group Foreman environments
|
33
|
+
by Katello organizations and environments.
|
47
34
|
|
48
35
|
The activation keys are modeled similarly using foreman custom params.
|
49
36
|
The value entered into 'Activation Keys' is saved as
|
@@ -54,24 +41,6 @@ The activation keys are autocompleted for better user experience and
|
|
54
41
|
the list of products for each used activation key is displayed at the
|
55
42
|
bottom of the Katello tab.
|
56
43
|
|
57
|
-
### Katello-friendly provisioning
|
58
|
-
|
59
|
-
To register a provisioned system to katello a new provisioning
|
60
|
-
template snippet needs to be crated, lets call it katello:
|
61
|
-
|
62
|
-
```
|
63
|
-
<% if @host.params['kt_activation_keys'] %>
|
64
|
-
rpm -ivh "http://katello.example.com/pub/candlepin-cert-consumer-katello.example.com-1.0-1.noarch.rpm"
|
65
|
-
subscription-manager register --org "<%= @host.params['kt_org'] %>" --activationkey "<%= @host.params['kt_activation_keys'] %>"
|
66
|
-
<% end %>
|
67
|
-
```
|
68
|
-
|
69
|
-
and reference it from the kickstart template:
|
70
|
-
|
71
|
-
```
|
72
|
-
<%= snippets "katello" %>
|
73
|
-
```
|
74
|
-
|
75
44
|
Testing
|
76
45
|
-------
|
77
46
|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module ForemanKatelloEngine
|
2
|
+
class ActivationKeysController < ApplicationController
|
3
|
+
def index
|
4
|
+
environment = ::Environment.find_by_id(params[:environment_id])
|
5
|
+
raise "Selected environment has now Katello connection" unless environment.katello_id
|
6
|
+
kt_org_label, kt_env_label, kt_cv_label = environment.katello_id.split('/')
|
7
|
+
|
8
|
+
ak_data = ForemanKatelloEngine::Bindings.activation_keys_to_subscriptions(kt_org_label, kt_env_label, kt_cv_label)
|
9
|
+
render :status => 200, :json => ak_data, :content_type => 'application/json'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ForemanKatelloEngine
|
2
|
+
module Api
|
3
|
+
class EnvironmentsController < ::Api::V2::BaseController
|
4
|
+
|
5
|
+
def show
|
6
|
+
@environment = ForemanKatelloEngine::Environment.find(params[:org], params[:env], params[:content_view])
|
7
|
+
if @environment
|
8
|
+
render :template => "api/v1/environments/show"
|
9
|
+
else
|
10
|
+
render_error 'not_found', :status => :not_found
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def create
|
15
|
+
begin
|
16
|
+
organization = Organization.find(params[:org_id]) if params[:org_id].present?
|
17
|
+
@environment = ForemanKatelloEngine::Environment.create!(params[:org],
|
18
|
+
params[:env],
|
19
|
+
params[:content_view],
|
20
|
+
params[:content_view_id]) do |env|
|
21
|
+
env.organizations << organization if organization
|
22
|
+
end
|
23
|
+
rescue ForemanKatelloEngine::Environment::Conflict => e
|
24
|
+
render_error 'standard_error', :status => 409, :locals => { :exception => e }
|
25
|
+
return
|
26
|
+
rescue ArgumentError => e
|
27
|
+
render_error 'standard_error', :status => 422, :locals => { :exception => e }
|
28
|
+
return
|
29
|
+
end
|
30
|
+
render :template => "api/v1/environments/show"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -15,5 +15,53 @@ module ForemanKatelloEngine
|
|
15
15
|
"kt_activation_keys"
|
16
16
|
end
|
17
17
|
|
18
|
+
def envs_by_kt_org
|
19
|
+
::Environment.all.find_all(&:katello_id).group_by do |env|
|
20
|
+
if env.katello_id
|
21
|
+
env.katello_id.split('/').first
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def envs_by_kt_env(envs)
|
27
|
+
envs.group_by do |env|
|
28
|
+
env.katello_id.split('/')[1]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def envs_without_kt_org
|
33
|
+
envs_without_kt_org = ::Environment.all.reject(&:katello_id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def envs_without_kt_org_options
|
37
|
+
options_from_collection_for_select(envs_without_kt_org,
|
38
|
+
:id,
|
39
|
+
:to_label,
|
40
|
+
(@host || @hostgroup).environment_id)
|
41
|
+
end
|
42
|
+
|
43
|
+
def grouped_env_options
|
44
|
+
envs_by_org = envs_by_kt_org.reduce({}) do |hash, (org, envs)|
|
45
|
+
hash.update(org => envs_by_kt_env(envs))
|
46
|
+
end
|
47
|
+
grouped_options = envs_by_org.sort_by(&:first).map do |org, envs_by_env|
|
48
|
+
optgroup = %[<optgroup label="#{org}">]
|
49
|
+
opts = envs_by_env.sort_by(&:first).map do |kt_env, envs|
|
50
|
+
envs.sort_by(&:katello_id).map do |env|
|
51
|
+
selected = env.id == (@host || @hostgroup).environment_id ? "selected" : ""
|
52
|
+
if cv = env.katello_id.split('/')[2]
|
53
|
+
%[<option value="#{env.id}" class="kt-cv" #{selected}>#{cv}</option>]
|
54
|
+
else
|
55
|
+
%[<option value="#{env.id}" class="kt-env" #{selected}>#{kt_env}</option>]
|
56
|
+
end
|
57
|
+
end.join
|
58
|
+
end.join
|
59
|
+
optgroup << opts
|
60
|
+
optgroup << '</optgroup>'
|
61
|
+
end.join
|
62
|
+
|
63
|
+
return grouped_options.html_safe + envs_without_kt_org_options
|
64
|
+
end
|
65
|
+
|
18
66
|
end
|
19
67
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module ForemanKatelloEngine
|
2
|
+
class Environment
|
3
|
+
|
4
|
+
class Conflict < StandardError; end
|
5
|
+
|
6
|
+
def self.find(org_label, env_label, content_view_label)
|
7
|
+
katello_id = generate_katello_id(org_label, env_label, content_view_label)
|
8
|
+
::Environment.where(:katello_id => katello_id).first
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.create!(org_label, env_label, content_view_label, content_view_id)
|
12
|
+
katello_id = generate_katello_id(org_label, env_label, content_view_label)
|
13
|
+
::Environment.transaction do
|
14
|
+
if existing_env = ::Environment.where(:katello_id => katello_id).first
|
15
|
+
raise Conflict, "environment already exists: #{existing_env.id} - #{existing_env.name}"
|
16
|
+
end
|
17
|
+
::Environment.create! do |env|
|
18
|
+
env.name = generate_name(org_label, env_label, content_view_label, content_view_id)
|
19
|
+
env.katello_id = katello_id
|
20
|
+
yield env if block_given?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.generate_katello_id(org_label, env_label, content_view_label)
|
26
|
+
raise ArgumentError, "org_label has to be specified" if org_label.blank?
|
27
|
+
raise ArgumentError, "env_label has to be specified" if env_label.blank?
|
28
|
+
[org_label, env_label, content_view_label].reject(&:blank?).join('/')
|
29
|
+
end
|
30
|
+
|
31
|
+
# content_view_id provides the uniqueness of the name
|
32
|
+
def self.generate_name(org_label, env_label, content_view_label, content_view_id)
|
33
|
+
name = ["KT", org_label, env_label, content_view_label, content_view_id].reject(&:blank?).join('_')
|
34
|
+
return name.gsub('-','_')
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Setting::Katello < ::Setting
|
2
|
+
|
3
|
+
def self.load_defaults
|
4
|
+
return unless (self.table_exists? rescue false)
|
5
|
+
BLANK_ATTRS << "katello_url"
|
6
|
+
Setting.transaction do
|
7
|
+
[
|
8
|
+
self.set('katello_url', 'url of a Katello instance', 'https://localhost/katello'),
|
9
|
+
].compact.each { |s| self.create s.update(:category => "Setting::Katello")}
|
10
|
+
end
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -1,9 +1,17 @@
|
|
1
1
|
Deface::Override.new(:virtual_path => "hostgroups/_form",
|
2
2
|
:name => "add_activation_keys_tab",
|
3
3
|
:insert_after => 'ul.nav > code[erb-silent]:contains("show_organization_tab?") ~ code[erb-silent]:contains("end")',
|
4
|
-
:partial => 'activation_keys/host_tab')
|
4
|
+
:partial => 'foreman_katello_engine/activation_keys/host_tab')
|
5
5
|
|
6
6
|
Deface::Override.new(:virtual_path => "hostgroups/_form",
|
7
7
|
:name => "add_activation_keys_tab_pane",
|
8
8
|
:insert_after => 'div.tab-content > code[erb-silent]:contains("show_organization_tab?") ~ code[erb-silent]:contains("end")',
|
9
|
-
:partial => 'activation_keys/host_tab_pane')
|
9
|
+
:partial => 'foreman_katello_engine/activation_keys/host_tab_pane')
|
10
|
+
Deface::Override.new(:virtual_path => "hostgroups/_form",
|
11
|
+
:name => "hostgroups_update_environments_select",
|
12
|
+
:replace => 'code[erb-loud]:contains("select_f"):contains(":environment_id")',
|
13
|
+
:partial => 'foreman_katello_engine/activation_keys/host_environment_select')
|
14
|
+
Deface::Override.new(:virtual_path => "hosts/_form",
|
15
|
+
:name => "hosts_update_environments_select",
|
16
|
+
:replace => 'code[erb-loud]:contains("select_f"):contains(":environment_id")',
|
17
|
+
:partial => 'foreman_katello_engine/activation_keys/host_environment_select')
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<style>
|
2
|
+
option.kt-env { margin-left: 0em; }
|
3
|
+
option.kt-cv { margin-left: 1em; }
|
4
|
+
</style>
|
5
|
+
|
6
|
+
<%= field(f, :environment_id, {:include_blank => true}) do
|
7
|
+
f.select :environment_id,
|
8
|
+
grouped_env_options,
|
9
|
+
{:include_blank =>true},
|
10
|
+
{:onchange => 'update_puppetclasses(this);',
|
11
|
+
:"data-url" => environment_selected_hostgroups_path,
|
12
|
+
:'data-host-id' => (@host && @host.id)}
|
13
|
+
end %>
|
data/app/views/{activation_keys → foreman_katello_engine/activation_keys}/_host_tab_pane.html.erb
RENAMED
@@ -5,10 +5,17 @@ $(function() {
|
|
5
5
|
var availableActivationKeys = {};
|
6
6
|
|
7
7
|
function ktLoadActivationKeys() {
|
8
|
+
if(ktSelectedOrgEnvCv()[0]) {
|
9
|
+
ktAkTab().show();
|
10
|
+
} else {
|
11
|
+
ktAkTab().hide();
|
12
|
+
return; //no Katello-specific env selected
|
13
|
+
}
|
14
|
+
|
8
15
|
$("#ak-subscriptions-info").hide();
|
9
16
|
$("#ak-subscriptions-spinner").show();
|
10
|
-
var url = foreman_url('/activation_keys');
|
11
|
-
var environmentId = $("#
|
17
|
+
var url = foreman_url('/foreman_katello_engine/activation_keys');
|
18
|
+
var environmentId = $("#hostgroup_environment_id").val();
|
12
19
|
if(environmentId) {
|
13
20
|
$.ajax({
|
14
21
|
type: 'get',
|
@@ -43,8 +50,8 @@ $(function() {
|
|
43
50
|
}
|
44
51
|
|
45
52
|
function ktOrganizations() {
|
46
|
-
return $.grep($("#organizations
|
47
|
-
return $(el).text().trim().match(/^
|
53
|
+
return $.grep($("#organizations #hostgroup_organization_ids option"), function (el) {
|
54
|
+
return $(el).text().trim().match(/^KT-/)
|
48
55
|
});
|
49
56
|
}
|
50
57
|
|
@@ -63,54 +70,27 @@ $(function() {
|
|
63
70
|
});
|
64
71
|
}
|
65
72
|
|
66
|
-
function
|
67
|
-
var
|
68
|
-
var
|
69
|
-
$.each(ktOrganizations(), function (i, label) {
|
70
|
-
var input = $(label).find("input[ type = 'checkbox' ]");
|
71
|
-
var frOrgName = $(label).text().trim();
|
72
|
-
var frOrgId = input.val();
|
73
|
-
var match = ktParseOrgName(frOrgName);
|
74
|
-
if(match) {
|
75
|
-
if(input.attr('checked')) {
|
76
|
-
selectedEnvId = frOrgId;
|
77
|
-
}
|
78
|
-
var ktOrg = match[1]; ktEnv = match[2];
|
79
|
-
if(ktOrgs.indexOf(ktOrg) == -1) {
|
80
|
-
ktOrgs.push(ktOrg);
|
81
|
-
ktOrgsToEnvs[ktOrg] = [];
|
82
|
-
}
|
83
|
-
ktOrgsToEnvs[ktOrg].push([frOrgId, ktEnv]);
|
84
|
-
}
|
85
|
-
$(this).parent().hide();
|
86
|
-
});
|
73
|
+
function ktSelectedOrgEnvCv() {
|
74
|
+
var selectedEnvId = $("#hostgroup_environment_id").val();
|
75
|
+
var selectedOption = $("#hostgroup_environment_id option[ value ='" + selectedEnvId + "' ]");
|
87
76
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
content += env[0];
|
96
|
-
|
97
|
-
if(env[0] == selectedEnvId) {
|
98
|
-
content += " selected";
|
99
|
-
}
|
100
|
-
content += '>' + env[1] + '</option>';
|
101
|
-
});
|
102
|
-
content += '</optgroup>';
|
103
|
-
});
|
104
|
-
ktEnvironmentSelect.append(content);
|
77
|
+
var ktEnvOption, ktCvOption, ktOrgLabel, ktEnvLabel, ktCvLabel;
|
78
|
+
if(selectedOption.hasClass('kt-cv')) {
|
79
|
+
ktCvOption = selectedOption;
|
80
|
+
ktEnvOption = ktCvOption.prevAll('option.kt-env').first();
|
81
|
+
} else if(selectedOption.hasClass('kt-env')) {
|
82
|
+
ktEnvOption = selectedOption;
|
83
|
+
}
|
105
84
|
|
106
|
-
|
85
|
+
if(ktEnvOption) {
|
86
|
+
ktEnvLabel = ktEnvOption.text();
|
87
|
+
ktOrgLabel = ktEnvOption.parent().attr('label');
|
88
|
+
}
|
107
89
|
|
108
|
-
|
109
|
-
|
110
|
-
var orgCheckbox = $("#organizations label.organization input[ type = 'checkbox' ][ value = '" + selectedEnvId + "' ]");
|
111
|
-
if(orgCheckbox) {
|
112
|
-
return ktParseOrgName(orgCheckbox.parent().text().trim());
|
90
|
+
if(ktCvOption) {
|
91
|
+
ktCvLabel = ktCvOption.text();
|
113
92
|
}
|
93
|
+
return [ktOrgLabel, ktEnvLabel, ktCvLabel];
|
114
94
|
}
|
115
95
|
|
116
96
|
function ktSetParam(name, value) {
|
@@ -130,19 +110,25 @@ $(function() {
|
|
130
110
|
}
|
131
111
|
|
132
112
|
function ktEnvToParam() {
|
133
|
-
var
|
134
|
-
ktSetParam('kt_org',
|
135
|
-
ktSetParam('kt_env',
|
113
|
+
var orgEnvCv = ktSelectedOrgEnvCv() || [];
|
114
|
+
ktSetParam('kt_org', orgEnvCv[0]);
|
115
|
+
ktSetParam('kt_env', orgEnvCv[1]);
|
116
|
+
ktSetParam('kt_cv', orgEnvCv[2]);
|
136
117
|
}
|
137
118
|
|
138
119
|
function ktEnvToFrOrganizations() {
|
139
|
-
var
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
120
|
+
var orgEnvCv = ktSelectedOrgEnvCv() || [];
|
121
|
+
|
122
|
+
var orgName = "";
|
123
|
+
if(orgEnvCv[0]) {
|
124
|
+
orgName = 'KT-[' + orgEnvCv[0] + ']';
|
125
|
+
}
|
126
|
+
|
127
|
+
$.each(ktOrganizations(), function (i, option) {
|
128
|
+
if(orgName == $(option).text().trim()) {
|
129
|
+
$("#hostgroup_organization_ids").multiSelect('select', $(option).val());
|
144
130
|
} else {
|
145
|
-
|
131
|
+
$("#hostgroup_organization_ids").multiSelect('deselect', $(option).val());
|
146
132
|
}
|
147
133
|
});
|
148
134
|
}
|
@@ -181,10 +167,13 @@ $(function() {
|
|
181
167
|
$("#ak-subscriptions-spinner").hide();
|
182
168
|
}
|
183
169
|
|
170
|
+
function ktAkTab() {
|
171
|
+
return $('li#activation_keys_tab');
|
172
|
+
}
|
173
|
+
|
184
174
|
function ktOnLoad() {
|
185
175
|
ktHideParams();
|
186
176
|
ktParamToAkInput();
|
187
|
-
ktOrganizationsToKtEnv();
|
188
177
|
ktLoadActivationKeys();
|
189
178
|
};
|
190
179
|
|
@@ -232,7 +221,7 @@ $(function() {
|
|
232
221
|
$(this).autocomplete( "search" );
|
233
222
|
}});
|
234
223
|
|
235
|
-
$("#
|
224
|
+
$("#hostgroup_environment_id").change(ktLoadActivationKeys);
|
236
225
|
|
237
226
|
$("#ak_refresh_subscriptions").click(function () {
|
238
227
|
ktLoadActivationKeys();
|
@@ -242,11 +231,8 @@ $(function() {
|
|
242
231
|
});
|
243
232
|
|
244
233
|
<% end %>
|
245
|
-
<div class="tab-pane" id="
|
246
|
-
<%= field(
|
247
|
-
select_tag(:kt_environment_id, [])
|
248
|
-
end %>
|
249
|
-
<%= field(nil, "Activation Keys", :help_inline => "comma separated values. The value will be available in templates as @host.params['#{kt_ak_label}']") do
|
234
|
+
<div class="tab-pane" id="activation_keys">
|
235
|
+
<%= field(f, "Activation Keys", :help_inline => "comma separated values. The value will be available in templates as @host.params['#{kt_ak_label}']") do
|
250
236
|
text_field_tag("kt_activation_keys", "", :style => 'width: 98%')
|
251
237
|
end %>
|
252
238
|
<div class="alert alert-info">
|
data/config/routes.rb
CHANGED
@@ -20,14 +20,29 @@ module ForemanKatelloEngine
|
|
20
20
|
KatelloApi::Resources::Environment.new(client_config)
|
21
21
|
end
|
22
22
|
|
23
|
+
def content_view
|
24
|
+
KatelloApi::Resources::ContentView.new(client_config)
|
25
|
+
end
|
26
|
+
|
23
27
|
def activation_key
|
24
28
|
KatelloApi::Resources::ActivationKey.new(client_config)
|
25
29
|
end
|
26
30
|
|
27
|
-
def activation_keys_to_subscriptions(
|
28
|
-
|
31
|
+
def activation_keys_to_subscriptions(org_label, env_label, content_view_label = nil)
|
32
|
+
ak_query = {}
|
33
|
+
if content_view_label
|
34
|
+
content_views, _ = self.content_view.index('organization_id' => org_label,
|
35
|
+
'label' => content_view_label)
|
36
|
+
if content_view = content_views.first
|
37
|
+
ak_query['content_view_id'] = content_view['id']
|
38
|
+
end
|
39
|
+
end
|
40
|
+
environments, _ = self.environment.index('organization_id' => org_label, 'name' => env_label)
|
29
41
|
if environment = environments.first
|
30
|
-
|
42
|
+
ak_query['environment_id'] = environment['id']
|
43
|
+
end
|
44
|
+
if ak_query.any?
|
45
|
+
activation_keys, _ = self.activation_key.index(ak_query)
|
31
46
|
return activation_keys.reduce({}) do |h, ak|
|
32
47
|
h.update(ak['name'] => ak['pools'].map { |pool| pool['productName'] })
|
33
48
|
end
|
@@ -7,10 +7,11 @@ module ForemanKatelloEngine
|
|
7
7
|
end
|
8
8
|
|
9
9
|
config.after_initialize do
|
10
|
+
if (Setting::Katello.table_exists? rescue false)
|
11
|
+
Setting::Katello.load_defaults
|
12
|
+
end
|
10
13
|
require 'foreman_katello_engine/bindings'
|
11
|
-
require 'foreman_katello_engine/settings'
|
12
14
|
require 'foreman_katello_engine/renderer'
|
13
|
-
ForemanKatelloEngine::Settings.initialize_settings
|
14
15
|
end
|
15
16
|
|
16
17
|
initializer 'foreman_katello_engine.helper' do |app|
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module ForemanKatelloEngine
|
2
|
-
class Settings
|
3
|
-
|
4
|
-
def self.initialize_settings
|
5
|
-
# proceed only if db set up correctly
|
6
|
-
Setting.first rescue return
|
7
|
-
[
|
8
|
-
Foreman::DefaultSettings::Loader.set('katello_url', 'url of a Katello instance', 'https://localhost/katello')
|
9
|
-
].each { |s| Foreman::DefaultSettings::Loader.create(s.update(:category => "General")) }
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
end
|
@@ -1,17 +1,35 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
require 'mocha/setup'
|
3
3
|
|
4
|
-
|
4
|
+
module ForemanKatelloEngine
|
5
|
+
class ActivationKeysControllerTest < ActionController::TestCase
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
before do
|
8
|
+
setup_users
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
let :environment do
|
12
|
+
::Environment.create! do |env|
|
13
|
+
env.name = 'DevEnv'
|
14
|
+
env.katello_id = 'ACME/Dev/CV1'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
let :aks_to_subscriptions_data do
|
19
|
+
{"ak1" => ["prod1", "prod2"], "ak2" => ["prod3", "prod4"]}
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#index" do
|
16
23
|
|
24
|
+
it "loads activation keys from Katello" do
|
25
|
+
ForemanKatelloEngine::Bindings.expects(:activation_keys_to_subscriptions).
|
26
|
+
with('ACME', 'Dev', 'CV1').returns(aks_to_subscriptions_data)
|
27
|
+
get :index, { :environment_id => environment.id }, set_session_user
|
28
|
+
assert_response :success
|
29
|
+
assert_equal aks_to_subscriptions_data, JSON.parse(response.body)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
17
35
|
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'mocha/setup'
|
3
|
+
|
4
|
+
module ForemanKatelloEngine
|
5
|
+
module Api
|
6
|
+
class EnvironmentsControllerTest < ActionController::TestCase
|
7
|
+
|
8
|
+
before do
|
9
|
+
setup_users
|
10
|
+
environment
|
11
|
+
end
|
12
|
+
|
13
|
+
let :environment do
|
14
|
+
::Environment.create! do |env|
|
15
|
+
env.name = 'DevEnv'
|
16
|
+
env.katello_id = 'ACME/Dev/CV1'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
let :organization do
|
21
|
+
Organization.create! do |org|
|
22
|
+
org.name = 'ACME'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#show" do
|
27
|
+
|
28
|
+
it "show an environment based on Katello org, env and CV label" do
|
29
|
+
# id => show means id is not really used
|
30
|
+
get :show, { :id => "show", :org => 'ACME', :env => 'Dev', :content_view => 'CV1' }, set_session_user
|
31
|
+
assert_response :success
|
32
|
+
response_env = JSON.parse(response.body)["environment"]
|
33
|
+
response_env["id"].must_equal environment.id
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
describe "#create" do
|
40
|
+
|
41
|
+
it "creates an environment based on Katello org and env" do
|
42
|
+
# id => show means id is not really used
|
43
|
+
post :create, { :org => 'ACME', :env => 'Dev', :content_view_id => 'env'}, set_session_user
|
44
|
+
assert_response :success
|
45
|
+
response_env = JSON.parse(response.body)["environment"]
|
46
|
+
env = ::Environment.find(response_env["id"])
|
47
|
+
env.name.must_equal "KT_ACME_Dev_env"
|
48
|
+
env.katello_id.must_equal "ACME/Dev"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "assigns the environment to org when org_id provided" do
|
52
|
+
# id => show means id is not really used
|
53
|
+
create_params = {
|
54
|
+
:org => 'ACME',
|
55
|
+
:env => 'Dev',
|
56
|
+
:content_view_id => 'env',
|
57
|
+
:org_id => organization.id
|
58
|
+
}
|
59
|
+
post :create, create_params, set_session_user
|
60
|
+
assert_response :success
|
61
|
+
response_env = JSON.parse(response.body)["environment"]
|
62
|
+
env = ::Environment.find(response_env["id"])
|
63
|
+
env.name.must_equal "KT_ACME_Dev_env"
|
64
|
+
env.katello_id.must_equal "ACME/Dev"
|
65
|
+
env.organizations.must_include organization
|
66
|
+
end
|
67
|
+
|
68
|
+
it "creates an environment based on Katello org, env and CV label" do
|
69
|
+
post :create, { :org => 'ACME', :env => 'Dev', :content_view => 'CV2', :content_view_id => 2 }, set_session_user
|
70
|
+
assert_response :success
|
71
|
+
response_env = JSON.parse(response.body)["environment"]
|
72
|
+
env = ::Environment.find(response_env["id"])
|
73
|
+
env.name.must_equal "KT_ACME_Dev_CV2_2"
|
74
|
+
env.katello_id.must_equal "ACME/Dev/CV2"
|
75
|
+
end
|
76
|
+
|
77
|
+
it "requires env to be set" do
|
78
|
+
post :create, { :org => 'ACME'}, set_session_user
|
79
|
+
assert_response 422
|
80
|
+
end
|
81
|
+
|
82
|
+
it "requires org to be set" do
|
83
|
+
post :create, {}, set_session_user
|
84
|
+
assert_response 422
|
85
|
+
end
|
86
|
+
|
87
|
+
it "refused to create the same env twice" do
|
88
|
+
post :create, { :org => 'ACME', :env => 'Dev', :content_view => 'CV1', :content_view_id => 2 }, set_session_user
|
89
|
+
assert_response 409
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
data/test/lib/bindings_test.rb
CHANGED
@@ -4,14 +4,14 @@ require 'mocha/setup'
|
|
4
4
|
class BindingsTest < ActiveSupport::TestCase
|
5
5
|
|
6
6
|
def setup
|
7
|
-
|
8
|
-
|
7
|
+
Setting::Auth.load_defaults
|
8
|
+
Setting::Katello.load_defaults
|
9
9
|
end
|
10
10
|
|
11
11
|
test 'client lib setting' do
|
12
|
-
Setting['katello_url'] = 'https://example.com/katello'
|
13
|
-
Setting['oauth_consumer_key'] = 'key'
|
14
|
-
Setting['oauth_consumer_secret'] = 'secret'
|
12
|
+
Setting::Katello['katello_url'] = 'https://example.com/katello'
|
13
|
+
Setting::Auth['oauth_consumer_key'] = 'key'
|
14
|
+
Setting::Auth['oauth_consumer_secret'] = 'secret'
|
15
15
|
config = ForemanKatelloEngine::Bindings.environment.config
|
16
16
|
assert_equal 'https://example.com/katello', config[:base_url]
|
17
17
|
assert_equal 'key', config[:oauth][:consumer_key]
|
data/test/lib/settings_test.rb
CHANGED
@@ -2,12 +2,9 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class SettingsTest < ActiveSupport::TestCase
|
4
4
|
|
5
|
-
def setup
|
6
|
-
#Setting.where(:name => 'katello_url').delete_all
|
7
|
-
end
|
8
|
-
|
9
5
|
test "katello specific settings" do
|
10
|
-
|
11
|
-
assert_equal 'https://localhost/katello', Setting['katello_url']
|
6
|
+
Setting::Katello.load_defaults
|
7
|
+
assert_equal 'https://localhost/katello', Setting::Katello['katello_url']
|
12
8
|
end
|
9
|
+
|
13
10
|
end
|
data/test/test_helper.rb
CHANGED
@@ -5,6 +5,7 @@ ENV["RAILS_ENV"] ||= 'test'
|
|
5
5
|
require File.join("foreman_app/config/environment.rb")
|
6
6
|
|
7
7
|
require 'test/unit'
|
8
|
+
require 'minitest/spec'
|
8
9
|
require 'foreman-katello-engine'
|
9
10
|
require 'rails/test_help'
|
10
11
|
|
@@ -26,3 +27,12 @@ end
|
|
26
27
|
def set_session_user
|
27
28
|
SETTINGS[:login] ? {:user => User.admin.id, :expires_at => 5.minutes.from_now} : {}
|
28
29
|
end
|
30
|
+
|
31
|
+
def setup_users
|
32
|
+
User.current = users :admin
|
33
|
+
user = User.find_by_login("one")
|
34
|
+
@request.session[:user] = user.id
|
35
|
+
@request.session[:expires_at] = 5.minutes.from_now
|
36
|
+
user.roles = [Role.find_by_name('Anonymous'), Role.find_by_name('Viewer')]
|
37
|
+
user.save!
|
38
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman-katello-engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -55,18 +55,22 @@ files:
|
|
55
55
|
- LICENSE
|
56
56
|
- README.md
|
57
57
|
- Rakefile
|
58
|
-
- app/controllers/activation_keys_controller.rb
|
58
|
+
- app/controllers/foreman_katello_engine/activation_keys_controller.rb
|
59
|
+
- app/controllers/foreman_katello_engine/api/environments_controller.rb
|
59
60
|
- app/helpers/foreman_katello_engine/hosts_and_hostgroups_helper.rb
|
60
61
|
- app/helpers/foreman_katello_engine/katello_urls_helper.rb
|
61
|
-
- app/models/
|
62
|
+
- app/models/foreman_katello_engine/environment.rb
|
63
|
+
- app/models/setting/katello.rb
|
62
64
|
- app/overrides/add_activation_keys_input.rb
|
63
|
-
- app/views/activation_keys/
|
64
|
-
- app/views/activation_keys/
|
65
|
+
- app/views/foreman_katello_engine/activation_keys/_host_environment_select.html.erb
|
66
|
+
- app/views/foreman_katello_engine/activation_keys/_host_tab.html.erb
|
67
|
+
- app/views/foreman_katello_engine/activation_keys/_host_tab_pane.html.erb
|
65
68
|
- app/views/unattended/kickstart-katello.erb
|
66
69
|
- app/views/unattended/snippets/_katello_registration.erb
|
67
70
|
- config/routes.rb
|
68
71
|
- db/migrate/20130416152224_add_katello_templates.rb
|
69
72
|
- db/migrate/20130418105901_add_katello_ptables.rb
|
73
|
+
- db/migrate/20130419110332_update_environments_add_katello_id.rb
|
70
74
|
- foreman-katello-engine.gemspec
|
71
75
|
- lib/foreman-katello-engine.rb
|
72
76
|
- lib/foreman_katello_engine.rb
|
@@ -76,6 +80,7 @@ files:
|
|
76
80
|
- lib/foreman_katello_engine/settings.rb
|
77
81
|
- script/rails
|
78
82
|
- test/functional/activation_keys_controller_test.rb
|
83
|
+
- test/functional/api/environments_controller_test.rb
|
79
84
|
- test/lib/bindings_test.rb
|
80
85
|
- test/lib/settings_test.rb
|
81
86
|
- test/test_helper.rb
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class ActivationKeysController < ApplicationController
|
2
|
-
def index
|
3
|
-
if org = Organization.find_by_id(params[:environment_id])
|
4
|
-
if match = org.name.match(/\Akt-\[(.*)\]\[(.*)\]\Z/)
|
5
|
-
org_name, env_name = match[1], match[2]
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
ak_data = ForemanKatelloEngine::Bindings.activation_keys_to_subscriptions(org_name, env_name)
|
10
|
-
render :status => 200, :json => ak_data, :content_type => 'application/json'
|
11
|
-
end
|
12
|
-
end
|