staypuft 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,8 +10,7 @@ module Staypuft
10
10
  when :deployment_settings
11
11
  @layouts = Layout.all
12
12
  when :services_configuration
13
- # Collect services across all deployment's roles
14
- @services = @deployment.roles(:services).map(&:services).flatten.uniq
13
+ @services = @deployment.services
15
14
  end
16
15
 
17
16
  render_wizard
@@ -32,6 +32,11 @@ module Staypuft
32
32
  @deployment = Deployment.find(params[:id])
33
33
  end
34
34
 
35
+ def summary
36
+ @deployment = Deployment.find(params[:id])
37
+ @services = @deployment.services
38
+ end
39
+
35
40
  def destroy
36
41
  Deployment.find(params[:id]).destroy
37
42
  process_success
@@ -54,20 +59,23 @@ module Staypuft
54
59
  def associate_host
55
60
  hostgroup = ::Hostgroup.find params[:hostgroup_id]
56
61
 
57
- targeted_hosts = Array(::Host::Base.find *params[:host_ids])
62
+ targeted_hosts = ::Host::Base.find Array(params[:host_ids])
58
63
  assigned_hosts = hostgroup.hosts
59
64
  hosts_to_assign = targeted_hosts - assigned_hosts
60
65
  hosts_to_remove = assigned_hosts - targeted_hosts
61
66
 
62
67
  hosts_to_assign.each do |discovered_host|
63
- host = discovered_host.becomes(::Host::Managed)
64
- host.type = 'Host::Managed'
65
- host.managed = true
66
- host.build = false
67
- host.hostgroup = hostgroup
68
+ host = discovered_host.becomes(::Host::Managed)
69
+ host.type = 'Host::Managed'
70
+ host.managed = true
71
+ host.build = true
72
+
73
+ host.hostgroup = hostgroup
74
+ # set discovery environment to keep booting discovery image
75
+ host.environment = Environment.get_discovery
68
76
 
69
77
  # root_pass is not copied for some reason
70
- host.root_pass = hostgroup.root_pass
78
+ host.root_pass = hostgroup.root_pass
71
79
 
72
80
  # I do not why but the final save! adds following condytion to the update SQL command
73
81
  # "WHERE "hosts"."type" IN ('Host::Managed') AND "hosts"."id" = 283"
@@ -22,27 +22,53 @@ module Actions
22
22
  end
23
23
 
24
24
  def run
25
- host = ::Host.find(input[:host_id])
26
- host.setBuild or fail(::Staypuft::Exception, 'Setting Build Flag Failed')
25
+ host = ::Host.find(input[:host_id])
26
+ # return back to hostgroup's environment
27
+ host.environment = nil
28
+ host.save!
29
+ host.send :setTFTP
30
+ restart(host)
31
+ end
27
32
 
28
- check_expected_state(host.power.state)
29
- if %w(running on).include?(host.power.state)
30
- if !host.power.reset
31
- fail(::Staypuft::Exception, 'Resetting Host Failed')
33
+ private
34
+
35
+ def restart(host)
36
+ power_management = begin
37
+ host.power
38
+ rescue Foreman::Exception => e
39
+ if e.code == 'ERF42-9958' # Unknown power management support
40
+ nil
41
+ else
42
+ raise e
32
43
  end
33
44
  end
34
45
 
35
- # FIXME host.power.reset leaves the host in "shutdown" state for
36
- # libvirt not tested in BMC. The following code makes sure the host
37
- # starts again
38
- check_expected_state(host.power.state)
39
- if %w(shutoff off).include?(host.power.state)
40
- host.power.start or fail(::Staypuft::Exception, 'Starting Host Failed')
46
+ if power_management
47
+ restart_with_power_management power_management
48
+ else
49
+ restart_with_foreman_proxy host
41
50
  end
51
+ end
42
52
 
53
+ def restart_with_foreman_proxy(host)
54
+ host.setReboot # FIXME detect failures
43
55
  end
44
56
 
