staypuft 0.3.9 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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