|
|
@@ -18,11 +18,8 @@ import googleapiclient
|
|
|
import cloudbridge as cb
|
|
|
from cloudbridge.cloud.base.resources import BaseAttachmentInfo
|
|
|
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 BaseGatewayContainer
|
|
|
from cloudbridge.cloud.base.resources import BaseInstance
|
|
|
from cloudbridge.cloud.base.resources import BaseInternetGateway
|
|
|
from cloudbridge.cloud.base.resources import BaseKeyPair
|
|
|
@@ -36,11 +33,8 @@ from cloudbridge.cloud.base.resources import BaseSnapshot
|
|
|
from cloudbridge.cloud.base.resources import BaseSubnet
|
|
|
from cloudbridge.cloud.base.resources import BaseVMFirewall
|
|
|
from cloudbridge.cloud.base.resources import BaseVMFirewallRule
|
|
|
-from cloudbridge.cloud.base.resources import BaseVMFirewallRuleContainer
|
|
|
from cloudbridge.cloud.base.resources import BaseVMType
|
|
|
from cloudbridge.cloud.base.resources import BaseVolume
|
|
|
-from cloudbridge.cloud.base.resources import ClientPagedResultList
|
|
|
-from cloudbridge.cloud.base.resources import ServerPagedResultList
|
|
|
from cloudbridge.cloud.interfaces.resources import GatewayState
|
|
|
from cloudbridge.cloud.interfaces.resources import InstanceState
|
|
|
from cloudbridge.cloud.interfaces.resources import MachineImageState
|
|
|
@@ -50,9 +44,15 @@ from cloudbridge.cloud.interfaces.resources import SnapshotState
|
|
|
from cloudbridge.cloud.interfaces.resources import SubnetState
|
|
|
from cloudbridge.cloud.interfaces.resources import TrafficDirection
|
|
|
from cloudbridge.cloud.interfaces.resources import VolumeState
|
|
|
-from cloudbridge.cloud.providers.gce import helpers
|
|
|
+
|
|
|
+from . import helpers
|
|
|
+from .subservices import GCEFloatingIPSubService
|
|
|
+from .subservices import GCEGatewaySubService
|
|
|
+from .subservices import GCEVMFirewallRuleSubService
|
|
|
+from .subservices import GCSBucketObjectSubService
|
|
|
|
|
|
# Older versions of Python do not have a built-in set data-structure.
|
|
|
+
|
|
|
try:
|
|
|
set
|
|
|
except NameError:
|
|
|
@@ -454,7 +454,7 @@ class GCEVMFirewall(BaseVMFirewall):
|
|
|
.get_or_create_default())
|
|
|
else:
|
|
|
self._network = network
|
|
|
- self._rule_container = GCEVMFirewallRuleContainer(self)
|
|
|
+ self._rule_container = GCEVMFirewallRuleSubService(self)
|
|
|
|
|
|
@property
|
|
|
def id(self):
|
|
|
@@ -537,67 +537,6 @@ class GCEVMFirewall(BaseVMFirewall):
|
|
|
return self._delegate
|
|
|
|
|
|
|
|
|
-class GCEVMFirewallRuleContainer(BaseVMFirewallRuleContainer):
|
|
|
-
|
|
|
- def __init__(self, firewall):
|
|
|
- super(GCEVMFirewallRuleContainer, self).__init__(
|
|
|
- firewall.delegate.provider, firewall)
|
|
|
- self._dummy_rule = None
|
|
|
-
|
|
|
- def list(self, limit=None, marker=None):
|
|
|
- rules = []
|
|
|
- for firewall in self.firewall.delegate.iter_firewalls(
|
|
|
- self.firewall.name, self.firewall.network.name):
|
|
|
- rule = GCEVMFirewallRule(self.firewall, firewall['id'])
|
|
|
- if rule.is_dummy_rule():
|
|
|
- self._dummy_rule = rule
|
|
|
- else:
|
|
|
- rules.append(rule)
|
|
|
- return ClientPagedResultList(self._provider, rules,
|
|
|
- limit=limit, marker=marker)
|
|
|
-
|
|
|
- @property
|
|
|
- def dummy_rule(self):
|
|
|
- if not self._dummy_rule:
|
|
|
- self.list()
|
|
|
- return self._dummy_rule
|
|
|
-
|
|
|
- @staticmethod
|
|
|
- def to_port_range(from_port, to_port):
|
|
|
- if from_port is not None and to_port is not None:
|
|
|
- return '%d-%d' % (from_port, to_port)
|
|
|
- elif from_port is not None:
|
|
|
- return from_port
|
|
|
- else:
|
|
|
- return to_port
|
|
|
-
|
|
|
- def create_with_priority(self, direction, protocol, priority,
|
|
|
- from_port=None, to_port=None, cidr=None,
|
|
|
- src_dest_fw=None):
|
|
|
- port = GCEVMFirewallRuleContainer.to_port_range(from_port, to_port)
|
|
|
- src_dest_tag = None
|
|
|
- src_dest_fw_id = None
|
|
|
- if src_dest_fw:
|
|
|
- src_dest_tag = src_dest_fw.name
|
|
|
- src_dest_fw_id = src_dest_fw.id
|
|
|
- if not self.firewall.delegate.add_firewall(
|
|
|
- self.firewall.name, direction, protocol, priority, port, cidr,
|
|
|
- src_dest_tag, self.firewall.description,
|
|
|
- self.firewall.network.name):
|
|
|
- return None
|
|
|
- rules = self.find(direction=direction, protocol=protocol,
|
|
|
- from_port=from_port, to_port=to_port, cidr=cidr,
|
|
|
- src_dest_fw_id=src_dest_fw_id)
|
|
|
- if len(rules) < 1:
|
|
|
- return None
|
|
|
- return rules[0]
|
|
|
-
|
|
|
- def create(self, direction, protocol, from_port=None, to_port=None,
|
|
|
- cidr=None, src_dest_fw=None):
|
|
|
- return self.create_with_priority(direction, protocol, 1000, from_port,
|
|
|
- to_port, cidr, src_dest_fw)
|
|
|
-
|
|
|
-
|
|
|
class GCEVMFirewallRule(BaseVMFirewallRule):
|
|
|
|
|
|
def __init__(self, parent_fw, rule):
|
|
|
@@ -1323,7 +1262,7 @@ class GCENetwork(BaseNetwork):
|
|
|
def __init__(self, provider, network):
|
|
|
super(GCENetwork, self).__init__(provider)
|
|
|
self._network = network
|
|
|
- self._gateway_container = GCEGatewayContainer(provider, self)
|
|
|
+ self._gateway_container = GCEGatewaySubService(provider, self)
|
|
|
|
|
|
@property
|
|
|
def resource_url(self):
|
|
|
@@ -1394,49 +1333,6 @@ class GCENetwork(BaseNetwork):
|
|
|
return self._gateway_container
|
|
|
|
|
|
|
|
|
-class GCEFloatingIPContainer(BaseFloatingIPContainer):
|
|
|
-
|
|
|
- def __init__(self, provider, gateway):
|
|
|
- super(GCEFloatingIPContainer, self).__init__(provider, gateway)
|
|
|
-
|
|
|
- def get(self, floating_ip_id):
|
|
|
- fip = self._provider.get_resource('addresses', floating_ip_id)
|
|
|
- return (GCEFloatingIP(self._provider, self.gateway, fip)
|
|
|
- if fip else None)
|
|
|
-
|
|
|
- def list(self, limit=None, marker=None):
|
|
|
- max_result = limit if limit is not None and limit < 500 else 500
|
|
|
- response = (self._provider
|
|
|
- .gce_compute
|
|
|
- .addresses()
|
|
|
- .list(project=self._provider.project_name,
|
|
|
- region=self._provider.region_name,
|
|
|
- maxResults=max_result,
|
|
|
- pageToken=marker)
|
|
|
- .execute())
|
|
|
- ips = [GCEFloatingIP(self._provider, self.gateway, ip)
|
|
|
- for ip in response.get('items', [])]
|
|
|
- if len(ips) > max_result:
|
|
|
- cb.log.warning('Expected at most %d results; got %d',
|
|
|
- max_result, len(ips))
|
|
|
- return ServerPagedResultList('nextPageToken' in response,
|
|
|
- response.get('nextPageToken'),
|
|
|
- False, data=ips)
|
|
|
-
|
|
|
- def create(self):
|
|
|
- region_name = self._provider.region_name
|
|
|
- ip_name = 'ip-{0}'.format(uuid.uuid4())
|
|
|
- response = (self._provider
|
|
|
- .gce_compute
|
|
|
- .addresses()
|
|
|
- .insert(project=self._provider.project_name,
|
|
|
- region=region_name,
|
|
|
- body={'name': ip_name})
|
|
|
- .execute())
|
|
|
- self._provider.wait_for_operation(response, region=region_name)
|
|
|
- return self.get(ip_name)
|
|
|
-
|
|
|
-
|
|
|
class GCEFloatingIP(BaseFloatingIP):
|
|
|
_DEAD_INSTANCE = 'dead instance'
|
|
|
|
|
|
@@ -1611,36 +1507,12 @@ class GCERouter(BaseRouter):
|
|
|
pass
|
|
|
|
|
|
|
|
|
-class GCEGatewayContainer(BaseGatewayContainer):
|
|
|
- _DEFAULT_GATEWAY_NAME = 'default-internet-gateway'
|
|
|
- _GATEWAY_URL_PREFIX = 'global/gateways/'
|
|
|
-
|
|
|
- def __init__(self, provider, network):
|
|
|
- super(GCEGatewayContainer, self).__init__(provider, network)
|
|
|
- self._default_internet_gateway = GCEInternetGateway(
|
|
|
- provider,
|
|
|
- {'id': (GCEGatewayContainer._GATEWAY_URL_PREFIX +
|
|
|
- GCEGatewayContainer._DEFAULT_GATEWAY_NAME),
|
|
|
- 'name': GCEGatewayContainer._DEFAULT_GATEWAY_NAME})
|
|
|
-
|
|
|
- def get_or_create_inet_gateway(self, name=None):
|
|
|
- return self._default_internet_gateway
|
|
|
-
|
|
|
- def delete(self, gateway):
|
|
|
- pass
|
|
|
-
|
|
|
- def list(self, limit=None, marker=None):
|
|
|
- return ClientPagedResultList(self._provider,
|
|
|
- [self._default_internet_gateway],
|
|
|
- limit=limit, marker=marker)
|
|
|
-
|
|
|
-
|
|
|
class GCEInternetGateway(BaseInternetGateway):
|
|
|
|
|
|
def __init__(self, provider, gateway):
|
|
|
super(GCEInternetGateway, self).__init__(provider)
|
|
|
self._gateway = gateway
|
|
|
- self._fip_container = GCEFloatingIPContainer(provider, self)
|
|
|
+ self._fip_container = GCEFloatingIPSubService(provider, self)
|
|
|
|
|
|
@property
|
|
|
def id(self):
|
|
|
@@ -2088,7 +1960,7 @@ class GCSObject(BaseBucketObject):
|
|
|
media_body = googleapiclient.http.MediaIoBaseUpload(
|
|
|
io.BytesIO(data), mimetype='plain/text')
|
|
|
response = (self._provider
|
|
|
- .storage.bucket_objects
|
|
|
+ .storage._bucket_objects
|
|
|
._create_object_with_media_body(self._bucket,
|
|
|
self.name,
|
|
|
media_body))
|
|
|
@@ -2103,7 +1975,7 @@ class GCSObject(BaseBucketObject):
|
|
|
media_body = googleapiclient.http.MediaIoBaseUpload(
|
|
|
f, 'application/octet-stream')
|
|
|
response = (self._provider
|
|
|
- .storage.bucket_objects
|
|
|
+ .storage._bucket_objects
|
|
|
._create_object_with_media_body(self._bucket,
|
|
|
self.name,
|
|
|
media_body))
|
|
|
@@ -2139,18 +2011,12 @@ class GCSObject(BaseBucketObject):
|
|
|
self._obj = self.bucket.objects.get(self.id)._obj
|
|
|
|
|
|
|
|
|
-class GCSBucketContainer(BaseBucketContainer):
|
|
|
-
|
|
|
- def __init__(self, provider, bucket):
|
|
|
- super(GCSBucketContainer, self).__init__(provider, bucket)
|
|
|
-
|
|
|
-
|
|
|
class GCSBucket(BaseBucket):
|
|
|
|
|
|
def __init__(self, provider, bucket):
|
|
|
super(GCSBucket, self).__init__(provider)
|
|
|
self._bucket = bucket
|
|
|
- self._object_container = GCSBucketContainer(provider, self)
|
|
|
+ self._object_container = GCSBucketObjectSubService(provider, self)
|
|
|
|
|
|
@property
|
|
|
def id(self):
|