45
- private
57
+ def restart_with_power_management(power)
58
+ check_expected_state(power.state)
59
+ if %w(running on).include?(power.state)
60
+ if !power.reset
61
+ fail(::Staypuft::Exception, 'Resetting Host Failed')
62
+ end
63
+ end
64
+
65
+ # FIXME host.power.reset leaves the host in "shutdown" state for
66
+ # libvirt not tested in BMC. The following code makes sure the host starts again
67
+ check_expected_state(power.state)
68
+ if %w(shutoff off).include?(power.state)
69
+ power.start or fail(::Staypuft::Exception, 'Starting Host Failed')
70
+ end
71
+ end
46
72
 
47
73
  def check_expected_state(state)
48
74
  if !%w(running on cycle shutoff off).include?(state.downcase)
@@ -38,7 +38,11 @@ module Actions
38
38
 
39
39
  def humanized_output
40
40
  format "Hostgroup: %s\n%s", input[:name],
41
- planned_actions.map(&:humanized_output).map { |l| ' ' + l }.join("\n")
41
+ planned_actions.
42
+ map(&:humanized_output).
43
+ tap { |lines| lines << '-' if lines.empty? }.
44
+ map { |l| ' ' + l }.
45
+ join("\n")
42
46
  end
43
47
 
44
48
  end
@@ -0,0 +1,12 @@
1
+ module Staypuft::Concerns::EnvironmentExtensions
2
+ extend ActiveSupport::Concern
3
+
4
+ module ClassMethods
5
+ def get_discovery
6
+ find_by_name('discovery') or
7
+ raise ::Staypuft::Exception,
8
+ 'missing discovery environment, which ensures all its machines are booted ' +
9
+ 'to discovery image.'
10
+ end
11
+ end
12
+ end
@@ -14,6 +14,8 @@ module Staypuft
14
14
  :source => :hostgroup
15
15
  has_many :roles, :through => :deployment_role_hostgroups
16
16
 
17
+ has_many :services, :through => :roles
18
+
17
19
  validates :name, :presence => true, :uniqueness => true
18
20
 
19
21
  validates :layout, :presence => true
@@ -16,10 +16,10 @@ module Staypuft
16
16
  # there are possibly multiple puppetclass matches. without this, we'll
17
17
  # just grab the first puppetclass from the matching hostgroup
18
18
  UI_PARAMS = {
19
- "qpid"=> ["qpid_ca", "qpid_cert", "qpid_host", "qpid_key", "qpid_nssdb_password"],
19
+ "qpid (non-HA)"=> ["qpid_ca", "qpid_cert", "qpid_host", "qpid_key", "qpid_nssdb_password"],
20
20
  "MySQL"=> ["mysql_ca", "mysql_cert", "mysql_host", "mysql_key",
21
21
  "mysql_root_password"],
22
- "Keystone"=> ["keystone_admin_token", "keystone_db_password"],
22
+ "Keystone (non-HA)"=> ["keystone_admin_token", "keystone_db_password"],
23
23
  "Nova (Controller)"=> ["admin_email", "admin_password", "auto_assign_floating_ip",
24
24
  "controller_admin_host", "controller_priv_host",
25
25
  "controller_pub_host", "freeipa", "horizon_ca",
@@ -49,7 +49,7 @@ module Staypuft
49
49
  "swift_admin_password", "swift_ringserver_ip",
50
50
  "swift_shared_secret", "swift_storage_device",
51
51
  "swift_storage_ips"],
52
- "Glance"=> ["glance_db_password", "glance_user_password"],
52
+ "Glance (non-HA)"=> ["glance_db_password", "glance_user_password"],
53
53
  "Cinder"=> ["cinder_backend_gluster", "cinder_backend_iscsi",
54
54
  "cinder_db_password", "cinder_gluster_servers",
55
55
  "cinder_gluster_volume", "cinder_user_password"],
@@ -88,27 +88,36 @@ module Staypuft
88
88
  "tenant_network_type", "tunnel_id_ranges", "verbose"],
89
89
  "Neutron-ovs-agent"=> [],
90
90
  "Swift" => ["swift_all_ips", "swift_ext4_device", "swift_local_interface",
91
- "swift_loopback", "swift_ring_server", "swift_shared_secret"]
91
+ "swift_loopback", "swift_ring_server", "swift_shared_secret"]
92
92
 
93
93
  }
94
94
 
95
95
  def ui_params_for_form(hostgroup = self.hostgroups.first)
