staypuft 0.0.8 → 0.0.9

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.
@@ -29,6 +29,7 @@ module Staypuft
29
29
  Deployment.transaction do
30
30
  @deployment.update_attributes(params[:staypuft_deployment])
31
31
  @deployment.update_hostgroup_list
32
+ @deployment.set_networking_params
32
33
  end
33
34
  when :services_configuration
34
35
  # Collect services across all deployment's roles
@@ -13,8 +13,7 @@ module Staypuft
13
13
  return
14
14
  end
15
15
 
16
- base_hostgroup = Hostgroup.where(:name => Setting[:base_hostgroup]).first or
17
- raise 'missing base_hostgroup'
16
+ base_hostgroup = Hostgroup.get_base_hostgroup
18
17
 
19
18
  deployment = Deployment.new(:name => Deployment::NEW_NAME_PREFIX+SecureRandom.hex)
20
19
  deployment.layout = Layout.where(:name => "Distributed",
@@ -34,7 +33,7 @@ module Staypuft
34
33
 
35
34
  def summary
36
35
  @deployment = Deployment.find(params[:id])
37
- @services = @deployment.services
36
+ @services = @deployment.services
38
37
  end
39
38
 
40
39
  def destroy
@@ -15,6 +15,7 @@ module Actions
15
15
  module Deployment
16
16
  class Deploy < Actions::Base
17
17
 
18
+ include Actions::Helpers::Lock
18
19
  middleware.use Actions::Staypuft::Middleware::AsCurrentUser
19
20
 
20
21
  def plan(deployment)
@@ -25,6 +26,8 @@ module Actions
25
26
  input.update id: deployment.id, name: deployment.name
26
27
 
27
28
  plan_action Hostgroup::OrderedDeploy, ordered_hostgroups
29
+
30
+ lock! deployment
28
31
  end
29
32
 
30
33
  def humanized_input
@@ -51,7 +51,7 @@ module Actions
51
51
  end
52
52
 
53
53
  def restart_with_foreman_proxy(host)
54
- host.setReboot # FIXME detect failures
54
+ host.setReboot
55
55
  end
56
56
 
57
57
  def restart_with_power_management(power)
@@ -20,18 +20,26 @@ module Actions
20
20
 
21
21
  input.update host: { id: host.id, name: host.name }
22
22
 
23
- sequence do
24
- plan_action Host::Build, host.id
25
- plan_action Host::WaitUntilInstalled, host.id
26
- plan_action Host::WaitUntilHostReady, host.id
23
+ unless host.open_stack_deployed?
24
+ sequence do
25
+ plan_action Host::Build, host.id
26
+ plan_action Host::WaitUntilInstalled, host.id
27
+ plan_action Host::WaitUntilHostReady, host.id
28
+ end
29
+ else
30
+ # it is already deployed
27
31
  end
28
32
  end
29
33
 
30
34
  def humanized_output
31
35
  # TODO: fix dynflow to allow better progress getting
32
36
  steps = planned_actions.inject([]) { |s, a| s + a.steps[1..2] }.compact
33
- progress = steps.map(&:progress_done).reduce(&:+) / steps.size
34
- format '%3d%% Host: %s', progress * 100, input[:host][:name]
37
+ progress = if steps.empty?
38
+ 'done'
39
+ else
40
+ format '%3d%%', steps.map(&:progress_done).reduce(&:+) / steps.size * 100
41
+ end
42
+ format '%s Host: %s', progress, input[:host][:name]
35
43
  end
36
44
 
37
45
  end
@@ -40,6 +40,7 @@ module Actions
40
40
  format "Hostgroup: %s\n%s", input[:name],
41
41
  planned_actions.
42
42
  map(&:humanized_output).
43
+ compact.
43
44
  tap { |lines| lines << '-' if lines.empty? }.
44
45
  map { |l| ' ' + l }.
45
46
  join("\n")
@@ -0,0 +1,18 @@
1
+ module Staypuft
2
+ module Concerns
3
+ module HostOpenStackAffiliation
4
+ extend ActiveSupport::Concern
5
+
6
+ def open_stack_deployed?
7
+ open_stack_assigned? &&
8
+ respond_to?(:environment) &&
9
+ environment != Environment.get_discovery
10
+ end
11
+
12
+ def open_stack_assigned?
13
+ respond_to?(:hostgroup) &&
14
+ hostgroup.try(:parent).try(:parent) == Hostgroup.get_base_hostgroup
15
+ end
16
+ end
17
+ end
18
+ end
@@ -18,6 +18,7 @@ module Staypuft
18
18
  def self.cache_id(host_id)
19
19
  "host.#{host_id}.wake_up_orchestration"
20
20
  end
21
+
21
22
  end
22
23
  end
23
24
  end
@@ -7,44 +7,50 @@ module Staypuft::Concerns::HostgroupExtensions
7
7
  has_one :role, :through => :deployment_role_hostgroup, :class_name => 'Staypuft::Role'
8
8
 
9
9
  has_one :deployment, :class_name => 'Staypuft::Deployment'
10
+ end
10
11
 
11
- def add_puppetclasses_from_resource(resource)
12
- if resource.respond_to?(:puppetclasses)
13
- resource.puppetclasses.each do |puppetclass|
14
- unless puppetclasses.include?(puppetclass)
15
- puppetclasses << puppetclass
16
- end
12
+ def add_puppetclasses_from_resource(resource)
13
+ if resource.respond_to?(:puppetclasses)
14
+ resource.puppetclasses.each do |puppetclass|
15
+ unless puppetclasses.include?(puppetclass)
16
+ puppetclasses << puppetclass
17
17
  end
18
18
  end
19
19
  end
20
+ end
20
21
 
21
- def current_param_value(key)
22
- if (v = LookupValue.where(:lookup_key_id => key.id, :id => lookup_values).first)
23
- return v.value, to_label
24
- end
25
- return inherited_lookup_value(key)
22
+ def current_param_value(key)
23
+ if (v = LookupValue.where(:lookup_key_id => key.id, :id => lookup_values).first)
24
+ return v.value, to_label
26
25
  end
26
+ return inherited_lookup_value(key)
27
+ end
27
28
 
28
- def current_param_value_str(key)
29
- val = current_param_value(key)[0]
30
- val.is_a?(Array) ? val.join(", ") : val
31
- end
29
+ def current_param_value_str(key)
30
+ val = current_param_value(key)[0]
31
+ val.is_a?(Array) ? val.join(", ") : val
32
+ end
32
33
 
33
- def set_param_value_if_changed(puppetclass, key, value)
34
- lookup_key = puppetclass.class_params.where(:key => key).first
35
- current_value = current_param_value(lookup_key)[0]
36
- new_value = current_value.is_a?(Array) ? value.split(", ") : value
37
- unless current_value == new_value
38
- lookup = LookupValue.where(:match => hostgroup.send(:lookup_value_match),
39
- :lookup_key_id => lookup_key.id).first_or_initialize
40
- lookup.value = new_value
41
- lookup.save!
42
- end
34
+ def set_param_value_if_changed(puppetclass, key, value)
35
+ lookup_key = puppetclass.class_params.where(:key => key).first
36
+ current_value = current_param_value(lookup_key)[0]
37
+ new_value = current_value.is_a?(Array) ? value.split(", ") : value
38
+ unless current_value == new_value
39
+ lookup = LookupValue.where(:match => hostgroup.send(:lookup_value_match),
40
+ :lookup_key_id => lookup_key.id).first_or_initialize
41
+ lookup.value = new_value
42
+ lookup.save!
43
43
  end
44
+ end
45
+
46
+ def own_and_free_hosts
47
+ # TODO update to Discovered only?
48
+ Host::Base.where('hostgroup_id = ? OR hostgroup_id IS NULL', id)
49
+ end
44
50
 
45
- def own_and_free_hosts
46
- # TODO update to Discovered only?
47
- Host::Base.where('hostgroup_id = ? OR hostgroup_id IS NULL', id)
51
+ module ClassMethods
52
+ def get_base_hostgroup
53
+ Hostgroup.where(:name => Setting[:base_hostgroup]).first or raise 'missing base_hostgroup'
48
54
  end
49
55
  end
50
56
 
@@ -23,6 +23,10 @@ module Staypuft
23
23
 
24
24
  scoped_search :on => :name, :complete_value => :true
25
25
 
26
+ def self.available_locks
27
+ [:deploy]
28
+ end
29
+
26
30
  def destroy
27
31
  child_hostgroups.each do |h|
28
32
  h.destroy
@@ -42,6 +46,9 @@ module Staypuft
42
46
  end
43
47
 
44
48
  role_hostgroup.hostgroup.add_puppetclasses_from_resource(layout_role.role)
49
+ layout_role.role.services.each do |service|
50
+ role_hostgroup.hostgroup.add_puppetclasses_from_resource(service)
51
+ end
45
52
  role_hostgroup.hostgroup.save!
46
53
 
47
54
  role_hostgroup.deploy_order = layout_role.deploy_order
@@ -55,6 +62,19 @@ module Staypuft
55
62
  end
56
63
  end
57
64
 
65
+ # If layout networking is set to 'neutron', then set include_neutron on the
66
+ # hostgroup if it includes the "quickstack::pacemaker::params" puppetclass
67
+ def set_networking_params
68
+ child_hostgroups.each do |the_hostgroup|
69
+ the_hostgroup.puppetclasses.each do |pclass|
70
+ if pclass.class_params.where(:key=> "include_neutron").first
71
+ the_hostgroup.set_param_value_if_changed(pclass, "include_neutron",
72
+ (layout.networking == 'neutron') ? true : false)
73
+ end
74
+ end
75
+ end
76
+ end
77
+
58
78
  private
59
79
  def update_hostgroup_name
60
80
  hostgroup.name = self.name
@@ -24,8 +24,18 @@
24
24
  </div>
25
25
  <% end %>
26
26
 
27
-
28
- <%= display_link_if_authorized(_("Deploy"), hash_for_deploy_deployment_path, :class => 'btn-success') %>
27
+ <% if ForemanTasks::Lock.locked? @deployment, nil %>
28
+ <%= display_link_if_authorized(
29
+ _('Deploy in progress'),
30
+ hash_for_foreman_tasks_task_path(id: ForemanTasks::Lock.colliding_locks(@deployment, nil).first.task.id),
31
+ :class => 'btn-info') %>
32
+ <% else %>
33
+ <%= link_to(_("Deploy"),
34
+ "",
35
+ :class => %w(btn btn-success),
36
+ :'data-toggle' => "modal",
37
+ :'data-target' => "#deploy_modal") %>
38
+ <% end %>
29
39
  <%= help_path %>
30
40
  <% end %>
31
41
 
@@ -35,9 +45,18 @@
35
45
  <% @deployment.child_hostgroups.each_with_index do |child_hostgroup, i| %>
36
46
  <li class="<%= 'active' if i == 0 %>">
37
47
  <a href="#<%= child_hostgroup.name.parameterize.underscore %>" data-toggle="tab" class="roles_list">
38
- <div class="col-xs-2 text-center"><span class="glyphicon glyphicon-ok"></span><span><%= child_hostgroup.hosts.count %></span></div>
39
- <div class="col-xs-2 text-center"><span class="glyphicon glyphicon-warning-sign"></span><span>0</span></div>
40
- <div class="col-xs-2 text-center"><span class="glyphicon glyphicon-time"></span><span>0</span></div>
48
+ <div class="col-xs-2 text-center">
49
+ <span class="glyphicon glyphicon-ok"></span>
50
+ <span><%= child_hostgroup.hosts.select { |h| h.open_stack_deployed? && !h.error? }.count %></span>
51
+ </div>
52
+ <div class="col-xs-2 text-center">
53
+ <span class="glyphicon glyphicon-warning-sign"></span>
54
+ <span><%= child_hostgroup.hosts.select { |h| h.open_stack_deployed? && h.error? }.count %></span>
55
+ </div>
56
+ <div class="col-xs-2 text-center">
57
+ <span class="glyphicon glyphicon-time"></span>
58
+ <span><%= child_hostgroup.hosts.select { |h| !h.open_stack_deployed? }.count %></span>
59
+ </div>
41
60
  <div class="col-xs-6"><%= child_hostgroup.name %></div>
42
61
  <span class="clearfix"></span>
43
62
  </a>
@@ -70,7 +89,12 @@
70
89
  <% child_hostgroup.own_and_free_hosts.each do |host| %>
71
90
  <tr class="checkbox_highlight <%= "success" if child_hostgroup.host_ids.include?(host.id) %>">
72
91
  <td class="ca">
73
- <%= check_box_tag "host_ids[]", host.id, child_hostgroup.host_ids.include?(host.id), :id => "host_ids_#{host.id}" %>
92
+ <%= check_box_tag 'host_ids[]',
93
+ host.id,
94
+ child_hostgroup.host_ids.include?(host.id),
95
+ :id => "host_ids_#{host.id}",
96
+ :disabled => host.open_stack_deployed? %>
97
+ <%= hidden_field_tag 'host_ids[]', host.id if host.open_stack_deployed? %>
74
98
  </td>
75
99
  <td class="ellipsis"><%= host.name %></td>
76
100
  <td class="hidden-s hidden-xs"><%= host.mac %></td>
@@ -93,3 +117,23 @@
93
117
  </div>
94
118
  </div>
95
119
 
120
+ <div class="modal fade" id="deploy_modal" tabindex="-1" role="dialog" aria-labelledby="Deploy" aria-hidden="true">
121
+ <div class="modal-dialog">
122
+ <div class="modal-content">
123
+ <div class="modal-header">
124
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
125
+ <h2 class="modal-title" id="deploy_modal_label">
126
+ <span class="glyphicon glyphicon-cloud-upload">
127
+ </span> <%= _("Deploy") %>
128
+ </h2>
129
+ </div>
130
+ <div class="modal-body">
131
+ <%= (_("This action will initiate the deployment of %s ") % "<strong>#{@deployment.name}</strong>").html_safe %>
132
+ </div>
133
+ <div class="modal-footer">
134
+ <button type="button" class="btn btn-default" data-dismiss="modal"><%= _("Cancel") %></button>
135
+ <%= display_link_if_authorized(_("Deploy"), hash_for_deploy_deployment_path, :class => 'btn btn-primary') %>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ </div>
data/db/seeds.rb CHANGED
@@ -159,6 +159,7 @@ services = {
159
159
  "qpid::server"]},
