staypuft 0.4.0 → 0.4.1

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.
Files changed (34) hide show
  1. checksums.yaml +5 -13
  2. data/app/assets/javascripts/staypuft/nics_assignment.js +35 -0
  3. data/app/assets/javascripts/staypuft/staypuft.js +4 -0
  4. data/app/assets/javascripts/staypuft/subnets_assignment.js +33 -3
  5. data/app/assets/stylesheets/staypuft/staypuft.css.scss +31 -0
  6. data/app/controllers/staypuft/bonds_controller.rb +131 -0
  7. data/app/controllers/staypuft/interface_assignments_controller.rb +7 -2
  8. data/app/controllers/staypuft/steps_controller.rb +1 -1
  9. data/app/controllers/staypuft/subnet_typings_controller.rb +45 -3
  10. data/app/lib/staypuft/seeder.rb +57 -27
  11. data/app/models/staypuft/deployment/glance_service.rb +1 -1
  12. data/app/models/staypuft/deployment/neutron_service.rb +1 -1
  13. data/app/models/staypuft/deployment.rb +4 -0
  14. data/app/models/staypuft/interface_assigner.rb +42 -22
  15. data/app/models/staypuft/subnet_type.rb +1 -0
  16. data/app/views/staypuft/bonds/add_slave.js.erb +10 -0
  17. data/app/views/staypuft/bonds/create.js.erb +10 -0
  18. data/app/views/staypuft/bonds/destroy.js.erb +10 -0
  19. data/app/views/staypuft/deployments/_assigned_hosts.html.erb +17 -17
  20. data/app/views/staypuft/interface_assignments/_interfaces.html.erb +31 -0
  21. data/app/views/staypuft/interface_assignments/_nics_assignment.html.erb +29 -0
  22. data/app/views/staypuft/interface_assignments/index.html.erb +42 -69
  23. data/app/views/staypuft/interfaces/_drop_zone.html.erb +72 -3
  24. data/app/views/staypuft/steps/_glance.html.erb +3 -3
  25. data/app/views/staypuft/steps/_neutron.html.erb +1 -1
  26. data/app/views/staypuft/steps/deployment_settings.html.erb +2 -2
  27. data/app/views/staypuft/steps/services_configuration.html.erb +1 -1
  28. data/app/views/staypuft/subnet_typings/create.js.erb +3 -0
  29. data/app/views/staypuft/subnet_typings/destroy.js.erb +3 -0
  30. data/app/views/staypuft/subnet_typings/update.js.erb +3 -0
  31. data/config/routes.rb +8 -0
  32. data/db/migrate/20141003223000_add_validation_to_subnet_types.rb +7 -0
  33. data/lib/staypuft/version.rb +1 -1
  34. metadata +143 -136
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZGZkOGMwMDYxYjI0ODE2ZGI3NjNhZWRhMzg0MGNjNTUyMDJlMjYwMA==
5
- data.tar.gz: !binary |-
6
- YzAyMWVlODdjMzI2ZDE0YzM0ZmM3ODcwNjI5YjZhYmE0NTg5ZGU1ZA==
2
+ SHA1:
3
+ metadata.gz: a03caebb78c982156156e14071fb90cef35627dd
4
+ data.tar.gz: 96d1b6b7f38b74f6b081d1e061b7a9d7e5dbab89
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MWFiNzBiMzk4NzQzYWRmMDZjMWNmNzZlY2ZhMTkzMGZmOTM2YjM1ZTM5ZDk3
10
- MDlhZDM0MzM0NTlkOTg3NTFhYzBjNTlmMzhmNGJjNzE5NjZiNjY1OTkyODg0
11
- YzljZjM1ZjQ3NDVkYjU3OWEzMzMwN2FkYzcxZmM1NjI1OGEzNTg=
12
- data.tar.gz: !binary |-
13
- YjljNjI4NWMxM2ZjMGIxNGM4ZDI1YmU1N2U1M2QwZWY4NmUyZjNjZGFhYWZj
14
- ZDdmZjFkMmIxNTIwNWFlMmFjNWRhY2U0NTlmYzJjZmNiYzFkODlkYWRiYmI4
15
- ZDgzMDk0ODFkOTdhNDNjOGM5YzMwZmZhYzFiMGM1NWNjYWM1MjE=
6
+ metadata.gz: 213f86077425ac3969d84c220fce82fe6bc941234ea136e8332d594c9bc93c58e440ba919c7be841ae2e4848c598eb4c9c00cd64076471440331ad6d0fed392f
7
+ data.tar.gz: 114c5a5a5ad09fc049bb8c6504265a8da3a05717acfb6b7fe232b83a4c023b491bc10f3c78e16349fc50372dd1732535a6f6bc267fc507e072fca1890979825e
@@ -44,4 +44,39 @@ var nics_assignment = (function() {
44
44
  });