96
- return [] if (hostgroup.nil? || hostgroup.puppetclasses.nil?)
97
- puppetclass = hostgroup.puppetclasses.first
98
- # nil puppetclass means grab the first one from matching hostgroup
99
- UI_PARAMS[self.name].collect do |param_key|
100
- if param_key.is_a?(Array)
101
- param_name = param_key[0]
102
- param_puppetclass = param_key[1]
103
- else
104
- param_name = param_key
105
- param_puppetclass = puppetclass
96
+ return [] if (hostgroup.nil?)
97
+ if hostgroup.puppetclasses.blank?
98
+ params_from_hash = []
99
+ else
100
+ puppetclass = hostgroup.puppetclasses.first
101
+ params_from_hash = UI_PARAMS.fetch(self.name,[]).collect do |param_key|
102
+ if param_key.is_a?(Array)
103
+ param_name = param_key[0]
104
+ param_puppetclass = Puppetclass.find_by_name(param_key[1])
105
+ else
106
+ param_name = param_key
107
+ param_puppetclass = puppetclass
108
+ end
109
+ param_lookup_key = param_puppetclass.class_params.where(:key=>param_key).first
110
+ param_lookup_key.nil? ? nil : {:hostgroup => hostgroup,
111
+ :puppetclass => param_puppetclass,
112
+ :param_key => param_lookup_key}
113
+ end.compact
114
+ end
115
+ params_from_service = self.puppetclasses.collect do |pclass|
116
+ pclass.class_params.collect do |class_param|
117
+ {:hostgroup => hostgroup, :puppetclass => pclass, :param_key => class_param}
106
118
  end
107
- param_lookup_key = param_puppetclass.class_params.where(:key=>param_key).first
108
- param_lookup_key.nil? ? nil : {:hostgroup => hostgroup,
109
- :puppetclass => param_puppetclass,
110
- :param_key => param_lookup_key}
111
- end.compact
119
+ end.flatten
120
+ params_from_hash + params_from_service
112
121
  end
113
122
  end
114
123
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  <% content_for(:title_actions) do %>
4
4
 
5
+ <%= link_to(_("Configuration Summary"), summary_deployment_path(@deployment.id), :class => '') %>
6
+
5
7
  <% if Rails.env.development? %>
6
8
  <div class="btn-group">
7
9
  <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
@@ -50,7 +52,7 @@
50
52
  <% if child_hostgroup.own_and_free_hosts.present? %>
51
53
  <%= form_tag(associate_host_deployments_path, class: 'form-horizontal well association') do |f| %>
52
54
  <p>
53
- <%= submit_tag _("Apply"), :class => "btn btn-primary btn-sm" %>
55
+ <%= submit_tag _("Assign"), :class => "btn btn-primary btn-sm" %>
54
56
  </p>
55
57
  <%= hidden_field_tag :hostgroup_id, child_hostgroup.id %>
56
58
  <table class="table table-bordered table-striped table-condensed">
@@ -0,0 +1,27 @@
1
+ <% title_actions link_to _("Back to Deployment"), deployment_path(@deployment.id)%>
2
+ <% title _("%s Summary") % @deployment.name %>
3
+
4
+ <div class="col-md-12">
5
+ <% @services.each_with_index do |service, i| %>
6
+ <div class="well <%= 'active' if i == 0 %>" id="<%= service.name.parameterize.underscore %>">
7
+ <h3><%= "#{service.name} " + _("Service Configuration") %></h3>
8
+ <% if (params_hash = service.ui_params_for_form).size > 0 %>
9
+ <% params_hash.each do |param_hash| %>
10
+ <div class="row">
11
+ <div class="col-md-3 text-right">
12
+ <%= label_tag param_hash[:param_key].key %>
13
+ </div>
14
+ <div class="col-md-9">
15
+ <%= content_tag "staypuft_deployment[hostgroup_params][#{param_hash[:hostgroup].id}][puppetclass_params][#{param_hash[:puppetclass].id}][#{param_hash[:param_key].key}]", param_hash[:hostgroup].current_param_value_str(param_hash[:param_key]), :class=>"" %>
16
+ </div>
17
+ </div>
18
+ <br/>
19
+ <% end %>
20
+ <% else %>
21
+ <div class="row">
22
+ <p class="col-md-12"><%= _("No configuration for this service.") %></p>
23
+ </div>
24
+ <% end %>
25
+ </div>
26
+ <% end %>
27
+ </div>
data/config/routes.rb CHANGED
@@ -8,6 +8,7 @@ Rails.application.routes.draw do
8
8
  member do
