Merge "Azure: don't require full subnet id"

This commit is contained in:
Zuul 2021-06-18 21:47:20 +00:00 committed by Gerrit Code Review
commit 8d2e723605
3 changed files with 62 additions and 12 deletions

View File

@ -243,6 +243,18 @@ class AzureAdapter(statemachine.Adapter):
self.provider.rate_limit)
with open(self.provider.auth_path) as f:
self.azul = azul.AzureCloud(json.load(f))
if provider_config.subnet_id:
self.subnet_id = provider_config.subnet_id
else:
if isinstance(provider_config.network, str):
net_info = {'network': provider_config.network}
else:
net_info = provider_config.network
subnet = self.azul.subnets.get(
net_info.get('resource-group', self.provider.resource_group),
net_info['network'],
net_info.get('subnet', 'default'))
self.subnet_id = subnet['id']
def getCreateStateMachine(self, hostname, label, metadata, retries):
return AzureCreateStateMachine(
@ -390,11 +402,11 @@ class AzureAdapter(statemachine.Adapter):
if ipv4:
ip_configs.append(make_ip_config('nodepool-v4-ip-config',
'IPv4', self.provider.subnet_id,
'IPv4', self.subnet_id,
pip4))
if ipv6:
ip_configs.append(make_ip_config('nodepool-v6-ip-config',
'IPv6', self.provider.subnet_id,
'IPv6', self.subnet_id,
pip6))
nic_data = {

View File

@ -126,32 +126,60 @@ class AzureCRUD:
def get(self, resource_group_name, name):
url = self.url(
'{_resource}/{_resourceName}',
_resource=self.resource,
_resourceName=name,
'{}/{}'.format(self.resource, name),
resourceGroupName=resource_group_name,
)
return self.cloud.get(url)
def create(self, resource_group_name, name, params):
url = self.url(
'{_resource}/{_resourceName}',
_resource=self.resource,
_resourceName=name,
'{}/{}'.format(self.resource, name),
resourceGroupName=resource_group_name,
)
return self.cloud.put(url, params)
def delete(self, resource_group_name, name):
url = self.url(
'{_resource}/{_resourceName}',
_resource=self.resource,
_resourceName=name,
'{}/{}'.format(self.resource, name),
resourceGroupName=resource_group_name,
)
return self.cloud.delete(url)
class AzureSubnetCRUD(AzureCRUD):
def list(self, resource_group_name, virtual_network_name):
url = self.url(
self.resource,
resourceGroupName=resource_group_name,
virtualNetworkName=virtual_network_name,
)
return self.cloud.paginate(self.cloud.get(url))
def get(self, resource_group_name, virtual_network_name, name):
url = self.url(
'{}/{}'.format(self.resource, name),
resourceGroupName=resource_group_name,
virtualNetworkName=virtual_network_name,
)
return self.cloud.get(url)
def create(self, resource_group_name, virtual_network_name, name, params):
url = self.url(
'{}/{}'.format(self.resource, name),
resourceGroupName=resource_group_name,
virtualNetworkName=virtual_network_name,
)
return self.cloud.put(url, params)
def delete(self, resource_group_name, virtual_network_name, name):
url = self.url(
'{}/{}'.format(self.resource, name),
resourceGroupName=resource_group_name,
virtualNetworkName=virtual_network_name,
)
return self.cloud.delete(url)
class AzureDictResponse(dict):
def __init__(self, response, *args):
super().__init__(*args)
@ -193,6 +221,10 @@ class AzureCloud:
self.resource_groups = AzureResourceGroupsCRUD(
self,
'2020-06-01')
self.subnets = AzureSubnetCRUD(
self,
'Microsoft.Network/virtualNetworks/{virtualNetworkName}/subnets',
'2020-07-01')
def get(self, url, codes=[200]):
return self.request('GET', url, None, codes)

View File

@ -175,6 +175,7 @@ class AzureProviderConfig(ProviderConfig):
self.zuul_public_key = self.provider['zuul-public-key']
self.location = self.provider['location']
self.subnet_id = self.provider.get('subnet-id')
self.network = self.provider.get('network')
# Don't use these directly; these are default values for
# labels.
self.public_ipv4 = self.provider.get('public-ipv4', False)
@ -213,7 +214,12 @@ class AzureProviderConfig(ProviderConfig):
v.Required('location'): str,
v.Required('resource-group'): str,
v.Required('resource-group-location'): str,
v.Required('subnet-id'): str,
'subnet-id': str,
'network': v.Any(str, {
'resource-group': str,
'network': str,
'subnet': str,
}),
v.Required('cloud-images'): [provider_cloud_images],
v.Required('auth-path'): str,
'ipv4': bool,