This is an automated email from the ASF dual-hosted git repository. tomaz pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/libcloud.git
commit 6f78c1aafb8bb48e36ee6f90e5e22d691110ea69 Author: Tio Gobin <[email protected]> AuthorDate: Tue Aug 25 11:41:57 2020 +0200 Flake8 and MyPy compliance for outscale driver --- libcloud/common/osc.py | 25 +++--- libcloud/compute/drivers/outscale.py | 148 +++++++++++++++++++++-------------- 2 files changed, 101 insertions(+), 72 deletions(-) diff --git a/libcloud/common/osc.py b/libcloud/common/osc.py index a00d155..475f327 100644 --- a/libcloud/common/osc.py +++ b/libcloud/common/osc.py @@ -54,7 +54,7 @@ class OSCRequestSigner(object): class OSCRequestSignerAlgorithmV4(OSCRequestSigner): @staticmethod - def sign(key: str, msg: str): + def sign(key, msg): return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest() @staticmethod @@ -73,7 +73,7 @@ class OSCRequestSignerAlgorithmV4(OSCRequestSigner): for k, v in sorted(params.items())]) def get_request_headers(self, service_name: str, region: str, action: str, - data: dict = None): + data: str): date = datetime.utcnow() host = "{}.{}.outscale.com".format(service_name, region) headers = { @@ -97,10 +97,10 @@ class OSCRequestSignerAlgorithmV4(OSCRequestSigner): return headers def _get_authorization_v4_header(self, headers: dict, + data: str, dt: datetime, method: str = 'GET', - path: str = '/', - data: dict = None): + path: str = '/'): credentials_scope = self._get_credential_scope(dt=dt) signed_headers = self._get_signed_headers(headers=headers) signature = self._get_signature(headers=headers, dt=dt, @@ -115,23 +115,25 @@ class OSCRequestSignerAlgorithmV4(OSCRequestSigner): } def _get_signature(self, headers: dict, dt: datetime, - method: str, path: str, data: dict): + method: str, path: str, data: str): string_to_sign = self._get_string_to_sign(headers=headers, dt=dt, method=method, path=path, data=data) - signing_key = self._get_key_to_sign_with(self.access_secret, dt) + signing_key = self._get_key_to_sign_with( + self.access_secret, + dt.strftime('%Y%m%d') + ) return hmac.new(signing_key, string_to_sign.encode('utf-8'), hashlib.sha256).hexdigest() - def _get_key_to_sign_with(self, key: str, dt: datetime): - dt = dt.strftime('%Y%m%d') + def _get_key_to_sign_with(self, key: str, dt: str): k_date = self.sign(('OSC4' + key).encode('utf-8'), dt) k_region = self.sign(k_date, self.connection.region_name) k_service = self.sign(k_region, self.connection.service_name) return self.sign(k_service, 'osc4_request') def _get_string_to_sign(self, headers: dict, dt: datetime, method: str, - path: str, data: dict): + path: str, data: str): canonical_request = self._get_canonical_request(headers=headers, method=method, path=path, @@ -147,8 +149,7 @@ class OSCRequestSignerAlgorithmV4(OSCRequestSigner): self.connection.service_name, 'osc4_request']) - def _get_canonical_request(self, headers, method, path, data = "{}"): - data = data if data else "{}" + def _get_canonical_request(self, headers, method, path, data): return '\n'.join([ method, path, @@ -156,4 +157,4 @@ class OSCRequestSignerAlgorithmV4(OSCRequestSigner): self._get_canonical_headers(headers), self._get_signed_headers(headers), hashlib.sha256(data.encode('utf-8')).hexdigest() - ]) \ No newline at end of file + ]) diff --git a/libcloud/compute/drivers/outscale.py b/libcloud/compute/drivers/outscale.py index fe1b80b..df43b10 100644 --- a/libcloud/compute/drivers/outscale.py +++ b/libcloud/compute/drivers/outscale.py @@ -114,8 +114,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return True return False @@ -153,7 +153,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return True return False @@ -252,7 +253,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return True return False @@ -290,7 +292,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return True return False @@ -387,11 +390,14 @@ class OutscaleNodeDriver(NodeDriver): create the VM. :type ex_subnet_id: ``str`` - :param ex_user_data: Data or script used to add a specific configuration to the VM. It must be base64-encoded. + :param ex_user_data: Data or script used to add a specific + configuration to the VM. It must be base64-encoded. :type ex_user_data: ``str`` - :param ex_vm_initiated_shutdown_behavior: The VM behavior when you stop it. By default or if set to stop, the - VM stops. If set to restart, the VM stops then automatically restarts. If set to terminate, the VM stops and is terminated. + :param ex_vm_initiated_shutdown_behavior: The VM behavior when + you stop it. By default or if set to stop, the + VM stops. If set to restart, the VM stops then automatically restarts. + If set to terminate, the VM stops and is terminated. create the VM. :type ex_vm_initiated_shutdown_behavior: ``str`` @@ -434,7 +440,10 @@ class OutscaleNodeDriver(NodeDriver): if ex_user_data is not None: data.update({"UserData": ex_user_data}) if ex_vm_initiated_shutdown_behavior is not None: - data.update({"VmInstantiatedShutdownBehavior": ex_vm_initiated_shutdown_behavior}) + data.update({ + "VmInstantiatedShutdownBehavior": + ex_vm_initiated_shutdown_behavior + }) if ex_vm_type is not None: data.update({"VmType": ex_vm_type}) if ex_subnet_id is not None: @@ -445,8 +454,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - vm = requests.post(endpoint, data=data, headers=headers).json()["Vms"][0] - + response = requests.post(endpoint, data=data, headers=headers) + vm = response.json()["Vms"][0] return self._to_node(vm) def reboot_node(self, node: Node): @@ -466,7 +475,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return False return False @@ -482,8 +492,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - vms = requests.post(endpoint, data=ex_data, headers=headers).json()["Vms"] - return self._to_nodes(vms) + vms = requests.post(endpoint, data=ex_data, headers=headers) + return self._to_nodes(vms.json()["Vms"]) def destroy_node(self, node: Node): """ @@ -501,7 +511,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return True return False @@ -587,8 +598,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - image = requests.post(endpoint, data=data, headers=headers).json()["Image"] - return self._to_node_images(image) + image = requests.post(endpoint, data=data, headers=headers).json() + return self._to_node_image(image["Image"]) def list_images(self, ex_data: str = "{}"): """ @@ -602,8 +613,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - images = requests.post(endpoint, data=ex_data, headers=headers).json()["Images"] - return self._to_node_images(images) + images = requests.post(endpoint, data=ex_data, headers=headers).json() + return self._to_node_images(images["Images"]) def get_image(self, image_id: str): """ @@ -621,8 +632,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - images = requests.post(endpoint, data=data, headers=headers).json()["Images"] - return self._to_node_image(images) + images = requests.post(endpoint, data=data, headers=headers).json() + return self._to_node_image(images["Images"]) def delete_image(self, node_image: NodeImage): """ @@ -640,7 +651,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return True return False @@ -648,7 +660,9 @@ class OutscaleNodeDriver(NodeDriver): return [self._to_key_pair(key_pair) for key_pair in key_pairs] def _to_key_pair(self, key_pair): - private_key = key_pair["PrivateKey"] if "PrivateKey" in key_pair else "" + private_key = "" + if "PrivateKey" in key_pair: + private_key = key_pair["PrivateKey"] return KeyPair( name=key_pair["KeypairName"], public_key="", @@ -704,8 +718,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - key_pairs = requests.post(endpoint, data=ex_data, headers=headers).json() - return self._to_key_pairs(key_pairs["Keypairs"]) + key_pairs = requests.post(endpoint, data=ex_data, headers=headers) + return self._to_key_pairs(key_pairs.json()["Keypairs"]) def get_key_pair(self, name: str): """ @@ -724,14 +738,15 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - key_pair = requests.post(endpoint, data=data, headers=headers).json()["Keypairs"][0] - return self._to_key_pair(key_pair) + key_pair = requests.post(endpoint, data=data, headers=headers).json() + return self._to_key_pair(key_pair["Keypairs"][0]) def delete_key_pair(self, key_pair: KeyPair): """ Delete an image. - :param key_pair: the name of the keypair you want to delete (required) + :param key_pair: the name of the keypair + you want to delete (required) :type key_pair: ``KeyPair`` :return: boolean @@ -743,7 +758,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return True return False @@ -814,8 +830,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - snapshot = requests.post(endpoint, data=data, headers=headers).json()["Volume"] - return self._to_snapshot(snapshot) + snapshot = requests.post(endpoint, data=data, headers=headers) + return self._to_snapshot(snapshot.json()["Volume"]) def list_snapshots(self, ex_data: str = "{}"): """ @@ -829,9 +845,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - snapshots = requests.post(endpoint, data=ex_data, headers=headers).json() - - return self._to_snapshots(snapshots) + snapshots = requests.post(endpoint, data=ex_data, headers=headers) + return self._to_snapshots(snapshots.json()["Snapshots"]) def destroy_volume_snapshot(self, snapshot: VolumeSnapshot): """ @@ -839,10 +854,10 @@ class OutscaleNodeDriver(NodeDriver): :param snapshot: the ID of the snapshot you want to delete (required) - :type snapshot: ``str`` + :type snapshot: ``VolumeSnapshot`` :return: request - :rtype: ``dict`` + :rtype: ``bool`` """ action = "DeleteSnapshot" data = '{"SnapshotId": "' + snapshot.id + '"}' @@ -850,7 +865,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return True return False @@ -914,8 +930,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - volume = requests.post(endpoint, data=data, headers=headers).json()["Volume"] - return self._to_volume(volume) + volume = requests.post(endpoint, data=data, headers=headers) + return self._to_volume(volume.json()["Volume"]) def list_volumes(self, ex_data: str = "{}"): """ @@ -929,8 +945,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - volumes = requests.post(endpoint, data=ex_data, headers=headers).json()["Volumes"] - return self._to_volumes(volumes) + volumes = requests.post(endpoint, data=ex_data, headers=headers) + return self._to_volumes(volumes.json()["Volumes"]) def destroy_volume(self, volume: StorageVolume): """ @@ -938,10 +954,10 @@ class OutscaleNodeDriver(NodeDriver): :param volume: the ID of the volume you want to delete (required) - :type volume: ``str`` + :type volume: ``StorageVolume`` :return: request - :rtype: ``dict`` + :rtype: ``bool`` """ action = "DeleteVolume" data = '{"VolumeId": "' + volume.id + '"}' @@ -949,21 +965,27 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return True return False - def attach_volume(self, node: Node, volume: StorageVolume, device: str = None): + def attach_volume( + self, + node: Node, + volume: StorageVolume, + device: str = None + ): """ Attach a volume. :param node: the ID of the VM you want to attach the volume to (required) - :type node: ``str`` + :type node: ``Node`` :param volume: the ID of the volume you want to attach (required) - :type volume: ``str`` + :type volume: ``StorageVolume`` :param device: the name of the device (required) :type device: ``str`` @@ -981,7 +1003,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return True return False @@ -1017,7 +1040,8 @@ class OutscaleNodeDriver(NodeDriver): endpoint = self._get_outscale_endpoint(self.region, self.version, action) - if requests.post(endpoint, data=data, headers=headers).status_code == 200: + response = requests.post(endpoint, data=data, headers=headers) + if response.status_code == 200: return True return False @@ -1029,18 +1053,22 @@ class OutscaleNodeDriver(NodeDriver): action ) - def _ex_generate_headers(self, action: str, data: dict): - return self.signer.get_request_headers(action=action, - data=data, - service_name=self.service_name, - region=self.region) + def _ex_generate_headers(self, action: str, data: str): + return self.signer.get_request_headers( + action=action, + data=data, + service_name=self.service_name, + region=self.region + ) def _to_location(self, region): - return NodeLocation(id="", - name=region["RegionName"], - country="", - driver=self, - extra=region) + return NodeLocation( + id="", + name=region["RegionName"], + country="", + driver=self, + extra=region + ) def _to_locations(self, regions: list): return [self._to_location(region) for region in regions] @@ -1053,7 +1081,7 @@ class OutscaleNodeDriver(NodeDriver): return VolumeSnapshot( id=snapshot["SnapshotId"], name=name, - size=snapshot["Size"], + size=snapshot["VolumeSize"], driver=self, state=snapshot["State"], created=None,