9
9
  get 'deploy'
10
10
  get 'populate'
11
+ get 'summary'
11
12
  end
12
13
  end
13
14
 
@@ -1,5 +1,2 @@
1
1
  gemspec path: '../staypuft'
2
2
 
3
- gem 'foreman_discovery',
4
- git: 'https://github.com/theforeman/foreman_discovery.git',
5
- branch: 'develop'
data/db/seeds.rb CHANGED
@@ -31,9 +31,11 @@ params = {
31
31
  "gluster_open_port_count" => '10',
32
32
  "heat_db_password" => SecureRandom.hex,
33
33
  "heat_user_password" => SecureRandom.hex,
34
+ "heat_cfn_user_password" => SecureRandom.hex,
34
35
  "horizon_secret_key" => SecureRandom.hex,
35
36
  "keystone_admin_token" => SecureRandom.hex,
36
37
  "keystone_db_password" => SecureRandom.hex,
38
+ "keystone_user_password" => SecureRandom.hex,
37
39
  "mysql_root_password" => SecureRandom.hex,
38
40
  "neutron_db_password" => SecureRandom.hex,
39
41
  "neutron_user_password" => SecureRandom.hex,
@@ -42,6 +44,7 @@ params = {
42
44
  "nova_default_floating_pool" => "nova",
43
45
  "swift_admin_password" => SecureRandom.hex,
44
46
  "swift_shared_secret" => SecureRandom.hex,
47
+ "swift_user_password" => SecureRandom.hex,
45
48
  "swift_all_ips" => ['192.168.203.1', '192.168.203.2', '192.168.203.3', '192.168.203.4'],
46
49
  "swift_ext4_device" => '/dev/sdc2',
47
50
  "swift_local_interface" => 'eth3',
@@ -62,6 +65,8 @@ params = {
62
65
  "mysql_resource_group_name" => 'mysqlgrp',
63
66
  "mysql_clu_member_addrs" => '192.168.203.11 192.168.203.12 192.168.203.13',
64
67
  "qpid_host" => '172.16.0.1',
68
+ "qpid_username" => 'openstack',
69
+ "qpid_password" => SecureRandom.hex,
65
70
  "admin_email" => "admin@#{Facter.value(:domain)}",
66
71
  "neutron_metadata_proxy_secret" => SecureRandom.hex,
67
72
  "enable_ovs_agent" => "true",
@@ -83,6 +88,8 @@ params = {
83
88
  "provider_vlan_auto_trunk" => "false",
84
89
  "backend_server_names" => [],
85
90
  "backend_server_addrs" => [],
91
+ "lb_backend_server_names" => [],
92
+ "lb_backend_server_addrs" => [],
86
93
  "configure_ovswitch" => "true",
87
94
  "neutron" => "false",
88
95
  "ssl" => "false",
@@ -97,9 +104,7 @@ params = {
97
104
  "horizon_cert" => "/etc/pki/tls/certs/PUB_HOST-horizon.crt",
98
105
  "horizon_key" => "/etc/pki/tls/private/PUB_HOST-horizon.key",
99
106
  "qpid_nssdb_password" => SecureRandom.hex,
100
- "pacemaker_cluster_name" => "openstack",
101
- "pacemaker_cluster_members" => "192.168.200.10 192.168.200.11 192.168.200.12",
102
- "pacemaker_disable_stonith" => false,
107
+ "fence_xvm_key_file_password" => SecureRandom.hex,
103
108
  }
104
109
 
105
110
  def get_key_type(value)
@@ -128,29 +133,40 @@ layouts = {
128
133
 
129
134
  # services don't have puppetclasses yet, since they aren't broken out on the back end
130
135
  services = {
131
- :qpid => {:name => "qpid", :class => nil},
132
- :mysql => {:name => "MySQL", :class => nil},
133
- :keystone => {:name => "Keystone", :class => nil},
134
- :nova_controller => {:name => "Nova (Controller)", :class => nil},
135
- :neutron_controller => {:name => "Neutron (Controller)", :class => nil},
136
- :glance => {:name => "Glance", :class => nil},
137
- :cinder => {:name => "Cinder", :class => nil},
138
- :heat => {:name => "Heat", :class => nil},
139
- :ceilometer => {:name => "Ceilometer", :class => nil},
140
- :neutron_l3 => {:name => "Neutron - L3", :class => nil},
141
- :dhcp => {:name => "DHCP", :class => nil},
142
- :ovs => {:name => "OVS", :class => nil},
143
- :nova_compute => {:name => "Nova-compute", :class => nil},
144
- :neutron_compute => {:name => "Neutron-compute", :class => nil},
145
- :neutron_ovs_agent => {:name => "Neutron-ovs-agent", :class => nil},
146
- :swift => {:name => "Swift", :class => nil}
136
+ :non_ha_qpid => {:name => "qpid (non-HA)", :class => []},
137
+ :mysql => {:name => "MySQL", :class => []},
138
+ :non_ha_keystone => {:name => "Keystone (non-HA)", :class => []},
139
+ :nova_controller => {:name => "Nova (Controller)", :class => []},
140
+ :neutron_controller => {:name => "Neutron (Controller)", :class => []},
141
+ :non_ha_glance => {:name => "Glance (non-HA)", :class => []},
142
+ :cinder => {:name => "Cinder", :class => []},
143
+ :heat => {:name => "Heat", :class => []},
144
+ :ceilometer => {:name => "Ceilometer", :class => []},
145
+ :neutron_l3 => {:name => "Neutron - L3", :class => []},
146
+ :dhcp => {:name => "DHCP", :class => []},
147
+ :ovs => {:name => "OVS", :class => []},
148
+ :nova_compute => {:name => "Nova-compute", :class => []},
149
+ :neutron_compute => {:name => "Neutron-compute", :class => []},
150
+ :neutron_ovs_agent => {:name => "Neutron-ovs-agent", :class => []},
151
+ :swift => {:name => "Swift", :class => []},
152
+ :ha_controller => {:name => "HA (Controller)", :class => ["quickstack::openstack_common",
153
+ "quickstack::pacemaker::common",
154
+ "quickstack::pacemaker::params"]},
155
+ :keystone_ha => {:name => "Keystone (HA)", :class => ["quickstack::pacemaker::keystone"]},
156
+ :load_balancer_ha => {:name => "Load Balancer (HA)", :class => ["quickstack::pacemaker::load_balancer"]},
157
+ :memcached_ha => {:name => "Memcached (HA)", :class => ["quickstack::pacemaker::memcached"]},
158
+ :qpid_ha => {:name => "qpid (HA)", :class => ["quickstack::pacemaker::qpid",
159
+ "qpid::server"]},
160
+ :glance_ha => {:name => "Glance (HA)", :class => ["quickstack::pacemaker::glance"]},
161
+ :nova_ha => {:name => "Nova (HA)", :class => ["quickstack::pacemaker::nova"]}
147
162
  }
148
163
  services.each do |skey, svalue|
149
164
  service = Staypuft::Service.where(:name=>svalue[:name]).first_or_create!
150
165
 
151
166
  # set params in puppetclass
152
- if svalue[:class]
153
- pclass = Puppetclass.find_by_name svalue[:class]
167
+ pclassnames = svalue[:class].kind_of?(Array) ? svalue[:class] : [ svalue[:class] ]
168
+ service.puppetclasses = pclassnames.collect do |pclassname|
169
+ pclass = Puppetclass.find_by_name pclassname
154
170
  # skip if puppet class isn't found (yet)
155
171
  if pclass
156
172
  pclass.class_params.each do |p|
@@ -161,9 +177,9 @@ services.each do |skey, svalue|
161
177
  p.override = true
162
178
  p.save!
163
179
  end
164
- service.puppetclasses = [ pclass ]
180
+ pclass
165
181
  end
166
- end
182
+ end.compact
167
183
 
168
184
  service.description = svalue[:description]
169
185
  service.save!
@@ -178,36 +194,40 @@ end
178
194
  roles = [
179
195
  {:name=>"Controller (Nova)",
180
196
  :class=>"quickstack::nova_network::controller",
181
- :layouts=>[[:ha_nova, 1], [:non_ha_nova, 1]],
182
- :services=>[:qpid, :mysql, :keystone, :nova_controller, :glance, :cinder, :heat, :ceilometer]},
197
+ :layouts=>[[:non_ha_nova, 1]],
198
+ :services=>[:non_ha_qpid, :mysql, :non_ha_keystone, :nova_controller, :non_ha_glance, :cinder, :heat, :ceilometer]},
183
199
  {:name=>"Compute (Nova)",
184
200
  :class=>"quickstack::nova_network::compute",
185
201
  :layouts=>[[:ha_nova, 10], [:non_ha_nova, 10]],
186
202
  :services=>[:nova_compute]},
187
203
  {:name=>"Controller (Neutron)",
188
204
  :class=>"quickstack::neutron::controller",
189
- :layouts=>[[:ha_neutron, 1], [:non_ha_neutron, 1]],
190
- :services=>[:qpid, :mysql, :keystone, :neutron_controller, :glance, :cinder, :heat, :ceilometer]},
205
+ :layouts=>[[:non_ha_neutron, 1]],
206
+ :services=>[:non_ha_qpid, :mysql, :non_ha_keystone, :neutron_controller, :non_ha_glance, :cinder, :heat, :ceilometer]},
191
207
  {:name=>"Compute (Neutron)",
192
208
  :class=>"quickstack::neutron::compute",
193
209
  :layouts=>[[:ha_neutron, 10], [:non_ha_neutron, 10]],
194
210
  :services=>[:neutron_compute, :neutron_ovs_agent]},
195
211
  {:name=>"Neutron Networker",
196
212
  :class=>"quickstack::neutron::networker",
197
- :layouts=>[[:ha_neutron, 2], [:non_ha_neutron, 2]],
213
+ :layouts=>[[:non_ha_neutron, 2]],
198
214
  :services=>[:neutron_l3, :dhcp, :ovs]},
199
215
  {:name=>"LVM Block Storage",
200
216
  :class=>"quickstack::storage_backend::lvm_cinder",
201
217
  :layouts=>[[:ha_nova, 3], [:ha_neutron, 3], [:non_ha_nova, 3], [:non_ha_neutron, 3]],
202
218
  :services=>[:cinder]},
203
- {:name=>"Load Balancer",
204
- :class=>"quickstack::load_balancer",
205
- :layouts=>[[:ha_nova, 4], [:ha_neutron, 4]],
206
- :services=>[]},
207
219
  {:name=>"Swift Storage Node",
208
220
  :class=>"quickstack::swift::storage",
209
- :layouts=>[[:non_ha_nova, 5], [:non_ha_neutron, 5]],
210
- :services=>[:swift]}
221
+ :layouts=>[[:ha_nova, 5], [:ha_neutron, 5], [:non_ha_nova, 5], [:non_ha_neutron, 5]],
222
+ :services=>[:swift]},
223
+ {:name=>"HA Controller (Nova)",
224
+ :class=>[],
225
+ :layouts=>[[:ha_nova, 1]],
226
+ :services=>[:ha_controller, :keystone_ha, :load_balancer_ha, :memcached_ha, :qpid_ha, :glance_ha, :nova_ha]},
227
+ {:name=>"HA Controller (Neutron)",
228
+ :class=>[],
229
+ :layouts=>[[:ha_neutron, 1]],
230
+ :services=>[]}
211
231
  ]
212
232
 
213
233
  roles.each do |r|
@@ -215,8 +235,9 @@ roles.each do |r|
215
235
  role = Staypuft::Role.where(:name => r[:name]).first_or_create!
216
236
 
217
237
  # set params in puppetclass
218
- if r[:class]
219
- pclass = Puppetclass.find_by_name r[:class]
238
+ pclassnames = r[:class].kind_of?(Array) ? r[:class] : [ r[:class] ]
239
+ role.puppetclasses = pclassnames.collect do |pclassname|
240
+ pclass = Puppetclass.find_by_name pclassname
220
241
  # skip if puppet class isn't found (yet)
221
242
  if pclass
222
243
  pclass.class_params.each do |p|
@@ -227,18 +248,30 @@ roles.each do |r|
227
248
  p.override = true
228
249
  p.save!
229
250
  end
230
- role.puppetclasses = [ pclass ]
251
+ pclass
231
252
  end
232
- end
253
+ end.compact
233
254
 
234
255
  role.description = r[:description]
256
+ old_role_services_arr = role.role_services.to_a
235
257
  r[:services].each do |key|
236
- Staypuft::RoleService.where(:role_id => role.id, :service_id => services[key][:obj].id).first_or_create!
258
+ role_service = role.role_services.where(:service_id => services[key][:obj].id).first_or_create!
259
+ old_role_services_arr.delete(role_service)
260
+ end
261
+ # delete any prior mappings that remain
262
+ old_role_services_arr.each do |role_service|
263
+ role.services.destroy(role_service.service)
237
264
  end
238
265
  role.save!
266
+ old_layout_roles_arr = role.layout_roles.to_a
239
267
  r[:layouts].each do |layout, deploy_order|
240
- layout_role = Staypuft::LayoutRole.where(:role_id => role.id, :layout_id => layouts[layout].id).first_or_initialize
268
+ layout_role = role.layout_roles.where(:layout_id => layouts[layout].id).first_or_initialize
241
269
  layout_role.deploy_order = deploy_order
242
270
  layout_role.save!
271
+ old_layout_roles_arr.delete(layout_role)
272
+ end
273
+ # delete any prior mappings that remain
274
+ old_layout_roles_arr.each do |layout_role|
275
+ role.layouts.destroy(layout_role.layout)
243
276
  end
244
277
  end
@@ -25,6 +25,7 @@ module Staypuft
25
25
  ::Host::Managed.send :include, Staypuft::Concerns::HostOrchestrationBuildHook
26
26
  ::Puppetclass.send :include, Staypuft::Concerns::PuppetclassExtensions
27
27
  ::Hostgroup.send :include, Staypuft::Concerns::HostgroupExtensions
28
+ ::Environment.send :include, Staypuft::Concerns::EnvironmentExtensions
28
29
  end
29
30
 
30
31
  rake_tasks do
@@ -1,3 +1,3 @@
1
1
  module Staypuft
2
- VERSION = '0.0.5'
2
+ VERSION = '0.0.7'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: staypuft
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-09 00:00:00.000000000 Z
12
+ date: 2014-04-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: foreman-tasks
@@ -64,17 +64,17 @@ dependencies:
64
64
  requirement: !ruby/object:Gem::Requirement
65
65
  none: false
66
66
  requirements:
67
- - - ! '>='
67
+ - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: '0'
69
+ version: 1.3.0.rc1
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
- - - ! '>='
75
+ - - ~>
76
76
  - !ruby/object:Gem::Version
77
- version: '0'
77
+ version: 1.3.0.rc1
78
78
  description: OpenStack Foreman Installer
79
79
  email:
80
80
  - foreman-dev+staypuft@googlegroups.com
@@ -103,6 +103,7 @@ files:
103
103
  - app/lib/actions/staypuft/middleware/as_current_user.rb
104
104
  - app/lib/staypuft/exception.rb
105
105
  - app/models/setting/staypuft_provisioning.rb
106
+ - app/models/staypuft/concerns/environment_extensions.rb
106
107
  - app/models/staypuft/concerns/host_orchestration_build_hook.rb
107
108
  - app/models/staypuft/concerns/hostgroup_extensions.rb
108
109
  - app/models/staypuft/concerns/puppetclass_extensions.rb
@@ -121,6 +122,7 @@ files:
121
122
  - app/views/staypuft/deployment_steps/services_selection.html.erb
122
123
  - app/views/staypuft/deployments/index.html.erb
123
124
  - app/views/staypuft/deployments/show.html.erb
125
+ - app/views/staypuft/deployments/summary.html.erb
124
126
  - app/views/staypuft/layouts/staypuft.html.erb
125
127
  - config/routes.rb
126
128
  - config/staypuft.local.rb