45
45
  }
46
46
  });
47
+
48
+ $('#hosts_to_configure').on('show.bs.collapse', function() {
49
+ $(this).prev('h3[data-toggle="collapse"]').addClass('active');
50
+ });
51
+ $('#hosts_to_configure').on('hide.bs.collapse', function() {
52
+ $(this).prev('h3[data-toggle="collapse"]').removeClass('active');
53
+ });
54
+
55
+ $('.panel-heading > #bonding_mode > ul > li').on('click', function(event) {
56
+ var dropdown = $($(event.target).parents('ul')[0]).prev();
57
+ dropdown.prop('disabled', true);
58
+
59
+ var to_assign = $('input:checkbox[name=host_ids[]]:checked').map(
60
+ function() {
61
+ return $(this).attr('value');
62
+ }).get().join();
63
+ /* remove the first if it's the select all */
64
+ if(to_assign.substr(0, 2) == 'on') {
65
+ to_assign = to_assign.substr(3);
66
+ }
67
+
68
+ var to_path = $('#bonding_mode').data('path');
69
+ $.ajax({
70
+ url: to_path,
71
+ type: 'PUT',
72
+ data: {
73
+ mode: $(event.target).text(),
74
+ host_ids: to_assign
75
+ },
76
+ success: function(data) {
77
+ dropdown.text($(event.target).text());
78
+ dropdown.prop('disabled', false);
79
+ }
80
+ });
81
+ });
47
82
  });
