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
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZGZkOGMwMDYxYjI0ODE2ZGI3NjNhZWRhMzg0MGNjNTUyMDJlMjYwMA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YzAyMWVlODdjMzI2ZDE0YzM0ZmM3ODcwNjI5YjZhYmE0NTg5ZGU1ZA==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MWFiNzBiMzk4NzQzYWRmMDZjMWNmNzZlY2ZhMTkzMGZmOTM2YjM1ZTM5ZDk3
|
10
|
+
MDlhZDM0MzM0NTlkOTg3NTFhYzBjNTlmMzhmNGJjNzE5NjZiNjY1OTkyODg0
|
11
|
+
YzljZjM1ZjQ3NDVkYjU3OWEzMzMwN2FkYzcxZmM1NjI1OGEzNTg=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YjljNjI4NWMxM2ZjMGIxNGM4ZDI1YmU1N2U1M2QwZWY4NmUyZjNjZGFhYWZj
|
14
|
+
ZDdmZjFkMmIxNTIwNWFlMmFjNWRhY2U0NTlmYzJjZmNiYzFkODlkYWRiYmI4
|
15
|
+
ZDgzMDk0ODFkOTdhNDNjOGM5YzMwZmZhYzFiMGM1NWNjYWM1MjE=
|
data/README.md
CHANGED
@@ -4,20 +4,29 @@ Staypuft is the name of the OpenStack Foreman Installer plugin for The Foreman.
|
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
You can either use [staypuft-installer](https://github.com/theforeman/foreman-installer-staypuft) which is basically
|
8
|
+
foreman installer with staypuft specific wizards or you can install staypuft
|
9
|
+
plugin into existing foreman instance. The first options is preferred and you
|
10
|
+
can find more instructions in installer README.
|
11
11
|
|
12
|
-
|
12
|
+
See [How to Install a Plugin](http://theforeman.org/manuals/1.6/index.html#6.1InstallaPlugin)
|
13
|
+
for how to install Foreman plugins
|
13
14
|
|
14
15
|
## Development setup
|
15
16
|
|
16
|
-
See
|
17
|
+
See howto for development setup
|
18
|
+
- [fedora 19](doc/setup_fedora.md)
|
19
|
+
- [centos 6.5](doc/setup_centos.md) - a bit easier way
|
17
20
|
|
18
21
|
## Contributing
|
19
22
|
|
20
|
-
|
23
|
+
If you found an issue, you can report it in [Bugzilla](https://bugzilla.redhat.com/buglist.cgi?component=rubygem-staypuft&product=Red%20Hat%20OpenStack).
|
24
|
+
If you want to chat about the issue or staypuft in general, we are on freenode
|
25
|
+
irc server on channel #staypuft. We also have mailing list to which you can
|
26
|
+
subscribe [here](https://www.redhat.com/mailman/listinfo/rdo-list). For staypuft
|
27
|
+
related questions please add [Installer] tag in subject.
|
28
|
+
|
29
|
+
If you want to send a patch, fork the projects and send a Pull Request. Thanks!
|
21
30
|
|
22
31
|
## Release a new version
|
23
32
|
|
@@ -1,5 +1,11 @@
|
|
1
1
|
var nics_assignment = (function() {
|
2
|
+
var dropped = null;
|
2
3
|
$("div.subnet-pull.active").draggable({
|
4
|
+
start: function( event, ui ) {
|
5
|
+
dropped = $(this);
|
6
|
+
dropped.data.left = ui.originalPosition.left;
|
7
|
+
dropped.data.top = ui.originalPosition.top;
|
8
|
+
},
|
3
9
|
revert: 'invalid'
|
4
10
|
});
|
5
11
|
|
@@ -8,11 +14,20 @@ var nics_assignment = (function() {
|
|
8
14
|
hoverClass: "panel-success",
|
9
15
|
accept: "div.subnet-pull",
|
10
16
|
drop: function(event, ui) {
|
17
|
+
dropped = $(ui.draggable);
|
11
18
|
$.ajax({
|
12
19
|
type: 'POST',
|
13
|
-
url:
|
20
|
+
url: dropped.data('create-url'),
|
14
21
|
data: 'interface=' + $(this).data('interface'),
|
15
|
-
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
|
+
}
|
16
31
|
});
|
17
32
|
}
|
18
33
|
});
|
@@ -148,6 +148,20 @@ $(function () {
|
|
148
148
|
}
|
149
149
|
}
|
150
150
|
|
151
|
+
showNeutronMl2CiscoNexus();
|
152
|
+
$("#staypuft_deployment_neutron_ml2_cisco_nexus").change(showNeutronMl2CiscoNexus);
|
153
|
+
function showNeutronMl2CiscoNexus() {
|
154
|
+
if ($('#staypuft_deployment_neutron_ml2_cisco_nexus').is(":checked")) {
|
155
|
+
$('.neutron_cisco_nexus').show();
|
156
|
+
if($('#nexuses').children().length == 0) {
|
157
|
+
$('.add_another_switch').click();
|
158
|
+
}
|
159
|
+
}
|
160
|
+
else {
|
161
|
+
$('.neutron_cisco_nexus').hide();
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
151
165
|
showCephNotification();
|
152
166
|
function showCephNotification() {
|
153
167
|
var cephDeploymentNotification = readFromCookie();
|
@@ -234,6 +248,12 @@ $(function () {
|
|
234
248
|
});
|
235
249
|
}
|
236
250
|
});
|
251
|
+
$('#configure_networks_modal .done').live('click', function(){
|
252
|
+
$("input:checkbox[name=host_ids[]]:checked").removeAttr('checked')
|
253
|
+
$("tr.checkbox_highlight").removeClass('checkbox_highlight');
|
254
|
+
$("tr.info").removeClass('info');
|
255
|
+
|
256
|
+
})
|
237
257
|
});
|
238
258
|
|
239
259
|
var scrolled = false;
|
@@ -299,7 +319,24 @@ $(function () {
|
|
299
319
|
}
|
300
320
|
})
|
301
321
|
|
302
|
-
$(".
|
322
|
+
$("button.add_another_switch").live("click", function() {
|
323
|
+
var nexus_form = function() {
|
324
|
+
return $('#nexus_form_template').text().replace(/NEW_RECORD/g, new Date().getTime());
|
325
|
+
}
|
326
|
+
$('#nexuses').append(nexus_form());
|
327
|
+
if($('#nexuses').children().length > 1) {
|
328
|
+
var added_form_span = $('#nexuses').children().last().find('h5').find('.switch_number');
|
329
|
+
var previous_span_number = $('#nexuses').children().eq(-2).find('h5').find('.switch_number');
|
330
|
+
added_form_span.html(parseInt(previous_span_number.html(), 10) + 1);
|
331
|
+
}
|
332
|
+
})
|
333
|
+
|
334
|
+
function remove_element_on_click(element_name) {
|
335
|
+
$(element_name + " h5 a.remove").live("click", function(){
|
303
336
|
$(this).parent().parent().remove();
|
304
|
-
|
337
|
+
});
|
338
|
+
}
|
339
|
+
|
340
|
+
remove_element_on_click('.eqlx');
|
341
|
+
remove_element_on_click('.nexus');
|
305
342
|
});
|
@@ -52,6 +52,15 @@ module Staypuft
|
|
52
52
|
host.interfaces_identifiers.compact.sort.join(tag(:br)).html_safe
|
53
53
|
end
|
54
54
|
|
55
|
+
def host_disks(host)
|
56
|
+
hosts_facts = FactValue.joins(:fact_name).where(host_id: host.id)
|
57
|
+
host.blockdevices.collect do |blockdevice|
|
58
|
+
disk_size = hosts_facts.
|
59
|
+
where(fact_names: { name: 'blockdevice_#{blockdevice}_size'}).first.try(:value)
|
60
|
+
"#{blockdevice}: #{disk_size or 'Unknown'}"
|
61
|
+
end.join(tag(:br)).html_safe
|
62
|
+
end
|
63
|
+
|
55
64
|
def is_pxe?(deployment, subnet)
|
56
65
|
subnet_typings(deployment, subnet).any? { |t| t.subnet_type.name == Staypuft::SubnetType::PXE }
|
57
66
|
end
|
data/app/lib/staypuft/seeder.rb
CHANGED
@@ -36,7 +36,6 @@ module Staypuft
|
|
36
36
|
'auto_assign_floating_ip' => 'true',
|
37
37
|
'cisco_vswitch_plugin' => 'neutron.plugins.openvswitch.ovs_neutron_plugin.OVSNeutronPluginV2',
|
38
38
|
'cisco_nexus_plugin' => 'neutron.plugins.cisco.nexus.cisco_nexus_plugin_v2.NexusPlugin',
|
39
|
-
'nexus_config' => { :hash => {}},
|
40
39
|
'nexus_credentials' => [],
|
41
40
|
'provider_vlan_auto_create' => 'false',
|
42
41
|
'provider_vlan_auto_trunk' => 'false',
|
@@ -105,7 +104,9 @@ module Staypuft
|
|
105
104
|
:mysql_ha => { :name => 'Mysql (HA)', :class => ['quickstack::pacemaker::mysql'] },
|
106
105
|
:neutron_ha => { :name => 'Neutron (HA)', :class => ['quickstack::pacemaker::neutron'] },
|
107
106
|
:generic_rhel_7 => { :name => 'Generic RHEL 7', :class => ['quickstack::openstack_common'] },
|
108
|
-
:ceph_osd => { :name => 'Ceph Storage (OSD) (node)',
|
107
|
+
:ceph_osd => { :name => 'Ceph Storage (OSD) (node)',
|
108
|
+
:class => ['quickstack::openstack_common',
|
109
|
+
'quickstack::ceph::config'] },
|
109
110
|
}
|
110
111
|
|
111
112
|
# The list of roles is still from astapor
|
@@ -222,6 +223,7 @@ module Staypuft
|
|
222
223
|
# multi_host handled inline, since it's two separate static values 'true' and 'True'
|
223
224
|
network_overrides = { :hash => '<%= @host.deployment.nova.network_overrides %>' }
|
224
225
|
network_num_networks = { :string => '<%= @host.deployment.nova.num_networks %>' }
|
226
|
+
network_network_size = { :string => '<%= @host.deployment.nova.network_size %>' }
|
225
227
|
network_fixed_range = { :string => '<%= @host.deployment.nova.private_fixed_range %>' }
|
226
228
|
network_floating_range = { :string => '<%= @host.deployment.nova.public_floating_range %>' }
|
227
229
|
network_private_iface = { :string => "<%= @host.network_query.interface_for_host('#{Staypuft::SubnetType::TENANT}') %>" }
|
@@ -236,6 +238,7 @@ module Staypuft
|
|
236
238
|
ml2_tenant_network_types = [ tenant_network_type ]
|
237
239
|
ml2_tunnel_id_ranges = ['10:1000']
|
238
240
|
ml2_vni_ranges = ['10:1000']
|
241
|
+
ml2_mechanism_drivers = { :array => '<%= @host.deployment.neutron.ml2_mechanisms %>' }
|
239
242
|
ovs_tunnel_types = { :array => '<%= @host.deployment.neutron.ovs_tunnel_types %>' }
|
240
243
|
ovs_tunnel_iface = { :string => '<%= n = @host.deployment.neutron; n.enable_tunneling? ? n.tenant_iface(@host) : "" %>' }
|
241
244
|
ovs_bridge_mappings = { :array => '<%= @host.deployment.neutron.networker_ovs_bridge_mappings(@host) %>' }
|
@@ -303,10 +306,13 @@ module Staypuft
|
|
303
306
|
ceph_images_key = { :string => '<%= @host.deployment.ceph.images_key %>' }
|
304
307
|
ceph_volumes_key = { :string => '<%= @host.deployment.ceph.volumes_key %>' }
|
305
308
|
# FIXME: this should move to STORAGE from PXE like above
|
306
|
-
ceph_mon_host = { :array => "<%= @host.network_query.controller_ips('#{Staypuft::SubnetType::
|
309
|
+
ceph_mon_host = { :array => "<%= @host.network_query.controller_ips('#{Staypuft::SubnetType::STORAGE}') %>" }
|
307
310
|
# FIXME: This is currently the hostnames (which maps to fqdns on the PXE network) -- eventually we want DNS names
|
308
311
|
# on the Storage network
|
309
312
|
ceph_mon_initial_members = { :array => "<%= @host.deployment.ceph.mon_initial_members %>" }
|
313
|
+
ceph_osd_pool_size = { :string => '<%= @host.deployment.ceph.osd_pool_size %>' }
|
314
|
+
ceph_osd_journal_size = { :string => '<%= @host.deployment.ceph.osd_journal_size %>' }
|
315
|
+
|
310
316
|
|
311
317
|
# effective_value grabs shared password if deployment is in shared password mode,
|
312
318
|
# otherwise use the service-specific one
|
@@ -365,6 +371,9 @@ module Staypuft
|
|
365
371
|
fence_ipmilan_expose_lanplus = { :string => '<%= @host.bmc_nic.expose_lanplus? if @host.bmc_nic && @host.bmc_nic.fencing_enabled? %>' }
|
366
372
|
fence_ipmilan_lanplus_options = { :string => '<%= @host.bmc_nic.attrs["fence_ipmilan_lanplus_options"] if @host.bmc_nic && @host.bmc_nic.fencing_enabled? %>' }
|
367
373
|
|
374
|
+
# Cisco Nexus
|
375
|
+
cisco_nexus_config = { :hash => '<%= n = @host.deployment.neutron; (n.active? && n.cisco_nexus_mechanism?) ? n.compute_cisco_nexus_config : {} %>' }
|
376
|
+
|
368
377
|
{
|
369
378
|
'quickstack::nova_network::controller' => {
|
370
379
|
'amqp_provider' => amqp_provider,
|
@@ -449,6 +458,7 @@ module Staypuft
|
|
449
458
|
'ml2_tenant_network_types' => ml2_tenant_network_types,
|
450
459
|
'ml2_tunnel_id_ranges' => ml2_tunnel_id_ranges,
|
451
460
|
'ml2_vni_ranges' => ml2_vni_ranges,
|
461
|
+
'ml2_mechanism_drivers' => ml2_mechanism_drivers,
|
452
462
|
'ovs_vlan_ranges' => ovs_vlan_ranges,
|
453
463
|
'enable_tunneling' => enable_tunneling,
|
454
464
|
'cinder_backend_gluster' => cinder_backend_gluster,
|
@@ -514,7 +524,8 @@ module Staypuft
|
|
514
524
|
'cinder_gluster_shares' => [],
|
515
525
|
'controller_admin_host' => controller_admin_host,
|
516
526
|
'controller_priv_host' => controller_priv_host,
|
517
|
-
'controller_pub_host' => controller_pub_host
|
527
|
+
'controller_pub_host' => controller_pub_host,
|
528
|
+
'nexus_config' => cisco_nexus_config },
|
518
529
|
'quickstack::pacemaker::params' => {
|
519
530
|
'include_swift' => 'false',
|
520
531
|
'include_neutron' => neutron,
|
@@ -527,6 +538,8 @@ module Staypuft
|
|
527
538
|
'ceph_volumes_key' => ceph_volumes_key,
|
528
539
|
'ceph_mon_host' => ceph_mon_host,
|
529
540
|
'ceph_mon_initial_members' => ceph_mon_initial_members,
|
541
|
+
'ceph_osd_pool_default_size' => ceph_osd_pool_size,
|
542
|
+
'ceph_osd_journal_size' => ceph_osd_journal_size,
|
530
543
|
'cinder_db_password' => cinder_db_pw,
|
531
544
|
'cinder_user_password' => cinder_user_pw,
|
532
545
|
'glance_db_password' => glance_db_pw,
|
@@ -580,7 +593,7 @@ module Staypuft
|
|
580
593
|
'lb_backend_server_addrs' => { :array => "<%= @host.deployment.network_query.controller_ips('#{Staypuft::SubnetType::MANAGEMENT}') %>" },
|
581
594
|
'lb_backend_server_names' => { :array => '<%= @host.deployment.network_query.controller_fqdns %>' } },
|
582
595
|
'quickstack::pacemaker::common' => {
|
583
|
-
'pacemaker_cluster_members' => { :string => "<%= @host.deployment.network_query.controller_ips('#{Staypuft::SubnetType::
|
596
|
+
'pacemaker_cluster_members' => { :string => "<%= @host.deployment.network_query.controller_ips('#{Staypuft::SubnetType::CLUSTER_MGMT}').join(' ') %>" },
|
584
597
|
'fencing_type' => fencing_type,
|
585
598
|
'fence_ipmilan_address' => fence_ipmilan_address,
|
586
599
|
'fence_ipmilan_username' => fence_ipmilan_username,
|
@@ -594,12 +607,14 @@ module Staypuft
|
|
594
607
|
'ml2_network_vlan_ranges' => ml2_network_vlan_ranges,
|
595
608
|
'ml2_tenant_network_types' => ml2_tenant_network_types,
|
596
609
|
'ml2_tunnel_id_ranges' => ml2_tunnel_id_ranges,
|
610
|
+
'ml2_mechanism_drivers' => ml2_mechanism_drivers,
|
597
611
|
'enable_tunneling' => enable_tunneling,
|
598
612
|
'ovs_bridge_mappings' => ovs_bridge_mappings,
|
599
613
|
'ovs_bridge_uplinks' => ovs_bridge_uplinks,
|
600
614
|
'ovs_tunnel_iface' => ovs_tunnel_iface,
|
601
615
|
'ovs_tunnel_types' => ovs_tunnel_types,
|
602
|
-
'ovs_vlan_ranges' => ovs_vlan_ranges
|
616
|
+
'ovs_vlan_ranges' => ovs_vlan_ranges,
|
617
|
+
'nexus_config' => cisco_nexus_config },
|
603
618
|
'quickstack::pacemaker::glance' => {
|
604
619
|
'backend' => backend,
|
605
620
|
'pcmk_fs_type' => pcmk_fs_type,
|
@@ -686,6 +701,7 @@ module Staypuft
|
|
686
701
|
'network_manager' => network_manager,
|
687
702
|
'network_overrides' => network_overrides,
|
688
703
|
'network_num_networks' => network_num_networks,
|
704
|
+
'network_network_size' => network_network_size,
|
689
705
|
'network_fixed_range' => network_fixed_range,
|
690
706
|
'network_floating_range' => network_floating_range,
|
691
707
|
'network_private_iface' => network_private_iface,
|
@@ -741,7 +757,19 @@ module Staypuft
|
|
741
757
|
'nova_host' => nova_host,
|
742
758
|
'private_ip' => private_ip },
|
743
759
|
'quickstack::pacemaker::rsync::keystone' => {
|
744
|
-
'keystone_private_vip' => vip_format(:keystone) }
|
760
|
+
'keystone_private_vip' => vip_format(:keystone) },
|
761
|
+
'quickstack::ceph::config' => {
|
762
|
+
'fsid' => ceph_fsid,
|
763
|
+
'mon_initial_members' => ceph_mon_initial_members,
|
764
|
+
'mon_host' => ceph_mon_host,
|
765
|
+
'cluster_network' => ceph_cluster_network,
|
766
|
+
'public_network' => ceph_public_network,
|
767
|
+
'images_key' => ceph_images_key,
|
768
|
+
'volumes_key' => ceph_volumes_key,
|
769
|
+
'osd_pool_default_size' => ceph_osd_pool_size,
|
770
|
+
'osd_journal_size' => ceph_osd_journal_size
|
771
|
+
}
|
772
|
+
}
|
745
773
|
end
|
746
774
|
|
747
775
|
def get_key_type_and_value(value)
|
@@ -65,19 +65,6 @@ module Staypuft::Concerns::HostgroupExtensions
|
|
65
65
|
oshosts
|
66
66
|
end
|
67
67
|
|
68
|
-
# Returns all hosts associated with this hostgroup with the openstack
|
69
|
-
# deployment environment set. These can be filtered based by setting
|
70
|
-
# errors=true or errors=false to return only the hosts with no errors or
|
71
|
-
# with errors respectively.
|
72
|
-
def openstack_hosts(errors=nil)
|
73
|
-
oshosts = hosts.select { |h| h.open_stack_environment_set? }
|
74
|
-
|
75
|
-
unless errors.nil?
|
76
|
-
oshosts.select! { |h| (!errors ^ h.error?) }
|
77
|
-
end
|
78
|
-
oshosts
|
79
|
-
end
|
80
|
-
|
81
68
|
module ClassMethods
|
82
69
|
def get_base_hostgroup
|
83
70
|
Hostgroup.where(:name => Setting[:base_hostgroup]).first or raise 'missing base_hostgroup'
|
@@ -4,11 +4,12 @@ module Staypuft
|
|
4
4
|
'ceph'
|
5
5
|
end
|
6
6
|
|
7
|
-
param_attr :fsid, :volumes_key, :images_key
|
7
|
+
param_attr :fsid, :volumes_key, :images_key, :osd_pool_size, :osd_journal_size
|
8
8
|
|
9
9
|
|
10
10
|
class Jail < Safemode::Jail
|
11
|
-
allow :fsid, :volumes_key, :images_key, :mon_initial_members
|
11
|
+
allow :fsid, :volumes_key, :images_key, :mon_initial_members,
|
12
|
+
:osd_pool_size, :osd_journal_size
|
12
13
|
end
|
13
14
|
|
14
15
|
def set_defaults
|
@@ -19,14 +20,17 @@ module Staypuft
|
|
19
20
|
key = ` ceph-authtool --gen-print-key`
|
20
21
|
key.chomp! if key
|
21
22
|
self.images_key = key
|
23
|
+
self.osd_pool_size = ''
|
24
|
+
self.osd_journal_size = ''
|
22
25
|
end
|
23
26
|
|
24
27
|
def mon_initial_members
|
25
|
-
|
28
|
+
deployment.network_query.controller_shortnames
|
26
29
|
end
|
27
30
|
|
28
31
|
def param_hash
|
29
|
-
{ "fsid" => fsid, "volumes_key" => volumes_key, "images_key" => images_key
|
32
|
+
{ "fsid" => fsid, "volumes_key" => volumes_key, "images_key" => images_key,
|
33
|
+
"osd_pool_size" => osd_pool_size, "osd_journal_size" => osd_journal_size }
|
30
34
|
end
|
31
35
|
|
32
36
|
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
module Staypuft
|
3
|
+
class Deployment::NeutronService::Cisconexus
|
4
|
+
include ActiveModel::Serializers::JSON
|
5
|
+
include ActiveModel::Validations
|
6
|
+
extend ActiveModel::Naming
|
7
|
+
|
8
|
+
attr_accessor :id, :hostname, :ip, :login, :password, :port_map, :ssh_port
|
9
|
+
attr_reader :errors
|
10
|
+
|
11
|
+
module Hostname
|
12
|
+
HUMAN = N_('Switch Hostname:')
|
13
|
+
end
|
14
|
+
module Ip
|
15
|
+
HUMAN = N_('Switch IP Address:')
|
16
|
+
end
|
17
|
+
module Login
|
18
|
+
HUMAN = N_('Switch Login:')
|
19
|
+
end
|
20
|
+
module Password
|
21
|
+
HUMAN = N_('Switch Password:')
|
22
|
+
end
|
23
|
+
module PortMap
|
24
|
+
HUMAN = N_('Port Mappings:')
|
25
|
+
HELP_INLINE = N_("hostname: port (One per line)")
|
26
|
+
end
|
27
|
+
module SshPort
|
28
|
+
HUMAN = N_('SSH Port:')
|
29
|
+
end
|
30
|
+
|
31
|
+
class IpValueValidator < ActiveModel::EachValidator
|
32
|
+
def validate_each(record, attribute, value)
|
33
|
+
return if value.empty?
|
34
|
+
|
35
|
+
ip_addr = IPAddr.new(value)
|
36
|
+
ip_range = ip_addr.to_range
|
37
|
+
if ip_range.begin == ip_range.end
|
38
|
+
true
|
39
|
+
else
|
40
|
+
record.errors.add attribute, "Specify single IP address, not range"
|
41
|
+
false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class PortMapValueValidator < ActiveModel::EachValidator
|
47
|
+
def validate_each(record, attribute, value)
|
48
|
+
return if value.empty?
|
49
|
+
|
50
|
+
if value.each_line.collect { |line| line.split(':').count == 2 }.all?
|
51
|
+
true
|
52
|
+
else
|
53
|
+
record.errors.add attribute, "One per line, 'hostname: port'"
|
54
|
+
false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
validates :hostname,
|
60
|
+
presence: true
|
61
|
+
validates :ip,
|
62
|
+
presence: true,
|
63
|
+
ip_value: true
|
64
|
+
validates :login,
|
65
|
+
presence: true,
|
66
|
+
format: /\A[a-zA-Z\d][\w\.\-]*[\w\-]\z/,
|
67
|
+
length: { maximum: 16 }
|
68
|
+
validates :password,
|
69
|
+
presence: true,
|
70
|
+
format: /\A[!-~]+\z/,
|
71
|
+
length: { minimum:3, maximum: 16 }
|
72
|
+
validates :port_map,
|
73
|
+
presence: true,
|
74
|
+
port_map_value: true
|
75
|
+
validates :ssh_port,
|
76
|
+
presence: true,
|
77
|
+
numericality: { only_integer: true,
|
78
|
+
greater_than_or_equal_to: 1,
|
79
|
+
less_than_or_equal_to: 65535 }
|
80
|
+
|
81
|
+
def initialize(attrs = {})
|
82
|
+
@errors = ActiveModel::Errors.new(self)
|
83
|
+
# Default ssh port to 22, but let args override
|
84
|
+
self.ssh_port = 22
|
85
|
+
self.attributes = attrs
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.human_attribute_name(attr, options = {})
|
89
|
+
attr
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.lookup_ancestors
|
93
|
+
[self]
|
94
|
+
end
|
95
|
+
|
96
|
+
def config_hash
|
97
|
+
{ "ip_address" => ip, "username" => login, "password" => password,
|
98
|
+
"ssh_port" => ssh_port, "servers" => port_map_hash }
|
99
|
+
end
|
100
|
+
|
101
|
+
def port_map_hash
|
102
|
+
Hash[port_map.each_line.map do |line|
|
103
|
+
server = line.split(':')
|
104
|
+
[ server.first.strip, server.last.strip ]
|
105
|
+
end]
|
106
|
+
end
|
107
|
+
|
108
|
+
def attributes
|
109
|
+
{ 'hostname' => nil, 'ip' => nil, 'login' => nil, 'password' => nil,
|
110
|
+
'port_map' => nil, 'ssh_port' => nil }
|
111
|
+
end
|
112
|
+
|
113
|
+
def attributes=(attrs)
|
114
|
+
attrs.each { |attr, value| send "#{attr}=", value } unless attrs.nil?
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
@@ -6,8 +6,10 @@ module Staypuft
|
|
6
6
|
|
7
7
|
SEGMENTATION_LIST = ['vxlan', 'vlan', 'gre', 'flat']
|
8
8
|
VLAN_HELP = N_('[1-4094] (e.g. 10:15)')
|
9
|
+
ML2MECHANISM_TYPES = :ml2_openvswitch, :ml2_l2population, :ml2_cisco_nexus
|
9
10
|
|
10
|
-
param_attr :network_segmentation, :tenant_vlan_ranges
|
11
|
+
param_attr :network_segmentation, :tenant_vlan_ranges, *ML2MECHANISM_TYPES
|
12
|
+
param_attr_array :nexuses => Cisconexus
|
11
13
|
|
12
14
|
module NetworkSegmentation
|
13
15
|
VXLAN = 'vxlan'
|
@@ -30,7 +32,7 @@ module Staypuft
|
|
30
32
|
end
|
31
33
|
|
32
34
|
class NeutronVlanRangesValidator < ActiveModel::EachValidator
|
33
|
-
include Staypuft::Deployment::VlanRangeValuesValidator
|
35
|
+
include Staypuft::Deployment::VlanRangeValuesValidator
|
34
36
|
end
|
35
37
|
|
36
38
|
validates :tenant_vlan_ranges,
|
@@ -38,14 +40,36 @@ module Staypuft
|
|
38
40
|
:if => :vlan_segmentation?,
|
39
41
|
:neutron_vlan_ranges => true
|
40
42
|
|
43
|
+
module Ml2Mechanisms
|
44
|
+
OPENVSWITCH = 'openvswitch'
|
45
|
+
L2POPULATION = 'l2population'
|
46
|
+
CISCO_NEXUS = 'cisco_nexus'
|
47
|
+
LABELS = { OPENVSWITCH => N_('Open vSwitch'),
|
48
|
+
L2POPULATION => N_('L2 Population'),
|
49
|
+
CISCO_NEXUS => N_('Cisco Nexus') }
|
50
|
+
TYPES = LABELS.keys
|
51
|
+
HUMAN = N_('ML2 Mechanism Drivers')
|
52
|
+
end
|
53
|
+
validate :at_least_one_mechanism_selected
|
54
|
+
validate :cisco_nexuses,
|
55
|
+
:if => :cisco_nexus_mechanism?
|
56
|
+
validates :nexuses,
|
57
|
+
:presence => true,
|
58
|
+
:if => :cisco_nexus_mechanism?
|
59
|
+
|
41
60
|
class Jail < Safemode::Jail
|
42
61
|
allow :networker_vlan_ranges, :compute_vlan_ranges, :network_segmentation, :enable_tunneling?,
|
43
62
|
:tenant_iface, :networker_ovs_bridge_mappings, :networker_ovs_bridge_uplinks,
|
44
|
-
:compute_ovs_bridge_mappings, :compute_ovs_bridge_uplinks, :ovs_tunnel_types
|
63
|
+
:compute_ovs_bridge_mappings, :compute_ovs_bridge_uplinks, :ovs_tunnel_types,
|
64
|
+
:openvswitch_mechanism?, :l2population_mechanism?, :cisco_nexus_mechanism?,
|
65
|
+
:ml2_mechanisms, :nexuses
|
45
66
|
end
|
46
67
|
|
47
68
|
def set_defaults
|
48
69
|
self.network_segmentation = NetworkSegmentation::VXLAN
|
70
|
+
self.ml2_openvswitch = "true"
|
71
|
+
self.ml2_l2population = "true"
|
72
|
+
self.ml2_cisco_nexus = "false"
|
49
73
|
end
|
50
74
|
|
51
75
|
def active?
|
@@ -109,9 +133,47 @@ module Staypuft
|
|
109
133
|
end
|
110
134
|
end
|
111
135
|
|
136
|
+
def openvswitch_mechanism?
|
137
|
+
self.ml2_openvswitch == "true"
|
138
|
+
end
|
139
|
+
|
140
|
+
def l2population_mechanism?
|
141
|
+
self.ml2_l2population == "true"
|
142
|
+
end
|
143
|
+
|
144
|
+
def cisco_nexus_mechanism?
|
145
|
+
self.ml2_cisco_nexus == "true"
|
146
|
+
end
|
147
|
+
|
148
|
+
def compute_cisco_nexus_config
|
149
|
+
Hash[nexuses.map { |nexus| [nexus.hostname, nexus.config_hash] }]
|
150
|
+
end
|
151
|
+
|
152
|
+
def ml2_mechanisms
|
153
|
+
Ml2Mechanisms::TYPES.map { |ml2_type| ml2_type if self.send("#{ml2_type}_mechanism?") }.compact
|
154
|
+
end
|
155
|
+
|
112
156
|
def param_hash
|
113
157
|
{ 'network_segmentation' => network_segmentation,
|
114
|
-
'tenant_vlan_ranges' => tenant_vlan_ranges
|
158
|
+
'tenant_vlan_ranges' => tenant_vlan_ranges,
|
159
|
+
'ml2_openvswitch' => ml2_openvswitch,
|
160
|
+
'ml2_l2population' => ml2_l2population,
|
161
|
+
'ml2_cisco_nexus' => ml2_cisco_nexus,
|
162
|
+
'nexuses' => nexuses }
|
163
|
+
end
|
164
|
+
|
165
|
+
private
|
166
|
+
|
167
|
+
def at_least_one_mechanism_selected
|
168
|
+
if ml2_mechanisms.empty?
|
169
|
+
errors.add :base, _("At least one ML2 mechanism must be selected")
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def cisco_nexuses
|
174
|
+
unless self.nexuses.all? { |item| item.valid? }
|
175
|
+
errors.add :base, _("Please fix the problems in selected mechanisms")
|
176
|
+
end
|
115
177
|
end
|
116
178
|
|
117
179
|
end
|