|
|
@@ -11,6 +11,7 @@ from cloudbridge.cloud.base.resources import BaseBucket
|
|
|
from cloudbridge.cloud.base.resources import BaseBucketContainer
|
|
|
from cloudbridge.cloud.base.resources import BaseBucketObject
|
|
|
from cloudbridge.cloud.base.resources import BaseFloatingIP
|
|
|
+from cloudbridge.cloud.base.resources import BaseFloatingIPContainer
|
|
|
from cloudbridge.cloud.base.resources import BaseInstance
|
|
|
from cloudbridge.cloud.base.resources import BaseInternetGateway
|
|
|
from cloudbridge.cloud.base.resources import BaseKeyPair
|
|
|
@@ -28,6 +29,7 @@ from cloudbridge.cloud.base.resources import BaseVMType
|
|
|
from cloudbridge.cloud.base.resources import BaseVolume
|
|
|
from cloudbridge.cloud.base.resources import ClientPagedResultList
|
|
|
from cloudbridge.cloud.interfaces.exceptions import InvalidValueException
|
|
|
+from cloudbridge.cloud.interfaces.exceptions import ProviderInternalException
|
|
|
from cloudbridge.cloud.interfaces.resources import GatewayState
|
|
|
from cloudbridge.cloud.interfaces.resources import InstanceState
|
|
|
from cloudbridge.cloud.interfaces.resources import MachineImageState
|
|
|
@@ -46,6 +48,7 @@ from neutronclient.common.exceptions import PortNotFoundClient
|
|
|
import novaclient.exceptions as novaex
|
|
|
|
|
|
from openstack.exceptions import HttpException
|
|
|
+from openstack.exceptions import ResourceNotFound
|
|
|
|
|
|
import swiftclient
|
|
|
from swiftclient.service import SwiftService, SwiftUploadObject
|
|
|
@@ -762,7 +765,8 @@ class OpenStackNetwork(BaseNetwork):
|
|
|
return ''
|
|
|
|
|
|
def delete(self):
|
|
|
- if self.id in str(self._provider.neutron.list_networks()):
|
|
|
+ if not self.external and self.id in str(
|
|
|
+ self._provider.neutron.list_networks()):
|
|
|
# If there are ports associated with the network, it won't delete
|
|
|
ports = self._provider.neutron.list_ports(
|
|
|
network_id=self.id).get('ports', [])
|
|
|
@@ -854,6 +858,32 @@ class OpenStackSubnet(BaseSubnet):
|
|
|
self._state = SubnetState.UNKNOWN
|
|
|
|
|
|
|
|
|
+class OpenStackFloatingIPContainer(BaseFloatingIPContainer):
|
|
|
+
|
|
|
+ def __init__(self, provider, gateway):
|
|
|
+ super(OpenStackFloatingIPContainer, self).__init__(provider, gateway)
|
|
|
+
|
|
|
+ def get(self, fip_id):
|
|
|
+ try:
|
|
|
+ return OpenStackFloatingIP(
|
|
|
+ self._provider, self._provider.os_conn.network.get_ip(fip_id))
|
|
|
+ except ResourceNotFound:
|
|
|
+ return None
|
|
|
+
|
|
|
+ def list(self, limit=None, marker=None):
|
|
|
+ fips = [OpenStackFloatingIP(self._provider, fip)
|
|
|
+ for fip in self._provider.os_conn.network.ips(
|
|
|
+ floating_network_id=self.gateway.id
|
|
|
+ )]
|
|
|
+ return ClientPagedResultList(self._provider, fips,
|
|
|
+ limit=limit, marker=marker)
|
|
|
+
|
|
|
+ def create(self):
|
|
|
+ return OpenStackFloatingIP(
|
|
|
+ self._provider, self._provider.os_conn.network.create_ip(
|
|
|
+ floating_network_id=self.gateway.id))
|
|
|
+
|
|
|
+
|
|
|
class OpenStackFloatingIP(BaseFloatingIP):
|
|
|
|
|
|
def __init__(self, provider, floating_ip):
|
|
|
@@ -969,6 +999,7 @@ class OpenStackInternetGateway(BaseInternetGateway):
|
|
|
# pylint:disable=protected-access
|
|
|
gateway_net = gateway_net._network
|
|
|
self._gateway_net = gateway_net
|
|
|
+ self._fips_container = OpenStackFloatingIPContainer(provider, self)
|
|
|
|
|
|
@property
|
|
|
def id(self):
|
|
|
@@ -988,7 +1019,7 @@ class OpenStackInternetGateway(BaseInternetGateway):
|
|
|
|
|
|
@property
|
|
|
def network_id(self):
|
|
|
- return self._gateway_net.id
|
|
|
+ return self._gateway_net.get('id')
|
|
|
|
|
|
def refresh(self):
|
|
|
"""Refresh the state of this network by re-querying the provider."""
|
|
|
@@ -1009,6 +1040,10 @@ class OpenStackInternetGateway(BaseInternetGateway):
|
|
|
"""Do nothing on openstack"""
|
|
|
pass
|
|
|
|
|
|
+ @property
|
|
|
+ def floating_ips(self):
|
|
|
+ return self._fips_container
|
|
|
+
|
|
|
|
|
|
class OpenStackKeyPair(BaseKeyPair):
|
|
|
|