294 lines
12 KiB
Python
294 lines
12 KiB
Python
![]() |
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||
|
|
||
|
# Copyright 2013, Mirantis Inc
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||
|
# not use this file except in compliance with the License. You may obtain
|
||
|
# a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||
|
# License for the specific language governing permissions and limitations
|
||
|
# under the License.
|
||
|
#
|
||
|
# @author: Tatiana Mazur
|
||
|
|
||
|
import logging
|
||
|
|
||
|
from django.core.urlresolvers import reverse # noqa
|
||
|
from django.utils.translation import ugettext_lazy as _ # noqa
|
||
|
|
||
|
from horizon import exceptions
|
||
|
from horizon import forms
|
||
|
from horizon import messages
|
||
|
from horizon.utils import fields
|
||
|
|
||
|
from openstack_dashboard import api
|
||
|
|
||
|
|
||
|
LOG = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
class UpdateVPNService(forms.SelfHandlingForm):
|
||
|
name = forms.CharField(max_length=80, label=_("Name"), required=False)
|
||
|
vpnservice_id = forms.CharField(
|
||
|
label=_("ID"),
|
||
|
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
|
||
|
description = forms.CharField(
|
||
|
required=False, max_length=80, label=_("Description"))
|
||
|
admin_state_up = forms.BooleanField(label=_("Admin State"), required=False)
|
||
|
|
||
|
failure_url = 'horizon:project:vpn:index'
|
||
|
|
||
|
def handle(self, request, context):
|
||
|
try:
|
||
|
data = {'vpnservice': {'name': context['name'],
|
||
|
'description': context['description'],
|
||
|
'admin_state_up': context['admin_state_up'],
|
||
|
}}
|
||
|
vpnservice = api.vpn.vpnservice_update(
|
||
|
request, context['vpnservice_id'], **data)
|
||
|
msg = (_('VPN Service %s was successfully updated.')
|
||
|
% context['name'])
|
||
|
LOG.debug(msg)
|
||
|
messages.success(request, msg)
|
||
|
return vpnservice
|
||
|
except Exception as e:
|
||
|
msg = _('Failed to update VPN Service %s') % context['name']
|
||
|
LOG.info('%s: %s' % (msg, e))
|
||
|
redirect = reverse(self.failure_url)
|
||
|
exceptions.handle(request, msg, redirect=redirect)
|
||
|
|
||
|
|
||
|
class UpdateIKEPolicy(forms.SelfHandlingForm):
|
||
|
name = forms.CharField(max_length=80, label=_("Name"), required=False)
|
||
|
ikepolicy_id = forms.CharField(
|
||
|
label=_("ID"),
|
||
|
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
|
||
|
description = forms.CharField(
|
||
|
required=False, max_length=80, label=_("Description"))
|
||
|
# Currently this field has only one choice, so mark it as readonly.
|
||
|
auth_algorithm = forms.ChoiceField(
|
||
|
label=_("Authorization algorithm"),
|
||
|
choices=[('sha1', _('sha1'))],
|
||
|
widget=forms.Select(attrs={'readonly': 'readonly'}))
|
||
|
encryption_algorithm = forms.ChoiceField(
|
||
|
label=_("Encryption algorithm"),
|
||
|
choices=[('3des', _('3des')),
|
||
|
('aes-128', _('aes-128')),
|
||
|
('aes-192', _('aes-192')),
|
||
|
('aes-256', _('aes-256'))])
|
||
|
ike_version = forms.ChoiceField(
|
||
|
label=_("IKE version"),
|
||
|
choices=[('v1', _('v1')),
|
||
|
('v2', _('v2'))])
|
||
|
# Currently this field has only one choice, so mark it as readonly.
|
||
|
lifetime_units = forms.ChoiceField(
|
||
|
label=_("Lifetime units for IKE keys"),
|
||
|
choices=[('seconds', _('seconds'))],
|
||
|
widget=forms.Select(attrs={'readonly': 'readonly'}))
|
||
|
lifetime_value = forms.IntegerField(
|
||
|
min_value=60,
|
||
|
label=_("Lifetime value for IKE keys"),
|
||
|
help_text=_("Equal to or more than 60"))
|
||
|
pfs = forms.ChoiceField(
|
||
|
label=_("Perfect Forward Secrecy"),
|
||
|
choices=[('group2', _('group2')),
|
||
|
('group5', _('group5')),
|
||
|
('group14', _('group14'))])
|
||
|
# Currently this field has only one choice, so mark it as readonly.
|
||
|
phase1_negotiation_mode = forms.ChoiceField(
|
||
|
label=_("IKE Phase1 negotiation mode"),
|
||
|
choices=[('main', 'main')],
|
||
|
widget=forms.Select(attrs={'readonly': 'readonly'}))
|
||
|
|
||
|
failure_url = 'horizon:project:vpn:index'
|
||
|
|
||
|
def handle(self, request, context):
|
||
|
try:
|
||
|
data = {'ikepolicy':
|
||
|
{'name': context['name'],
|
||
|
'description': context['description'],
|
||
|
'auth_algorithm': context['auth_algorithm'],
|
||
|
'encryption_algorithm': context['encryption_algorithm'],
|
||
|
'ike_version': context['ike_version'],
|
||
|
'lifetime': {'units': context['lifetime_units'],
|
||
|
'value': context['lifetime_value']},
|
||
|
'pfs': context['pfs'],
|
||
|
'phase1_negotiation_mode': context['phase1_negotiation_mode'],
|
||
|
}}
|
||
|
ikepolicy = api.vpn.ikepolicy_update(
|
||
|
request, context['ikepolicy_id'], **data)
|
||
|
msg = (_('IKE Policy %s was successfully updated.')
|
||
|
% context['name'])
|
||
|
LOG.debug(msg)
|
||
|
messages.success(request, msg)
|
||
|
return ikepolicy
|
||
|
except Exception as e:
|
||
|
msg = _('Failed to update IKE Policy %s') % context['name']
|
||
|
LOG.info('%s: %s' % (msg, e))
|
||
|
redirect = reverse(self.failure_url)
|
||
|
exceptions.handle(request, msg, redirect=redirect)
|
||
|
|
||
|
|
||
|
class UpdateIPSecPolicy(forms.SelfHandlingForm):
|
||
|
name = forms.CharField(max_length=80, label=_("Name"), required=False)
|
||
|
ipsecpolicy_id = forms.CharField(
|
||
|
label=_("ID"),
|
||
|
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
|
||
|
description = forms.CharField(
|
||
|
required=False, max_length=80, label=_("Description"))
|
||
|
# Currently this field has only one choice, so mark it as readonly.
|
||
|
auth_algorithm = forms.ChoiceField(
|
||
|
label=_("Authorization algorithm"),
|
||
|
choices=[('sha1', _('sha1'))],
|
||
|
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
|
||
|
encapsulation_mode = forms.ChoiceField(
|
||
|
label=_("Encapsulation mode"),
|
||
|
choices=[('tunnel', _('tunnel')),
|
||
|
('transport', _('transport'))])
|
||
|
encryption_algorithm = forms.ChoiceField(
|
||
|
label=_("Encryption algorithm"),
|
||
|
choices=[('3des', _('3des')),
|
||
|
('aes-128', _('aes-128')),
|
||
|
('aes-192', _('aes-192')),
|
||
|
('aes-256', _('aes-256'))])
|
||
|
# Currently this field has only one choice, so mark it as readonly.
|
||
|
lifetime_units = forms.ChoiceField(
|
||
|
label=_("Lifetime units"),
|
||
|
choices=[('seconds', _('seconds'))],
|
||
|
widget=forms.Select(attrs={'readonly': 'readonly'}))
|
||
|
lifetime_value = forms.IntegerField(
|
||
|
min_value=60,
|
||
|
label=_("Lifetime value"),
|
||
|
help_text=_("Equal to or more than 60"))
|
||
|
pfs = forms.ChoiceField(
|
||
|
label=_("Perfect Forward Secrecy"),
|
||
|
choices=[('group2', _('group2')),
|
||
|
('group5', _('group5')),
|
||
|
('group14', _('group14'))])
|
||
|
transform_protocol = forms.ChoiceField(
|
||
|
label=_("Transform Protocol"),
|
||
|
choices=[('esp', _('esp')),
|
||
|
('ah', _('ah')),
|
||
|
('ah-esp', _('ah-esp'))])
|
||
|
|
||
|
failure_url = 'horizon:project:vpn:index'
|
||
|
|
||
|
def handle(self, request, context):
|
||
|
try:
|
||
|
data = {'ipsecpolicy':
|
||
|
{'name': context['name'],
|
||
|
'description': context['description'],
|
||
|
'auth_algorithm': context['auth_algorithm'],
|
||
|
'encapsulation_mode': context['encapsulation_mode'],
|
||
|
'encryption_algorithm': context['encryption_algorithm'],
|
||
|
'lifetime': {'units': context['lifetime_units'],
|
||
|
'value': context['lifetime_value']},
|
||
|
'pfs': context['pfs'],
|
||
|
'transform_protocol': context['transform_protocol'],
|
||
|
}}
|
||
|
ipsecpolicy = api.vpn.ipsecpolicy_update(
|
||
|
request, context['ipsecpolicy_id'], **data)
|
||
|
msg = (_('IPSec Policy %s was successfully updated.')
|
||
|
% context['name'])
|
||
|
LOG.debug(msg)
|
||
|
messages.success(request, msg)
|
||
|
return ipsecpolicy
|
||
|
except Exception as e:
|
||
|
msg = _('Failed to update IPSec Policy %s') % context['name']
|
||
|
LOG.info('%s: %s' % (msg, e))
|
||
|
redirect = reverse(self.failure_url)
|
||
|
exceptions.handle(request, msg, redirect=redirect)
|
||
|
|
||
|
|
||
|
class UpdateIPSecSiteConnection(forms.SelfHandlingForm):
|
||
|
name = forms.CharField(max_length=80, label=_("Name"), required=False)
|
||
|
ipsecsiteconnection_id = forms.CharField(label=_("ID"),
|
||
|
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
|
||
|
description = forms.CharField(
|
||
|
required=False, max_length=80, label=_("Description"))
|
||
|
peer_address = fields.IPField(
|
||
|
label=_("Peer gateway public IPv4/IPv6 Address or FQDN"),
|
||
|
help_text=_("Peer gateway public IPv4/IPv6 address or FQDN for "
|
||
|
"the VPN Connection"),
|
||
|
version=fields.IPv4 | fields.IPv6,
|
||
|
mask=False)
|
||
|
peer_id = fields.IPField(
|
||
|
label=_("Peer router identity for authentication (Peer ID)"),
|
||
|
help_text=_("Peer router identity for authentication. "
|
||
|
"Can be IPv4/IPv6 address, e-mail, key ID, or FQDN"),
|
||
|
version=fields.IPv4 | fields.IPv6,
|
||
|
mask=False)
|
||
|
peer_cidrs = fields.MultiIPField(
|
||
|
label=_("Remote peer subnet(s)"),
|
||
|
help_text=_("Remote peer subnet(s) address(es) "
|
||
|
"with mask(s) in CIDR format "
|
||
|
"separated with commas if needed "
|
||
|
"(e.g. 20.1.0.0/24, 21.1.0.0/24)"),
|
||
|
version=fields.IPv4 | fields.IPv6,
|
||
|
mask=True)
|
||
|
psk = forms.CharField(
|
||
|
max_length=80, label=_("Pre-Shared Key (PSK) string"))
|
||
|
mtu = forms.IntegerField(
|
||
|
min_value=68,
|
||
|
label=_("Maximum Transmission Unit size for the connection"),
|
||
|
help_text=_("Equal to or more than 68 if the local subnet is IPv4. "
|
||
|
"Equal to or more than 1280 if the local subnet is IPv6."))
|
||
|
dpd_action = forms.ChoiceField(
|
||
|
label=_("Dead peer detection actions"),
|
||
|
choices=[('hold', _('hold')),
|
||
|
('clear', _('clear')),
|
||
|
('disabled', _('disabled')),
|
||
|
('restart', _('restart')),
|
||
|
('restart-by-peer', _('restart-by-peer'))])
|
||
|
dpd_interval = forms.IntegerField(
|
||
|
min_value=1,
|
||
|
label=_("Dead peer detection interval"),
|
||
|
help_text=_("Valid integer"))
|
||
|
dpd_timeout = forms.IntegerField(
|
||
|
min_value=1,
|
||
|
label=_("Dead peer detection timeout"),
|
||
|
help_text=_("Valid integer greater than the DPD interval"))
|
||
|
initiator = forms.ChoiceField(
|
||
|
label=_("Initiator state"),
|
||
|
choices=[('bi-directional', _('bi-directional')),
|
||
|
('response-only', _('response-only'))])
|
||
|
admin_state_up = forms.BooleanField(label=_("Admin State"), required=False)
|
||
|
|
||
|
failure_url = 'horizon:project:vpn:index'
|
||
|
|
||
|
def handle(self, request, context):
|
||
|
try:
|
||
|
data = {'ipsec_site_connection':
|
||
|
{'name': context['name'],
|
||
|
'description': context['description'],
|
||
|
'peer_address': context['peer_address'],
|
||
|
'peer_id': context['peer_id'],
|
||
|
'peer_cidrs': context[
|
||
|
'peer_cidrs'].replace(" ", "").split(","),
|
||
|
'psk': context['psk'],
|
||
|
'mtu': context['mtu'],
|
||
|
'dpd': {'action': context['dpd_action'],
|
||
|
'interval': context['dpd_interval'],
|
||
|
'timeout': context['dpd_timeout']},
|
||
|
'initiator': context['initiator'],
|
||
|
'admin_state_up': context['admin_state_up'],
|
||
|
}}
|
||
|
ipsecsiteconnection = api.vpn.ipsecsiteconnection_update(
|
||
|
request, context['ipsecsiteconnection_id'], **data)
|
||
|
msg = (_('IPSec Site Connection %s was successfully updated.')
|
||
|
% context['name'])
|
||
|
LOG.debug(msg)
|
||
|
messages.success(request, msg)
|
||
|
return ipsecsiteconnection
|
||
|
except Exception as e:
|
||
|
msg = (_('Failed to update IPSec Site Connection %s')
|
||
|
% context['name'])
|
||
|
LOG.info('%s: %s' % (msg, e))
|
||
|
redirect = reverse(self.failure_url)
|
||
|
exceptions.handle(request, msg, redirect=redirect)
|