staypuft 0.0.5 → 0.0.7

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.
@@ -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