Merge "Add IPsecSiteConnection resource and proxy layer functionality for it"
This commit is contained in:
commit
9e7b22d7f7
@ -234,6 +234,15 @@ VPN Operations
|
||||
:members: create_vpn_service, update_vpn_service, delete_vpn_service,
|
||||
get_vpn_service, find_vpn_service, vpn_services
|
||||
|
||||
IPSecSiteConnection Operations
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. autoclass:: openstack.network.v2._proxy.Proxy
|
||||
:noindex:
|
||||
:members: create_vpn_ipsec_site_connection, update_vpn_ipsec_site_connection,
|
||||
delete_vpn_ipsec_site_connection, get_vpn_ipsec_site_connection,
|
||||
find_vpn_ipsec_site_connection, vpn_ipsec_site_connections
|
||||
|
||||
Extension Operations
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
@ -13,6 +13,7 @@ Network Resources
|
||||
v2/flavor
|
||||
v2/floating_ip
|
||||
v2/health_monitor
|
||||
v2/ipsec_site_connection
|
||||
v2/listener
|
||||
v2/load_balancer
|
||||
v2/metering_label
|
||||
|
@ -0,0 +1,13 @@
|
||||
openstack.network.v2.ipsec_site_connection
|
||||
==========================================
|
||||
|
||||
.. automodule:: openstack.network.v2.ipsec_site_connection
|
||||
|
||||
The IPSecSiteConnection Class
|
||||
-----------------------------
|
||||
|
||||
The ``IPSecSiteConnection`` class inherits from
|
||||
:class:`~openstack.resource.Resource`.
|
||||
|
||||
.. autoclass:: openstack.network.v2.ipsec_site_connection.IPSecSiteConnection
|
||||
:members:
|
@ -24,6 +24,8 @@ from openstack.network.v2 import firewall_rule as _firewall_rule
|
||||
from openstack.network.v2 import flavor as _flavor
|
||||
from openstack.network.v2 import floating_ip as _floating_ip
|
||||
from openstack.network.v2 import health_monitor as _health_monitor
|
||||
from openstack.network.v2 import ipsec_site_connection as \
|
||||
_ipsec_site_connection
|
||||
from openstack.network.v2 import l3_conntrack_helper as _l3_conntrack_helper
|
||||
from openstack.network.v2 import listener as _listener
|
||||
from openstack.network.v2 import load_balancer as _load_balancer
|
||||
@ -951,6 +953,100 @@ class Proxy(proxy.Proxy):
|
||||
return self._update(_health_monitor.HealthMonitor, health_monitor,
|
||||
**attrs)
|
||||
|
||||
def create_vpn_ipsec_site_connection(self, **attrs):
|
||||
"""Create a new ipsec site connection from attributes
|
||||
|
||||
:param dict attrs: Keyword arguments which will be used to create a
|
||||
:class:`~openstack.network.v2.ipsec_site_connection.
|
||||
IPSecSiteConnection`, comprised of the properties on the
|
||||
IPSecSiteConnection class.
|
||||
|
||||
:returns: The results of ipsec site connection creation :rtype:
|
||||
:class:`~openstack.network.v2.ipsec_site_connection.
|
||||
IPSecSiteConnection`
|
||||
"""
|
||||
return self._create(_ipsec_site_connection.IPSecSiteConnection,
|
||||
**attrs)
|
||||
|
||||
def find_vpn_ipsec_site_connection(self, name_or_id,
|
||||
ignore_missing=True, **args):
|
||||
"""Find a single ipsec site connection
|
||||
|
||||
:param name_or_id: The name or ID of an ipsec site connection.
|
||||
:param bool ignore_missing: When set to ``False`` :class:`~openstack.
|
||||
exceptions.ResourceNotFound` will be raised when the resource does
|
||||
not exist.When set to ``True``, None will be returned when
|
||||
attempting to find a nonexistent resource.
|
||||
:param dict args: Any additional parameters to be passed into
|
||||
underlying methods such as query filters.
|
||||
:returns: One :class:`~openstack.network.v2.ipsec_site_connection.
|
||||
IPSecSiteConnection` or None
|
||||
"""
|
||||
return self._find(_ipsec_site_connection.IPSecSiteConnection,
|
||||
name_or_id, ignore_missing=ignore_missing, **args)
|
||||
|
||||
def get_vpn_ipsec_site_connection(self, ipsec_site_connection):
|
||||
"""Get a single ipsec site connection
|
||||
|
||||
:param ipsec_site_connection: The value can be the ID of an ipsec site
|
||||
connection or a :class:`~openstack.network.v2.
|
||||
ipsec_site_connection.IPSecSiteConnection` instance.
|
||||
|
||||
:returns: One :class:`~openstack.network.v2.ipsec_site_connection.
|
||||
IPSecSiteConnection`
|
||||
:raises: :class:`~openstack.exceptions.ResourceNotFound`
|
||||
when no resource can be found.
|
||||
"""
|
||||
return self._get(_ipsec_site_connection.IPSecSiteConnection,
|
||||
ipsec_site_connection)
|
||||
|
||||
def vpn_ipsec_site_connections(self, **query):
|
||||
"""Return a generator of ipsec site connections
|
||||
|
||||
:param dict query: Optional query parameters to be sent to limit the
|
||||
resources being returned.
|
||||
|
||||
:returns: A generator of ipsec site connection objects
|
||||
:rtype: :class:`~openstack.network.v2.ipsec_site_connection.
|
||||
IPSecSiteConnection`
|
||||
"""
|
||||
return self._list(_ipsec_site_connection.IPSecSiteConnection, **query)
|
||||
|
||||
def update_vpn_ipsec_site_connection(self, ipsec_site_connection, **attrs):
|
||||
"""Update a ipsec site connection
|
||||
|
||||
:ipsec_site_connection: Either the id of an ipsec site connection or
|
||||
a :class:`~openstack.network.v2.ipsec_site_connection.
|
||||
IPSecSiteConnection` instance.
|
||||
:param dict attrs: The attributes to update on the ipsec site
|
||||
connection represented by ``ipsec_site_connection``.
|
||||
|
||||
:returns: The updated ipsec site connection
|
||||
:rtype: :class:`~openstack.network.v2.ipsec_site_connection.
|
||||
IPSecSiteConnection`
|
||||
"""
|
||||
return self._update(_ipsec_site_connection.IPSecSiteConnection,
|
||||
ipsec_site_connection, **attrs)
|
||||
|
||||
def delete_vpn_ipsec_site_connection(self, ipsec_site_connection,
|
||||
ignore_missing=True):
|
||||
"""Delete a ipsec site connection
|
||||
|
||||
:param ipsec_site_connection: The value can be either the ID of an
|
||||
ipsec site connection, or a :class:`~openstack.network.v2.
|
||||
ipsec_site_connection.IPSecSiteConnection` instance.
|
||||
:param bool ignore_missing:
|
||||
When set to ``False`` :class:`~openstack.exceptions.
|
||||
ResourceNotFound` will be raised when the ipsec site connection
|
||||
does not exist.
|
||||
When set to ``True``, no exception will be set when attempting to
|
||||
delete a nonexistent ipsec site connection.
|
||||
|
||||
:returns: ``None``
|
||||
"""
|
||||
self._delete(_ipsec_site_connection.IPSecSiteConnection,
|
||||
ipsec_site_connection, ignore_missing=ignore_missing)
|
||||
|
||||
def create_listener(self, **attrs):
|
||||
"""Create a new listener from attributes
|
||||
|
||||
|
105
openstack/network/v2/ipsec_site_connection.py
Normal file
105
openstack/network/v2/ipsec_site_connection.py
Normal file
@ -0,0 +1,105 @@
|
||||
# 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.
|
||||
|
||||
from openstack import resource
|
||||
|
||||
|
||||
class IPSecSiteConnection(resource.Resource):
|
||||
resource_key = 'ipsec_site_connection'
|
||||
resources_key = 'ipsec_site_connections'
|
||||
base_path = '/vpn/ipsec-site-connections'
|
||||
|
||||
# capabilities
|
||||
allow_create = True
|
||||
allow_fetch = True
|
||||
allow_commit = True
|
||||
allow_delete = True
|
||||
allow_list = True
|
||||
|
||||
# Properties
|
||||
#: The dead peer detection (DPD) action.
|
||||
# A valid value is clear, hold, restart,
|
||||
# disabled, or restart-by-peer. Default value is hold.
|
||||
action = resource.Body('action')
|
||||
#: The authentication mode. A valid value
|
||||
# is psk, which is the default.
|
||||
auth_mode = resource.Body('auth_mode')
|
||||
#: A human-readable description for the resource.
|
||||
# Default is an empty string.
|
||||
description = resource.Body('description')
|
||||
#: A dictionary with dead peer detection (DPD) protocol controls.
|
||||
dpd = resource.Body('dpd', type=dict)
|
||||
#: The administrative state of the resource,
|
||||
# which is up (true) or down (false).
|
||||
is_admin_state_up = resource.Body('admin_state_up', type=bool)
|
||||
#: The ID of the IKE policy.
|
||||
ikepolicy_id = resource.Body('ikepolicy_id')
|
||||
#: Indicates whether this VPN can only respond
|
||||
# to connections or both respond
|
||||
# to and initiate connections. A valid value is
|
||||
# response- only or bi-directional. Default is bi-directional.
|
||||
initiator = resource.Body('initiator')
|
||||
#: The ID of the IPsec policy.
|
||||
ipsecpolicy_id = resource.Body('ipsecpolicy_id')
|
||||
#: The dead peer detection (DPD) interval, in seconds.
|
||||
# A valid value is a positive integer. Default is 30.
|
||||
interval = resource.Body('interval', type=int)
|
||||
#: The ID for the endpoint group that contains
|
||||
# private subnets for the local side of the connection.
|
||||
# Yo must specify this parameter with the
|
||||
# peer_ep_group_id parameter unless in backward- compatible
|
||||
# mode where peer_cidrs is provided with
|
||||
# a subnet_id for the VPN service.
|
||||
local_ep_group_id = resource.Body('local_ep_group_id')
|
||||
#: The peer gateway public IPv4 or IPv6 address or FQDN.
|
||||
peer_address = resource.Body('peer_address')
|
||||
#: An ID to be used instead of the external IP address for
|
||||
# a virtual router used in traffic between
|
||||
# instances on different networks in east-west traffic.
|
||||
# Most often, local ID would be domain
|
||||
# name, email address, etc. If this is not configured
|
||||
# then the external IP address will be used as the ID.
|
||||
local_id = resource.Body('local_id')
|
||||
#: The maximum transmission unit (MTU)
|
||||
# value to address fragmentation. Minimum value
|
||||
# is 68 for IPv4, and 1280 for IPv6.
|
||||
mtu = resource.Body('mtu', type=int)
|
||||
#: Human-readable name of the resource. Default is an empty string.
|
||||
name = resource.Body('name')
|
||||
#: The peer router identity for authentication.
|
||||
# A valid value is an IPv4 address, IPv6 address, e-mail address,
|
||||
# key ID, or FQDN. Typically, this value matches
|
||||
# the peer_address value.
|
||||
peer_id = resource.Body('peer_id')
|
||||
#: (Deprecated) Unique list of valid peer private
|
||||
# CIDRs in the form < net_address > / < prefix > .
|
||||
peer_cidrs = resource.Body('peer_cidrs', type=list)
|
||||
#: The ID of the project.
|
||||
project_id = resource.Body('tenant_id')
|
||||
#: The pre-shared key. A valid value is any string.
|
||||
psk = resource.Body('psk')
|
||||
#: The ID for the endpoint group that contains
|
||||
# private CIDRs in the form < net_address > / < prefix >
|
||||
# for the peer side of the connection. You must
|
||||
# specify this parameter with the local_ep_group_id
|
||||
# parameter unless in backward-compatible mode
|
||||
# where peer_cidrs is provided with a subnet_id for the VPN service.
|
||||
peer_ep_group_id = resource.Body('peer_ep_group_id')
|
||||
#: The route mode. A valid value is static, which is the default.
|
||||
route_mode = resource.Body('route_mode')
|
||||
#: The dead peer detection (DPD) timeout
|
||||
# in seconds. A valid value is a
|
||||
# positive integer that is greater
|
||||
# than the DPD interval value. Default is 120.
|
||||
timeout = resource.Body('timeout', type=int)
|
||||
#: The ID of the VPN service.
|
||||
vpnservice_id = resource.Body('vpnservice_id')
|
@ -0,0 +1,80 @@
|
||||
# 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.
|
||||
|
||||
from openstack.network.v2 import ipsec_site_connection
|
||||
from openstack.tests.unit import base
|
||||
|
||||
|
||||
IDENTIFIER = 'IDENTIFIER'
|
||||
EXAMPLE = {
|
||||
"admin_state_up": True,
|
||||
"auth_mode": "1",
|
||||
"ikepolicy_id": "2",
|
||||
"vpnservice_id": "3",
|
||||
"local_ep_group_id": "4",
|
||||
"peer_address": "5",
|
||||
"route_mode": "6",
|
||||
"ipsecpolicy_id": "7",
|
||||
"peer_id": "8",
|
||||
"psk": "9",
|
||||
"description": "10",
|
||||
"initiator": "11",
|
||||
"peer_cidrs": ['1', '2'],
|
||||
"name": "12",
|
||||
"tenant_id": "13",
|
||||
"interval": 5,
|
||||
"mtu": 5,
|
||||
"peer_ep_group_id": "14",
|
||||
"dpd": {'a': 5},
|
||||
"timeout": 16,
|
||||
"action": "17",
|
||||
"local_id": "18"
|
||||
}
|
||||
|
||||
|
||||
class TestIPSecSiteConnection(base.TestCase):
|
||||
|
||||
def test_basic(self):
|
||||
sot = ipsec_site_connection.IPSecSiteConnection()
|
||||
self.assertEqual('ipsec_site_connection', sot.resource_key)
|
||||
self.assertEqual('ipsec_site_connections', sot.resources_key)
|
||||
self.assertEqual('/vpn/ipsec-site-connections', sot.base_path)
|
||||
self.assertTrue(sot.allow_create)
|
||||
self.assertTrue(sot.allow_fetch)
|
||||
self.assertTrue(sot.allow_commit)
|
||||
self.assertTrue(sot.allow_delete)
|
||||
self.assertTrue(sot.allow_list)
|
||||
|
||||
def test_make_it(self):
|
||||
sot = ipsec_site_connection.IPSecSiteConnection(**EXAMPLE)
|
||||
self.assertTrue(sot.is_admin_state_up)
|
||||
self.assertEqual(EXAMPLE['auth_mode'], sot.auth_mode)
|
||||
self.assertEqual(EXAMPLE['ikepolicy_id'], sot.ikepolicy_id)
|
||||
self.assertEqual(EXAMPLE['vpnservice_id'], sot.vpnservice_id)
|
||||
self.assertEqual(EXAMPLE['local_ep_group_id'], sot.local_ep_group_id)
|
||||
self.assertEqual(EXAMPLE['peer_address'], sot.peer_address)
|
||||
self.assertEqual(EXAMPLE['route_mode'], sot.route_mode)
|
||||
self.assertEqual(EXAMPLE['ipsecpolicy_id'], sot.ipsecpolicy_id)
|
||||
self.assertEqual(EXAMPLE['peer_id'], sot.peer_id)
|
||||
self.assertEqual(EXAMPLE['psk'], sot.psk)
|
||||
self.assertEqual(EXAMPLE['description'], sot.description)
|
||||
self.assertEqual(EXAMPLE['initiator'], sot.initiator)
|
||||
self.assertEqual(EXAMPLE['peer_cidrs'], sot.peer_cidrs)
|
||||
self.assertEqual(EXAMPLE['name'], sot.name)
|
||||
self.assertEqual(EXAMPLE['tenant_id'], sot.project_id)
|
||||
self.assertEqual(EXAMPLE['interval'], sot.interval)
|
||||
self.assertEqual(EXAMPLE['mtu'], sot.mtu)
|
||||
self.assertEqual(EXAMPLE['peer_ep_group_id'], sot.peer_ep_group_id)
|
||||
self.assertEqual(EXAMPLE['dpd'], sot.dpd)
|
||||
self.assertEqual(EXAMPLE['timeout'], sot.timeout)
|
||||
self.assertEqual(EXAMPLE['action'], sot.action)
|
||||
self.assertEqual(EXAMPLE['local_id'], sot.local_id)
|
@ -26,6 +26,7 @@ from openstack.network.v2 import firewall_rule
|
||||
from openstack.network.v2 import flavor
|
||||
from openstack.network.v2 import floating_ip
|
||||
from openstack.network.v2 import health_monitor
|
||||
from openstack.network.v2 import ipsec_site_connection
|
||||
from openstack.network.v2 import l3_conntrack_helper
|
||||
from openstack.network.v2 import listener
|
||||
from openstack.network.v2 import load_balancer
|
||||
@ -239,6 +240,34 @@ class TestNetworkProxy(test_proxy_base.TestProxyBase):
|
||||
self.verify_update(self.proxy.update_health_monitor,
|
||||
health_monitor.HealthMonitor)
|
||||
|
||||
def test_ipsec_site_connection_create_attrs(self):
|
||||
self.verify_create(self.proxy.create_vpn_ipsec_site_connection,
|
||||
ipsec_site_connection.IPSecSiteConnection)
|
||||
|
||||
def test_ipsec_site_connection_delete(self):
|
||||
self.verify_delete(self.proxy.delete_vpn_ipsec_site_connection,
|
||||
ipsec_site_connection.IPSecSiteConnection, False)
|
||||
|
||||
def test_ipsec_site_connection_delete_ignore(self):
|
||||
self.verify_delete(self.proxy.delete_vpn_ipsec_site_connection,
|
||||
ipsec_site_connection.IPSecSiteConnection, True)
|
||||
|
||||
def test_ipsec_site_connection_find(self):
|
||||
self.verify_find(self.proxy.find_vpn_ipsec_site_connection,
|
||||
ipsec_site_connection.IPSecSiteConnection)
|
||||
|
||||
def test_ipsec_site_connection_get(self):
|
||||
self.verify_get(self.proxy.get_vpn_ipsec_site_connection,
|
||||
ipsec_site_connection.IPSecSiteConnection)
|
||||
|
||||
def test_ipsec_site_connections(self):
|
||||
self.verify_list(self.proxy.vpn_ipsec_site_connections,
|
||||
ipsec_site_connection.IPSecSiteConnection)
|
||||
|
||||
def test_ipsec_site_connection_update(self):
|
||||
self.verify_update(self.proxy.update_vpn_ipsec_site_connection,
|
||||
ipsec_site_connection.IPSecSiteConnection)
|
||||
|
||||
def test_listener_create_attrs(self):
|
||||
self.verify_create(self.proxy.create_listener, listener.Listener)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user