modified test of create node response to 202 Accepted rather than 200 OK. Removed default VM image name map as its already out of date. Ensure line lengths are no greater the 80 characters where appropriate. Fixed unit tests
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/3a1d40ba Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/3a1d40ba Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/3a1d40ba Branch: refs/heads/trunk Commit: 3a1d40ba997b530912088d898696ce4607b2a45c Parents: 5c66320 Author: davidcrossland <[email protected]> Authored: Mon Jun 30 10:15:20 2014 +0100 Committer: Michael Bennett <[email protected]> Committed: Wed Nov 19 13:03:14 2014 -0500 ---------------------------------------------------------------------- libcloud/common/azure.py | 17 +- libcloud/compute/drivers/azure.py | 280 ++++++++++++++++++------------- libcloud/test/compute/test_azure.py | 79 ++++++--- 3 files changed, 227 insertions(+), 149 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/3a1d40ba/libcloud/common/azure.py ---------------------------------------------------------------------- diff --git a/libcloud/common/azure.py b/libcloud/common/azure.py index 8fbb1bd..b742933 100644 --- a/libcloud/common/azure.py +++ b/libcloud/common/azure.py @@ -31,7 +31,8 @@ except ImportError: from libcloud.common.types import InvalidCredsError from libcloud.common.types import LibcloudError, MalformedResponseError -from libcloud.common.base import ConnectionUserAndKey, RawResponse, CertificateConnection +from libcloud.common.base import ConnectionUserAndKey, RawResponse, \ + CertificateConnection from libcloud.common.base import XmlResponse # Azure API version @@ -43,8 +44,11 @@ AZURE_TIME_FORMAT = '%a, %d %b %Y %H:%M:%S GMT' class AzureResponse(XmlResponse): + valid_response_codes = [httplib.NOT_FOUND, httplib.CONFLICT, - httplib.BAD_REQUEST, httplib.TEMPORARY_REDIRECT] # added TEMPORARY_REDIRECT as this can sometimes be sent by azure instead of a success or fail response + # added TEMPORARY_REDIRECT as this can sometimes be + # sent by azure instead of a success or fail response + httplib.BAD_REQUEST, httplib.TEMPORARY_REDIRECT] def success(self): i = int(self.status) @@ -193,8 +197,10 @@ class AzureBaseDriver(object): class AzureServiceManagementConnection(CertificateConnection): # This needs the following approach - - # 1. Make request using LibcloudHTTPSConnection which is a overloaded class which takes in a client certificate - # 2. Depending on the type of operation use a PollingConnection when the response id is returned + # 1. Make request using LibcloudHTTPSConnection which is a overloaded + # class which takes in a client certificate + # 2. Depending on the type of operation use a PollingConnection + # when the response id is returned # 3. The Response can be used in an AzureServiceManagementResponse """Authentication class for "Service Account" authentication.""" driver = AzureBaseDriver @@ -220,7 +226,8 @@ class AzureServiceManagementConnection(CertificateConnection): self.keyfile = keypath; is_file_path = os.path.exists(keypath) and os.path.isfile(keypath) if not is_file_path: - raise InvalidCredsError('pem file needed to authenticate to Microsoft Azure') + raise InvalidCredsError( + 'pem file needed to authenticate to Microsoft Azure') self.key_file = key_file super(AzureServiceManagementConnection, self).__init__( http://git-wip-us.apache.org/repos/asf/libcloud/blob/3a1d40ba/libcloud/compute/drivers/azure.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/azure.py b/libcloud/compute/drivers/azure.py index c33d077..44d0b33 100644 --- a/libcloud/compute/drivers/azure.py +++ b/libcloud/compute/drivers/azure.py @@ -64,54 +64,6 @@ azure_service_management_host = 'management.core.windows.net' _USER_AGENT_STRING = 'libcloudazurecompute/' + __version__ X_MS_VERSION = '2013-08-01' -AZURE_DEFAULT_IMAGE_NAME = { - 'WinServer2013_JDK6':'0c0083a6d9a24f2d91800e52cad83950__JDK-1.6.0_71-0514-Win-GA', - 'WinServer2013_JDK7':'0c0083a6d9a24f2d91800e52cad83950__JDK-1.7.0_51-0514-Win-GA', - 'WinServer2013_JDK8':'0c0083a6d9a24f2d91800e52cad83950__JDK-1.8.0-0514-Win-GA', - 'OracleDb11gR2Ent_WinServer2008Rs':'0c0083a6d9a24f2d91800e52cad83950__Oracle-Database-11.2.0.4.0-EE-0514-Win-GA', - 'OracleDb11gR2Ent_WL_WinServer2008Rs':'0c0083a6d9a24f2d91800e52cad83950__Oracle-Database-11.2.0.4.0-EE-WebLogic-10.3.6-EE-JDK-1.7.0_51-0514-Win-GA', - 'OracleDb11gR2Std_WinServer2008Rs':'0c0083a6d9a24f2d91800e52cad83950__Oracle-Database-11.2.0.4.0-SE-0514-Win-GA', - 'OracleDb11gR2Std_WL_WinServer2008Rs':'0c0083a6d9a24f2d91800e52cad83950__Oracle-Database-11.2.0.4.0-SE-WebLogic-10.3.6-SE-JDK-1.7.0_51-0514-Win-GA', - 'OracleDb12cEnt_WinServer2012':'0c0083a6d9a24f2d91800e52cad83950__Oracle-Database-12.1.0.1.0-0514-EE-Win-GA', - 'OracleDb12cStd_WinServer2012':'0c0083a6d9a24f2d91800e52cad83950__Oracle-Database-12.1.0.1.0-0514-SE-Win-GA', - 'OracleDb12cEnt_WL_WinServer2012':'0c0083a6d9a24f2d91800e52cad83950__Oracle-Database-12.1.0.1.0-EE-WebLogic-12.1.2.0-EE-JDK-1.7.0_51-0514-Win-GA', - 'OracleDb12cStd_WL_WinServer2012':'0c0083a6d9a24f2d91800e52cad83950__Oracle-Database-12.1.0.1.0-SE-WebLogic-12.1.2.0-SE-JDK-1.7.0_51-0514-Win-GA', - 'OracleWL12cEnt_WinServer2012':'0c0083a6d9a24f2d91800e52cad83950__WebLogic-12.1.2.0-EE-JDK-1.7.0_51-0514-Win-GA', - 'OracleWL12cStd_WinServer2012':'0c0083a6d9a24f2d91800e52cad83950__WebLogic-12.1.2.0-SE-JDK-1.7.0_51-0514-Win-GA', - 'OracleWL11gEnt_WinServer2008R2':'0c0083a6d9a24f2d91800e52cad83950__Weblogic-10.3.6-EE-JDK-1.7.0_51-0514-Win-GA', - 'OracleWL11gStd_WinServer2008R2':'0c0083a6d9a24f2d91800e52cad83950__Weblogic-10.3.6-SE-JDK-1.7.0_51-0514-Win-GA', - 'BizTalkServer2013Ent_WinServer2012':'2cdc6229df6344129ee553dd3499f0d3__BizTalk-Server-2013-Enterprise', - 'BizTalkServer2013Std_WinServer2012':'2cdc6229df6344129ee553dd3499f0d3__BizTalk-Server-2013-Standard', - 'WinServerEssentials_WinServer2012R2':'3a50f22b388a4ff7ab41029918570fa6__Windows-Server-2012-Essentials-20140327-enus', - 'OpenLogic':'5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20140415', - 'WinServer2008R2SP1':'a699494373c04fc0bc8f2bb1389d6106__Win2K8R2SP1-Datacenter-201404.01-en.us-127GB.vhd', - 'WinServer2012DataCenter':'a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-Datacenter-201404.01-en.us-127GB.vhd', - 'WinServer2012R2DataCenter':'a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201404.01-en.us-127GB.vhd', - 'WinServerRemoteDskTopSessionHost_WinServer2012R2':'ad072bd3082149369c449ba5832401ae__Windows-Server-Remote-Desktop-Session-Host-on-Windows-Server-2012-R2-20140514-1852', - 'UbuntuServer13.10':'b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-13_10-amd64-server-20140507-en-us-30GB', - 'UnuntuServer12.04.4LTS':'b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-12_04_4-LTS-amd64-server-20140514-en-us-30GB', - 'UbuntuServer14.04LTS':'b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04-LTS-amd64-server-20140416.1-en-us-30GB', - 'SUSELinuxEntServer11SP3Prem':'b4590d9e3ed742e4a1d46e5424aa335e__SUSE-Linux-Enterprise-Server-11-SP3-Prio-v202', - 'SUSELinuxEntServer11SP3Sap':'b4590d9e3ed742e4a1d46e5424aa335e__SUSE-Linux-Enterprise-Server-11-SP3-SAP-CAL-v101,', - 'SUSELinuxEntServer11SP3':'b4590d9e3ed742e4a1d46e5424aa335e__SUSE-Linux-Enterprise-Server-11-SP3-v202', - 'OpenSUSE13.1':'b4590d9e3ed742e4a1d46e5424aa335e__openSUSE-13.1-v101', - 'OracleDB12.1.0.1Ent_OracleLinux6.4':'c290a6b031d841e09f2da759bbabe71f__Oracle-Database-121010.v1-EE-Lnx', - 'OracleDB12.1.0.1Std_OracleLinux6.4':'c290a6b031d841e09f2da759bbabe71f__Oracle-Database-121010.v3-SE-Lnx', - 'OracleLinux6.4':'c290a6b031d841e09f2da759bbabe71f__Oracle-Linux-6', - 'OracleWLServer12.1.2_OracleLinux6.4':'c290a6b031d841e09f2da759bbabe71f__WebLogic-Server-12c.v1-Lnx', - 'PuppetEnt3.2.2':'de89c2ed05c748f5aded3ddc75fdcce4__PuppetEnterpriseMaster-3_2_2-amd64-server-20140408-en-us-30GB', - 'SQLServer2008R2SP2Ent_WinServer2008R2':'fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2008R2SP2-Enterprise-CY13SU04-SQL2008-SP2-10.50.4021.0', - 'SQLServer2008R2SP2Std_WinServer2008R2':'fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2008R2SP2-Standard-CY13SU04-SQL2008-SP2-10.50.4021.0', - 'SQLServer2012SP1Ent_WinServer2012':'fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2012SP1-Enterprise-CY13SU04-SQL2012-SP1-11.0.3350.0-Win2012', - 'SQLServer2012SP1Ent_WinServer2008R2':'fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2012SP1-Enterprise-CY13SU04-SQL11-SP1-CU3-11.0.3350.0-B', - 'SQLServer2012SP1Std_WinServer2012':'fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2012SP1-Standard-CY13SU04-SQL2012-SP1-11.0.3350.0-Win2012', - 'SQLServer2012SP1Std_WinServer2008R2':'fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2012SP1-Standard-CY13SU04-SQL11-SP1-CU3-11.0.3350.0-B', - 'SQLServer2012SP1Web_WinServer2008R2':'fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2012SP1-Web-CY13SU04-SQL11-SP1-CU3-11.0.3350.0', - 'SQLServer2008R2SP2Web_WinServer2008R2':'fb83b3509582419d99629ce476bcb5c8__SQL-Server-2008R2SP2-GDR-10.50.4021.0-Web-ENU-Win2K8R2-CY13SU12', - 'SQLServer2012SP1DataWarehousing_WinServer2012':'fb83b3509582419d99629ce476bcb5c8__SQL-Server-2012SP1-CU5-11.0.3373.0-DataWarehousing-ENU-WS2012-CY13SU12', - -} - """ Sizes must be hardcoded because Microsoft doesn't provide an API to fetch them. From http://msdn.microsoft.com/en-us/library/windowsazure/dn197896.aspx @@ -322,16 +274,20 @@ class AzureNodeDriver(NodeDriver): '?embed-detail=True', None) if response.status != 200 : - raise LibcloudError('Message: %s, Body: %s, Status code: %d' % (response.error, response.body, response.status), driver=self) + raise LibcloudError('Message: %s, Body: %s, Status code: %d' % + (response.error, response.body, response.status) + , driver=self) data = self._parse_response(response, HostedService) try: - return [self._to_node(n) for n in data.deployments[0].role_instance_list] + return [self._to_node(n) for n in + data.deployments[0].role_instance_list] except IndexError: return None - def reboot_node(self, node=None, ex_cloud_service_name=None, ex_deployment_slot=None): + def reboot_node(self, node=None, ex_cloud_service_name=None, + ex_deployment_slot=None): """ Reboots a node. @@ -359,14 +315,20 @@ class AzureNodeDriver(NodeDriver): if not node: raise ValueError("node is required.") - _deployment_name = self._get_deployment(service_name=ex_cloud_service_name,deployment_slot=ex_deployment_slot).name + _deployment_name = self._get_deployment( + service_name=ex_cloud_service_name, + deployment_slot=ex_deployment_slot).name try: - response = self._perform_post(self._get_deployment_path_using_name(ex_cloud_service_name, _deployment_name) + '/roleinstances/' + _str(node.id) + '?comp=reboot' - , '') + response = self._perform_post( + self._get_deployment_path_using_name( + ex_cloud_service_name, _deployment_name) + '/roleinstances/' + + _str(node.id) + '?comp=reboot', '') if response.status != 202: - raise LibcloudError('Message: %s, Body: %s, Status code: %d' % (response.error, response.body, response.status), driver=self) + raise LibcloudError('Message: %s, Body: %s, Status code: %d' % + (response.error, response.body, + response.status), driver=self) if self._parse_response_for_async_op(response): return True @@ -395,7 +357,8 @@ class AzureNodeDriver(NodeDriver): def create_node(self, ex_cloud_service_name=None, **kwargs): """Create Azure Virtual Machine - Reference: http://bit.ly/1fIsCb7 [www.windowsazure.com/en-us/documentation/] + Reference: http://bit.ly/1fIsCb7 + [www.windowsazure.com/en-us/documentation/] We default to: @@ -414,18 +377,21 @@ class AzureNodeDriver(NodeDriver): @inherits: :class:`NodeDriver.create_node` - :keyword ex_cloud_service_name: Required. Name of the Azure Cloud Service. + :keyword ex_cloud_service_name: Required. + Name of the Azure Cloud Service. :type ex_cloud_service_name: ``str`` - :keyword ex_storage_service_name: Optional: Name of the Azure Storage Service. + :keyword ex_storage_service_name: Optional: + Name of the Azure Storage Service. :type ex_storage_service_name: ``str`` - :keyword ex_deployment_name: Optional. The name of the deployment. - If this is not passed in we default to - using the Cloud Service name. + :keyword ex_deployment_name: Optional. The name of the deployment + If this is not passed in we default + to using the Cloud Service name. :type ex_deployment_name: ``str`` - :keyword ex_deployment_slot: Optional: Valid values: production|staging. + :keyword ex_deployment_slot: Optional: Valid values: production| + staging. Defaults to production. :type ex_deployment_slot: ``str`` @@ -447,7 +413,8 @@ class AzureNodeDriver(NodeDriver): if "ex_deployment_slot" in kwargs: ex_deployment_slot = kwargs['ex_deployment_slot'] else: - ex_deployment_slot = "production" # We assume production if this is not provided. + # We assume production if this is not provided. + ex_deployment_slot = "production" if "ex_admin_user_id" in kwargs: ex_admin_user_id = kwargs['ex_admin_user_id'] @@ -461,15 +428,21 @@ class AzureNodeDriver(NodeDriver): # We do this because we need to pass a Configuration to the # method. This will be either Linux or Windows. - if re.search("Win|SQL|SharePoint|Visual|Dynamics|DynGP|BizTalk", image, re.I): - machine_config = WindowsConfigurationSet(computer_name=name, admin_password=password, admin_user_name=ex_admin_user_id) + if re.search("Win|SQL|SharePoint|Visual|Dynamics|DynGP|BizTalk", + image, re.I): + machine_config = WindowsConfigurationSet( + computer_name=name, admin_password=password, + admin_user_name=ex_admin_user_id) + machine_config.domain_join = None if node_list is None: port = "3389" else: port = random.randint(41952,65535) - endpoints = self._get_deployment(service_name=ex_cloud_service_name,deployment_slot=ex_deployment_slot) + endpoints = self._get_deployment( + service_name=ex_cloud_service_name, + deployment_slot=ex_deployment_slot) for instances in endpoints.role_instance_list: ports = [] @@ -492,7 +465,9 @@ class AzureNodeDriver(NodeDriver): port = "22" else: port = random.randint(41952,65535) - endpoints = self._get_deployment(service_name=ex_cloud_service_name,deployment_slot=ex_deployment_slot) + endpoints = self._get_deployment( + service_name=ex_cloud_service_name, + deployment_slot=ex_deployment_slot) for instances in endpoints.role_instance_list: ports = [] @@ -510,11 +485,13 @@ class AzureNodeDriver(NodeDriver): load_balanced_endpoint_set_name=None, enable_direct_server_return=False ) - machine_config = LinuxConfigurationSet(name, ex_admin_user_id, password, False) + machine_config = LinuxConfigurationSet( + name, ex_admin_user_id, password, False) network_config.input_endpoints.input_endpoints.append(endpoint) - _storage_location = self._get_cloud_service_location(service_name=ex_cloud_service_name) + _storage_location = self._get_cloud_service_location( + service_name=ex_cloud_service_name) # OK, bit annoying here. You must create a deployment before # you can create an instance; however, the deployment function @@ -528,8 +505,11 @@ class AzureNodeDriver(NodeDriver): ex_storage_service_name = kwargs['ex_storage_service_name'] else: ex_storage_service_name = ex_cloud_service_name - ex_storage_service_name = re.sub(ur'[\W_]+', u'', ex_storage_service_name.lower(), flags=re.UNICODE) - if self._is_storage_service_unique(service_name=ex_storage_service_name): + ex_storage_service_name = re.sub( + ur'[\W_]+', u'', ex_storage_service_name.lower(), + flags=re.UNICODE) + if self._is_storage_service_unique( + service_name=ex_storage_service_name): self._create_storage_account( service_name=ex_storage_service_name, location=_storage_location.service_location, @@ -541,8 +521,12 @@ class AzureNodeDriver(NodeDriver): else: ex_deployment_name = ex_cloud_service_name - blob_url = "http://" + ex_storage_service_name + ".blob.core.windows.net" - disk_name = "{0}-{1}-{2}.vhd".format(ex_cloud_service_name,name,time.strftime("%Y-%m-%d")) # Azure's pattern in the UI. + blob_url = "http://" + ex_storage_service_name \ + + ".blob.core.windows.net" + + # Azure's pattern in the UI. + disk_name = "{0}-{1}-{2}.vhd".format( + ex_cloud_service_name,name,time.strftime("%Y-%m-%d")) media_link = blob_url + "/vhds/" + disk_name disk_config = OSVirtualHardDisk(image, media_link) @@ -562,28 +546,36 @@ class AzureNodeDriver(NodeDriver): size, None)) - if response.status != 200: - raise LibcloudError('Message: %s, Body: %s, Status code: %d' % (response.error, response.body, response.status), driver=self) + if response.status != 202: + raise LibcloudError('Message: %s, Body: %s, Status code: %d' % + (response.error, response.body, response.status), driver=self) self._ex_complete_async_azure_operation(response) else: - _deployment_name = self._get_deployment(service_name=ex_cloud_service_name,deployment_slot=ex_deployment_slot).name + _deployment_name = self._get_deployment( + service_name=ex_cloud_service_name, + deployment_slot=ex_deployment_slot).name if "ex_storage_service_name" in kwargs: ex_storage_service_name = kwargs['ex_storage_service_name'] else: ex_storage_service_name = ex_cloud_service_name - ex_storage_service_name = re.sub(ur'[\W_]+', u'', ex_storage_service_name.lower(), flags=re.UNICODE) + ex_storage_service_name = re.sub( + ur'[\W_]+', u'', ex_storage_service_name.lower(), + flags=re.UNICODE) - if self._is_storage_service_unique(service_name=ex_storage_service_name): + if self._is_storage_service_unique( + service_name=ex_storage_service_name): self._create_storage_account( service_name=ex_storage_service_name, location=_storage_location.service_location, is_affinity_group=_storage_location.is_affinity_group ) - blob_url = "http://" + ex_storage_service_name + ".blob.core.windows.net" - disk_name = "{0}-{1}-{2}.vhd".format(ex_cloud_service_name,name,time.strftime("%Y-%m-%d")) + blob_url = "http://" + ex_storage_service_name + \ + ".blob.core.windows.net" + disk_name = "{0}-{1}-{2}.vhd".format( + ex_cloud_service_name,name,time.strftime("%Y-%m-%d")) media_link = blob_url + "/vhds/" + disk_name disk_config = OSVirtualHardDisk(image, media_link) @@ -601,7 +593,9 @@ class AzureNodeDriver(NodeDriver): size)) # role_size) if response.status != 202: - raise LibcloudError('Message: %s, Body: %s, Status code: %d' % (response.error, response.body, response.status), driver=self) + raise LibcloudError('Message: %s, Body: %s, Status code: %d' % + (response.error, response.body, + response.status), driver=self) self._ex_complete_async_azure_operation(response) @@ -614,7 +608,8 @@ class AzureNodeDriver(NodeDriver): driver=self.connection.driver ) - def destroy_node(self, node=None, ex_cloud_service_name=None, ex_deployment_slot=None): + def destroy_node(self, node=None, ex_cloud_service_name=None, + ex_deployment_slot=None): """Remove Azure Virtual Machine This removes the instance, but does not @@ -622,7 +617,8 @@ class AzureNodeDriver(NodeDriver): Azure sometimes has an issue where it will hold onto a blob lease for an extended amount of time. - :keyword ex_cloud_service_name: Required. Name of the Azure Cloud Service. + :keyword ex_cloud_service_name: Required. + Name of the Azure Cloud Service. :type ex_cloud_service_name: ``str`` :keyword ex_deployment_slot: Optional: The name of the deployment @@ -640,13 +636,17 @@ class AzureNodeDriver(NodeDriver): if not ex_deployment_slot: ex_deployment_slot = "production" - _deployment = self._get_deployment(service_name=ex_cloud_service_name,deployment_slot=ex_deployment_slot) + _deployment = self._get_deployment( + service_name=ex_cloud_service_name, + deployment_slot=ex_deployment_slot) + _deployment_name = _deployment.name _server_deployment_count = len(_deployment.role_instance_list) if _server_deployment_count > 1: - path = self._get_role_path(ex_cloud_service_name, _deployment_name, node.id) + path = self._get_role_path(ex_cloud_service_name, + _deployment_name, node.id) path += '?comp=media' # forces deletion of attached disks data = self._perform_delete(path) @@ -663,7 +663,8 @@ class AzureNodeDriver(NodeDriver): return True - def create_cloud_service(self, ex_cloud_service_name=None, location=None, description=None, extended_properties=None): + def create_cloud_service(self, ex_cloud_service_name=None, location=None, + description=None, extended_properties=None): """ creates an azure cloud service. @@ -689,12 +690,15 @@ class AzureNodeDriver(NodeDriver): response = self._perform_cloud_service_create( self._get_hosted_service_path(), - AzureXmlSerializer.create_hosted_service_to_xml(ex_cloud_service_name, self._encode_base64(ex_cloud_service_name), description, - location, None, - extended_properties)) + AzureXmlSerializer.create_hosted_service_to_xml( + ex_cloud_service_name, + self._encode_base64(ex_cloud_service_name), + description, location, None, extended_properties)) if response.status != 201: - raise LibcloudError('Message: %s, Body: %s, Status code: %d' % (response.error, response.body, response.status), driver=self) + raise LibcloudError('Message: %s, Body: %s, Status code: %d' + % (response.error, response.body, + response.status), driver=self) return True @@ -712,10 +716,13 @@ class AzureNodeDriver(NodeDriver): if not ex_cloud_service_name: raise ValueError("ex_cloud_service_name is required.") #add check to ensure all nodes have been deleted - response = self._perform_cloud_service_delete(self._get_hosted_service_path(ex_cloud_service_name)) + response = self._perform_cloud_service_delete( + self._get_hosted_service_path(ex_cloud_service_name)) if response.status != 200: - raise LibcloudError('Message: %s, Body: %s, Status code: %d' % (response.error, response.body, response.status), driver=self) + raise LibcloudError('Message: %s, Body: %s, Status code: %d' % + (response.error, response.body, response.status) + , driver=self) return True @@ -834,7 +841,8 @@ class AzureNodeDriver(NodeDriver): country=country, driver=self.connection.driver, available_services =data.available_services, - virtual_machine_role_sizes = (data.compute_capabilities).virtual_machines_role_sizes) + virtual_machine_role_sizes = + (data.compute_capabilities).virtual_machines_role_sizes) def _to_node_size(self, data): """ @@ -877,11 +885,13 @@ class AzureNodeDriver(NodeDriver): extra = {} extra['affinity_group'] = volume.affinity_group if hasattr(volume.attached_to, 'hosted_service_name'): - extra['hosted_service_name'] = volume.attached_to.hosted_service_name + extra['hosted_service_name'] = \ + volume.attached_to.hosted_service_name if hasattr(volume.attached_to, 'role_name'): extra['role_name'] = volume.attached_to.role_name if hasattr(volume.attached_to, 'deployment_name'): - extra['deployment_name'] = volume.attached_to.deployment_name + extra['deployment_name'] = \ + volume.attached_to.deployment_name extra['os'] = volume.os extra['location'] = volume.location extra['media_link'] = volume.media_link @@ -896,7 +906,8 @@ class AzureNodeDriver(NodeDriver): extra = {} extra['affinity_group'] = volume.affinity_group if hasattr(volume.attached_to, 'hosted_service_name'): - extra['hosted_service_name'] = volume.attached_to.hosted_service_name + extra['hosted_service_name'] = \ + volume.attached_to.hosted_service_name if hasattr(volume.attached_to, 'role_name'): extra['role_name'] = volume.attached_to.role_name if hasattr(volume.attached_to, 'deployment_name'): @@ -921,7 +932,9 @@ class AzureNodeDriver(NodeDriver): _service_name, _deployment_slot), None) if response.status != 200: - raise LibcloudError('Message: %s, Body: %s, Status code: %d' % (response.error, response.body, response.status), driver=self) + raise LibcloudError('Message: %s, Body: %s, Status code: %d' % + (response.error, response.body, response.status) + , driver=self) return self._parse_response(response, Deployment) @@ -972,7 +985,9 @@ class AzureNodeDriver(NodeDriver): None)) # extended_properties if response.status != 202: - raise LibcloudError('Message: %s, Body: %s, Status code: %d' % (response.error, response.body, response.status), driver=self) + raise LibcloudError('Message: %s, Body: %s, Status code: %d' % + (response.error, response.body, + response.status), driver=self) else: response = self._perform_post( @@ -987,12 +1002,15 @@ class AzureNodeDriver(NodeDriver): None)) # extended_properties if response.status != 202: - raise LibcloudError('Message: %s, Body: %s, Status code: %d' % (response.error, response.body, response.status), driver=self) + raise LibcloudError('Message: %s, Body: %s, Status code: %d' % + (response.error, response.body, + response.status), driver=self) # We need to wait for this to be created before we can # create the storage container and the instance. - self._ex_complete_async_azure_operation(response, "create_storage_account") + self._ex_complete_async_azure_operation(response, + "create_storage_account") return @@ -1021,7 +1039,8 @@ class AzureNodeDriver(NodeDriver): request.host = azure_service_management_host request.path = path request.body = self._get_request_body(body) - request.path, request.query = self._update_request_uri_query(request) + request.path, request.query = \ + self._update_request_uri_query(request) request.headers = self._update_management_header(request) response = self._perform_request(request) @@ -1037,7 +1056,9 @@ class AzureNodeDriver(NodeDriver): response = self._perform_request(request) if response.status != 202: - raise LibcloudError('Message: %s, Body: %s, Status code: %d' % (response.error, response.body, response.status), driver=self) + raise LibcloudError('Message: %s, Body: %s, Status code: %d' % + (response.error, response.body, response.status) + , driver=self) if async: return self._parse_response_for_async_op(response) @@ -1047,7 +1068,10 @@ class AzureNodeDriver(NodeDriver): def _perform_request(self, request): try: - return self.connection.request(action="https://%s%s" % (request.host, request.path), data=request.body, headers=request.headers, method=request.method) + return self.connection.request( + action="https://%s%s" % (request.host, request.path), + data=request.body, headers=request.headers, + method=request.method) except Exception, e: print e.message @@ -1077,7 +1101,8 @@ class AzureNodeDriver(NodeDriver): request.path += '?' for name, value in request.query: if value is not None: - request.path += name + '=' + url_quote(value, '/()$=\',') + '&' + request.path += name + '=' + \ + url_quote(value, '/()$=\',') + '&' request.path = request.path[:-1] return request.path, request.query @@ -1122,7 +1147,8 @@ class AzureNodeDriver(NodeDriver): Parse the HTTPResponse's body and fill all the data into a class of return_type. ''' - return self._parse_response_body_from_xml_text(response.body, return_type) + return self._parse_response_body_from_xml_text( + response.body, return_type) def _parse_response_body_from_xml_text(self, respbody, return_type): ''' @@ -1170,12 +1196,14 @@ class AzureNodeDriver(NodeDriver): elif isinstance(value, dict): setattr(return_obj, name, - self._fill_dict(node, self._get_serialization_name(name))) + self._fill_dict(node, + self._get_serialization_name(name))) elif isinstance(value, _Base64String): value = self._fill_data_minidom(node, name, '') if value is not None: value = self._decode_base64_to_text(value) - # always set the attribute, so we don't end up returning an object + # always set the attribute, + # so we don't end up returning an object # with type _Base64String setattr(return_obj, name, value) else: @@ -1185,7 +1213,8 @@ class AzureNodeDriver(NodeDriver): def _fill_list_of(self, xmldoc, element_type, xml_element_name): xmlelements = self._get_child_nodes(xmldoc, xml_element_name) - return [self._parse_response_body_from_xml_node(xmlelement, element_type) \ + return [self._parse_response_body_from_xml_node( + xmlelement, element_type) \ for xmlelement in xmlelements] def _parse_response_body_from_xml_node(self, node, return_type): @@ -1201,7 +1230,8 @@ class AzureNodeDriver(NodeDriver): xml_element_name): xmlelements = self._get_child_nodes(xmldoc, parent_xml_element_name) if xmlelements: - xmlelements = self._get_child_nodes(xmlelements[0], xml_element_name) + xmlelements = \ + self._get_child_nodes(xmlelements[0], xml_element_name) return [self._get_node_value(xmlelement, element_type) \ for xmlelement in xmlelements] @@ -1230,13 +1260,15 @@ class AzureNodeDriver(NodeDriver): return ''.join(name.capitalize() for name in element_name.split('_')) - def _fill_dict_of(self, xmldoc, parent_xml_element_name, pair_xml_element_name, + def _fill_dict_of( + self, xmldoc, parent_xml_element_name, pair_xml_element_name, key_xml_element_name, value_xml_element_name): return_obj = {} xmlelements = self._get_child_nodes(xmldoc, parent_xml_element_name) if xmlelements: - xmlelements = self._get_child_nodes(xmlelements[0], pair_xml_element_name) + xmlelements = \ + self._get_child_nodes(xmlelements[0], pair_xml_element_name) for pair in xmlelements: keys = self._get_child_nodes(pair, key_xml_element_name) values = self._get_child_nodes(pair, value_xml_element_name) @@ -1345,8 +1377,8 @@ class AzureNodeDriver(NodeDriver): isinstance(value, WindowsAzureData): xmlstr += self._convert_class_to_xml(value, False) else: - xmlstr += ('<' + self._get_serialization_name(name) + '>' + - xml_escape(str(value)) + '</' + + xmlstr += ('<' + self._get_serialization_name(name) + + '>' + xml_escape(str(value)) + '</' + self._get_serialization_name(name) + '>') xmlstr += '</' + class_name + '>' return xmlstr @@ -1365,7 +1397,8 @@ class AzureNodeDriver(NodeDriver): def _get_deployment_path_using_name(self, service_name, deployment_name=None): - return self._get_path('services/hostedservices/' + _str(service_name) + + return self._get_path('services/hostedservices/' + + _str(service_name) + '/deployments', deployment_name) def _get_path(self, resource, name): @@ -1395,7 +1428,8 @@ class AzureNodeDriver(NodeDriver): def _get_storage_service_path(self, service_name=None): return self._get_path('services/storageservices', service_name) - def _ex_complete_async_azure_operation(self, response=None, operation_type='create_node'): + def _ex_complete_async_azure_operation(self, response=None, + operation_type='create_node'): request_id = self._parse_response_for_async_op(response) operation_status = self._get_operation_status(request_id.request_id) @@ -1413,7 +1447,9 @@ class AzureNodeDriver(NodeDriver): time.sleep(interval) if operation_status.status == 'Failed': - raise LibcloudError('Message: Async request for operation %s has failed'% operation_type, driver=self) + raise LibcloudError( + 'Message: Async request for operation %s has failed'% + operation_type, driver=self) #def get_connection(self): # certificate_path = "/Users/baldwin/.azure/managementCertificate.pem" @@ -1469,7 +1505,8 @@ class AzureXmlSerializer(): @staticmethod def update_hosted_service_to_xml(label, description, extended_properties): return AzureXmlSerializer.doc_from_data('UpdateHostedService', - [('Label', label, AzureNodeDriver._encode_base64), + [('Label', label, + AzureNodeDriver._encode_base64), ('Description', description)], extended_properties) @@ -1992,7 +2029,8 @@ class WindowsConfigurationSet(WindowsAzureData): def __init__(self, computer_name=None, admin_password=None, reset_password_on_first_logon=None, - enable_automatic_updates=None, time_zone=None, admin_user_name=None): + enable_automatic_updates=None, + time_zone=None, admin_user_name=None): self.configuration_set_type = u'WindowsProvisioningConfiguration' self.computer_name = computer_name self.admin_password = admin_password @@ -2606,7 +2644,8 @@ class _dict_of(dict): class AzureNodeLocation(NodeLocation): # we can also have something in here for available services which is an extra to the API with Azure - def __init__(self, id, name, country, driver, available_services, virtual_machine_role_sizes): + def __init__(self, id, name, country, driver, available_services, + virtual_machine_role_sizes): super(AzureNodeLocation, self).__init__(id, name, country, driver) self.available_services = available_services self.virtual_machine_role_sizes = virtual_machine_role_sizes @@ -2615,4 +2654,5 @@ class AzureNodeLocation(NodeLocation): return (('<AzureNodeLocation: id=%s, name=%s, country=%s, ' 'driver=%s services=%s virtualMachineRoleSizes=%s >') % (self.id, self.name, self.country, - self.driver.name, ','.join(self.available_service), ','.join(self.virtual_machine_role_sizes))) \ No newline at end of file + self.driver.name, ','.join(self.available_service), + ','.join(self.virtual_machine_role_sizes))) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/libcloud/blob/3a1d40ba/libcloud/test/compute/test_azure.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_azure.py b/libcloud/test/compute/test_azure.py index c52a133..d211bab 100644 --- a/libcloud/test/compute/test_azure.py +++ b/libcloud/test/compute/test_azure.py @@ -1,7 +1,6 @@ import libcloud from libcloud.common.types import LibcloudError from libcloud.compute.base import NodeAuthPassword -from libcloud.compute.drivers.azure import AZURE_DEFAULT_IMAGE_NAME __author__ = 'david' @@ -34,18 +33,23 @@ class AzureNodeDriverTests(unittest.TestCase) : self.assertEqual(len(locations), 7) locationNamesResult = list(a.name for a in locations) - locationNamesExpected = ['East Asia','Southeast Asia','North Europe','West Europe','East US','North Central US','West US'] + locationNamesExpected = ['East Asia','Southeast Asia','North Europe', + 'West Europe','East US','North Central US', + 'West US'] self.assertListEqual(locationNamesResult, locationNamesExpected) - matchedLocation = next(location for location in locations if location.name == 'Southeast Asia') + matchedLocation = next(location for location in locations + if location.name == 'Southeast Asia') servicesResult = matchedLocation.available_services servicesExpected = ['Compute','Storage','PersistentVMRole','HighMemory'] self.assertListEqual(servicesResult, servicesExpected) vmRoleSizesResult = matchedLocation.virtual_machine_role_sizes - vmRoleSizesExpected = ['A5','A6','A7','Basic_A0','Basic_A1','Basic_A2','Basic_A3','Basic_A4','ExtraLarge','ExtraSmall','Large','Medium','Small'] + vmRoleSizesExpected = ['A5','A6','A7','Basic_A0','Basic_A1','Basic_A2', + 'Basic_A3','Basic_A4','ExtraLarge','ExtraSmall', + 'Large','Medium','Small'] self.assertListEqual(vmRoleSizesResult, vmRoleSizesExpected) def test_images_returned_successfully(self): @@ -57,7 +61,8 @@ class AzureNodeDriverTests(unittest.TestCase) : self.assertEquals(len(images), 207 ) def test_list_nodes_returned_successfully(self): - vmimages = self.driver.list_nodes(ex_cloud_service_name="dcoddkinztest01") + vmimages = self.driver.list_nodes( + ex_cloud_service_name="dcoddkinztest01") self.assertEqual(len(vmimages), 2) img0 = vmimages[0] @@ -74,7 +79,8 @@ class AzureNodeDriverTests(unittest.TestCase) : self.assertEquals(extra["ssh_port"], u'22') def test_list_nodes_returned_no_deployments(self): - vmimages = self.driver.list_nodes(ex_cloud_service_name="dcoddkinztest03") + vmimages = self.driver.list_nodes( + ex_cloud_service_name="dcoddkinztest03") self.assertIsNone(vmimages) def test_list_nodes_returned_no_cloud_service(self): @@ -84,7 +90,9 @@ class AzureNodeDriverTests(unittest.TestCase) : def test_restart_node_success(self): node = type('Node', (object,), dict(id="dc03")) - result = self.driver.reboot_node(node=node, ex_cloud_service_name="dcoddkinztest01", ex_deployment_slot="Production") + result = self.driver.reboot_node( + node=node, ex_cloud_service_name="dcoddkinztest01", + ex_deployment_slot="Production") self.assertTrue(result) @@ -94,35 +102,45 @@ class AzureNodeDriverTests(unittest.TestCase) : node = type('Node', (object,), dict(id="dc03")) with self.assertRaises(LibcloudError): - self.driver.reboot_node(node=node, ex_cloud_service_name="dcoddkinztest02", ex_deployment_slot="Production") + self.driver.reboot_node(node=node, + ex_cloud_service_name="dcoddkinztest02", + ex_deployment_slot="Production") def test_restart_node_fail_no_cloud_service(self): node = type('Node', (object,), dict(id="dc03")) with self.assertRaises(LibcloudError): - self.driver.reboot_node(node=node, ex_cloud_service_name="dcoddkinztest03", ex_deployment_slot="Production") + self.driver.reboot_node(node=node, + ex_cloud_service_name="dcoddkinztest03", + ex_deployment_slot="Production") def test_restart_node_fail_node_not_found(self): node = type('Node', (object,), dict(id="dc13")) - result = self.driver.reboot_node(node=node, ex_cloud_service_name="dcoddkinztest01", ex_deployment_slot="Production") + result = self.driver.reboot_node( + node=node, ex_cloud_service_name="dcoddkinztest01", + ex_deployment_slot="Production") self.assertFalse(result) def test_destroy_node_success_single_node_in_cloud_service(self): node = type('Node', (object,), dict(id="oddkinz1")) - result = self.driver.destroy_node(node=node, ex_cloud_service_name="oddkinz1", ex_deployment_slot="Production") + result = self.driver.destroy_node(node=node, + ex_cloud_service_name="oddkinz1", + ex_deployment_slot="Production") self.assertTrue(result) def test_destroy_node_success_multiple_nodes_in_cloud_service(self): node = type('Node', (object,), dict(id="oddkinz1")) - result = self.driver.destroy_node(node=node, ex_cloud_service_name="oddkinz2", ex_deployment_slot="Production") + result = self.driver.destroy_node(node=node, + ex_cloud_service_name="oddkinz2", + ex_deployment_slot="Production") self.assertTrue(result) def test_destroy_node_fail_node_does_not_exist(self): @@ -130,7 +148,9 @@ class AzureNodeDriverTests(unittest.TestCase) : node = type('Node', (object,), dict(id="oddkinz2")) with self.assertRaises(LibcloudError): - self.driver.destroy_node(node=node, ex_cloud_service_name="oddkinz2", ex_deployment_slot="Production") + self.driver.destroy_node(node=node, + ex_cloud_service_name="oddkinz2", + ex_deployment_slot="Production") def test_destroy_node_success_cloud_service_not_found(self): @@ -138,7 +158,9 @@ class AzureNodeDriverTests(unittest.TestCase) : node["name"]="cloudredis" with self.assertRaises(LibcloudError): - self.driver.destroy_node(node=node, ex_cloud_service_name="oddkinz5", ex_deployment_slot="Production" ) + self.driver.destroy_node(node=node, + ex_cloud_service_name="oddkinz5", + ex_deployment_slot="Production" ) def test_create_cloud_service(self): result = self.driver.create_cloud_service("testdc123", "North Europe") @@ -147,17 +169,20 @@ class AzureNodeDriverTests(unittest.TestCase) : def test_create_cloud_service_service_exists(self): with self.assertRaises(LibcloudError): - self.driver.create_cloud_service(ex_cloud_service_name="testdc1234", location="North Europe") + self.driver.create_cloud_service(ex_cloud_service_name="testdc1234", + location="North Europe") def test_destroy_cloud_service(self): - result = self.driver.destroy_cloud_service(ex_cloud_service_name="testdc123") + result = self.driver.destroy_cloud_service( + ex_cloud_service_name="testdc123") self.assertTrue(result) def test_destroy_cloud_service_service_does_not_exist(self): with self.assertRaises(LibcloudError): - self.driver.destroy_cloud_service(ex_cloud_service_name="testdc1234") + self.driver.destroy_cloud_service( + ex_cloud_service_name="testdc1234") def test_create_node_and_deployment_one_node(self): kwargs = {} @@ -171,10 +196,12 @@ class AzureNodeDriverTests(unittest.TestCase) : kwargs["auth"]= auth kwargs["size"]= "ExtraSmall" - kwargs["image"] = "5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20140415" + kwargs["image"] = \ + "5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20140415" kwargs["name"] = "dcoddkinztest03" - result = self.driver.create_node(ex_cloud_service_name="testdcabc", **kwargs) + result = self.driver.create_node( + ex_cloud_service_name="testdcabc", **kwargs) self.assertIsNotNone(result) def test_create_node_and_deployment_second_node(self): @@ -189,11 +216,13 @@ class AzureNodeDriverTests(unittest.TestCase) : kwargs["auth"]= auth kwargs["size"]= "ExtraSmall" - kwargs["image"] = AZURE_DEFAULT_IMAGE_NAME["OpenLogic"] + kwargs["image"] = \ + "5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20140415" kwargs["name"] = "dcoddkinztest03" node = type('Node', (object,), dict(id="dc14")) - result = self.driver.create_node(ex_cloud_service_name="testdcabc2", **kwargs) + result = self.driver.create_node( + ex_cloud_service_name="testdcabc2", **kwargs) self.assertIsNotNone(result) def test_create_node_and_deployment_second_node_307_response(self): @@ -208,11 +237,13 @@ class AzureNodeDriverTests(unittest.TestCase) : kwargs["auth"]= auth kwargs["size"]= "ExtraSmall" - kwargs["image"] = AZURE_DEFAULT_IMAGE_NAME["OpenLogic"] + kwargs["image"] = \ + "5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20140415" kwargs["name"] = "dcoddkinztest04" with self.assertRaises(LibcloudError): - self.driver.create_node(ex_cloud_service_name="testdcabc3", **kwargs) + self.driver.create_node(ex_cloud_service_name="testdcabc3", + **kwargs) class AzureMockHttp(MockHttp): @@ -330,7 +361,7 @@ class AzureMockHttp(MockHttp): if method == "GET": body = self.fixtures.load('_3761b98b_673d_526c_8d55_fee918758e6e_services_hostedservices_testdcabc_deployments.xml') - return (httplib.OK, body, headers, httplib.responses[httplib.OK]) + return (httplib.ACCEPTED, body, headers, httplib.responses[httplib.ACCEPTED]) def _3761b98b_673d_526c_8d55_fee918758e6e_services_hostedservices_testdcabc2(self, method, url, body, headers): if method == "GET":
