staypuft 0.3.9 → 0.4.0
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 +13 -5
- data/README.md +16 -7
- data/app/assets/javascripts/staypuft/nics_assignment.js +17 -2
- data/app/assets/javascripts/staypuft/staypuft.js +39 -2
- data/app/controllers/staypuft/interface_assignments_controller.rb +0 -1
- data/app/helpers/staypuft/deployments_helper.rb +9 -0
- data/app/lib/staypuft/network_query.rb +4 -0
- data/app/lib/staypuft/seeder.rb +35 -7
- data/app/models/staypuft/concerns/host_details_helper.rb +9 -0
- data/app/models/staypuft/concerns/hostgroup_extensions.rb +0 -13
- data/app/models/staypuft/deployment/ceph_service.rb +8 -4
- data/app/models/staypuft/deployment/neutron_service/cisconexus.rb +118 -0
- data/app/models/staypuft/deployment/neutron_service.rb +66 -4
- data/app/models/staypuft/deployment/nova_service.rb +37 -1
- data/app/overrides/foreman_hosts_edit.rb +1 -1
- data/app/views/staypuft/deployments/_assigned_hosts.html.erb +2 -38
- data/app/views/staypuft/deployments/_free_hosts.html.erb +1 -37
- data/app/views/staypuft/deployments/_host_head_row.html.erb +1 -0
- data/app/views/staypuft/deployments/_host_row.html.erb +4 -0
- data/app/views/staypuft/deployments/_hosts_table.html.erb +51 -0
- data/app/views/staypuft/interface_assignments/index.html.erb +40 -0
- data/app/views/staypuft/steps/_neutron.html.erb +39 -0
- data/app/views/staypuft/steps/_neutron_cisco_nexus_form.html.erb +17 -0
- data/lib/staypuft/engine.rb +1 -0
- data/lib/staypuft/version.rb +1 -1
- metadata +136 -133
@@ -41,6 +41,11 @@ module Staypuft
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
44
|
+
unless record.private_fixed_range.empty?
|
45
|
+
if record.network_size < 4
|
46
|
+
record.errors[:private_fixed_range] << "Fixed range is too small. Specify CIDR for network size #{record.min_fixed_range_cidr} or larger"
|
47
|
+
end
|
48
|
+
end
|
44
49
|
end
|
45
50
|
end
|
46
51
|
|
@@ -119,6 +124,37 @@ module Staypuft
|
|
119
124
|
end
|
120
125
|
end
|
121
126
|
|
127
|
+
def fixed_range_size
|
128
|
+
fixed_range_str = private_fixed_range
|
129
|
+
if fixed_range_str.empty?
|
130
|
+
0
|
131
|
+
else
|
132
|
+
fixed_range = IPAddr.new(fixed_range_str).to_range
|
133
|
+
fixed_range.last.to_i - fixed_range.first.to_i + 1
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# network size is equal to the number of IP addresses in
|
138
|
+
# the fixed range, divided by the number of networks,
|
139
|
+
# rounded *down* to the next power of two (or zero if <1)
|
140
|
+
def network_size
|
141
|
+
unrounded_size = fixed_range_size / num_networks
|
142
|
+
if unrounded_size < 1
|
143
|
+
0
|
144
|
+
else
|
145
|
+
2**Math.log(unrounded_size,2).floor
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# for the current num_networks value (1 for non-vlan;
|
150
|
+
# based on the vlan range for VLAN, this calculates
|
151
|
+
# the smallest fixed range network cidr assuming the
|
152
|
+
# smallest useful network size of 4 (2 hosts+network
|
153
|
+
# address+broadcast address)
|
154
|
+
def min_fixed_range_cidr
|
155
|
+
"/#{32 - Math.log(4*num_networks,2).ceil}"
|
156
|
+
end
|
157
|
+
|
122
158
|
def param_hash
|
123
159
|
{ 'network_manager' => network_manager,
|
124
160
|
'vlan_range' => vlan_range,
|
@@ -128,7 +164,7 @@ module Staypuft
|
|
128
164
|
|
129
165
|
class Jail < Safemode::Jail
|
130
166
|
allow :network_manager, :network_overrides, :private_fixed_range, :public_floating_range,
|
131
|
-
:num_networks
|
167
|
+
:num_networks, :network_size
|
132
168
|
end
|
133
169
|
|
134
170
|
end
|
@@ -7,7 +7,7 @@ end
|
|
7
7
|
|
8
8
|
Deface::Override.new(:virtual_path => "hosts/_form",
|
9
9
|
:name => "include_custom_js_for_hosts_edit",
|
10
|
-
:insert_after => "
|
10
|
+
:insert_after => "li > a[href='#network']",
|
11
11
|
:text => "<%= javascript 'staypuft/host_edit'%>"
|
12
12
|
)
|
13
13
|
|
@@ -11,43 +11,7 @@
|
|
11
11
|
<%= submit_tag _("Unassign Hosts"), :class => "btn btn-primary btn-sm", :disabled => true, :id => "unassign_hosts_button" %>
|
12
12
|
</div>
|
13
13
|
</div>
|
14
|
-
|
15
|
-
<thead>
|
16
|
-
<tr>
|
17
|
-
<th class="ca">
|
18
|
-
<%= tag :input, type: 'checkbox', class: 'check_all' %>
|
19
|
-
</th>
|
20
|
-
<th><%= sort :name, :as => _('Name') %></th>
|
21
|
-
<th><%= _("Deployment Role") %></th>
|
22
|
-
<th><%= _("CPUs") %><br/><span class="text-muted small"><%= _("(cores)") %></span></th>
|
23
|
-
<th><%= _("Memory") %><br/><span class="text-muted small"><%= _("(GB)") %></span></th>
|
24
|
-
<th><%= _("NICs") %></th>
|
25
|
-
<th class="hidden-s hidden-xs"><%= sort :ip, :as => _('IP Address') %></th>
|
26
|
-
</tr>
|
27
|
-
</thead>
|
28
|
-
<tbody class="searchable">
|
29
|
-
<% hosts.each do |host| %>
|
30
|
-
<tr class="checkbox_highlight">
|
31
|
-
<td class="ca">
|
32
|
-
<%= check_box_tag 'host_ids[]',
|
33
|
-
host.id,
|
34
|
-
false,
|
35
|
-
id: "host_ids_#{host.id}" %>
|
36
|
-
</td>
|
37
|
-
<td class="ellipsis">
|
38
|
-
<%= host_label(host) %>
|
39
|
-
</td>
|
40
|
-
<td class="ellipsis">
|
41
|
-
<%= link_to(host.hostgroup.role, hosts_path(:search => "os_description = #{host.hostgroup.role}")) if host.hostgroup %>
|
42
|
-
</td>
|
43
|
-
<td><%= host.cpus %></td>
|
44
|
-
<td><%= host.mem %></td>
|
45
|
-
<td><%= host_nics(host) %></td>
|
46
|
-
<td class="hidden-s hidden-xs"><%= host.ip %></td>
|
47
|
-
</tr>
|
48
|
-
<% end %>
|
49
|
-
</tbody>
|
50
|
-
</table>
|
14
|
+
<%= render partial: "hosts_table", locals: { hosts: hosts, deployment_role_col: true } %>
|
51
15
|
<div class="modal fade" id="configure_networks_modal" tabindex="-1" role="dialog" aria-labelledby="<%= _("Configure Networks") %>" aria-hidden="true" data-path="<%= deployment_interface_assignments_path(@deployment.id) %>">
|
52
16
|
<div class="modal-dialog modal-lg">
|
53
17
|
<div class="modal-content">
|
@@ -63,7 +27,7 @@
|
|
63
27
|
</div>
|
64
28
|
<div class="modal-footer">
|
65
29
|
<button type="button" class="btn btn-default" data-dismiss="modal"><%= _("Cancel") %></button>
|
66
|
-
<button type="button" class="btn btn-
|
30
|
+
<button type="button" class="btn btn-primary done" data-dismiss="modal"><%= _("Done") %></button>
|
67
31
|
</div>
|
68
32
|
</div>
|
69
33
|
</div>
|
@@ -11,43 +11,7 @@
|
|
11
11
|
data-target = "#role_modal" disabled="true"><%= _("Assign Hosts") %></button>
|
12
12
|
</div>
|
13
13
|
</div>
|
14
|
-
|
15
|
-
<thead>
|
16
|
-
<tr>
|
17
|
-
<th class="ca">
|
18
|
-
<%= tag :input, type: 'checkbox', class: 'check_all' %>
|
19
|
-
</th>
|
20
|
-
<th><%= sort :name, :as => _('Name') %></th>
|
21
|
-
<th><%= _("Operating System") %></th>
|
22
|
-
<th><%= _("CPUs") %><br/><span class="text-muted small"><%= _("(cores)") %></span></th>
|
23
|
-
<th><%= _("Memory") %><br/><span class="text-muted small"><%= _("(GB)") %></span></th>
|
24
|
-
<th><%= _("NICs") %></th>
|
25
|
-
<th class="hidden-s hidden-xs"><%= sort :ip, :as => _('IP Address') %></th>
|
26
|
-
</tr>
|
27
|
-
</thead>
|
28
|
-
<tbody class="searchable">
|
29
|
-
<% hosts.each do |host| %>
|
30
|
-
<tr class="checkbox_highlight">
|
31
|
-
<td class="ca">
|
32
|
-
<%= check_box_tag 'host_ids[]',
|
33
|
-
host.id,
|
34
|
-
false,
|
35
|
-
id: "host_ids_#{host.id}" %>
|
36
|
-
</td>
|
37
|
-
<td class="ellipsis">
|
38
|
-
<%= host_label(host) %>
|
39
|
-
</td>
|
40
|
-
<td class="ellipsis">
|
41
|
-
<%= link_to(host.os.to_label, hosts_path(:search => "os_description = #{host.os.description}")) if host.respond_to?(:os) && host.os %>
|
42
|
-
</td>
|
43
|
-
<td><%= host.cpus if host.respond_to?(:cpu) %></td>
|
44
|
-
<td><%= host.mem if host.respond_to?(:mem) %></td>
|
45
|
-
<td><%= host_nics(host) %></td>
|
46
|
-
<td class="hidden-s hidden-xs"><%= host.ip %></td>
|
47
|
-
</tr>
|
48
|
-
<% end %>
|
49
|
-
</tbody>
|
50
|
-
</table>
|
14
|
+
<%= render partial: "hosts_table", locals: { hosts: hosts, operating_system_col: true } %>
|
51
15
|
<div class="modal fade" id="role_modal" tabindex="-1" role="dialog" aria-labelledby="Deployment Roles" aria-hidden="true">
|
52
16
|
<div class="modal-dialog">
|
53
17
|
<div class="modal-content">
|
@@ -0,0 +1,51 @@
|
|
1
|
+
<table class="table table-bordered table-striped table-condensed">
|
2
|
+
<thead>
|
3
|
+
<tr>
|
4
|
+
<th class="ca">
|
5
|
+
<%= tag :input, type: 'checkbox', class: 'check_all' %>
|
6
|
+
</th>
|
7
|
+
<th><%= sort :name, :as => _('Name') %></th>
|
8
|
+
<% if local_assigns[:deployment_role_col] %>
|
9
|
+
<th><%= _("Deployment Role") %></th>
|
10
|
+
<% end %>
|
11
|
+
<% if local_assigns[:operating_system_col] %>
|
12
|
+
<th><%= _("Operating System") %></th>
|
13
|
+
<% end %>
|
14
|
+
<th><%= _("CPUs") %><br/><span class="text-muted small"><%= _("(cores)") %></span></th>
|
15
|
+
<th><%= _("Memory") %><br/><span class="text-muted small"><%= _("(GB)") %></span></th>
|
16
|
+
<th><%= _("Storage") %></th>
|
17
|
+
<th><%= _("NICs") %></th>
|
18
|
+
<th class="hidden-s hidden-xs"><%= sort :ip, :as => _('IP Address') %></th>
|
19
|
+
</tr>
|
20
|
+
</thead>
|
21
|
+
<tbody class="searchable">
|
22
|
+
<% hosts.each do |host| %>
|
23
|
+
<tr class="checkbox_highlight">
|
24
|
+
<td class="ca">
|
25
|
+
<%= check_box_tag 'host_ids[]',
|
26
|
+
host.id,
|
27
|
+
false,
|
28
|
+
id: "host_ids_#{host.id}" %>
|
29
|
+
</td>
|
30
|
+
<td class="ellipsis">
|
31
|
+
<%= host_label(host) %>
|
32
|
+
</td>
|
33
|
+
<% if local_assigns[:deployment_role_col] %>
|
34
|
+
<td class="ellipsis">
|
35
|
+
<%= link_to(host.hostgroup.role, hosts_path(:search => "os_description = #{host.hostgroup.role}")) if host.hostgroup %>
|
36
|
+
</td>
|
37
|
+
<% end %>
|
38
|
+
<% if local_assigns[:operating_system_col] %>
|
39
|
+
<td class="ellipsis">
|
40
|
+
<%= link_to(host.os.to_label, hosts_path(:search => "os_description = #{host.os.description}")) if host.respond_to?(:os) && host.os %>
|
41
|
+
</td>
|
42
|
+
<% end %>
|
43
|
+
<td><%= host.cpus if host.respond_to?(:cpus) %></td>
|
44
|
+
<td><%= host.mem if host.respond_to?(:mem) %></td>
|
45
|
+
<td><%= host_disks(host) %></td>
|
46
|
+
<td><%= host_nics(host) %></td>
|
47
|
+
<td class="hidden-s hidden-xs"><%= host.ip %></td>
|
48
|
+
</tr>
|
49
|
+
<% end %>
|
50
|
+
</tbody>
|
51
|
+
</table>
|
@@ -2,6 +2,46 @@
|
|
2
2
|
|
3
3
|
<% title _("Configure Interfaces (%s hosts)") % @hosts.size %>
|
4
4
|
|
5
|
+
<div class="row">
|
6
|
+
<div class="col-md-12">
|
7
|
+
<h3><%= @hosts.count %> <%= "#{n_('Host', 'Hosts', @hosts.count)} #{_('to be configured')}" %></h3>
|
8
|
+
<table class="table table-striped table-condensed">
|
9
|
+
<thead>
|
10
|
+
<tr>
|
11
|
+
<th><%= sort :name, :as => _('Host Name') %></th>
|
12
|
+
<th><%= @host.primary_interface %></th>
|
13
|
+
<% @interfaces.each do |interface| %>
|
14
|
+
<th><%= interface.identifier %></th>
|
15
|
+
<% end %>
|
16
|
+
</tr>
|
17
|
+
</thead>
|
18
|
+
<tbody>
|
19
|
+
<% @hosts.each do |host| %>
|
20
|
+
<tr>
|
21
|
+
<td class="ellipsis">
|
22
|
+
<%= host_label(host) %>
|
23
|
+
</td>
|
24
|
+
<td>
|
25
|
+
<span class="glyphicon glyphicon-ok"></span> <%= _("ready") %> <br/>
|
26
|
+
<%= host.mac %><br/>
|
27
|
+
<%= host.ip %>
|
28
|
+
</td>
|
29
|
+
<% if host.interfaces.present? %>
|
30
|
+
<td>
|
31
|
+
<% host.interfaces.each do |interface| %>
|
32
|
+
<span class="glyphicon glyphicon-ok"></span> <%= _("ready") %> <br/>
|
33
|
+
<%= interface.mac %><br/>
|
34
|
+
<%= interface.ip %>
|
35
|
+
<% end %>
|
36
|
+
</td>
|
37
|
+
<% end %>
|
38
|
+
</tr>
|
39
|
+
<% end %>
|
40
|
+
</tbody>
|
41
|
+
</table>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
|
5
45
|
<div class="row">
|
6
46
|
<div class="col-md-12">
|
7
47
|
<h3><%= _("Configured Networks") %></h3>
|
@@ -1,4 +1,6 @@
|
|
1
1
|
<%= f.fields_for :neutron, @deployment.neutron do |p| %>
|
2
|
+
<%= base_errors_for @deployment.neutron %>
|
3
|
+
<div class="form-group <%= @deployment.neutron.errors.empty? ? "" : 'has-error' %> hide"></div>
|
2
4
|
<%= change_label_width(4, field(p, :network_segmentation, :label => _(Staypuft::Deployment::NeutronService::NetworkSegmentation::HUMAN)) do
|
3
5
|
Staypuft::Deployment::NeutronService::NetworkSegmentation::LABELS.map do |value, label|
|
4
6
|
radio_button_f_non_inline(p, :network_segmentation,
|
@@ -14,4 +16,41 @@
|
|
14
16
|
help_inline: _(Staypuft::Deployment::NeutronService::TenantVlanRanges::HUMAN_AFTER)) %>
|
15
17
|
</div>
|
16
18
|
|
19
|
+
<div class="form-group">
|
20
|
+
<label class="col-md-4 control-label"><%= _(Staypuft::Deployment::NeutronService::Ml2Mechanisms::HUMAN) %></label>
|
21
|
+
<div class="col-md-4">
|
22
|
+
<%= check_box_f_non_inline(p, :ml2_openvswitch,
|
23
|
+
:checked_value => 'true',
|
24
|
+
:unchecked_value => 'false',
|
25
|
+
:checked => @deployment.neutron.openvswitch_mechanism?,
|
26
|
+
:text => _(Staypuft::Deployment::NeutronService::Ml2Mechanisms::LABELS['openvswitch']))
|
27
|
+
%>
|
28
|
+
<%= check_box_f_non_inline(p, :ml2_l2population,
|
29
|
+
:checked_value => 'true',
|
30
|
+
:unchecked_value => 'false',
|
31
|
+
:checked => @deployment.neutron.l2population_mechanism?,
|
32
|
+
:text => _(Staypuft::Deployment::NeutronService::Ml2Mechanisms::LABELS['l2population']))
|
33
|
+
%>
|
34
|
+
<%= check_box_f_non_inline(p, :ml2_cisco_nexus,
|
35
|
+
:checked_value => 'true',
|
36
|
+
:unchecked_value => 'false',
|
37
|
+
:checked => @deployment.neutron.cisco_nexus_mechanism?,
|
38
|
+
:text => _(Staypuft::Deployment::NeutronService::Ml2Mechanisms::LABELS['cisco_nexus']))
|
39
|
+
%>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
<div class="neutron_cisco_nexus col-md-offset-1 hide">
|
43
|
+
<div id="nexuses" class="neutron_nexus_picker">
|
44
|
+
<% @deployment.neutron.nexuses.each_with_index do |nexus, index| %>
|
45
|
+
<%= p.fields_for "nexuses[]", nexus, index: index do |e| %>
|
46
|
+
<% render partial: 'neutron_cisco_nexus_form', locals: {e: e} %>
|
47
|
+
<% end %>
|
48
|
+
<% end %>
|
49
|
+
</div>
|
50
|
+
<script type='html/template' id='nexus_form_template'>
|
51
|
+
<%= p.fields_for 'nexuses[]', Staypuft::Deployment::NeutronService::Cisconexus.new, index: 'NEW_RECORD' do |e| render(partial: 'neutron_cisco_nexus_form', locals: {e: e}); end %>
|
52
|
+
</script>
|
53
|
+
<button type="button" class= "btn btn-primary btn-sm add_another_switch"><%= _("Add Another Switch") %></button>
|
54
|
+
</div>
|
55
|
+
|
17
56
|
<% end %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div class="nexus well">
|
2
|
+
<h5 class="muted"><a href="#" class="remove"><i class="glyphicon glyphicon-remove-sign "> </i></a> Switch #<span class="switch_number">1</span></h5>
|
3
|
+
<%= text_f e, :hostname, class: "neutron_cisco_nexus",
|
4
|
+
label: _(Staypuft::Deployment::NeutronService::Cisconexus::Hostname::HUMAN) %>
|
5
|
+
<%= text_f e, :ip, class: "neutron_cisco_nexus",
|
6
|
+
label: _(Staypuft::Deployment::NeutronService::Cisconexus::Ip::HUMAN) %>
|
7
|
+
<%= text_f e, :login, class: "neutron_cisco_nexus",
|
8
|
+
label: _(Staypuft::Deployment::NeutronService::Cisconexus::Login::HUMAN) %>
|
9
|
+
<%= text_f e, :password, class: "neutron_cisco_nexus",
|
10
|
+
label: _(Staypuft::Deployment::NeutronService::Cisconexus::Password::HUMAN) %>
|
11
|
+
<%= text_f e, :ssh_port, class: "neutron_cisco_nexus",
|
12
|
+
label: _(Staypuft::Deployment::NeutronService::Cisconexus::SshPort::HUMAN) %>
|
13
|
+
<%= textarea_f e, :port_map, class: "neutron_cisco_nexus",
|
14
|
+
label: _(Staypuft::Deployment::NeutronService::Cisconexus::PortMap::HUMAN),
|
15
|
+
rows: 5,
|
16
|
+
help_inline: _(Staypuft::Deployment::NeutronService::Cisconexus::PortMap::HELP_INLINE) %>
|
17
|
+
</div>
|
data/lib/staypuft/engine.rb
CHANGED
@@ -33,6 +33,7 @@ module Staypuft
|
|
33
33
|
::Host::Managed.send :include, Staypuft::Concerns::HostOpenStackAffiliation
|
34
34
|
::Host::Managed.send :include, Staypuft::Concerns::HostDetailsHelper
|
35
35
|
::Host::Discovered.send :include, Staypuft::Concerns::HostOpenStackAffiliation
|
36
|
+
::Host::Discovered.send :include, Staypuft::Concerns::HostDetailsHelper
|
36
37
|
::Puppetclass.send :include, Staypuft::Concerns::PuppetclassExtensions
|
37
38
|
::Nic::Base.send :include, Staypuft::Concerns::SubnetIpManagement
|
38
39
|
::Nic::Base.send :include, Staypuft::Concerns::VipNicScopes
|
data/lib/staypuft/version.rb
CHANGED