Merge "Add missing trunk segment type option for profile create"
This commit is contained in:
commit
ca0e1e0284
@ -53,14 +53,16 @@ class CreateNetworkProfile(forms.SelfHandlingForm):
|
|||||||
required=True)
|
required=True)
|
||||||
segment_type = forms.ChoiceField(label=_('Segment Type'),
|
segment_type = forms.ChoiceField(label=_('Segment Type'),
|
||||||
choices=[('vlan', _('VLAN')),
|
choices=[('vlan', _('VLAN')),
|
||||||
('overlay', _('OVERLAY'))],
|
('overlay', _('Overlay')),
|
||||||
|
('trunk', _('Trunk'))],
|
||||||
widget=forms.Select
|
widget=forms.Select
|
||||||
(attrs={'class': 'switchable',
|
(attrs={'class': 'switchable',
|
||||||
'data-slug': 'segtype'}))
|
'data-slug': 'segtype'}))
|
||||||
|
# Sub type options available for Overlay segment type
|
||||||
sub_type = forms.ChoiceField(label=_('Sub Type'),
|
sub_type = forms.ChoiceField(label=_('Sub Type'),
|
||||||
choices=[('native_vxlan', _('NATIVE VXLAN')),
|
choices=[('native_vxlan', _('Native VXLAN')),
|
||||||
('enhanced', _('ENHANCED')),
|
('enhanced', _('Enhanced VXLAN')),
|
||||||
('other', _('OTHER'))],
|
('other', _('Other'))],
|
||||||
required=False,
|
required=False,
|
||||||
widget=forms.Select
|
widget=forms.Select
|
||||||
(attrs={'class': 'switchable switched',
|
(attrs={'class': 'switchable switched',
|
||||||
@ -68,9 +70,24 @@ class CreateNetworkProfile(forms.SelfHandlingForm):
|
|||||||
'data-switch-on': 'segtype',
|
'data-switch-on': 'segtype',
|
||||||
'data-segtype-overlay':
|
'data-segtype-overlay':
|
||||||
_("Sub Type")}))
|
_("Sub Type")}))
|
||||||
|
# Sub type options available for Trunk segment type
|
||||||
|
sub_type_trunk = forms.ChoiceField(label=_('Sub Type'),
|
||||||
|
choices=[('vlan', _('VLAN'))],
|
||||||
|
required=False,
|
||||||
|
widget=forms.Select
|
||||||
|
(attrs={'class': 'switched',
|
||||||
|
'data-switch-on': 'segtype',
|
||||||
|
'data-segtype-trunk': _("Sub Type")}))
|
||||||
segment_range = forms.CharField(max_length=255,
|
segment_range = forms.CharField(max_length=255,
|
||||||
label=_("Segment Range"),
|
label=_("Segment Range"),
|
||||||
required=True,
|
required=False,
|
||||||
|
widget=forms.TextInput
|
||||||
|
(attrs={'class': 'switched',
|
||||||
|
'data-switch-on': 'segtype',
|
||||||
|
'data-segtype-vlan':
|
||||||
|
_("Segment Range"),
|
||||||
|
'data-segtype-overlay':
|
||||||
|
_("Segment Range")}),
|
||||||
help_text=_("1-4093 for VLAN; "
|
help_text=_("1-4093 for VLAN; "
|
||||||
"5000-10000 for Overlay"))
|
"5000-10000 for Overlay"))
|
||||||
multicast_ip_range = forms.CharField(max_length=30,
|
multicast_ip_range = forms.CharField(max_length=30,
|
||||||
@ -83,8 +100,8 @@ class CreateNetworkProfile(forms.SelfHandlingForm):
|
|||||||
'data-subtype-native_vxlan':
|
'data-subtype-native_vxlan':
|
||||||
_("Multicast IP Range")}),
|
_("Multicast IP Range")}),
|
||||||
help_text=_("Multicast IPv4 range"
|
help_text=_("Multicast IPv4 range"
|
||||||
"(e.g. 132.0.0.0-"
|
"(e.g. 224.0.0.0-"
|
||||||
"132.0.0.100)"))
|
"224.0.0.100)"))
|
||||||
other_subtype = forms.CharField(max_length=255,
|
other_subtype = forms.CharField(max_length=255,
|
||||||
label=_("Sub Type Value (Manual Input)"),
|
label=_("Sub Type Value (Manual Input)"),
|
||||||
required=False,
|
required=False,
|
||||||
@ -112,7 +129,8 @@ class CreateNetworkProfile(forms.SelfHandlingForm):
|
|||||||
self.fields['project'].choices = get_tenant_choices(request)
|
self.fields['project'].choices = get_tenant_choices(request)
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
# If sub_type is 'other' then assign this new value for sub_type
|
# If sub_type is 'other' or 'trunk' then
|
||||||
|
# assign this new value for sub_type
|
||||||
cleaned_data = super(CreateNetworkProfile, self).clean()
|
cleaned_data = super(CreateNetworkProfile, self).clean()
|
||||||
|
|
||||||
segment_type = cleaned_data.get('segment_type')
|
segment_type = cleaned_data.get('segment_type')
|
||||||
@ -123,6 +141,11 @@ class CreateNetworkProfile(forms.SelfHandlingForm):
|
|||||||
cleaned_data['sub_type'] = other_subtype
|
cleaned_data['sub_type'] = other_subtype
|
||||||
LOG.debug('subtype is now %(params)s',
|
LOG.debug('subtype is now %(params)s',
|
||||||
{'params': other_subtype})
|
{'params': other_subtype})
|
||||||
|
elif segment_type == 'trunk':
|
||||||
|
sub_type_trunk = cleaned_data.get('sub_type_trunk')
|
||||||
|
cleaned_data['sub_type'] = sub_type_trunk
|
||||||
|
LOG.debug('subtype is now %(params)s',
|
||||||
|
{'params': sub_type_trunk})
|
||||||
|
|
||||||
return cleaned_data
|
return cleaned_data
|
||||||
|
|
||||||
|
@ -17,9 +17,9 @@
|
|||||||
<div class="right">
|
<div class="right">
|
||||||
<h3>{% trans "Description" %}:</h3>
|
<h3>{% trans "Description" %}:</h3>
|
||||||
<p><strong>{% trans "Name" %}</strong>: {% blocktrans %} Select a name for your network profile.{% endblocktrans %}</p>
|
<p><strong>{% trans "Name" %}</strong>: {% blocktrans %} Select a name for your network profile.{% endblocktrans %}</p>
|
||||||
<p><strong>{% trans "Segment Type" %}</strong>: {% blocktrans %} Segment types available are VLAN and OVERLAY.{% endblocktrans %}</p>
|
<p><strong>{% trans "Segment Type" %}</strong>: {% blocktrans %} Segment types available are VLAN, Overlay and Trunk.{% endblocktrans %}</p>
|
||||||
<p><strong>{% trans "Segment Sub Type" %}</strong>: {% blocktrans %} Sub types available are for the Overlay segment. Available sub-types for overlay are: native_vxlan, enhanced or 'other' (eg. GRE) which can be manually inputed as a text parameter for subtype.{% endblocktrans %}</p>
|
<p><strong>{% trans "Segment Sub Type" %}</strong>: {% blocktrans %} Sub types available are for the Overlay and Trunk segments. Available sub-types for Overlay are: Native-VXLAN, Enhanced-VXLAN or 'Other' (eg. GRE) which can be manually inputed as a text parameter for subtype. Available sub-type for Trunk is: VLAN.{% endblocktrans %}</p>
|
||||||
<p><strong>{% trans "Segment Range" %}</strong>: {% blocktrans %} Segment Ranges are 1-4093 for VLAN and above 5000 for enhanced overlay.{% endblocktrans %}</p>
|
<p><strong>{% trans "Segment Range" %}</strong>: {% blocktrans %} Segment Ranges are 1-4093 for VLAN and above 5000 for Enhanced-VXLAN Overlay.{% endblocktrans %}</p>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
@ -133,3 +133,73 @@ if api.neutron.is_port_profiles_supported():
|
|||||||
self.assertRedirectsNoFollow(res,
|
self.assertRedirectsNoFollow(res,
|
||||||
reverse
|
reverse
|
||||||
('horizon:router:nexus1000v:index'))
|
('horizon:router:nexus1000v:index'))
|
||||||
|
|
||||||
|
@test.create_stubs({api.neutron: ('profile_create',),
|
||||||
|
api.keystone: ('tenant_list',)})
|
||||||
|
def test_create_overlay_other_net_profile(self):
|
||||||
|
tenants = self.tenants.list()
|
||||||
|
net_profile = self.net_profiles.list()[2]
|
||||||
|
params = {'name': net_profile.name,
|
||||||
|
'segment_type': net_profile.segment_type,
|
||||||
|
'segment_range': net_profile.segment_range,
|
||||||
|
'sub_type': net_profile.other_subtype,
|
||||||
|
'tenant_id': net_profile.project,
|
||||||
|
# overlay 'other' profiles have no multicast_ip_range
|
||||||
|
# or physical_network type
|
||||||
|
'multicast_ip_range': '',
|
||||||
|
'physical_network': ''}
|
||||||
|
|
||||||
|
api.neutron.profile_create(IsA(http.HttpRequest),
|
||||||
|
**params).AndReturn(net_profile)
|
||||||
|
api.keystone.tenant_list(
|
||||||
|
IsA(http.HttpRequest)).AndReturn([tenants, False])
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
form_data = {'name': net_profile.name,
|
||||||
|
'segment_type': net_profile.segment_type,
|
||||||
|
'segment_range': net_profile.segment_range,
|
||||||
|
'sub_type': net_profile.sub_type,
|
||||||
|
'other_subtype': net_profile.other_subtype,
|
||||||
|
'project': net_profile.project}
|
||||||
|
form_data.update(form_data_overlay())
|
||||||
|
url = reverse('horizon:router:nexus1000v:create_network_profile')
|
||||||
|
res = self.client.post(url, form_data)
|
||||||
|
|
||||||
|
self.assertNoFormErrors(res)
|
||||||
|
self.assertRedirectsNoFollow(res,
|
||||||
|
reverse
|
||||||
|
('horizon:router:nexus1000v:index'))
|
||||||
|
|
||||||
|
@test.create_stubs({api.neutron: ('profile_create',),
|
||||||
|
api.keystone: ('tenant_list',)})
|
||||||
|
def test_create_trunk_net_profile(self):
|
||||||
|
tenants = self.tenants.list()
|
||||||
|
net_profile = self.net_profiles.list()[3]
|
||||||
|
params = {'name': net_profile.name,
|
||||||
|
'segment_type': net_profile.segment_type,
|
||||||
|
'sub_type': net_profile.sub_type_trunk,
|
||||||
|
'tenant_id': net_profile.project,
|
||||||
|
# trunk profiles have no multicast_ip_range,
|
||||||
|
# no segment_range or no physical_network type
|
||||||
|
'multicast_ip_range': '',
|
||||||
|
'segment_range': '',
|
||||||
|
'physical_network': ''}
|
||||||
|
|
||||||
|
api.neutron.profile_create(IsA(http.HttpRequest),
|
||||||
|
**params).AndReturn(net_profile)
|
||||||
|
api.keystone.tenant_list(
|
||||||
|
IsA(http.HttpRequest)).AndReturn([tenants, False])
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
form_data = {'name': net_profile.name,
|
||||||
|
'segment_type': net_profile.segment_type,
|
||||||
|
'sub_type_trunk': net_profile.sub_type_trunk,
|
||||||
|
'project': net_profile.project}
|
||||||
|
form_data.update(form_data_no_overlay())
|
||||||
|
url = reverse('horizon:router:nexus1000v:create_network_profile')
|
||||||
|
res = self.client.post(url, form_data)
|
||||||
|
|
||||||
|
self.assertNoFormErrors(res)
|
||||||
|
self.assertRedirectsNoFollow(res,
|
||||||
|
reverse
|
||||||
|
('horizon:router:nexus1000v:index'))
|
||||||
|
@ -911,3 +911,47 @@ def data(TEST):
|
|||||||
TEST.api_network_profile_binding.add(network_profile_binding_dict)
|
TEST.api_network_profile_binding.add(network_profile_binding_dict)
|
||||||
TEST.network_profile_binding.add(neutron.Profile(
|
TEST.network_profile_binding.add(neutron.Profile(
|
||||||
network_profile_binding_dict))
|
network_profile_binding_dict))
|
||||||
|
|
||||||
|
# 3rd network profile for network when using the cisco n1k plugin
|
||||||
|
# Profile applied on 1st network
|
||||||
|
net_profile_dict = {'name': 'net_profile_test3',
|
||||||
|
'segment_type': 'overlay',
|
||||||
|
'sub_type': 'other',
|
||||||
|
'other_subtype': 'GRE',
|
||||||
|
'segment_range': '11000-11100',
|
||||||
|
'id':
|
||||||
|
'00000000-3333-3333-3333-000000000000',
|
||||||
|
'project': '1'}
|
||||||
|
|
||||||
|
TEST.api_net_profiles.add(net_profile_dict)
|
||||||
|
TEST.net_profiles.add(neutron.Profile(net_profile_dict))
|
||||||
|
|
||||||
|
# 3rd network profile binding
|
||||||
|
network_profile_binding_dict = {'profile_id':
|
||||||
|
'00000000-3333-3333-3333-000000000000',
|
||||||
|
'tenant_id': '1'}
|
||||||
|
|
||||||
|
TEST.api_network_profile_binding.add(network_profile_binding_dict)
|
||||||
|
TEST.network_profile_binding.add(neutron.Profile(
|
||||||
|
network_profile_binding_dict))
|
||||||
|
|
||||||
|
# 4th network profile for network when using the cisco n1k plugin
|
||||||
|
# Profile applied on 1st network
|
||||||
|
net_profile_dict = {'name': 'net_profile_test4',
|
||||||
|
'segment_type': 'trunk',
|
||||||
|
'sub_type_trunk': 'vlan',
|
||||||
|
'id':
|
||||||
|
'00000000-4444-4444-4444-000000000000',
|
||||||
|
'project': '1'}
|
||||||
|
|
||||||
|
TEST.api_net_profiles.add(net_profile_dict)
|
||||||
|
TEST.net_profiles.add(neutron.Profile(net_profile_dict))
|
||||||
|
|
||||||
|
# 4th network profile binding
|
||||||
|
network_profile_binding_dict = {'profile_id':
|
||||||
|
'00000000-4444-4444-4444-000000000000',
|
||||||
|
'tenant_id': '1'}
|
||||||
|
|
||||||
|
TEST.api_network_profile_binding.add(network_profile_binding_dict)
|
||||||
|
TEST.network_profile_binding.add(neutron.Profile(
|
||||||
|
network_profile_binding_dict))
|
||||||
|
Loading…
Reference in New Issue
Block a user