|
@@ -626,28 +626,27 @@ class GCENetworkService(BaseNetworkService):
|
|
|
except:
|
|
except:
|
|
|
return []
|
|
return []
|
|
|
|
|
|
|
|
- def create(self, name):
|
|
|
|
|
|
|
+ def _create(self, name, autoCreateSubnetworks):
|
|
|
"""
|
|
"""
|
|
|
- Creates a custom mode VPC network.
|
|
|
|
|
|
|
+ Possible values for 'autoCreateSubnetworks' are:
|
|
|
|
|
+
|
|
|
|
|
+ None: For creating a legacy (non-subnetted) network.
|
|
|
|
|
+ True: For creating an auto mode VPC network. This also creates a
|
|
|
|
|
+ subnetwork in every region.
|
|
|
|
|
+ False: For creating a custom mode VPC network. Subnetworks should be
|
|
|
|
|
+ created manually.
|
|
|
"""
|
|
"""
|
|
|
|
|
+ networks = self.list(filter='name eq %s' % name)
|
|
|
|
|
+ if len(networks) > 0:
|
|
|
|
|
+ return networks[0]
|
|
|
|
|
+ body = {'name': name,
|
|
|
|
|
+ 'autoCreateSubnetworks': autoCreateSubnetworks}
|
|
|
try:
|
|
try:
|
|
|
- networks = self.list(filter='name eq %s' % name)
|
|
|
|
|
- if len(networks) > 0:
|
|
|
|
|
- return networks[0]
|
|
|
|
|
-
|
|
|
|
|
- # Possible values for 'autoCreateSubnetworks' are:
|
|
|
|
|
- #
|
|
|
|
|
- # None: For creating a legacy (non-subnetted) network.
|
|
|
|
|
- # True: For creating an auto mode VPC network. This also creates a
|
|
|
|
|
- # subnetwork in every region.
|
|
|
|
|
- # False: For creating a custom mode VPC network. Subnetworks should
|
|
|
|
|
- # be created manually.
|
|
|
|
|
response = (self.provider
|
|
response = (self.provider
|
|
|
.gce_compute
|
|
.gce_compute
|
|
|
.networks()
|
|
.networks()
|
|
|
.insert(project=self.provider.project_name,
|
|
.insert(project=self.provider.project_name,
|
|
|
- body={'name': name,
|
|
|
|
|
- 'autoCreateSubnetworks': False})
|
|
|
|
|
|
|
+ body=body)
|
|
|
.execute())
|
|
.execute())
|
|
|
if 'error' in response:
|
|
if 'error' in response:
|
|
|
return None
|
|
return None
|
|
@@ -657,6 +656,15 @@ class GCENetworkService(BaseNetworkService):
|
|
|
except:
|
|
except:
|
|
|
return None
|
|
return None
|
|
|
|
|
|
|
|
|
|
+ def create(self, name):
|
|
|
|
|
+ """
|
|
|
|
|
+ Creates a custom mode VPC network.
|
|
|
|
|
+ """
|
|
|
|
|
+ return self._create(name, False)
|
|
|
|
|
+
|
|
|
|
|
+ def get_or_create_default(self):
|
|
|
|
|
+ return self._create(GCEFirewallsDelegate.DEFAULT_NETWORK, True)
|
|
|
|
|
+
|
|
|
@property
|
|
@property
|
|
|
def subnets(self):
|
|
def subnets(self):
|
|
|
return self._subnet_svc
|
|
return self._subnet_svc
|
|
@@ -748,9 +756,8 @@ class GCESubnetService(BaseSubnetService):
|
|
|
return subnet
|
|
return subnet
|
|
|
return None
|
|
return None
|
|
|
|
|
|
|
|
- def list(self, network=None, region=None, limit=None, marker=None):
|
|
|
|
|
- if not region:
|
|
|
|
|
- region = self.provider.region_name
|
|
|
|
|
|
|
+ def list(self, network=None, zone=None, limit=None, marker=None):
|
|
|
|
|
+ region = zone.region_name if zone else self.provider.region_name
|
|
|
filter = None
|
|
filter = None
|
|
|
if network is not None:
|
|
if network is not None:
|
|
|
filter = 'network eq %s' % network.resource_url
|
|
filter = 'network eq %s' % network.resource_url
|
|
@@ -775,6 +782,11 @@ class GCESubnetService(BaseSubnetService):
|
|
|
False, data=subnets)
|
|
False, data=subnets)
|
|
|
|
|
|
|
|
def create(self, network, cidr_block, name=None, zone=None):
|
|
def create(self, network, cidr_block, name=None, zone=None):
|
|
|
|
|
+ """
|
|
|
|
|
+ GCE subnets are regional. The region is inferred from the zone if a
|
|
|
|
|
+ zone is provided; otherwise, the default region, as set in the
|
|
|
|
|
+ provider, is used.
|
|
|
|
|
+ """
|
|
|
if not name:
|
|
if not name:
|
|
|
name = 'subnet-{0}'.format(uuid.uuid4())
|
|
name = 'subnet-{0}'.format(uuid.uuid4())
|
|
|
region = self.provider.region_name
|
|
region = self.provider.region_name
|
|
@@ -797,14 +809,27 @@ class GCESubnetService(BaseSubnetService):
|
|
|
return None
|
|
return None
|
|
|
subnets = self.list(network, region)
|
|
subnets = self.list(network, region)
|
|
|
for subnet in subnets:
|
|
for subnet in subnets:
|
|
|
- cb.log.warning('subnet ID: %s', subnet.id)
|
|
|
|
|
if subnet.id == response['targetId']:
|
|
if subnet.id == response['targetId']:
|
|
|
return subnet
|
|
return subnet
|
|
|
except:
|
|
except:
|
|
|
return None
|
|
return None
|
|
|
|
|
|
|
|
def get_or_create_default(self, zone=None):
|
|
def get_or_create_default(self, zone=None):
|
|
|
- raise NotImplementedError('To be implemented')
|
|
|
|
|
|
|
+ """
|
|
|
|
|
+ Every GCP project comes with a default auto mode VPC network. An auto
|
|
|
|
|
+ mode VPC network has exactly one subnetwork per region. This method
|
|
|
|
|
+ returns the subnetwork of the default network that spans the given
|
|
|
|
|
+ zone.
|
|
|
|
|
+ """
|
|
|
|
|
+ network = self.provider.network.get_or_create_default()
|
|
|
|
|
+ subnets = self.list(network, zone)
|
|
|
|
|
+ if len(subnets) > 1:
|
|
|
|
|
+ cb.log.warning('The default network has more than one subnetwork '
|
|
|
|
|
+ 'in a region')
|
|
|
|
|
+ if len(subnets) > 0:
|
|
|
|
|
+ return subnets[0]
|
|
|
|
|
+ cb.log.warning('The default network has no subnetwork in a region')
|
|
|
|
|
+ return None
|
|
|
|
|
|
|
|
def delete(self, subnet):
|
|
def delete(self, subnet):
|
|
|
response = (self.provider
|
|
response = (self.provider
|