160
160
  :glance_ha => {:name => "Glance (HA)", :class => ["quickstack::pacemaker::glance"]},
161
161
  :nova_ha => {:name => "Nova (HA)", :class => ["quickstack::pacemaker::nova"]},
162
+ :cinder_ha => {:name => "Cinder (HA)", :class => ["quickstack::pacemaker::cinder"]},
162
163
  :ha_db_temp => {:name => "Database (HA -- temp)", :class => ["quickstack::hamysql::singlenodetest"]}
163
164
  }
164
165
  services.each do |skey, svalue|
@@ -224,7 +225,7 @@ roles = [
224
225
  {:name=>"HA Controller (Nova)",
225
226
  :class=>[],
226
227
  :layouts=>[[:ha_nova, 3]],
227
- :services=>[:ha_controller, :keystone_ha, :load_balancer_ha, :memcached_ha, :qpid_ha, :glance_ha, :nova_ha]},
228
+ :services=>[:ha_controller, :keystone_ha, :load_balancer_ha, :memcached_ha, :qpid_ha, :glance_ha, :nova_ha, :cinder_ha]},
228
229
  {:name=>"HA Controller (Neutron)",
229
230
  :class=>[],
230
231
  :layouts=>[[:ha_neutron, 2]],
@@ -23,6 +23,8 @@ module Staypuft
23
23
 
24
24
  config.to_prepare do
25
25
  ::Host::Managed.send :include, Staypuft::Concerns::HostOrchestrationBuildHook
26
+ ::Host::Managed.send :include, Staypuft::Concerns::HostOpenStackAffiliation
27
+ ::Host::Discovered.send :include, Staypuft::Concerns::HostOpenStackAffiliation
26
28
  ::Puppetclass.send :include, Staypuft::Concerns::PuppetclassExtensions
27
29
  ::Hostgroup.send :include, Staypuft::Concerns::HostgroupExtensions
28
30
  ::Environment.send :include, Staypuft::Concerns::EnvironmentExtensions
@@ -1,3 +1,3 @@
1
1
  module Staypuft
2
- VERSION = '0.0.8'
2
+ VERSION = '0.0.9'
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.8
4
+ version: 0.0.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,24 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-14 00:00:00.000000000 Z
12
+ date: 2014-04-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: foreman-tasks
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '0'
21
+ version: 0.5.3
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: '0'
29
+ version: 0.5.3
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: dynflow
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -104,6 +104,7 @@ files:
104
104
  - app/lib/staypuft/exception.rb
105
105
  - app/models/setting/staypuft_provisioning.rb
106
106
  - app/models/staypuft/concerns/environment_extensions.rb
107
+ - app/models/staypuft/concerns/host_open_stack_affiliation.rb
107
108
  - app/models/staypuft/concerns/host_orchestration_build_hook.rb
108
109
  - app/models/staypuft/concerns/hostgroup_extensions.rb
109
110
  - app/models/staypuft/concerns/puppetclass_extensions.rb