staypuft 0.1.5 → 0.1.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.
- checksums.yaml +8 -8
- data/app/assets/javascripts/staypuft/staypuft.js +99 -1
- data/app/assets/stylesheets/staypuft/bootstrap_and_overrides.css.scss +48 -4
- data/app/assets/stylesheets/staypuft/staypuft.css.scss +7 -11
- data/app/controllers/staypuft/deployments_controller.rb +23 -20
- data/app/controllers/staypuft/steps_controller.rb +18 -24
- data/app/helpers/staypuft/application_helper.rb +16 -1
- data/app/helpers/staypuft/deployments_helper.rb +1 -1
- data/app/lib/actions/staypuft/host/wait_until_host_ready.rb +2 -8
- data/app/lib/staypuft/seeder.rb +702 -0
- data/app/models/staypuft/concerns/host_open_stack_affiliation.rb +29 -2
- data/app/models/staypuft/concerns/hostgroup_extensions.rb +28 -3
- data/app/models/staypuft/concerns/lookup_key_extensions.rb +72 -0
- data/app/models/staypuft/deployment/abstract_param_scope.rb +31 -0
- data/app/models/staypuft/deployment/attribute_param_storage.rb +41 -0
- data/app/models/staypuft/deployment/cinder_service.rb +87 -0
- data/app/models/staypuft/deployment/glance_service.rb +85 -0
- data/app/models/staypuft/deployment/ips.rb +26 -0
- data/app/models/staypuft/deployment/neutron_service.rb +165 -0
- data/app/models/staypuft/deployment/nova_service.rb +84 -0
- data/app/models/staypuft/deployment/passwords.rb +66 -0
- data/app/models/staypuft/deployment/vips.rb +36 -0
- data/app/models/staypuft/deployment.rb +179 -72
- data/app/models/staypuft/deployment_role_hostgroup.rb +1 -1
- data/app/models/staypuft/role.rb +8 -1
- data/app/models/staypuft/service/ui_params.rb +12 -1
- data/app/views/staypuft/deployments/_assigned_hosts_table.html.erb +60 -0
- data/app/views/staypuft/deployments/_deployed_hosts_table.html.erb +51 -0
- data/app/views/staypuft/deployments/_free_hosts_table.html.erb +47 -0
- data/app/views/staypuft/deployments/edit.html.erb +50 -0
- data/app/views/staypuft/deployments/show.html.erb +41 -79
- data/app/views/staypuft/deployments/summary.html.erb +4 -1
- data/app/views/staypuft/steps/_cinder.html.erb +17 -0
- data/app/views/staypuft/steps/_glance.html.erb +16 -0
- data/app/views/staypuft/steps/_neutron.html.erb +57 -0
- data/app/views/staypuft/steps/_nova.html.erb +34 -0
- data/app/views/staypuft/steps/deployment_settings.html.erb +41 -17
- data/app/views/staypuft/steps/services_configuration.html.erb +19 -32
- data/app/views/staypuft/steps/{services_selection.html.erb → services_overview.html.erb} +7 -3
- data/config/routes.rb +2 -0
- data/db/migrate/20140623142500_remove_amqp_provider_from_staypuft_deployment.rb +6 -0
- data/db/seeds.rb +1 -314
- data/lib/staypuft/engine.rb +1 -0
- data/lib/staypuft/version.rb +1 -1
- metadata +23 -3
@@ -0,0 +1,66 @@
|
|
1
|
+
module Staypuft
|
2
|
+
class Deployment::Passwords < Deployment::AbstractParamScope
|
3
|
+
PASSWORD_LIST = :admin, :ceilometer_user, :cinder_db, :cinder_user,
|
4
|
+
:glance_db, :glance_user, :heat_db, :heat_user, :heat_cfn_user, :mysql_root,
|
5
|
+
:keystone_db, :keystone_user, :neutron_db, :neutron_user, :nova_db, :nova_user,
|
6
|
+
:swift_admin, :swift_user, :amqp, :amqp_nssdb, :keystone_admin_token,
|
7
|
+
:ceilometer_metering_secret, :heat_auth_encrypt_key, :horizon_secret_key,
|
8
|
+
:swift_shared_secret, :neutron_metadata_proxy_secret
|
9
|
+
|
10
|
+
OTHER_ATTRS_LIST = :mode, :single_password
|
11
|
+
|
12
|
+
def self.param_scope
|
13
|
+
'passwords'
|
14
|
+
end
|
15
|
+
|
16
|
+
param_attr *OTHER_ATTRS_LIST, *PASSWORD_LIST
|
17
|
+
|
18
|
+
def initialize(deployment)
|
19
|
+
super deployment
|
20
|
+
self.single_password_confirmation = single_password
|
21
|
+
end
|
22
|
+
|
23
|
+
module Mode
|
24
|
+
SINGLE = 'single'
|
25
|
+
RANDOM = 'random'
|
26
|
+
LABELS = { RANDOM => N_('Generate random password for each service'),
|
27
|
+
SINGLE => N_('Use single password for all services') }
|
28
|
+
TYPES = LABELS.keys
|
29
|
+
HUMAN = N_('Service Password')
|
30
|
+
end
|
31
|
+
|
32
|
+
validates :mode, presence: true, inclusion: { in: Mode::TYPES }
|
33
|
+
|
34
|
+
# using old hash syntax here since if:, while validly parsing as :if => in
|
35
|
+
# ruby itself, in irb the parser treats it as an if keyword, as does both
|
36
|
+
# emacs and rubymine, which really messes with indention, etc.
|
37
|
+
validates :single_password,
|
38
|
+
:presence => true,
|
39
|
+
:confirmation => true,
|
40
|
+
:if => :single_mode?,
|
41
|
+
:length => { minimum: 6 }
|
42
|
+
|
43
|
+
def set_defaults
|
44
|
+
self.mode = Mode::RANDOM
|
45
|
+
PASSWORD_LIST.each do |password_field|
|
46
|
+
self.send("#{password_field}=", SecureRandom.hex)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def single_mode?
|
51
|
+
mode == Mode::SINGLE
|
52
|
+
end
|
53
|
+
|
54
|
+
def effective_value(password_field)
|
55
|
+
if single_mode?
|
56
|
+
single_password
|
57
|
+
else
|
58
|
+
send(password_field)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def id # compatibility with password_f
|
63
|
+
single_password
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Staypuft
|
2
|
+
class Deployment::VIPS < Deployment::AbstractParamScope
|
3
|
+
|
4
|
+
VIP_NAMES = [:ceilometer, :cinder, :db, :glance, :heat, :horizon, :keystone, :loadbalancer,
|
5
|
+
:nova, :neutron, :amqp, :swift]
|
6
|
+
COUNT = VIP_NAMES.size
|
7
|
+
|
8
|
+
def self.param_scope
|
9
|
+
'vips'
|
10
|
+
end
|
11
|
+
|
12
|
+
param_attr :user_range
|
13
|
+
|
14
|
+
HUMAN = N_('Virtual IP addresses range')
|
15
|
+
|
16
|
+
def range
|
17
|
+
(user_range || default_range)
|
18
|
+
# TODO reserve the IP addresses
|
19
|
+
end
|
20
|
+
|
21
|
+
# TODO validate range that it is array with size 11 and that it contains only IPS
|
22
|
+
|
23
|
+
def default_range
|
24
|
+
@default_range ||= begin
|
25
|
+
top_ip = hostgroup.subnet.to.split('.').map &:to_i
|
26
|
+
((top_ip[-1]-(COUNT-1))..top_ip[-1]).
|
27
|
+
map { |last| [*top_ip[0..2], last] }.
|
28
|
+
map { |ip| ip.join '.' }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def get(name)
|
33
|
+
range[VIP_NAMES.index(name) || raise(ArgumentError, "unknown #{name}")]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -6,22 +6,19 @@ module Staypuft
|
|
6
6
|
STEP_SETTINGS = :settings
|
7
7
|
STEP_CONFIGURATION = :configuration
|
8
8
|
STEP_COMPLETE = :complete
|
9
|
-
|
9
|
+
STEP_OVERVIEW = :overview
|
10
10
|
|
11
|
-
NEW_NAME_PREFIX=
|
11
|
+
NEW_NAME_PREFIX = 'uninitialized_'
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
AMQP_QPID = "qpid"
|
16
|
-
AMQP_PROVIDERS = [AMQP_RABBITMQ, AMQP_QPID]
|
17
|
-
AMQP_PROVIDER_LABELS = {AMQP_RABBITMQ => "RabbitMQ",
|
18
|
-
AMQP_QPID => "Qpid" }
|
19
|
-
|
20
|
-
attr_accessible :description, :name, :layout_id, :layout, :amqp_provider
|
13
|
+
attr_accessible :description, :name, :layout_id, :layout,
|
14
|
+
:amqp_provider, :layout_name, :networking, :platform
|
21
15
|
after_save :update_hostgroup_name
|
22
16
|
after_validation :check_form_complete
|
23
17
|
|
24
18
|
belongs_to :layout
|
19
|
+
|
20
|
+
# needs to be defined before hostgroup association
|
21
|
+
before_destroy :prepare_destroy
|
25
22
|
belongs_to :hostgroup, :dependent => :destroy
|
26
23
|
|
27
24
|
has_many :deployment_role_hostgroups, :dependent => :destroy
|
@@ -45,80 +42,123 @@ module Staypuft
|
|
45
42
|
validates :layout, :presence => true
|
46
43
|
validates :hostgroup, :presence => true
|
47
44
|
|
48
|
-
|
45
|
+
after_validation :check_form_complete
|
46
|
+
before_save :update_layout
|
47
|
+
after_save :update_based_on_settings
|
49
48
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
49
|
+
SCOPES = [[:nova, :@nova_service, NovaService],
|
50
|
+
[:neutron, :@neutron_service, NeutronService],
|
51
|
+
[:glance, :@glance_service, GlanceService],
|
52
|
+
[:cinder, :@cinder_service, CinderService],
|
53
|
+
[:passwords, :@passwords, Passwords],
|
54
|
+
[:vips, :@vips, VIPS],
|
55
|
+
[:ips, :@ips, IPS]]
|
56
56
|
|
57
|
-
|
57
|
+
SCOPES.each do |name, ivar, scope_class|
|
58
|
+
define_method name do
|
59
|
+
instance_variable_get ivar or
|
60
|
+
instance_variable_set ivar, scope_class.new(self)
|
61
|
+
end
|
62
|
+
after_save { send(name).run_callbacks :save }
|
63
|
+
end
|
58
64
|
|
59
|
-
|
60
|
-
|
65
|
+
validates_associated :nova, :if => lambda { |d| d.form_step_is_past_configuration? && d.nova.active? }
|
66
|
+
validates_associated :neutron, :if => lambda { |d| d.form_step_is_past_configuration? && d.neutron.active? }
|
67
|
+
validates_associated :glance, :if => lambda {|d| d.form_step_is_past_configuration? && d.glance.active? }
|
68
|
+
validates_associated :cinder, :if => lambda {|d| d.form_step_is_past_configuration? && d.cinder.active? }
|
69
|
+
validates_associated :passwords
|
70
|
+
|
71
|
+
def initialize(attributes = {}, options = {})
|
72
|
+
super({ amqp_provider: AmqpProvider::RABBITMQ,
|
73
|
+
layout_name: LayoutName::NON_HA,
|
74
|
+
networking: Networking::NOVA,
|
75
|
+
platform: Platform::RHEL7 }.merge(attributes),
|
76
|
+
options)
|
77
|
+
|
78
|
+
self.hostgroup = Hostgroup.new(name: name, parent: Hostgroup.get_base_hostgroup)
|
79
|
+
|
80
|
+
self.nova.set_defaults
|
81
|
+
self.neutron.set_defaults
|
82
|
+
self.glance.set_defaults
|
83
|
+
self.cinder.set_defaults
|
84
|
+
self.passwords.set_defaults
|
85
|
+
self.layout = Layout.where(:name => self.layout_name,
|
86
|
+
:networking => self.networking).first
|
61
87
|
end
|
62
88
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
super
|
89
|
+
extend AttributeParamStorage
|
90
|
+
|
91
|
+
# Returns a list of hosts that are currently being deployed.
|
92
|
+
def in_progress_hosts(hostgroup)
|
93
|
+
return in_progress? ? hostgroup.openstack_hosts : {}
|
69
94
|
end
|
70
95
|
|
71
|
-
#
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
old_role_hostgroups_arr = deployment_role_hostgroups.to_a
|
76
|
-
layout.layout_roles.each do |layout_role|
|
77
|
-
role_hostgroup = deployment_role_hostgroups.where(:role_id => layout_role.role).first_or_initialize do |drh|
|
78
|
-
drh.hostgroup = Hostgroup.new(name: layout_role.role.name, parent: hostgroup)
|
79
|
-
end
|
96
|
+
# Helper method for checking whether this deployment is in progress or not.
|
97
|
+
def in_progress?
|
98
|
+
ForemanTasks::Lock.locked? self, nil
|
99
|
+
end
|
80
100
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
101
|
+
# Returns all deployed hosts with no errors (default behaviour). Set
|
102
|
+
# errors=true to return all deployed hosts that have errors
|
103
|
+
def deployed_hosts(hostgroup, errors=false)
|
104
|
+
in_progress? ? {} : hostgroup.openstack_hosts(errors)
|
105
|
+
end
|
86
106
|
|
87
|
-
|
88
|
-
|
107
|
+
def self.param_scope
|
108
|
+
'deployment'
|
109
|
+
end
|
89
110
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
111
|
+
module AmqpProvider
|
112
|
+
RABBITMQ = 'rabbitmq'
|
113
|
+
QPID = 'qpid'
|
114
|
+
LABELS = { RABBITMQ => N_('RabbitMQ'), QPID => N_('Qpid') }
|
115
|
+
TYPES = LABELS.keys
|
116
|
+
HUMAN = N_('Messaging provider')
|
96
117
|
end
|
97
118
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
119
|
+
module Networking
|
120
|
+
NOVA = 'nova'
|
121
|
+
NEUTRON = 'neutron'
|
122
|
+
LABELS = { NOVA => N_('Nova Network'), NEUTRON => N_('Neutron Networking') }
|
123
|
+
TYPES = LABELS.keys
|
124
|
+
HUMAN = N_('Networking')
|
125
|
+
end
|
126
|
+
|
127
|
+
module LayoutName
|
128
|
+
NON_HA = 'Controller / Compute'
|
129
|
+
HA = 'High Availability Controllers / Compute'
|
130
|
+
LABELS = { NON_HA => N_('Controller / Compute'),
|
131
|
+
HA => N_('High Availability Controllers / Compute') }
|
132
|
+
TYPES = LABELS.keys
|
133
|
+
HUMAN = N_('High Availability')
|
134
|
+
end
|
135
|
+
|
136
|
+
module Platform
|
137
|
+
RHEL7 = 'rhel7'
|
138
|
+
RHEL6 = 'rhel6'
|
139
|
+
LABELS = { RHEL7 => N_('Red Hat Enterprise Linux OpenStack Platform 5 with RHEL 7'),
|
140
|
+
RHEL6 => N_('Red Hat Enterprise Linux OpenStack Platform 5 with RHEL 6') }
|
141
|
+
TYPES = LABELS.keys
|
142
|
+
HUMAN = N_('Platform')
|
143
|
+
end
|
144
|
+
|
145
|
+
param_attr :amqp_provider, :networking, :layout_name, :platform
|
146
|
+
validates :amqp_provider, :presence => true, :inclusion => { :in => AmqpProvider::TYPES }
|
147
|
+
validates :networking, :presence => true, :inclusion => { :in => Networking::TYPES }
|
148
|
+
validates :layout_name, presence: true, inclusion: { in: LayoutName::TYPES }
|
149
|
+
validates :platform, presence: true, inclusion: { in: Platform::TYPES }
|
150
|
+
|
151
|
+
# TODO(mtaylor)
|
152
|
+
# Use conditional validations to validate the deployment multi-step form.
|
153
|
+
# deployment.form_step should be used to check the form step the user is
|
154
|
+
# currently on.
|
155
|
+
# e.g.
|
156
|
+
# validates :name, :presence => true, :if => :form_step_is_configuration?
|
157
|
+
|
158
|
+
scoped_search :on => :name, :complete_value => :true
|
159
|
+
|
160
|
+
def self.available_locks
|
161
|
+
[:deploy]
|
122
162
|
end
|
123
163
|
|
124
164
|
def services_hostgroup_map
|
@@ -133,20 +173,87 @@ module Staypuft
|
|
133
173
|
self.hosts.any?(&:open_stack_deployed?)
|
134
174
|
end
|
135
175
|
|
176
|
+
def form_step_is_configuration?
|
177
|
+
self.form_step.to_sym == Deployment::STEP_CONFIGURATION
|
178
|
+
end
|
179
|
+
|
180
|
+
def form_step_is_past_configuration?
|
181
|
+
self.form_step_is_configuration? || self.form_complete?
|
182
|
+
end
|
183
|
+
|
136
184
|
def form_complete?
|
137
185
|
self.form_step.to_sym == Deployment::STEP_COMPLETE
|
138
186
|
end
|
139
187
|
|
188
|
+
def ha?
|
189
|
+
self.layout_name == LayoutName::HA
|
190
|
+
end
|
191
|
+
|
140
192
|
private
|
193
|
+
|
194
|
+
def update_layout
|
195
|
+
self.layout = Layout.where(:name => layout_name, :networking => networking).first
|
196
|
+
end
|
197
|
+
|
198
|
+
def update_based_on_settings
|
199
|
+
update_hostgroup_name
|
200
|
+
update_operating_system
|
201
|
+
update_hostgroup_list
|
202
|
+
end
|
203
|
+
|
141
204
|
def update_hostgroup_name
|
142
205
|
hostgroup.name = self.name
|
143
206
|
hostgroup.save!
|
144
207
|
end
|
145
208
|
|
209
|
+
def update_operating_system
|
210
|
+
self.hostgroup.operatingsystem = case platform
|
211
|
+
when Platform::RHEL6
|
212
|
+
Operatingsystem.where(name: 'RedHat', major: '6', minor: '5').first
|
213
|
+
when Platform::RHEL7
|
214
|
+
Operatingsystem.where(name: 'RedHat', major: '7', minor: '0').first
|
215
|
+
Operatingsystem.where(name: 'RedHat', major: '6', minor: '5').first
|
216
|
+
end or
|
217
|
+
raise 'missing Operatingsystem'
|
218
|
+
self.hostgroup.save!
|
219
|
+
end
|
220
|
+
|
221
|
+
# After setting or changing layout, update the set of child hostgroups,
|
222
|
+
# adding groups for any roles not already represented, and removing others
|
223
|
+
# no longer needed.
|
224
|
+
def update_hostgroup_list
|
225
|
+
old_deployment_role_hostgroups = deployment_role_hostgroups.to_a
|
226
|
+
new_deployment_role_hostgroups = layout.layout_roles.map do |layout_role|
|
227
|
+
deployment_role_hostgroup = deployment_role_hostgroups.where(:role_id => layout_role.role).first_or_initialize do |drh|
|
228
|
+
drh.hostgroup = Hostgroup.new(name: layout_role.role.name, parent: hostgroup)
|
229
|
+
end
|
230
|
+
|
231
|
+
deployment_role_hostgroup.hostgroup.add_puppetclasses_from_resource(layout_role.role)
|
232
|
+
layout_role.role.services.each do |service|
|
233
|
+
deployment_role_hostgroup.hostgroup.add_puppetclasses_from_resource(service)
|
234
|
+
end
|
235
|
+
# deployment_role_hostgroup.hostgroup.save!
|
236
|
+
|
237
|
+
deployment_role_hostgroup.deploy_order = layout_role.deploy_order
|
238
|
+
deployment_role_hostgroup.save!
|
239
|
+
|
240
|
+
deployment_role_hostgroup
|
241
|
+
end
|
242
|
+
|
243
|
+
# delete any prior mappings that remain
|
244
|
+
(old_deployment_role_hostgroups - new_deployment_role_hostgroups).each &:destroy
|
245
|
+
end
|
246
|
+
|
146
247
|
# Checks to see if the form step was the last in the series. If so it sets
|
147
248
|
# the form_step field to complete.
|
148
249
|
def check_form_complete
|
149
250
|
self.form_step = Deployment::STEP_COMPLETE if self.form_step.to_sym == Deployment::STEP_CONFIGURATION
|
150
251
|
end
|
252
|
+
|
253
|
+
def prepare_destroy
|
254
|
+
hosts.each &:open_stack_unassign
|
255
|
+
child_hostgroups.each &:destroy
|
256
|
+
end
|
257
|
+
|
151
258
|
end
|
152
259
|
end
|
@@ -3,7 +3,7 @@ module Staypuft
|
|
3
3
|
attr_accessible :deployment, :deployment_id, :hostgroup, :hostgroup_id, :role, :role_id, :deploy_order
|
4
4
|
|
5
5
|
belongs_to :deployment
|
6
|
-
belongs_to :hostgroup
|
6
|
+
belongs_to :hostgroup, dependent: :destroy
|
7
7
|
belongs_to :role
|
8
8
|
has_many :services, :through => :role
|
9
9
|
|
data/app/models/staypuft/role.rb
CHANGED
@@ -15,6 +15,13 @@ module Staypuft
|
|
15
15
|
|
16
16
|
attr_accessible :description, :max_hosts, :min_hosts, :name
|
17
17
|
|
18
|
-
validates
|
18
|
+
validates :name, :presence => true, :uniqueness => true
|
19
|
+
|
20
|
+
scope(:in_deployment, lambda do |deployment|
|
21
|
+
joins(:deployment_role_hostgroups).
|
22
|
+
where(DeploymentRoleHostgroup.table_name => { deployment_id: deployment })
|
23
|
+
end)
|
24
|
+
|
25
|
+
scope(:controller, where(name: Seeder::CONTROLLER_ROLES.map { |h| h.fetch(:name) }))
|
19
26
|
end
|
20
27
|
end
|
@@ -83,7 +83,10 @@ Staypuft::Service::UI_PARAMS = {
|
|
83
83
|
'swift_storage_device',
|
84
84
|
'swift_storage_ips'],
|
85
85
|
'Glance (non-HA)' => ['glance_db_password',
|
86
|
-
'glance_user_password'
|
86
|
+
'glance_user_password',
|
87
|
+
'glance_backend',
|
88
|
+
'glance_rbd_store_user',
|
89
|
+
'glance_rbd_store_pool'],
|
87
90
|
'Cinder (controller)' => ['cinder_backend_eqlx',
|
88
91
|
'cinder_backend_eqlx_name',
|
89
92
|
'cinder_backend_gluster',
|
@@ -92,6 +95,8 @@ Staypuft::Service::UI_PARAMS = {
|
|
92
95
|
'cinder_backend_iscsi_name',
|
93
96
|
'cinder_backend_nfs',
|
94
97
|
'cinder_backend_nfs_name',
|
98
|
+
'cinder_backend_rbd',
|
99
|
+
'cinder_backend_rbd_name',
|
95
100
|
'cinder_db_password',
|
96
101
|
'cinder_multiple_backends',
|
97
102
|
'cinder_gluster_shares',
|
@@ -106,6 +111,12 @@ Staypuft::Service::UI_PARAMS = {
|
|
106
111
|
'cinder_eqlx_use_chap',
|
107
112
|
'cinder_eqlx_chap_login',
|
108
113
|
'cinder_eqlx_chap_password',
|
114
|
+
'cinder_rbd_pool',
|
115
|
+
'cinder_rbd_ceph_conf',
|
116
|
+
'cinder_rbd_flatten_volume_from_snapshot',
|
117
|
+
'cinder_rbd_max_clone_depth',
|
118
|
+
'cinder_rbd_user',
|
119
|
+
'cinder_rbd_secret_uuid',
|
109
120
|
'cinder_user_password'],
|
110
121
|
'Heat' => ['heat_cfn',
|
111
122
|
'heat_cloudwatch',
|
@@ -0,0 +1,60 @@
|
|
1
|
+
<div class="tab-pane" id="<%= child_hostgroup.name.parameterize.underscore %>_assigned_hosts">
|
2
|
+
<% if child_hostgroup.hosts.present? %>
|
3
|
+
<%= form_tag(unassign_host_deployment_path(id: deployment), class: 'form-horizontal well association') do |f| %>
|
4
|
+
<%= submit_tag _("Unassign Hosts"), :class => "btn btn-primary btn-sm pull-left" %>
|
5
|
+
<h4 class="pull-left"><%= _("Assigned Hosts") %></h4>
|
6
|
+
<button type="button" class="close" aria-hidden="true">×</button>
|
7
|
+
<p class="clearfix"></p>
|
8
|
+
<%= hidden_field_tag :hostgroup_id, child_hostgroup.id %>
|
9
|
+
<table class="table table-bordered table-striped table-condensed">
|
10
|
+
<thead>
|
11
|
+
<tr>
|
12
|
+
<th class="ca">
|
13
|
+
<%= check_box_tag :check_all %>
|
14
|
+
</th>
|
15
|
+
<th><%= sort :name, :as => _('Name') %></th>
|
16
|
+
<th class="hidden-s hidden-xs"><%= _('Deploying?') %></th>
|
17
|
+
<th class="hidden-s hidden-xs"><%= sort :ip, :as => _('IP Address') %></th>
|
18
|
+
</tr>
|
19
|
+
</thead>
|
20
|
+
<tbody>
|
21
|
+
<% child_hostgroup.hosts.each do |host| %>
|
22
|
+
<% disabled = ForemanTasks::Lock.locked?(deployment, nil) && host.open_stack_deployed? %>
|
23
|
+
<tr class="<%= ['checkbox_highlight',
|
24
|
+
('deploying' if disabled)
|
25
|
+
].compact.join(' ') %>">
|
26
|
+
<td class="ca">
|
27
|
+
<%= check_box_tag 'host_ids[]',
|
28
|
+
host.id,
|
29
|
+
false,
|
30
|
+
id: "host_ids_#{host.id}",
|
31
|
+
disabled: disabled %>
|
32
|
+
<%= hidden_field_tag 'host_ids[]', host.id if disabled %>
|
33
|
+
</td>
|
34
|
+
<td class="ellipsis">
|
35
|
+
<%= host_label(host) %>
|
36
|
+
</td>
|
37
|
+
<td class="hidden-s hidden-xs">
|
38
|
+
<% if disabled %>
|
39
|
+
<span class="glyphicon glyphicon-cloud-upload"></span>
|
40
|
+
<% else %>
|
41
|
+
<span class="glyphicon glyphicon-minus"></span>
|
42
|
+
<% end %>
|
43
|
+
</td>
|
44
|
+
<td class="hidden-s hidden-xs"><%= host.ip %></td>
|
45
|
+
</tr>
|
46
|
+
<% end %>
|
47
|
+
</tbody>
|
48
|
+
</table>
|
49
|
+
<% end %>
|
50
|
+
<% else %>
|
51
|
+
<div class="well association">
|
52
|
+
<button type="button" class="close pull-right" aria-hidden="true">×</button>
|
53
|
+
<h4><%= _("Assigned Hosts") %></h4>
|
54
|
+
<div class="alert alert-warning">
|
55
|
+
<span class="glyphicon glyphicon-warning-sign"> </span>
|
56
|
+
<%= _("No hosts were assigned to this group yet.") %>
|
57
|
+
</div>
|
58
|
+
</div>
|
59
|
+
<% end %>
|
60
|
+
</div>
|
@@ -0,0 +1,51 @@
|
|
1
|
+
<div class="tab-pane" id="<%= child_hostgroup.name.parameterize.underscore %>_deployed_hosts">
|
2
|
+
<% if child_hostgroup.hosts.select { |h| !ForemanTasks::Lock.locked?(deployment, nil) && h.open_stack_deployed? }.present? %>
|
3
|
+
<%= form_tag(unassign_host_deployment_path(id: deployment), class: 'form-horizontal well association') do |f| %>
|
4
|
+
<%= submit_tag _("Unassign Hosts"),
|
5
|
+
:class => "btn btn-danger btn-sm pull-left",
|
6
|
+
:'data-toggle' => "tooltip",
|
7
|
+
:'data-placement' => "right",
|
8
|
+
:title => _("Unassigning deployed hosts may lead to unexpected problems.") %>
|
9
|
+
<h4 class="pull-left"><%= _("Deployed Hosts") %></h4>
|
10
|
+
<button type="button" class="close" aria-hidden="true">×</button>
|
11
|
+
<p class="clearfix"></p>
|
12
|
+
<%= hidden_field_tag :hostgroup_id, child_hostgroup.id %>
|
13
|
+
<table class="table table-bordered table-striped table-condensed">
|
14
|
+
<thead>
|
15
|
+
<tr>
|
16
|
+
<th class="ca">
|
17
|
+
<%= check_box_tag :check_all %>
|
18
|
+
</th>
|
19
|
+
<th><%= sort :name, :as => _('Name') %></th>
|
20
|
+
<th class="hidden-s hidden-xs"><%= sort :ip, :as => _('IP Address') %></th>
|
21
|
+
</tr>
|
22
|
+
</thead>
|
23
|
+
<tbody>
|
24
|
+
<% child_hostgroup.hosts.select{ |h| !ForemanTasks::Lock.locked?(deployment, nil) && h.open_stack_deployed? }.each do |host| %>
|
25
|
+
<tr class="checkbox_highlight deployed">
|
26
|
+
<td class="ca">
|
27
|
+
<%= check_box_tag 'host_ids[]',
|
28
|
+
host.id,
|
29
|
+
false,
|
30
|
+
id: "host_ids_#{host.id}" %>
|
31
|
+
</td>
|
32
|
+
<td class="ellipsis">
|
33
|
+
<%= host_label(host) %>
|
34
|
+
</td>
|
35
|
+
<td class="hidden-s hidden-xs"><%= host.ip %></td>
|
36
|
+
</tr>
|
37
|
+
<% end %>
|
38
|
+
</tbody>
|
39
|
+
</table>
|
40
|
+
<% end %>
|
41
|
+
<% else %>
|
42
|
+
<div class="well association">
|
43
|
+
<button type="button" class="close pull-right" aria-hidden="true">×</button>
|
44
|
+
<h4><%= _("Deployed Hosts") %></h4>
|
45
|
+
<div class="alert alert-warning">
|
46
|
+
<span class="glyphicon glyphicon-warning-sign"> </span>
|
47
|
+
<%= _("No hosts from this group have been deployed yet.") %>
|
48
|
+
</div>
|
49
|
+
</div>
|
50
|
+
<% end %>
|
51
|
+
</div>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<div class="tab-pane" id="<%= child_hostgroup.name.parameterize.underscore %>_free_hosts">
|
2
|
+
<% if child_hostgroup.free_hosts.present? %>
|
3
|
+
<%= form_tag(associate_host_deployment_path(id: deployment), class: 'form-horizontal well association') do |f| %>
|
4
|
+
<%= submit_tag _("Assign Hosts"), :class => "btn btn-primary btn-sm pull-left" %>
|
5
|
+
<h4 class="pull-left"><%= _("Free Hosts") %></h4>
|
6
|
+
<button type="button" class="close" aria-hidden="true">×</button>
|
7
|
+
<p class="clearfix"></p>
|
8
|
+
<%= hidden_field_tag :hostgroup_id, child_hostgroup.id %>
|
9
|
+
<table class="table table-bordered table-striped table-condensed">
|
10
|
+
<thead>
|
11
|
+
<tr>
|
12
|
+
<th class="ca">
|
13
|
+
<%= check_box_tag :check_all %>
|
14
|
+
</th>
|
15
|
+
<th><%= sort :name, :as => _('Name') %></th>
|
16
|
+
<th class="hidden-s hidden-xs"><%= sort :ip, :as => _('IP Address') %></th>
|
17
|
+
</tr>
|
18
|
+
</thead>
|
19
|
+
<tbody>
|
20
|
+
<% child_hostgroup.free_hosts.each do |host| %>
|
21
|
+
<tr class="checkbox_highlight">
|
22
|
+
<td class="ca">
|
23
|
+
<%= check_box_tag 'host_ids[]',
|
24
|
+
host.id,
|
25
|
+
child_hostgroup.host_ids.include?(host.id),
|
26
|
+
id: "host_ids_#{host.id}" %>
|
27
|
+
</td>
|
28
|
+
<td class="ellipsis">
|
29
|
+
<%= host_label(host) %>
|
30
|
+
</td>
|
31
|
+
<td class="hidden-s hidden-xs"><%= host.ip %></td>
|
32
|
+
</tr>
|
33
|
+
<% end %>
|
34
|
+
</tbody>
|
35
|
+
</table>
|
36
|
+
<% end %>
|
37
|
+
<% else %>
|
38
|
+
<div class="well association">
|
39
|
+
<button type="button" class="close pull-right" aria-hidden="true">×</button>
|
40
|
+
<h4><%= _("Free Hosts") %></h4>
|
41
|
+
<div class="alert alert-warning">
|
42
|
+
<span class="glyphicon glyphicon-warning-sign"> </span>
|
43
|
+
<%= _("All available hosts have been already assigned.") %>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
<% end %>
|
47
|
+
</div>
|