|
@@ -6,22 +6,20 @@ import json
|
|
|
import logging
|
|
import logging
|
|
|
import time
|
|
import time
|
|
|
|
|
|
|
|
-
|
|
|
|
|
from azure.common import AzureException
|
|
from azure.common import AzureException
|
|
|
|
|
|
|
|
from azure.mgmt.network.models import NetworkSecurityGroup
|
|
from azure.mgmt.network.models import NetworkSecurityGroup
|
|
|
|
|
|
|
|
from cloudbridge.cloud.base.resources import BaseAttachmentInfo, \
|
|
from cloudbridge.cloud.base.resources import BaseAttachmentInfo, \
|
|
|
BaseBucket, BaseBucketObject, BaseFloatingIP, \
|
|
BaseBucket, BaseBucketObject, BaseFloatingIP, \
|
|
|
- BaseInstance, BaseInstanceType, BaseInternetGateway, \
|
|
|
|
|
- BaseKeyPair, BaseLaunchConfig, BaseMachineImage, BaseNetwork, \
|
|
|
|
|
|
|
+ BaseInstance, BaseInstanceType, BaseKeyPair, \
|
|
|
|
|
+ BaseLaunchConfig, BaseMachineImage, BaseNetwork, \
|
|
|
BasePlacementZone, BaseRegion, BaseRouter, BaseSecurityGroup, \
|
|
BasePlacementZone, BaseRegion, BaseRouter, BaseSecurityGroup, \
|
|
|
BaseSecurityGroupRule, BaseSnapshot, BaseSubnet, \
|
|
BaseSecurityGroupRule, BaseSnapshot, BaseSubnet, \
|
|
|
BaseVolume, ClientPagedResultList
|
|
BaseVolume, ClientPagedResultList
|
|
|
from cloudbridge.cloud.interfaces import InstanceState, VolumeState
|
|
from cloudbridge.cloud.interfaces import InstanceState, VolumeState
|
|
|
from cloudbridge.cloud.interfaces.resources import Instance, \
|
|
from cloudbridge.cloud.interfaces.resources import Instance, \
|
|
|
- MachineImageState, NetworkState, RouterState, \
|
|
|
|
|
- SnapshotState, SubnetState
|
|
|
|
|
|
|
+ MachineImageState, NetworkState, RouterState, SnapshotState
|
|
|
from cloudbridge.cloud.providers.azure import helpers as azure_helpers
|
|
from cloudbridge.cloud.providers.azure import helpers as azure_helpers
|
|
|
|
|
|
|
|
from msrestazure.azure_exceptions import CloudError
|
|
from msrestazure.azure_exceptions import CloudError
|
|
@@ -94,7 +92,6 @@ class AzureSecurityGroup(BaseSecurityGroup):
|
|
|
|
|
|
|
|
@name.setter
|
|
@name.setter
|
|
|
def name(self, value):
|
|
def name(self, value):
|
|
|
- self.assert_valid_resource_name(value)
|
|
|
|
|
self._security_group.tags.update(Name=value)
|
|
self._security_group.tags.update(Name=value)
|
|
|
self._provider.azure_client. \
|
|
self._provider.azure_client. \
|
|
|
update_security_group_tags(self.id,
|
|
update_security_group_tags(self.id,
|
|
@@ -107,7 +104,7 @@ class AzureSecurityGroup(BaseSecurityGroup):
|
|
|
@description.setter
|
|
@description.setter
|
|
|
def description(self, value):
|
|
def description(self, value):
|
|
|
self._security_group.tags.update(Description=value)
|
|
self._security_group.tags.update(Description=value)
|
|
|
- self._provider.azure_client.\
|
|
|
|
|
|
|
+ self._provider.azure_client. \
|
|
|
update_security_group_tags(self.id,
|
|
update_security_group_tags(self.id,
|
|
|
self._security_group.tags)
|
|
self._security_group.tags)
|
|
|
|
|
|
|
@@ -125,26 +122,13 @@ class AzureSecurityGroup(BaseSecurityGroup):
|
|
|
|
|
|
|
|
def delete(self):
|
|
def delete(self):
|
|
|
try:
|
|
try:
|
|
|
- self._provider.azure_client.\
|
|
|
|
|
|
|
+ self._provider.azure_client. \
|
|
|
delete_security_group(self.id)
|
|
delete_security_group(self.id)
|
|
|
return True
|
|
return True
|
|
|
except CloudError as cloudError:
|
|
except CloudError as cloudError:
|
|
|
log.exception(cloudError.message)
|
|
log.exception(cloudError.message)
|
|
|
return False
|
|
return False
|
|
|
|
|
|
|
|
- def refresh(self):
|
|
|
|
|
- """
|
|
|
|
|
- Refreshes the security group with tags if required.
|
|
|
|
|
- """
|
|
|
|
|
- try:
|
|
|
|
|
- self._security_group = self._provider.azure_client. \
|
|
|
|
|
- get_security_group(self.id)
|
|
|
|
|
- if not self._security_group.tags:
|
|
|
|
|
- self._security_group.tags = {}
|
|
|
|
|
- except (CloudError, ValueError) as cloudError:
|
|
|
|
|
- log.exception(cloudError.message)
|
|
|
|
|
- # The security group no longer exists and cannot be refreshed.
|
|
|
|
|
-
|
|
|
|
|
def add_rule(self, ip_protocol=None, from_port=None, to_port=None,
|
|
def add_rule(self, ip_protocol=None, from_port=None, to_port=None,
|
|
|
cidr_ip=None, src_group=None):
|
|
cidr_ip=None, src_group=None):
|
|
|
"""
|
|
"""
|
|
@@ -177,7 +161,7 @@ class AzureSecurityGroup(BaseSecurityGroup):
|
|
|
return self._create_rule(ip_protocol, from_port, to_port, cidr_ip)
|
|
return self._create_rule(ip_protocol, from_port, to_port, cidr_ip)
|
|
|
elif src_group:
|
|
elif src_group:
|
|
|
result = None
|
|
result = None
|
|
|
- sg = (self._provider.security.security_groups.get(src_group)
|
|
|
|
|
|
|
+ sg = (self._provicer.security.security_groups.get(src_group)
|
|
|
if isinstance(src_group, str) else src_group)
|
|
if isinstance(src_group, str) else src_group)
|
|
|
for rule in sg.rules:
|
|
for rule in sg.rules:
|
|
|
result = self._create_rule(rule.ip_protocol, rule.from_port,
|
|
result = self._create_rule(rule.ip_protocol, rule.from_port,
|
|
@@ -225,9 +209,9 @@ class AzureSecurityGroup(BaseSecurityGroup):
|
|
|
cidr_ip=None, src_group=None):
|
|
cidr_ip=None, src_group=None):
|
|
|
for rule in self.rules:
|
|
for rule in self.rules:
|
|
|
if (rule.ip_protocol == ip_protocol and
|
|
if (rule.ip_protocol == ip_protocol and
|
|
|
- rule.from_port == str(from_port) and
|
|
|
|
|
- rule.to_port == str(to_port) and
|
|
|
|
|
- rule.cidr_ip == cidr_ip):
|
|
|
|
|
|
|
+ rule.from_port == str(from_port) and
|
|
|
|
|
+ rule.to_port == str(to_port) and
|
|
|
|
|
+ rule.cidr_ip == cidr_ip):
|
|
|
return rule
|
|
return rule
|
|
|
return None
|
|
return None
|
|
|
|
|
|
|
@@ -238,7 +222,7 @@ class AzureSecurityGroup(BaseSecurityGroup):
|
|
|
js['rules'] = [json.loads(r) for r in json_rules]
|
|
js['rules'] = [json.loads(r) for r in json_rules]
|
|
|
if js.get('network_id'):
|
|
if js.get('network_id'):
|
|
|
js.pop('network_id') # Omit for consistency across cloud providers
|
|
js.pop('network_id') # Omit for consistency across cloud providers
|
|
|
- return js
|
|
|
|
|
|
|
+ return json.dumps(js, sort_keys=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
class AzureSecurityGroupRule(BaseSecurityGroupRule):
|
|
class AzureSecurityGroupRule(BaseSecurityGroupRule):
|
|
@@ -387,7 +371,7 @@ class AzureBucketObject(BaseBucketObject):
|
|
|
Generate a URL to this object.
|
|
Generate a URL to this object.
|
|
|
"""
|
|
"""
|
|
|
return self._provider.azure_client.get_blob_url(
|
|
return self._provider.azure_client.get_blob_url(
|
|
|
- self._container.name, self.name, expires_in)
|
|
|
|
|
|
|
+ self._container.name, self.name)
|
|
|
|
|
|
|
|
|
|
|
|
|
class AzureBucket(BaseBucket):
|
|
class AzureBucket(BaseBucket):
|
|
@@ -431,11 +415,6 @@ class AzureBucket(BaseBucket):
|
|
|
return ClientPagedResultList(self._provider, objects,
|
|
return ClientPagedResultList(self._provider, objects,
|
|
|
limit=limit, marker=marker)
|
|
limit=limit, marker=marker)
|
|
|
|
|
|
|
|
- def find(self, name, limit=None, marker=None):
|
|
|
|
|
- objects = [obj for obj in self if obj.name == name]
|
|
|
|
|
- return ClientPagedResultList(self._provider, objects,
|
|
|
|
|
- limit=limit, marker=marker)
|
|
|
|
|
-
|
|
|
|
|
def delete(self, delete_contents=True):
|
|
def delete(self, delete_contents=True):
|
|
|
"""
|
|
"""
|
|
|
Delete this bucket.
|
|
Delete this bucket.
|
|
@@ -517,7 +496,6 @@ class AzureVolume(BaseVolume):
|
|
|
Set the volume name.
|
|
Set the volume name.
|
|
|
"""
|
|
"""
|
|
|
# self._volume.name = value
|
|
# self._volume.name = value
|
|
|
- self.assert_valid_resource_name(value)
|
|
|
|
|
self._volume.tags.update(Name=value)
|
|
self._volume.tags.update(Name=value)
|
|
|
self._provider.azure_client. \
|
|
self._provider.azure_client. \
|
|
|
update_disk_tags(self.id,
|
|
update_disk_tags(self.id,
|
|
@@ -549,7 +527,7 @@ class AzureVolume(BaseVolume):
|
|
|
@property
|
|
@property
|
|
|
def source(self):
|
|
def source(self):
|
|
|
if self._volume.creation_data.source_uri:
|
|
if self._volume.creation_data.source_uri:
|
|
|
- url_params = azure_helpers.\
|
|
|
|
|
|
|
+ url_params = azure_helpers. \
|
|
|
parse_url(SNAPSHOT_RESOURCE_ID,
|
|
parse_url(SNAPSHOT_RESOURCE_ID,
|
|
|
self._volume.creation_data.source_uri)
|
|
self._volume.creation_data.source_uri)
|
|
|
return self._provider.block_store.snapshots. \
|
|
return self._provider.block_store.snapshots. \
|
|
@@ -705,7 +683,7 @@ class AzureSnapshot(BaseSnapshot):
|
|
|
"""
|
|
"""
|
|
|
Set the snapshot name.
|
|
Set the snapshot name.
|
|
|
"""
|
|
"""
|
|
|
- self.assert_valid_resource_name(value)
|
|
|
|
|
|
|
+ # self._snapshot.name = value
|
|
|
self._snapshot.tags.update(Name=value)
|
|
self._snapshot.tags.update(Name=value)
|
|
|
self._provider.azure_client. \
|
|
self._provider.azure_client. \
|
|
|
update_snapshot_tags(self.id,
|
|
update_snapshot_tags(self.id,
|
|
@@ -728,7 +706,7 @@ class AzureSnapshot(BaseSnapshot):
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def volume_id(self):
|
|
def volume_id(self):
|
|
|
- url_params = azure_helpers.\
|
|
|
|
|
|
|
+ url_params = azure_helpers. \
|
|
|
parse_url(VOLUME_RESOURCE_ID,
|
|
parse_url(VOLUME_RESOURCE_ID,
|
|
|
self._snapshot.creation_data.source_uri)
|
|
self._snapshot.creation_data.source_uri)
|
|
|
return url_params.get(VOLUME_NAME)
|
|
return url_params.get(VOLUME_NAME)
|
|
@@ -822,7 +800,6 @@ class AzureMachineImage(BaseMachineImage):
|
|
|
"""
|
|
"""
|
|
|
Set the image name.
|
|
Set the image name.
|
|
|
"""
|
|
"""
|
|
|
- self.assert_valid_resource_name(value)
|
|
|
|
|
self._image.tags.update(Name=value)
|
|
self._image.tags.update(Name=value)
|
|
|
self._provider.azure_client. \
|
|
self._provider.azure_client. \
|
|
|
update_image_tags(self.id, self._image.tags)
|
|
update_image_tags(self.id, self._image.tags)
|
|
@@ -876,7 +853,7 @@ class AzureMachineImage(BaseMachineImage):
|
|
|
for its latest state.
|
|
for its latest state.
|
|
|
"""
|
|
"""
|
|
|
try:
|
|
try:
|
|
|
- self._image = self._provider.azure_client\
|
|
|
|
|
|
|
+ self._image = self._provider.azure_client \
|
|
|
.get_image(self.id)
|
|
.get_image(self.id)
|
|
|
self._state = self._image.provisioning_state
|
|
self._state = self._image.provisioning_state
|
|
|
except CloudError as cloudError:
|
|
except CloudError as cloudError:
|
|
@@ -921,10 +898,9 @@ class AzureNetwork(BaseNetwork):
|
|
|
"""
|
|
"""
|
|
|
Set the network name.
|
|
Set the network name.
|
|
|
"""
|
|
"""
|
|
|
- self.assert_valid_resource_name(value)
|
|
|
|
|
self._network.tags.update(Name=value)
|
|
self._network.tags.update(Name=value)
|
|
|
self._provider.azure_client. \
|
|
self._provider.azure_client. \
|
|
|
- update_network_tags(self.id, self._network)
|
|
|
|
|
|
|
+ update_network_tags(self.id, self._network.tags)
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def external(self):
|
|
def external(self):
|
|
@@ -945,7 +921,7 @@ class AzureNetwork(BaseNetwork):
|
|
|
for its latest state.
|
|
for its latest state.
|
|
|
"""
|
|
"""
|
|
|
try:
|
|
try:
|
|
|
- self._network = self._provider.azure_client.\
|
|
|
|
|
|
|
+ self._network = self._provider.azure_client. \
|
|
|
get_network(self.id)
|
|
get_network(self.id)
|
|
|
self._state = self._network.provisioning_state
|
|
self._state = self._network.provisioning_state
|
|
|
except (CloudError, ValueError) as cloudError:
|
|
except (CloudError, ValueError) as cloudError:
|
|
@@ -967,20 +943,19 @@ class AzureNetwork(BaseNetwork):
|
|
|
Delete an existing network.
|
|
Delete an existing network.
|
|
|
"""
|
|
"""
|
|
|
try:
|
|
try:
|
|
|
- self._provider.azure_client.\
|
|
|
|
|
|
|
+ self._provider.azure_client. \
|
|
|
delete_network(self.id)
|
|
delete_network(self.id)
|
|
|
return True
|
|
return True
|
|
|
except CloudError as cloudError:
|
|
except CloudError as cloudError:
|
|
|
log.exception(cloudError.message)
|
|
log.exception(cloudError.message)
|
|
|
return False
|
|
return False
|
|
|
|
|
|
|
|
- @property
|
|
|
|
|
def subnets(self):
|
|
def subnets(self):
|
|
|
"""
|
|
"""
|
|
|
List all the subnets in this network
|
|
List all the subnets in this network
|
|
|
:return:
|
|
:return:
|
|
|
"""
|
|
"""
|
|
|
- return self._provider.networking.subnets.list(network=self.id)
|
|
|
|
|
|
|
+ return self._provider.network.subnets.list(network=self.id)
|
|
|
|
|
|
|
|
def create_subnet(self, cidr_block, name=None, zone=None):
|
|
def create_subnet(self, cidr_block, name=None, zone=None):
|
|
|
"""
|
|
"""
|
|
@@ -990,12 +965,11 @@ class AzureNetwork(BaseNetwork):
|
|
|
:param zone:
|
|
:param zone:
|
|
|
:return:
|
|
:return:
|
|
|
"""
|
|
"""
|
|
|
- return self._provider.networking.subnets. \
|
|
|
|
|
|
|
+ return self._provider.network.subnets. \
|
|
|
create(network=self.id, cidr_block=cidr_block, name=name)
|
|
create(network=self.id, cidr_block=cidr_block, name=name)
|
|
|
|
|
|
|
|
|
|
|
|
|
class AzureFloatingIP(BaseFloatingIP):
|
|
class AzureFloatingIP(BaseFloatingIP):
|
|
|
-
|
|
|
|
|
def __init__(self, provider, floating_ip):
|
|
def __init__(self, provider, floating_ip):
|
|
|
super(AzureFloatingIP, self).__init__(provider)
|
|
super(AzureFloatingIP, self).__init__(provider)
|
|
|
self._ip = floating_ip
|
|
self._ip = floating_ip
|
|
@@ -1062,6 +1036,7 @@ class AzurePlacementZone(BasePlacementZone):
|
|
|
As Azure does not provide zones (limited support), we are mapping the
|
|
As Azure does not provide zones (limited support), we are mapping the
|
|
|
region information in the zones.
|
|
region information in the zones.
|
|
|
"""
|
|
"""
|
|
|
|
|
+
|
|
|
def __init__(self, provider, zone, region):
|
|
def __init__(self, provider, zone, region):
|
|
|
super(AzurePlacementZone, self).__init__(provider)
|
|
super(AzurePlacementZone, self).__init__(provider)
|
|
|
self._azure_zone = zone
|
|
self._azure_zone = zone
|
|
@@ -1097,18 +1072,12 @@ class AzurePlacementZone(BasePlacementZone):
|
|
|
|
|
|
|
|
|
|
|
|
|
class AzureSubnet(BaseSubnet):
|
|
class AzureSubnet(BaseSubnet):
|
|
|
- _SUBNET_STATE_MAP = {
|
|
|
|
|
- 'InProgress': SubnetState.PENDING,
|
|
|
|
|
- 'Succeeded': SubnetState.AVAILABLE,
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
def __init__(self, provider, subnet):
|
|
def __init__(self, provider, subnet):
|
|
|
super(AzureSubnet, self).__init__(provider)
|
|
super(AzureSubnet, self).__init__(provider)
|
|
|
self._subnet = subnet
|
|
self._subnet = subnet
|
|
|
- self._state = self._subnet.provisioning_state
|
|
|
|
|
- self._url_params = azure_helpers\
|
|
|
|
|
|
|
+ self._url_params = azure_helpers \
|
|
|
.parse_url(SUBNET_RESOURCE_ID, subnet.id)
|
|
.parse_url(SUBNET_RESOURCE_ID, subnet.id)
|
|
|
- self._network = self._provider.azure_client.\
|
|
|
|
|
|
|
+ self._network = self._provider.azure_client. \
|
|
|
get_network(self._url_params.get(NETWORK_NAME))
|
|
get_network(self._url_params.get(NETWORK_NAME))
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
@@ -1130,7 +1099,7 @@ class AzureSubnet(BaseSubnet):
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def zone(self):
|
|
def zone(self):
|
|
|
- region = self._provider.\
|
|
|
|
|
|
|
+ region = self._provider. \
|
|
|
compute.regions.get(self._network.location)
|
|
compute.regions.get(self._network.location)
|
|
|
return region.zones[0]
|
|
return region.zones[0]
|
|
|
|
|
|
|
@@ -1156,29 +1125,8 @@ class AzureSubnet(BaseSubnet):
|
|
|
log.exception(cloudError.message)
|
|
log.exception(cloudError.message)
|
|
|
return False
|
|
return False
|
|
|
|
|
|
|
|
- @property
|
|
|
|
|
- def state(self):
|
|
|
|
|
- return self._SUBNET_STATE_MAP.get(
|
|
|
|
|
- self._state, NetworkState.UNKNOWN)
|
|
|
|
|
-
|
|
|
|
|
- def refresh(self):
|
|
|
|
|
- """
|
|
|
|
|
- Refreshes the state of this network by re-querying the cloud provider
|
|
|
|
|
- for its latest state.
|
|
|
|
|
- """
|
|
|
|
|
- try:
|
|
|
|
|
- self._network = self._provider.azure_client. \
|
|
|
|
|
- get_network(self.id)
|
|
|
|
|
- self._state = self._network.provisioning_state
|
|
|
|
|
- except (CloudError, ValueError) as cloudError:
|
|
|
|
|
- log.exception(cloudError.message)
|
|
|
|
|
- # The network no longer exists and cannot be refreshed.
|
|
|
|
|
- # set the state to unknown
|
|
|
|
|
- self._state = 'unknown'
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
class AzureInstance(BaseInstance):
|
|
class AzureInstance(BaseInstance):
|
|
|
-
|
|
|
|
|
INSTANCE_STATE_MAP = {
|
|
INSTANCE_STATE_MAP = {
|
|
|
'InProgress': InstanceState.PENDING,
|
|
'InProgress': InstanceState.PENDING,
|
|
|
'Creating': InstanceState.PENDING,
|
|
'Creating': InstanceState.PENDING,
|
|
@@ -1217,7 +1165,7 @@ class AzureInstance(BaseInstance):
|
|
|
self._public_ip_ids = []
|
|
self._public_ip_ids = []
|
|
|
self._nic_ids = []
|
|
self._nic_ids = []
|
|
|
for nic in self._vm.network_profile.network_interfaces:
|
|
for nic in self._vm.network_profile.network_interfaces:
|
|
|
- nic_params = azure_helpers.\
|
|
|
|
|
|
|
+ nic_params = azure_helpers. \
|
|
|
parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic.id)
|
|
parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic.id)
|
|
|
nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
|
|
nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
|
|
|
self._nic_ids.append(nic_name)
|
|
self._nic_ids.append(nic_name)
|
|
@@ -1226,17 +1174,17 @@ class AzureInstance(BaseInstance):
|
|
|
sg_params = azure_helpers. \
|
|
sg_params = azure_helpers. \
|
|
|
parse_url(SECURITY_GROUP_RESOURCE_ID,
|
|
parse_url(SECURITY_GROUP_RESOURCE_ID,
|
|
|
nic.network_security_group.id)
|
|
nic.network_security_group.id)
|
|
|
- self._security_group_ids.\
|
|
|
|
|
|
|
+ self._security_group_ids. \
|
|
|
append(sg_params.get(SECURITY_GROUP_NAME))
|
|
append(sg_params.get(SECURITY_GROUP_NAME))
|
|
|
if nic.ip_configurations:
|
|
if nic.ip_configurations:
|
|
|
for ip_config in nic.ip_configurations:
|
|
for ip_config in nic.ip_configurations:
|
|
|
self._private_ips.append(ip_config.private_ip_address)
|
|
self._private_ips.append(ip_config.private_ip_address)
|
|
|
if ip_config.public_ip_address:
|
|
if ip_config.public_ip_address:
|
|
|
- url_params = azure_helpers.\
|
|
|
|
|
|
|
+ url_params = azure_helpers. \
|
|
|
parse_url(PUBLIC_IP_RESOURCE_ID,
|
|
parse_url(PUBLIC_IP_RESOURCE_ID,
|
|
|
ip_config.public_ip_address.id)
|
|
ip_config.public_ip_address.id)
|
|
|
public_ip_name = url_params.get(PUBLIC_IP_NAME)
|
|
public_ip_name = url_params.get(PUBLIC_IP_NAME)
|
|
|
- public_ip = self._provider.azure_client.\
|
|
|
|
|
|
|
+ public_ip = self._provider.azure_client. \
|
|
|
get_public_ip(public_ip_name)
|
|
get_public_ip(public_ip_name)
|
|
|
self._public_ip_ids.append(public_ip_name)
|
|
self._public_ip_ids.append(public_ip_name)
|
|
|
self._public_ips.append(public_ip.ip_address)
|
|
self._public_ips.append(public_ip.ip_address)
|
|
@@ -1267,10 +1215,9 @@ class AzureInstance(BaseInstance):
|
|
|
"""
|
|
"""
|
|
|
Set the instance name.
|
|
Set the instance name.
|
|
|
"""
|
|
"""
|
|
|
- self.assert_valid_resource_name(value)
|
|
|
|
|
self._vm.tags.update(Name=value)
|
|
self._vm.tags.update(Name=value)
|
|
|
self._provider.azure_client. \
|
|
self._provider.azure_client. \
|
|
|
- update_vm_tags(self.id, self._vm)
|
|
|
|
|
|
|
+ update_vm_tags(self.id, self._vm.tags)
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def public_ips(self):
|
|
def public_ips(self):
|
|
@@ -1323,15 +1270,15 @@ class AzureInstance(BaseInstance):
|
|
|
self._provider.azure_client.delete_public_ip(public_ip_id)
|
|
self._provider.azure_client.delete_public_ip(public_ip_id)
|
|
|
for data_disk in self._vm.storage_profile.data_disks:
|
|
for data_disk in self._vm.storage_profile.data_disks:
|
|
|
if data_disk.managed_disk:
|
|
if data_disk.managed_disk:
|
|
|
- disk_params = azure_helpers.\
|
|
|
|
|
|
|
+ disk_params = azure_helpers. \
|
|
|
parse_url(VOLUME_RESOURCE_ID,
|
|
parse_url(VOLUME_RESOURCE_ID,
|
|
|
data_disk.managed_disk.id)
|
|
data_disk.managed_disk.id)
|
|
|
- disk = self._provider.azure_client.\
|
|
|
|
|
|
|
+ disk = self._provider.azure_client. \
|
|
|
get_disk(disk_params.get(VOLUME_NAME))
|
|
get_disk(disk_params.get(VOLUME_NAME))
|
|
|
if disk and disk.tags \
|
|
if disk and disk.tags \
|
|
|
and disk.tags.get('delete_on_terminate',
|
|
and disk.tags.get('delete_on_terminate',
|
|
|
'False') == 'True':
|
|
'False') == 'True':
|
|
|
- self._provider.azure_client.\
|
|
|
|
|
|
|
+ self._provider.azure_client. \
|
|
|
delete_disk(disk_params.get(VOLUME_NAME))
|
|
delete_disk(disk_params.get(VOLUME_NAME))
|
|
|
if self._vm.storage_profile.os_disk.managed_disk:
|
|
if self._vm.storage_profile.os_disk.managed_disk:
|
|
|
disk_params = azure_helpers. \
|
|
disk_params = azure_helpers. \
|
|
@@ -1396,8 +1343,6 @@ class AzureInstance(BaseInstance):
|
|
|
the private key file path
|
|
the private key file path
|
|
|
"""
|
|
"""
|
|
|
|
|
|
|
|
- self.assert_valid_resource_name(name)
|
|
|
|
|
-
|
|
|
|
|
if not self._state == 'VM generalized':
|
|
if not self._state == 'VM generalized':
|
|
|
if not self._state == 'VM running':
|
|
if not self._state == 'VM running':
|
|
|
self._provider.azure_client.start_vm(self.id)
|
|
self._provider.azure_client.start_vm(self.id)
|
|
@@ -1416,9 +1361,9 @@ class AzureInstance(BaseInstance):
|
|
|
},
|
|
},
|
|
|
'tags': {'Name': name}
|
|
'tags': {'Name': name}
|
|
|
}
|
|
}
|
|
|
- self._provider.azure_client.\
|
|
|
|
|
|
|
+ self._provider.azure_client. \
|
|
|
create_image(name, create_params)
|
|
create_image(name, create_params)
|
|
|
- image = self._provider.azure_client.\
|
|
|
|
|
|
|
+ image = self._provider.azure_client. \
|
|
|
get_image(name)
|
|
get_image(name)
|
|
|
|
|
|
|
|
return AzureMachineImage(self._provider, image)
|
|
return AzureMachineImage(self._provider, image)
|
|
@@ -1427,7 +1372,7 @@ class AzureInstance(BaseInstance):
|
|
|
cnopts = pysftp.CnOpts()
|
|
cnopts = pysftp.CnOpts()
|
|
|
cnopts.hostkeys = None
|
|
cnopts.hostkeys = None
|
|
|
if private_key_path:
|
|
if private_key_path:
|
|
|
- with pysftp.\
|
|
|
|
|
|
|
+ with pysftp. \
|
|
|
Connection(self.public_ips[0],
|
|
Connection(self.public_ips[0],
|
|
|
username=self._provider.vm_default_user_name,
|
|
username=self._provider.vm_default_user_name,
|
|
|
cnopts=cnopts,
|
|
cnopts=cnopts,
|
|
@@ -1493,13 +1438,13 @@ class AzureInstance(BaseInstance):
|
|
|
nic.network_security_group = NetworkSecurityGroup()
|
|
nic.network_security_group = NetworkSecurityGroup()
|
|
|
nic.network_security_group.id = sg.resource_id
|
|
nic.network_security_group.id = sg.resource_id
|
|
|
else:
|
|
else:
|
|
|
- sg_url_params = azure_helpers.\
|
|
|
|
|
|
|
+ sg_url_params = azure_helpers. \
|
|
|
parse_url(SECURITY_GROUP_RESOURCE_ID,
|
|
parse_url(SECURITY_GROUP_RESOURCE_ID,
|
|
|
nic.network_security_group.id)
|
|
nic.network_security_group.id)
|
|
|
- existing_sg = self._provider.security.\
|
|
|
|
|
|
|
+ existing_sg = self._provider.security. \
|
|
|
security_groups.get(sg_url_params.get(SECURITY_GROUP_NAME))
|
|
security_groups.get(sg_url_params.get(SECURITY_GROUP_NAME))
|
|
|
|
|
|
|
|
- new_sg = self._provider.security.security_groups.\
|
|
|
|
|
|
|
+ new_sg = self._provider.security.security_groups. \
|
|
|
create('{0}-{1}'.format(sg.name, existing_sg.name),
|
|
create('{0}-{1}'.format(sg.name, existing_sg.name),
|
|
|
'Merged security groups {0} and {1}'.
|
|
'Merged security groups {0} and {1}'.
|
|
|
format(sg.name, existing_sg.name))
|
|
format(sg.name, existing_sg.name))
|
|
@@ -1527,7 +1472,7 @@ class AzureInstance(BaseInstance):
|
|
|
sg = (self._provicer.security.security_groups.get(sg)
|
|
sg = (self._provicer.security.security_groups.get(sg)
|
|
|
if isinstance(sg, str) else sg)
|
|
if isinstance(sg, str) else sg)
|
|
|
if nic.network_security_group and \
|
|
if nic.network_security_group and \
|
|
|
- nic.network_security_group.id == sg.resource_id:
|
|
|
|
|
|
|
+ nic.network_security_group.id == sg.resource_id:
|
|
|
nic.network_security_group = None
|
|
nic.network_security_group = None
|
|
|
self._provider.azure_client.create_nic(self._nic_ids[0], nic)
|
|
self._provider.azure_client.create_nic(self._nic_ids[0], nic)
|
|
|
|
|
|
|
@@ -1573,13 +1518,11 @@ class AzureInstance(BaseInstance):
|
|
|
|
|
|
|
|
|
|
|
|
|
class AzureLaunchConfig(BaseLaunchConfig):
|
|
class AzureLaunchConfig(BaseLaunchConfig):
|
|
|
-
|
|
|
|
|
def __init__(self, provider):
|
|
def __init__(self, provider):
|
|
|
super(AzureLaunchConfig, self).__init__(provider)
|
|
super(AzureLaunchConfig, self).__init__(provider)
|
|
|
|
|
|
|
|
|
|
|
|
|
class AzureInstanceType(BaseInstanceType):
|
|
class AzureInstanceType(BaseInstanceType):
|
|
|
-
|
|
|
|
|
def __init__(self, provider, instance_type):
|
|
def __init__(self, provider, instance_type):
|
|
|
super(AzureInstanceType, self).__init__(provider)
|
|
super(AzureInstanceType, self).__init__(provider)
|
|
|
self._inst_type = instance_type
|
|
self._inst_type = instance_type
|
|
@@ -1628,13 +1571,12 @@ class AzureInstanceType(BaseInstanceType):
|
|
|
@property
|
|
@property
|
|
|
def extra_data(self):
|
|
def extra_data(self):
|
|
|
return {
|
|
return {
|
|
|
- 'max_data_disk_count':
|
|
|
|
|
- self._inst_type.max_data_disk_count
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ 'max_data_disk_count':
|
|
|
|
|
+ self._inst_type.max_data_disk_count
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
|
|
|
class AzureKeyPair(BaseKeyPair):
|
|
class AzureKeyPair(BaseKeyPair):
|
|
|
-
|
|
|
|
|
def __init__(self, provider, key_pair):
|
|
def __init__(self, provider, key_pair):
|
|
|
super(AzureKeyPair, self).__init__(provider, key_pair)
|
|
super(AzureKeyPair, self).__init__(provider, key_pair)
|
|
|
self._material = None
|
|
self._material = None
|
|
@@ -1664,7 +1606,7 @@ class AzureKeyPair(BaseKeyPair):
|
|
|
|
|
|
|
|
def delete(self):
|
|
def delete(self):
|
|
|
try:
|
|
try:
|
|
|
- self._provider.azure_client.\
|
|
|
|
|
|
|
+ self._provider.azure_client. \
|
|
|
delete_public_key(self._key_pair)
|
|
delete_public_key(self._key_pair)
|
|
|
return True
|
|
return True
|
|
|
except CloudError:
|
|
except CloudError:
|
|
@@ -1672,19 +1614,24 @@ class AzureKeyPair(BaseKeyPair):
|
|
|
|
|
|
|
|
|
|
|
|
|
class AzureRouter(BaseRouter):
|
|
class AzureRouter(BaseRouter):
|
|
|
- def __init__(self, provider, route_table):
|
|
|
|
|
|
|
+ def __init__(self, provider, router):
|
|
|
super(AzureRouter, self).__init__(provider)
|
|
super(AzureRouter, self).__init__(provider)
|
|
|
- self._route_table = route_table
|
|
|
|
|
- if not self._route_table.tags:
|
|
|
|
|
- self._route_table.tags = {}
|
|
|
|
|
|
|
+ self._router = router
|
|
|
|
|
+ self._ROUTE_CIDR = '0.0.0.0/0'
|
|
|
|
|
+ self._name = None
|
|
|
|
|
+ self._network_id = None
|
|
|
|
|
+ self._state = RouterState.DETACHED
|
|
|
|
|
+
|
|
|
|
|
+ def _route_table(self, subnet_id):
|
|
|
|
|
+ pass
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def id(self):
|
|
def id(self):
|
|
|
- return self._route_table.name
|
|
|
|
|
|
|
+ return self._name
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def resource_id(self):
|
|
def resource_id(self):
|
|
|
- return self._route_table.id
|
|
|
|
|
|
|
+ pass
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def name(self):
|
|
def name(self):
|
|
@@ -1693,7 +1640,7 @@ class AzureRouter(BaseRouter):
|
|
|
|
|
|
|
|
.. note:: the router must have a (case sensitive) tag ``Name``
|
|
.. note:: the router must have a (case sensitive) tag ``Name``
|
|
|
"""
|
|
"""
|
|
|
- return self._route_table.tags.get('Name', self._route_table.name)
|
|
|
|
|
|
|
+ return self._name
|
|
|
|
|
|
|
|
@name.setter
|
|
@name.setter
|
|
|
# pylint:disable=arguments-differ
|
|
# pylint:disable=arguments-differ
|
|
@@ -1701,98 +1648,47 @@ class AzureRouter(BaseRouter):
|
|
|
"""
|
|
"""
|
|
|
Set the router name.
|
|
Set the router name.
|
|
|
"""
|
|
"""
|
|
|
- self.assert_valid_resource_name(value)
|
|
|
|
|
- self._route_table.tags.update(Name=value)
|
|
|
|
|
- self._provider.azure_client. \
|
|
|
|
|
- update_route_table_tags(self._route_table.name,
|
|
|
|
|
- self._route_table)
|
|
|
|
|
|
|
+ self._name = value
|
|
|
|
|
|
|
|
def refresh(self):
|
|
def refresh(self):
|
|
|
- self._route_table = self._provider.azure_client. \
|
|
|
|
|
- get_route_table(self._route_table.name)
|
|
|
|
|
|
|
+ pass
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def state(self):
|
|
def state(self):
|
|
|
- self.refresh() # Explicitly refresh the local object
|
|
|
|
|
- if self._route_table.subnets:
|
|
|
|
|
- return RouterState.ATTACHED
|
|
|
|
|
- return RouterState.DETACHED
|
|
|
|
|
|
|
+ return self._state
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def network_id(self):
|
|
def network_id(self):
|
|
|
- return None
|
|
|
|
|
|
|
+ return self._network_id
|
|
|
|
|
|
|
|
def delete(self):
|
|
def delete(self):
|
|
|
- self._provider.azure_client. \
|
|
|
|
|
- delete_route_table(self.name)
|
|
|
|
|
-
|
|
|
|
|
- def attach_subnet(self, subnet):
|
|
|
|
|
- subnet_id_parts = subnet.id.split('|$|')
|
|
|
|
|
- if (len(subnet_id_parts) != 2):
|
|
|
|
|
- pass
|
|
|
|
|
- self._provider.azure_client. \
|
|
|
|
|
- attach_subnet_to_route_table(subnet_id_parts[0],
|
|
|
|
|
- subnet_id_parts[1],
|
|
|
|
|
- self.resource_id)
|
|
|
|
|
- self.refresh()
|
|
|
|
|
-
|
|
|
|
|
- def detach_subnet(self, subnet):
|
|
|
|
|
- subnet_id_parts = subnet.id.split('|$|')
|
|
|
|
|
- if (len(subnet_id_parts) != 2):
|
|
|
|
|
- pass
|
|
|
|
|
- self._provider.azure_client. \
|
|
|
|
|
- detach_subnet_to_route_table(subnet_id_parts[0],
|
|
|
|
|
- subnet_id_parts[1],
|
|
|
|
|
- self.resource_id)
|
|
|
|
|
- self.refresh()
|
|
|
|
|
-
|
|
|
|
|
- def attach_gateway(self, gateway):
|
|
|
|
|
- pass
|
|
|
|
|
-
|
|
|
|
|
- def detach_gateway(self, gateway):
|
|
|
|
|
pass
|
|
pass
|
|
|
|
|
|
|
|
|
|
+ def attach_network(self, network_id):
|
|
|
|
|
+ self._network_id = network_id
|
|
|
|
|
+ self._state = RouterState.ATTACHED
|
|
|
|
|
|
|
|
-class AzureInternetGateway(BaseInternetGateway):
|
|
|
|
|
- def __init__(self, provider, gateway):
|
|
|
|
|
- super(AzureInternetGateway, self).__init__(provider)
|
|
|
|
|
- self._gateway = gateway
|
|
|
|
|
- self._name = None
|
|
|
|
|
- self._network_id = None
|
|
|
|
|
- self._state = ''
|
|
|
|
|
-
|
|
|
|
|
- @property
|
|
|
|
|
- def id(self):
|
|
|
|
|
- return self._name
|
|
|
|
|
|
|
+ def detach_network(self):
|
|
|
|
|
+ pass
|
|
|
|
|
|
|
|
- @property
|
|
|
|
|
- def name(self):
|
|
|
|
|
|
|
+ def add_route(self, subnet_id):
|
|
|
"""
|
|
"""
|
|
|
- Get the gateway name.
|
|
|
|
|
|
|
+ Add a default route to this router.
|
|
|
|
|
|
|
|
- .. note:: the gateway must have a (case sensitive) tag ``Name``
|
|
|
|
|
- """
|
|
|
|
|
- return self._name
|
|
|
|
|
|
|
+ For Azure, routes are added to a route table. A route table is assoc.
|
|
|
|
|
+ with a network vs. a subnet so we retrieve the network via the subnet.
|
|
|
|
|
+ Note that the subnet must belong to the same network as the router
|
|
|
|
|
+ is attached to.
|
|
|
|
|
|
|
|
- @name.setter
|
|
|
|
|
- # pylint:disable=arguments-differ
|
|
|
|
|
- def name(self, value):
|
|
|
|
|
|
|
+ Further, only a single route can be added, targeting the Internet
|
|
|
|
|
+ (i.e., destination CIDR block ``0.0.0.0/0``).
|
|
|
"""
|
|
"""
|
|
|
- Set the router name.
|
|
|
|
|
- """
|
|
|
|
|
- self.assert_valid_resource_name(value)
|
|
|
|
|
- self._name = value
|
|
|
|
|
-
|
|
|
|
|
- def refresh(self):
|
|
|
|
|
pass
|
|
pass
|
|
|
|
|
|
|
|
- @property
|
|
|
|
|
- def state(self):
|
|
|
|
|
- return self._state
|
|
|
|
|
-
|
|
|
|
|
- @property
|
|
|
|
|
- def network_id(self):
|
|
|
|
|
- return None
|
|
|
|
|
|
|
+ def remove_route(self, subnet_id):
|
|
|
|
|
+ """
|
|
|
|
|
+ Remove the default Internet route from this router.
|
|
|
|
|
|
|
|
- def delete(self):
|
|
|
|
|
|
|
+ .. seealso:: ``add_route`` method
|
|
|
|
|
+ """
|
|
|
pass
|
|
pass
|