@@ -93,7 +93,9 @@ $(function () {
93
93
  showNeutronVlanRange();
94
94
  $("input[name='staypuft_deployment[neutron][network_segmentation]']").change(showNeutronVlanRange);
95
95
  function showNeutronVlanRange() {
96
+ $('#staypuft_deployment_neutron_network_segmentation_vlan').parent().parent().parent().removeClass('col-md-4').addClass('col-md-6')
96
97
  if ($('#staypuft_deployment_neutron_network_segmentation_vlan').is(":checked")) {
98
+ $('#staypuft_deployment_neutron_network_segmentation_vlan').parent().after($('.neutron_tenant_vlan_ranges'));
97
99
  $('.neutron_tenant_vlan_ranges').fadeIn(duration);
98
100
  }
99
101
  else {
@@ -115,7 +117,9 @@ $(function () {
115
117
  showGlanceNfsNetworkPath();
116
118
  $("input[name='staypuft_deployment[glance][driver_backend]']").change(showGlanceNfsNetworkPath);
117
119
  function showGlanceNfsNetworkPath() {
120
+ $('#staypuft_deployment_glance_driver_backend_nfs').parent().parent().parent().removeClass('col-md-4').addClass('col-md-6')
118
121
  if ($('#staypuft_deployment_glance_driver_backend_nfs').is(":checked")) {
122
+ $('#staypuft_deployment_glance_driver_backend_nfs').parent().after($('.glance_nfs_network_path'));
119
123
  $('.glance_nfs_network_path').show();
120
124
  }
121
125
  else {
@@ -2,6 +2,12 @@ $(function() {
2
2
  $("div.subnet-type-pull").draggable({
3
3
  revert: 'invalid'
4
4
  });
5
+
6
+ $("div.subnet-type-pull").live('dragstart', function( event, ui ) {
7
+ dropped = $(this);
8
+ dropped.data.left = ui.originalPosition.left;
9
+ dropped.data.top = ui.originalPosition.top;
10
+ });
5
11
 
6
12
  $("div.subnet-drop-zone").droppable({
7
13
  activeClass: "panel-droppable",
@@ -13,14 +19,30 @@ $(function() {
13
19
  type: 'POST',
14
20
  url: ui.draggable.data('create-url'),
15
21
  data: 'subnet_type_id=' + ui.draggable.data('subnet-type-id') + '&subnet_id=' + $(this).data('subnet-id'),
16
- dataType: 'script'
22
+ dataType: 'script',
23
+ success: function(data, event){
24
+ if(data.indexOf("error =") > -1){
25
+ dropped.animate({
26
+ left: dropped.data.left,
27
+ top: dropped.data.top
28
+ }, 1000, 'swing');
29
+ }
30
+ }
17
31
  })
18
32
  } else {
19
33
  $.ajax({
20
34
  type: 'PUT',
21
35
  url: ui.draggable.data('update-url'),
22
36
  data: 'subnet_id=' + $(this).data('subnet-id'),
23
- dataType: 'script'
37
+ dataType: 'script',
38
+ success: function(data, event){
39
+ if(data.indexOf("error =") > -1){
40
+ dropped.animate({
41
+ left: dropped.data.left,
42
+ top: dropped.data.top
43
+ }, 1000, 'swing');
44
+ }
45
+ }
24
46
  })
25
47
  }
26
48
  }
@@ -34,7 +56,15 @@ $(function() {
34
56
  $.ajax({
35
57
  type: 'DELETE',
36
58
  url: ui.draggable.data('delete-url'),
37
- dataType: 'script'
59
+ dataType: 'script',
60
+ success: function(data, event){
61
+ if(data.indexOf("error =") > -1){
62
+ dropped.animate({
63
+ left: dropped.data.left,
64
+ top: dropped.data.top
65
+ }, 1000, 'swing');
66
+ }
67
+ }
38
68
  });
39
69
  }
40
70
  });
@@ -172,3 +172,34 @@ span.editable, span.editable:hover {
172
172
  overflow-y: auto;
173
173
  }
174
174
  }
175
+
176
+ h3[data-toggle="collapse"] {
177
+ cursor: pointer;
178
+ span.glyphicon:before {
179
+ transition: all .3s ease 0s;
180
+ display: inline-block;
181
+ }
182
+ &.active span.glyphicon:before {
183
+ color: $brand-primary;
184
+ -ms-transform: rotate(180deg); /* IE 9 */
185
+ -webkit-transform: rotate(180deg); /* Chrome, Safari, Opera */
186
+ transform: rotate(180deg);
187
+ }
188
+ }
189
+
190
+ .inset_form {
191
+ font-size: 85%;
192
+ .form-group {
193
+ margin-bottom: 0;
194
+ .control-label {
195
+ text-align: left;
196
+ }
197
+ .help-block {
198
+ margin-bottom: 0;
199
+ }
200
+ }
201
+ }
202
+
203
+ .single_password.inset_form {
204
+ margin-left: 192px;
205
+ }
@@ -0,0 +1,131 @@
1
+ module Staypuft
2
+ class BondsController < Staypuft::ApplicationController
3
+ before_filter :find_hosts
4
+ before_filter :find_bonds, :only => %w(destroy add_slave remove_slave change_mode)
5
+
6
+ def create
7
+ @bonds = []
8
+ @hosts.each do |host|
9
+
10
+ existing = host.interfaces.select { |i| i.is_a?(Nic::Bond) }.map(&:identifier)
11
+ i = 0
12
+ while existing.include?("bond#{i}") do
13
+ i +=1
14
+ end
15
+
16
+ bond = Nic::Bond.new
17
+ bond.identifier = "bond#{i}"
18
+ params[:interfaces].each do |interface|
19
+ bond.add_slave(interface)
20
+ end
21
+ bond.mode = 'balance-tlb'
22
+ bond.bond_options = 'miimon=100'
23
+ bond.host = host
24
+ @bonds.push bond
25
+ end
26
+
27
+ ActiveRecord::Base.transaction do
28
+ results = @bonds.map(&:save)
29
+ @result = results.all?
30
+ clear_nic_assignments(params[:interfaces])
31
+ raise ActiveRecord::Rollback unless @result
32
+ end
33
+
34
+ find_unassigned_subnets
35
+ end
36
+
37
+ def destroy
38
+ ActiveRecord::Base.transaction do
39
+ clear_nic_assignments([params[:id]])
40
+ results = @bonds.map(&:destroy)
41
+ @result = results.all?
42
+ raise ActiveRecord::Rollback unless @result
43
+ end
44
+
45
+ find_unassigned_subnets
46
+ end
47
+
48
+ def add_slave
49
+ @bonds.each { |bond| bond.add_slave(params[:interface]) }
50
+
51
+ ActiveRecord::Base.transaction do
52
+ results = @bonds.map(&:save)
53
+ @result = results.all?
54
+ clear_nic_assignments([params[:interface]])
55
+ raise ActiveRecord::Rollback unless @result
56
+ end
57
+
58
+ find_unassigned_subnets
59
+ end
60
+
61
+ def change_mode
62
+ @bonds.each { |bond| bond.mode = params[:mode] }
63
+
64
+ ActiveRecord::Base.transaction do
65
+ results = @bonds.map(&:save)
66
+ @result = results.all?
67
+ raise ActiveRecord::Rollback unless @result
68
+ end
69
+
70
+ render :nothing => true
71
+ end
72
+
73
+
74
+ def remove_slave
75
+ @bonds.each { |bond| bond.remove_slave(params[:interface]) }
76
+
77
+ ActiveRecord::Base.transaction do
78
+ results = @bonds.map(&:save)
79
+ @result = results.all?
80
+ clear_nic_assignments(params[:interfaces])
81
+ raise ActiveRecord::Rollback unless @result
82
+ end
83
+ end
84
+
85
+ private
86
+
87
+ def find_bonds
88
+ @bonds = @hosts.map do |host|
89
+ host.interfaces.detect { |i| i.identifier == params[:id] }
90
+ end
91
+ end
92
+
93
+ def find_hosts
94
+ @hosts = Host::Managed.where(:id => params[:host_ids]).includes(:interfaces)
95
+ @host = @hosts.first
96
+ @interfaces = @host.interfaces.where("type <> 'Nic::BMC'").non_vip.order(:identifier).where(['(virtual = ? OR type = ?)', false, 'Nic::Bond'])
97
+ @deployment = Deployment.find(params[:deployment_id])
98
+ end
99
+
100
+ def find_unassigned_subnets
101
+ assigned_subnet_ids = ([@host.subnet_id] + @host.interfaces.non_vip.map(&:subnet_id)).compact.uniq
102
+ @subnets = @deployment.subnets.where(["#{Subnet.table_name}.id NOT IN (?)", assigned_subnet_ids]).uniq
103
+ end
104
+
105
+ def clear_nic_assignments(interface_identifiers)
106
+ @hosts.each do |host|
107
+ interface_identifiers.each do |interface_identifier|
108
+
109
+ if host.primary_interface == interface_identifier
110
+ interface = host
111
+ else
112
+ interface = host.interfaces.find_by_identifier(interface_identifier)
113
+ end
114
+
115
+ host.interfaces.where(:attached_to => interface_identifier).map(&:subnet).compact.uniq.each do |virtual_subnet|
116
+ assigner = InterfaceAssigner.new(@deployment, interface, virtual_subnet)
117
+ assigner.unassign
118
+ end
119
+
120
+ subnet_typing = Staypuft::SubnetTyping.includes('subnet_type').where(:deployment_id => @deployment, :subnet_id => interface.subnet).first
121
+ if subnet_typing
122
+ next if subnet_typing.subnet_type.name == Staypuft::SubnetType::PXE
123
+
124
+ assigner = InterfaceAssigner.new(@deployment, interface, interface.subnet)
125
+ assigner.unassign
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -6,9 +6,14 @@ module Staypuft
6
6
  host_ids = params[:host_ids]
7
7
  host_ids = host_ids.split(',') unless host_ids.is_a? Array
8
8
  @hosts = Host::Managed.where(:id => host_ids).includes(:interfaces)
9
- @subnets = @deployment.subnets.uniq
10
9
  @host = @hosts.first
11
- @interfaces = @host ? @host.interfaces.where("type <> 'Nic::BMC'").non_vip.order(:identifier).physical : []
10
+ assigned_subnet_ids = ([@host.subnet_id] + @host.interfaces.non_vip.map(&:subnet_id)).compact.uniq
11
+ @subnets = @deployment.subnets.where(["#{Subnet.table_name}.id NOT IN (?)", assigned_subnet_ids]).uniq
12
+ if @host
13
+ @interfaces = @host.interfaces.where("type <> 'Nic::BMC'").non_vip.order(:identifier).where(['(virtual = ? OR type = ?)', false, 'Nic::Bond'])
14
+ else
15
+ @interfaces = []
16
+ end
12
17
 
13
18
  errors = {}
14
19
  @hosts.each do |host|
@@ -36,7 +36,7 @@ module Staypuft
36
36
  # just a helper for user to have all types preassigned to pxe network
37
37
  pxe_network = Subnet.where('dhcp_id IS NOT NULL').first
38
38
  if pxe_network
39
- @deployment.unassigned_subnet_types.each do |type|
39
+ @deployment.unassigned_pxe_default_subnet_types.each do |type|
40
40
  @deployment.subnet_typings.new(:subnet_id => pxe_network.id, :subnet_type_id => type.id).save
41
41
  end
42
42
  end
@@ -1,31 +1,41 @@
1
1
  module Staypuft
2
2
  class SubnetTypingsController < ActionController::Base
3
3
  def create
4
+ @errors = {}
4
5
  @deployment = Deployment.find(params[:deployment_id])
5
6
  @subnet_type = SubnetType.find(params[:subnet_type_id])
6
7
  @subnet = Subnet.find(params[:subnet_id])
7
8
  check_for_existing_assignments
9
+ check_for_ip_management
10
+ check_for_unsharable_subnet_types
8
11
  @subnet_typing = @deployment.subnet_typings.new(:subnet_id => @subnet.id, :subnet_type_id => @subnet_type.id)
9
- @saved = @subnet_typing.save
12
+ @saved = @errors.blank? ? @subnet_typing.save : false
10
13
  end
11
14
 
12
15
  def update
16
+ @errors = {}
13
17
  @subnet_typing = SubnetTyping.find(params[:id])
14
18
  @deployment = @subnet_typing.deployment
15
19
  @subnet_type = @subnet_typing.subnet_type
16
20
  @subnet = Subnet.find(params[:subnet_id])
17
21
  check_for_existing_assignments
22
+ check_for_ip_management
23
+ check_for_unsharable_subnet_types
18
24
  @subnet_typing.subnet = @subnet
19
- @saved = @subnet_typing.save
25
+ @saved = @errors.blank? ? @subnet_typing.save : false
20
26
  end
21
27
 
22
28
  def destroy
29
+ @errors = {}
23
30
  @subnet_typing = SubnetTyping.find(params[:id])
24
31
  @deployment = @subnet_typing.deployment
25
32
  @subnet = @subnet_typing.subnet
26
33
  check_for_existing_assignments
27
34
  @subnet_type = @subnet_typing.subnet_type
28
- @destroyed = @subnet_typing.destroy
35
+ if @subnet_type.is_required
36
+ @errors[@subnet_type.name] = ["Network traffic type is required."]
37
+ end
38
+ @destroyed = @errors.blank? ? @subnet_typing.destroy : false
29
39
  end
30
40
 
31
41
  private
@@ -38,5 +48,37 @@ module Staypuft
38
48
  @warn = _('Some hosts interfaces were already assigned to this subnet, check interface assignment before deploying!')
39
49
  end
40
50
  end
51
+
52
+ def check_for_ip_management
53
+ if @subnet_type.foreman_managed_ips &&
54
+ !((@subnet.ipam == Subnet::IPAM_MODES[:dhcp] && @subnet.dhcp_boot_mode?) ||
55
+ (@subnet.ipam == Subnet::IPAM_MODES[:db] && !@subnet.dhcp_boot_mode?))
56
+ @errors[@subnet_type.name] = ["Foreman-managed IP addresses are required to associate with subnet."]
57
+ false
58
+ else
59
+ true
60
+ end
61
+ end
62
+
63
+ def check_for_unsharable_subnet_types
64
+ # if subnet type is unsharable, make sure nothing else is already assigned here
65
+ if @subnet_type.dedicated_subnet
66
+ if @deployment.subnet_typings.where(:subnet_id => @subnet.id).size > 0
67
+ @errors[@subnet_type.name] = ["Subnet cannot be shared with other traffic types in this deployment."]
68
+ false
69
+ else
70
+ true
71
+ end
72
+ #otherwise make sure there's no existing unsharable type already here
73
+ else
74
+ existing_dedicated_types = @deployment.subnet_typings.includes(:subnet_type).where(:subnet_id => @subnet.id, "staypuft_subnet_types.dedicated_subnet" => true)
75
+ if existing_dedicated_types.size > 0
76
+ @errors[existing_dedicated_types.first.subnet_type.name] = ["Subnet cannot be shared with other traffic types in this deployment."]
77
+ false
78
+ else
79
+ true
80
+ end
81
+ end
82
+ end
41
83
  end
42
84
  end
@@ -175,33 +175,60 @@ module Staypuft
175
175
  CEPH_ROLES = ROLES.select {|h| h.fetch(:name) =~ /Ceph/ }
176
176
 
177
177
  ALL_LAYOUTS = LAYOUTS.keys
178
- SUBNET_TYPES = { :pxe => { :name => Staypuft::SubnetType::PXE,
179
- :required => true,
180
- :layouts => ALL_LAYOUTS},
181
- :management => { :name => Staypuft::SubnetType::MANAGEMENT,
182
- :required => true,
183
- :layouts => ALL_LAYOUTS},
184
- :external => { :name => Staypuft::SubnetType::EXTERNAL,
185
- :required => true,
186
- :layouts => ALL_LAYOUTS},
187
- :cluster_mgmt => { :name => Staypuft::SubnetType::CLUSTER_MGMT,
188
- :required => true,
189
- :layouts => ALL_LAYOUTS},
190
- :admin_api => { :name => Staypuft::SubnetType::ADMIN_API,
191
- :required => true,
192
- :layouts => ALL_LAYOUTS},
193
- :public_api => { :name => Staypuft::SubnetType::PUBLIC_API,
194
- :required => true,
195
- :layouts => ALL_LAYOUTS},
196
- :tenant => { :name => Staypuft::SubnetType::TENANT,
197
- :required => true,
198
- :layouts => ALL_LAYOUTS},
199
- :storage => { :name => Staypuft::SubnetType::STORAGE,
200
- :required => false,
201
- :layouts => ALL_LAYOUTS},
202
- :storage_cluster => { :name => Staypuft::SubnetType::STORAGE_CLUSTERING,
203
- :required => false,
204
- :layouts => ALL_LAYOUTS}
178
+ SUBNET_TYPES = { :pxe => { :name => Staypuft::SubnetType::PXE,
179
+ :required => true,
180
+ :foreman_managed_ips => true,
181
+ :default_to_provisioning => true,
182
+ :dedicated_subnet => false,
183
+ :layouts => ALL_LAYOUTS},
184
+ :management => { :name => Staypuft::SubnetType::MANAGEMENT,
185
+ :required => true,
186
+ :foreman_managed_ips => true,
187
+ :default_to_provisioning => true,
188
+ :dedicated_subnet => false,
189
+ :layouts => ALL_LAYOUTS},
190
+ :external => { :name => Staypuft::SubnetType::EXTERNAL,
191
+ :required => true,
192
+ :foreman_managed_ips => false,
193
+ :default_to_provisioning => false,
194
+ :dedicated_subnet => true,
195
+ :layouts => ALL_LAYOUTS},
196
+ :cluster_mgmt => { :name => Staypuft::SubnetType::CLUSTER_MGMT,
197
+ :required => true,
198
+ :foreman_managed_ips => true,
199
+ :default_to_provisioning => true,
200
+ :dedicated_subnet => false,
201
+ :layouts => ALL_LAYOUTS},
202
+ :admin_api => { :name => Staypuft::SubnetType::ADMIN_API,
203
+ :required => true,
204
+ :foreman_managed_ips => true,
205
+ :default_to_provisioning => true,
206
+ :dedicated_subnet => false,
207
+ :layouts => ALL_LAYOUTS},
208
+ :public_api => { :name => Staypuft::SubnetType::PUBLIC_API,
209
+ :required => true,
210
+ :foreman_managed_ips => true,
211
+ :default_to_provisioning => true,
212
+ :dedicated_subnet => false,
213
+ :layouts => ALL_LAYOUTS},
214
+ :tenant => { :name => Staypuft::SubnetType::TENANT,
215
+ :required => true,
216
+ :foreman_managed_ips => false,
217
+ :default_to_provisioning => false,
218
+ :dedicated_subnet => true,
219
+ :layouts => ALL_LAYOUTS},
220
+ :storage => { :name => Staypuft::SubnetType::STORAGE,
221
+ :required => true,
222
+ :foreman_managed_ips => true,
223
+ :default_to_provisioning => true,
224
+ :dedicated_subnet => false,
225
+ :layouts => ALL_LAYOUTS},
226
+ :storage_cluster => { :name => Staypuft::SubnetType::STORAGE_CLUSTERING,
227
+ :required => true,
228
+ :foreman_managed_ips => true,
229
+ :default_to_provisioning => true,
230
+ :dedicated_subnet => false,
231
+ :layouts => ALL_LAYOUTS}
205
232
  }
206
233
 
207
234
  def get_host_format(param_name, subnet_type_name)
@@ -878,6 +905,9 @@ module Staypuft
878
905
  SUBNET_TYPES.each do |key, subnet_type_hash|
879
906
  subnet_type = Staypuft::SubnetType.where(:name => subnet_type_hash[:name]).first_or_initialize
880
907
  subnet_type.is_required = subnet_type_hash[:required]
908
+ subnet_type.foreman_managed_ips = subnet_type_hash[:foreman_managed_ips]
909
+ subnet_type.default_to_provisioning = subnet_type_hash[:default_to_provisioning]
910
+ subnet_type.dedicated_subnet = subnet_type_hash[:dedicated_subnet]
881
911
  subnet_type.save!
882
912
  old_layout_subnet_types_arr = subnet_type.layout_subnet_types.to_a
883
913
  subnet_type_hash[:layouts].each do |layout|
@@ -24,7 +24,7 @@ module Staypuft
24
24
  validates :driver_backend, presence: true, inclusion: { in: lambda {|g| g.backend_types_for_layout } }
25
25
 
26
26
  module NfsNetworkPath
27
- HUMAN = N_('network path')
27
+ HUMAN = N_('Network Path')
28
28
  HUMAN_AFTER = NFS_HELP
29
29
  end
30
30
 
@@ -62,7 +62,7 @@ module Staypuft
62
62
  :tenant_iface, :networker_ovs_bridge_mappings, :networker_ovs_bridge_uplinks,
63
63
  :compute_ovs_bridge_mappings, :compute_ovs_bridge_uplinks, :ovs_tunnel_types,
64
64
  :openvswitch_mechanism?, :l2population_mechanism?, :cisco_nexus_mechanism?,
65
- :ml2_mechanisms, :nexuses
65
+ :ml2_mechanisms, :nexuses, :active?, :compute_cisco_nexus_config
66
66
  end
67
67
 
68
68
  def set_defaults
@@ -273,6 +273,10 @@ module Staypuft
273
273
  self.layout.subnet_types - self.subnet_types
274
274
  end
275
275
 
276
+ def unassigned_pxe_default_subnet_types
277
+ self.layout.subnet_types.pxe_defaults - self.subnet_types
278
+ end
279
+
276
280
  def ceph_hostgroup
277
281
  Hostgroup.includes(:deployment_role_hostgroup).
278
282
  where(DeploymentRoleHostgroup.table_name => { deployment_id: self,
@@ -9,11 +9,11 @@ module Staypuft
9
9
  else
10
10
  # interface may be Host::Managed which means primary interface, so we create pseudo-interface object
11
11
  @interface = Nic::Managed.new(
12
- :mac => interface.mac,
13
- :virtual => false,
14
- :identifier => interface.primary_interface,
15
- :host => interface,
16
- :subnet => interface.subnet)
12
+ :mac => interface.mac,
13
+ :virtual => false,
14
+ :identifier => interface.primary_interface,
15
+ :host => interface,
16
+ :subnet => interface.subnet)
17
17
  end
18
18
 
19
19
  @host = @interface.host
@@ -51,7 +51,15 @@ module Staypuft
51
51
 
52
52
  def unassign
53
53
  base = @host.interfaces
54
- base = virtual_assignment? ? base.virtual : base.physical
54
+
55
+ # we should make sure that we delete from right base, subnet vlan may have changed meanwhile which affects
56
+ # virtual_assignment? result
57
+ if @interface.is_a?(Nic::Bond)
58
+ base = base.virtual # we want to find bond and vlans (both virtual)
59
+ else
60
+ base = virtual_assignment? ? base.virtual : base.physical
61
+ end
62
+
55
63
  ActiveRecord::Base.transaction do
56
64
  base.where(:subnet_id => @subnet.id).each do |interface|
57
65
  virtual_assignment? ? unassign_virtual(interface) : unassign_physical(interface)
@@ -66,25 +74,30 @@ module Staypuft
66
74
 
67
75
  private
68
76
 
77
+ def build_new_interface(klass = Nic::Managed)
78
+ klass.new(
79
+ :attached_to => @interface.identifier,
80
+ :mac => @interface.mac,
81
+ :host => @host,
82
+ :virtual => true,
83
+ :identifier => @interface.identifier + ".#{@subnet.vlanid}"
84
+ )
85
+ end
86
+
69
87
  def assign_virtual
70
- interface = Nic::Managed.new(
71
- :subnet => @subnet,
72
- :physical_device => @interface.identifier,
73
- :mac => @interface.mac,
74
- :host => @host,
75
- :virtual => true,
76
- :identifier => @interface.identifier + ".#{@subnet.vlanid}")
77
- suggest_ip(interface) if @subnet.ipam?
78
- unless interface.save
79
- @errors.push(*interface.errors.full_messages)
80
- end
88
+ interface = build_new_interface
89
+ assign_interface(interface)
81
90
  end
82
91
 
83
92
  def assign_physical
84
- @interface.subnet = @subnet
85
- suggest_ip(@interface) if @subnet.ipam?
86
- unless @interface.save
87
- @errors.push(*@interface.errors.full_messages)
93
+ assign_interface(@interface)
94
+ end
95
+
96
+ def assign_interface(interface)
97
+ interface.subnet = @subnet
98
+ suggest_ip(interface) if @subnet.ipam?
99
+ unless interface.save
100
+ @errors.push(*interface.errors.full_messages)
88
101
  end
89
102
  end
90
103
 
@@ -92,6 +105,7 @@ module Staypuft
92
105
  # subnet could become virtual/physical meanwhile
93
106
  def unassign_from_other_nics
94
107
  unassign_physicals
108
+ unassign_bonds
95
109
  unassign_virtuals
96
110
  end
97
111
 
@@ -111,8 +125,14 @@ module Staypuft
111
125
  end
112
126
  end
113
127
 
128
+ def unassign_bonds
129
+ @host.interfaces.bonds.where(:subnet_id => @subnet.id).each do |interface|
130
+ unassign_physical(interface)
131
+ end
132
+ end
133
+
114
134
  def unassign_virtuals
115
- @host.interfaces.virtual.where(:subnet_id => @subnet.id).each do |interface|
135
+ @host.interfaces.virtual.where('type <> ?', Nic::Bond.to_s).where(:subnet_id => @subnet.id).each do |interface|
116
136
  unassign_virtual(interface)
117
137
  end
118
138
  end
@@ -23,6 +23,7 @@ module Staypuft
23
23
  has_many :subnets, :through => :subnet_typings
24
24
 
25
25
  scope :required, lambda { where(:is_required => true) }
26
+ scope :pxe_defaults, lambda { where(:default_to_provisioning => true) }
26
27
 
27
28
  class Jail < Safemode::Jail
28
29
  allow :layouts, :layout_subnet_types, :name, :subnets, :subnet_typings, :required