You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2021/11/07 18:24:35 UTC

[libcloud] branch trunk updated (c0d151a -> 748dc59)

This is an automated email from the ASF dual-hosted git repository.

tomaz pushed a change to branch trunk
in repository https://gitbox.apache.org/repos/asf/libcloud.git.


    from c0d151a  Remove pinning we dont need anymore.
     add c69a7ab  Implement compute driver for Vultr API v2
     add 0b70fff  Implement DNS driver for Vultr API v2
     new 76025cb  Remove redundant `is True` checks
     new dc61abd  Prefix non-standard keyword args with ex
     new 35f4499  Change delete_key_pair arg to KeyPair
     new 7e2ecf2  Add type hints
     new 5816dfb  Merge branch 'vultr-api-v2' of https://github.com/dimgal1/libcloud into dimgal1-vultr-api-v2
     new 748dc59  Add changelog entry for #1610.

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CHANGES.rst                                        |   14 +-
 libcloud/common/vultr.py                           |   86 +-
 libcloud/compute/drivers/vultr.py                  | 1049 +++++++++++++++++++-
 libcloud/dns/drivers/vultr.py                      |  342 ++++++-
 .../compute/fixtures/vultr_v2/create_node.json     |   34 +
 .../fixtures/vultr_v2/create_node_bare_metal.json  |   27 +
 .../compute/fixtures/vultr_v2/create_volume.json   |   13 +
 .../fixtures/vultr_v2/ex_create_network.json       |   10 +
 .../fixtures/vultr_v2/ex_create_snapshot.json      |   11 +
 .../compute/fixtures/vultr_v2/ex_get_network.json  |   10 +
 .../compute/fixtures/vultr_v2/ex_get_node.json     |   31 +
 .../compute/fixtures/vultr_v2/ex_get_snapshot.json |   11 +
 .../compute/fixtures/vultr_v2/ex_get_volume.json   |   13 +
 .../ex_list_available_sizes_for_location.json      |   21 +
 .../vultr_v2/ex_list_bare_metal_nodes.json         |   59 ++
 .../vultr_v2/ex_list_bare_metal_sizes.json         |   88 ++
 .../fixtures/vultr_v2/ex_list_networks.json        |   27 +
 .../fixtures/vultr_v2/ex_list_snapshots.json       |   29 +
 .../compute/fixtures/vultr_v2/ex_resize_node.json  |   31 +
 .../compute/fixtures/vultr_v2/get_key_pair.json    |    8 +
 .../vultr_v2/import_key_pair_from_string.json      |    8 +
 .../compute/fixtures/vultr_v2/list_images.json     |  191 ++++
 .../fixtures/vultr_v2/list_images_paginated_1.json |   71 ++
 .../fixtures/vultr_v2/list_images_paginated_2.json |   71 ++
 .../fixtures/vultr_v2/list_images_paginated_3.json |   71 ++
 .../compute/fixtures/vultr_v2/list_key_pairs.json  |   17 +
 .../compute/fixtures/vultr_v2/list_locations.json  |  154 +++
 .../test/compute/fixtures/vultr_v2/list_nodes.json |   98 ++
 .../test/compute/fixtures/vultr_v2/list_sizes.json |  518 ++++++++++
 .../compute/fixtures/vultr_v2/list_volumes.json    |   33 +
 libcloud/test/compute/test_vultr.py                |    8 +-
 libcloud/test/compute/test_vultr_v2.py             |  554 +++++++++++
 .../test/dns/fixtures/vultr_v2/create_record.json  |   10 +
 .../test/dns/fixtures/vultr_v2/create_zone.json    |    6 +
 .../test/dns/fixtures/vultr_v2/get_record.json     |   10 +
 libcloud/test/dns/fixtures/vultr_v2/get_zone.json  |    6 +
 .../test/dns/fixtures/vultr_v2/list_records.json   |   51 +
 .../test/dns/fixtures/vultr_v2/list_zones.json     |   19 +
 libcloud/test/dns/test_vultr.py                    |    9 +-
 libcloud/test/dns/test_vultr_v2.py                 |  153 +++
 40 files changed, 3954 insertions(+), 18 deletions(-)
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/create_node.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/create_node_bare_metal.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/create_volume.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_create_network.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_create_snapshot.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_get_network.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_get_node.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_get_snapshot.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_get_volume.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_list_available_sizes_for_location.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_list_bare_metal_nodes.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_list_bare_metal_sizes.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_list_networks.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_list_snapshots.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/ex_resize_node.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/get_key_pair.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/import_key_pair_from_string.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/list_images.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/list_images_paginated_1.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/list_images_paginated_2.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/list_images_paginated_3.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/list_key_pairs.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/list_locations.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/list_nodes.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/list_sizes.json
 create mode 100644 libcloud/test/compute/fixtures/vultr_v2/list_volumes.json
 create mode 100644 libcloud/test/compute/test_vultr_v2.py
 create mode 100644 libcloud/test/dns/fixtures/vultr_v2/create_record.json
 create mode 100644 libcloud/test/dns/fixtures/vultr_v2/create_zone.json
 create mode 100644 libcloud/test/dns/fixtures/vultr_v2/get_record.json
 create mode 100644 libcloud/test/dns/fixtures/vultr_v2/get_zone.json
 create mode 100644 libcloud/test/dns/fixtures/vultr_v2/list_records.json
 create mode 100644 libcloud/test/dns/fixtures/vultr_v2/list_zones.json
 create mode 100644 libcloud/test/dns/test_vultr_v2.py

[libcloud] 05/06: Merge branch 'vultr-api-v2' of https://github.com/dimgal1/libcloud into dimgal1-vultr-api-v2

Posted by to...@apache.org.
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 5816dfb5273e3838fb42e700ea2e840b8a5367f0
Merge: c0d151a 7e2ecf2
Author: Tomaz Muraus <to...@tomaz.me>
AuthorDate: Sun Nov 7 19:21:24 2021 +0100

    Merge branch 'vultr-api-v2' of https://github.com/dimgal1/libcloud into dimgal1-vultr-api-v2

 libcloud/common/vultr.py                           |   86 +-
 libcloud/compute/drivers/vultr.py                  | 1049 +++++++++++++++++++-
 libcloud/dns/drivers/vultr.py                      |  342 ++++++-
 .../compute/fixtures/vultr_v2/create_node.json     |   34 +
 .../fixtures/vultr_v2/create_node_bare_metal.json  |   27 +
 .../compute/fixtures/vultr_v2/create_volume.json   |   13 +
 .../fixtures/vultr_v2/ex_create_network.json       |   10 +
 .../fixtures/vultr_v2/ex_create_snapshot.json      |   11 +
 .../compute/fixtures/vultr_v2/ex_get_network.json  |   10 +
 .../compute/fixtures/vultr_v2/ex_get_node.json     |   31 +
 .../compute/fixtures/vultr_v2/ex_get_snapshot.json |   11 +
 .../compute/fixtures/vultr_v2/ex_get_volume.json   |   13 +
 .../ex_list_available_sizes_for_location.json      |   21 +
 .../vultr_v2/ex_list_bare_metal_nodes.json         |   59 ++
 .../vultr_v2/ex_list_bare_metal_sizes.json         |   88 ++
 .../fixtures/vultr_v2/ex_list_networks.json        |   27 +
 .../fixtures/vultr_v2/ex_list_snapshots.json       |   29 +
 .../compute/fixtures/vultr_v2/ex_resize_node.json  |   31 +
 .../compute/fixtures/vultr_v2/get_key_pair.json    |    8 +
 .../vultr_v2/import_key_pair_from_string.json      |    8 +
 .../compute/fixtures/vultr_v2/list_images.json     |  191 ++++
 .../fixtures/vultr_v2/list_images_paginated_1.json |   71 ++
 .../fixtures/vultr_v2/list_images_paginated_2.json |   71 ++
 .../fixtures/vultr_v2/list_images_paginated_3.json |   71 ++
 .../compute/fixtures/vultr_v2/list_key_pairs.json  |   17 +
 .../compute/fixtures/vultr_v2/list_locations.json  |  154 +++
 .../test/compute/fixtures/vultr_v2/list_nodes.json |   98 ++
 .../test/compute/fixtures/vultr_v2/list_sizes.json |  518 ++++++++++
 .../compute/fixtures/vultr_v2/list_volumes.json    |   33 +
 libcloud/test/compute/test_vultr.py                |    8 +-
 libcloud/test/compute/test_vultr_v2.py             |  554 +++++++++++
 .../test/dns/fixtures/vultr_v2/create_record.json  |   10 +
 .../test/dns/fixtures/vultr_v2/create_zone.json    |    6 +
 .../test/dns/fixtures/vultr_v2/get_record.json     |   10 +
 libcloud/test/dns/fixtures/vultr_v2/get_zone.json  |    6 +
 .../test/dns/fixtures/vultr_v2/list_records.json   |   51 +
 .../test/dns/fixtures/vultr_v2/list_zones.json     |   19 +
 libcloud/test/dns/test_vultr.py                    |    9 +-
 libcloud/test/dns/test_vultr_v2.py                 |  153 +++
 39 files changed, 3942 insertions(+), 16 deletions(-)

[libcloud] 04/06: Add type hints

Posted by to...@apache.org.
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 7e2ecf2e48e1b988463a021849ca4ae85991e055
Author: Dimitris Galanis <di...@gmail.com>
AuthorDate: Sun Nov 7 19:52:31 2021 +0200

    Add type hints
---
 libcloud/common/vultr.py          |   9 ++-
 libcloud/compute/drivers/vultr.py | 160 ++++++++++++++++++++++++--------------
 libcloud/dns/drivers/vultr.py     |  47 +++++++----
 3 files changed, 144 insertions(+), 72 deletions(-)

diff --git a/libcloud/common/vultr.py b/libcloud/common/vultr.py
index e421702..33ae324 100644
--- a/libcloud/common/vultr.py
+++ b/libcloud/common/vultr.py
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from typing import Dict
+from typing import Dict, Optional, Any
 
 from libcloud.common.base import ConnectionKey, JsonResponse
 from libcloud.compute.base import VolumeSnapshot
@@ -198,7 +198,12 @@ class VultrNetwork:
     Represents information about a Vultr private network.
     """
 
-    def __init__(self, id, cidr_block, location, extra=None):
+    def __init__(self,
+                 id: str,
+                 cidr_block: str,
+                 location: str,
+                 extra: Optional[Dict[str, Any]] = None
+                 ) -> None:
         self.id = id
         self.cidr_block = cidr_block
         self.location = location
diff --git a/libcloud/compute/drivers/vultr.py b/libcloud/compute/drivers/vultr.py
index d164b6b..7409f08 100644
--- a/libcloud/compute/drivers/vultr.py
+++ b/libcloud/compute/drivers/vultr.py
@@ -19,6 +19,7 @@ import time
 import json
 import base64
 from functools import update_wrapper
+from typing import Optional, List, Dict, Union, Any
 
 from libcloud.common.base import ConnectionKey, JsonResponse
 from libcloud.common.types import InvalidCredsError
@@ -1062,7 +1063,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
         'pending': VolumeSnapshotState.CREATING,
     }
 
-    def list_nodes(self, ex_list_bare_metals=True):
+    def list_nodes(self, ex_list_bare_metals: bool = True) -> List[Node]:
         """List all nodes.
 
         :keyword ex_list_bare_metals: Whether to fetch bare metal nodes.
@@ -1078,15 +1079,30 @@ class VultrNodeDriverV2(VultrNodeDriver):
             nodes += self.ex_list_bare_metal_nodes()
         return nodes
 
-    def create_node(self, name, size, location, image=None,
-                    ex_ssh_key_ids=None, ex_private_network_ids=None,
-                    ex_snapshot=None, ex_enable_ipv6=False, ex_backups=False,
-                    ex_userdata=None, ex_ddos_protection=False,
-                    ex_enable_private_network=False, ex_ipxe_chain_url=None,
-                    ex_iso_id=None, ex_script_id=None, ex_image_id=None,
-                    ex_activation_email=False, ex_hostname=None, ex_tag=None,
-                    ex_firewall_group_id=None, ex_reserved_ipv4=None,
-                    ex_persistent_pxe=False):
+    def create_node(self,
+                    name: str,
+                    size: NodeSize,
+                    location: NodeLocation,
+                    image: Optional[NodeImage] = None,
+                    ex_ssh_key_ids: Optional[List[str]] = None,
+                    ex_private_network_ids: Optional[List[str]] = None,
+                    ex_snapshot: Union[VultrNodeSnapshot, str, None] = None,
+                    ex_enable_ipv6: bool = False,
+                    ex_backups: bool = False,
+                    ex_userdata: Optional[str] = None,
+                    ex_ddos_protection: bool = False,
+                    ex_enable_private_network: bool = False,
+                    ex_ipxe_chain_url: Optional[str] = None,
+                    ex_iso_id: Optional[str] = None,
+                    ex_script_id: Optional[str] = None,
+                    ex_image_id: Optional[str] = None,
+                    ex_activation_email: bool = False,
+                    ex_hostname: Optional[str] = None,
+                    ex_tag: Optional[str] = None,
+                    ex_firewall_group_id: Optional[str] = None,
+                    ex_reserved_ipv4: Optional[str] = None,
+                    ex_persistent_pxe: bool = False
+                    ) -> Node:
         """Create a new node.
 
         :param name: The new node's name.
@@ -1241,7 +1257,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                                            method='POST')
             return self._to_node(resp.object['instance'])
 
-    def reboot_node(self, node):
+    def reboot_node(self, node: Node) -> bool:
         """Reboot the given node.
 
         :param node: The node to be rebooted.
@@ -1257,7 +1273,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def start_node(self, node):
+    def start_node(self, node: Node) -> bool:
         """Start the given node.
 
         :param node: The node to be started.
@@ -1273,7 +1289,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def stop_node(self, node):
+    def stop_node(self, node: Node) -> bool:
         """Stop the given node.
 
         :param node: The node to be stopped.
@@ -1286,7 +1302,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return self.ex_stop_nodes([node])
 
-    def destroy_node(self, node):
+    def destroy_node(self, node: Node) -> bool:
         """Destroy the given node.
 
         :param node: The node to be destroyed.
@@ -1302,7 +1318,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def list_sizes(self, ex_list_bare_metals=True):
+    def list_sizes(self, ex_list_bare_metals: bool = True) -> List[NodeSize]:
         """List available node sizes.
 
         :keyword ex_list_bare_metals: Whether to fetch bare metal sizes.
@@ -1317,7 +1333,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
             sizes += self.ex_list_bare_metal_sizes()
         return sizes
 
-    def list_images(self):
+    def list_images(self) -> List[NodeImage]:
         """List available node images.
 
         :rtype: ``list`` of :class: `NodeImage`
@@ -1325,7 +1341,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
         data = self._paginated_request('/v2/os', 'os')
         return [self._to_image(item) for item in data]
 
-    def list_locations(self):
+    def list_locations(self) -> List[NodeLocation]:
         """List available node locations.
 
         :rtype: ``list`` of :class: `NodeLocation`
@@ -1333,7 +1349,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
         data = self._paginated_request('/v2/regions', 'regions')
         return [self._to_location(item) for item in data]
 
-    def list_volumes(self):
+    def list_volumes(self) -> List[StorageVolume]:
         """List storage volumes.
 
         :rtype: ``list`` of :class:`StorageVolume`
@@ -1341,7 +1357,11 @@ class VultrNodeDriverV2(VultrNodeDriver):
         data = self._paginated_request('/v2/blocks', 'blocks')
         return [self._to_volume(item) for item in data]
 
-    def create_volume(self, size, name, location):
+    def create_volume(self,
+                      size: int,
+                      name: str,
+                      location: Union[NodeLocation, str],
+                      ) -> StorageVolume:
         """Create a new volume.
 
         :param size: Size of the volume in gigabytes.\
@@ -1372,7 +1392,11 @@ class VultrNodeDriverV2(VultrNodeDriver):
                                        method='POST')
         return self._to_volume(resp.object['block'])
 
-    def attach_volume(self, node, volume, ex_live=True):
+    def attach_volume(self,
+                      node: Node,
+                      volume: StorageVolume,
+                      ex_live: bool = True,
+                      ) -> bool:
         """Attaches volume to node.
 
         :param node: Node to attach volume to.
@@ -1397,7 +1421,10 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def detach_volume(self, volume, ex_live=True):
+    def detach_volume(self,
+                      volume: StorageVolume,
+                      ex_live: bool = True,
+                      ) -> bool:
         """Detaches a volume from a node.
 
         :param volume: Volume to be detached
@@ -1418,7 +1445,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def destroy_volume(self, volume):
+    def destroy_volume(self, volume: StorageVolume) -> bool:
         """Destroys a storage volume.
 
         :param volume: Volume to be destroyed
@@ -1432,7 +1459,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def list_key_pairs(self):
+    def list_key_pairs(self) -> List[KeyPair]:
         """List all the available SSH key pair objects.
 
         :rtype: ``list`` of :class:`KeyPair`
@@ -1440,7 +1467,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
         data = self._paginated_request('/v2/ssh-keys', 'ssh_keys')
         return [self._to_key_pair(item) for item in data]
 
-    def get_key_pair(self, key_id):
+    def get_key_pair(self, key_id: str) -> KeyPair:
         """Retrieve a single key pair.
 
         :param key_id: ID of the key pair to retrieve.
@@ -1451,7 +1478,10 @@ class VultrNodeDriverV2(VultrNodeDriver):
         resp = self.connection.request('/v2/ssh-keys/%s' % key_id)
         return self._to_key_pair(resp.object['ssh_key'])
 
-    def import_key_pair_from_string(self, name, key_material):
+    def import_key_pair_from_string(self,
+                                    name: str,
+                                    key_material: str
+                                    ) -> KeyPair:
         """Import a new public key from string.
 
         :param name: Key pair name.
@@ -1471,7 +1501,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                                        method='POST')
         return self._to_key_pair(resp.object['ssh_key'])
 
-    def delete_key_pair(self, key_pair):
+    def delete_key_pair(self, key_pair: KeyPair) -> bool:
         """Delete existing key pair.
 
         :param key_pair: The key pair object to delete.
@@ -1486,7 +1516,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def ex_list_bare_metal_nodes(self):
+    def ex_list_bare_metal_nodes(self) -> List[Node]:
         """List all bare metal nodes.
 
         :return:  list of node objects
@@ -1495,7 +1525,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
         data = self._paginated_request('/v2/bare-metals', 'bare_metals')
         return [self._to_node(item) for item in data]
 
-    def ex_reboot_bare_metal_node(self, node):
+    def ex_reboot_bare_metal_node(self, node: Node) -> bool:
         """Reboot the given bare metal node.
 
         :param node: The bare metal node to be rebooted.
@@ -1508,7 +1538,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def ex_resize_node(self, node, size):
+    def ex_resize_node(self, node: Node, size: NodeSize) -> bool:
         """Change size for the given node, only applicable for VPS nodes.
 
         :param node: The node to be resized.
@@ -1525,7 +1555,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                                        method='PATCH')
         return self._to_node(resp.object['instance'])
 
-    def ex_start_bare_metal_node(self, node):
+    def ex_start_bare_metal_node(self, node: Node) -> bool:
         """Start the given bare metal node.
 
         :param node: The bare metal node to be started.
@@ -1538,7 +1568,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def ex_stop_bare_metal_node(self, node):
+    def ex_stop_bare_metal_node(self, node: Node) -> bool:
         """Stop the given bare metal node.
 
         :param node: The bare metal node to be stopped.
@@ -1551,7 +1581,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def ex_destroy_bare_metal_node(self, node):
+    def ex_destroy_bare_metal_node(self, node: Node) -> bool:
         """Destroy the given bare metal node.
 
         :param node: The bare metal node to be destroyed.
@@ -1564,7 +1594,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def ex_get_node(self, node_id):
+    def ex_get_node(self, node_id: str) -> Node:
         """Retrieve a node object.
 
         :param node_id: ID of the node to retrieve.
@@ -1575,7 +1605,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
         resp = self.connection.request('/v2/instances/%s' % node_id)
         return self._to_node(resp.object['instance'])
 
-    def ex_stop_nodes(self, nodes):
+    def ex_stop_nodes(self, nodes: List[Node]) -> bool:
         """Stops all the nodes given.
 
         : param nodes: A list of the nodes to stop.
@@ -1593,7 +1623,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def ex_list_bare_metal_sizes(self):
+    def ex_list_bare_metal_sizes(self) -> List[NodeSize]:
         """List bare metal sizes.
 
         :rtype: ``list`` of :class: `NodeSize`
@@ -1601,7 +1631,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
         data = self._paginated_request('/v2/plans-metal', 'plans_metal')
         return [self._to_size(item) for item in data]
 
-    def ex_list_snapshots(self):
+    def ex_list_snapshots(self) -> List[VultrNodeSnapshot]:
         """List node snapshots.
 
         :rtype: ``list`` of :class: `VultrNodeSnapshot`
@@ -1609,7 +1639,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
         data = self._paginated_request('/v2/snapshots', 'snapshots')
         return [self._to_snapshot(item) for item in data]
 
-    def ex_get_snapshot(self, snapshot_id):
+    def ex_get_snapshot(self, snapshot_id: str) -> VultrNodeSnapshot:
         """Retrieve a snapshot.
 
         :param snapshot_id: ID of the snapshot to retrieve.
@@ -1620,7 +1650,10 @@ class VultrNodeDriverV2(VultrNodeDriver):
         resp = self.connection.request('/v2/snapshots/%s' % snapshot_id)
         return self._to_snapshot(resp.object['snapshot'])
 
-    def ex_create_snapshot(self, node, description=None):
+    def ex_create_snapshot(self,
+                           node: Node,
+                           description: Optional[str] = None
+                           ) -> VultrNodeSnapshot:
         """Create snapshot from a node.
 
         :param node: Node to create the snapshot from.
@@ -1643,7 +1676,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return self._to_snapshot(resp.object['snapshot'])
 
-    def ex_delete_snapshot(self, snapshot):
+    def ex_delete_snapshot(self, snapshot: VultrNodeSnapshot) -> bool:
         """Delete the given snapshot.
 
         :param snapshot: The snapshot to delete.
@@ -1657,7 +1690,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def ex_list_networks(self):
+    def ex_list_networks(self) -> List[VultrNetwork]:
         """List all private networks.
 
         :rtype: ``list`` of :class: `VultrNetwork`
@@ -1666,7 +1699,11 @@ class VultrNodeDriverV2(VultrNodeDriver):
         data = self._paginated_request('/v2/private-networks', 'networks')
         return [self._to_network(item) for item in data]
 
-    def ex_create_network(self, cidr_block, location, description=None):
+    def ex_create_network(self,
+                          cidr_block: str,
+                          location: Union[NodeLocation, str],
+                          description: Optional[str] = None,
+                          ) -> VultrNetwork:
         """Create a private network.
 
         :param cidr_block: The CIDR block assigned to the network.
@@ -1700,7 +1737,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return self._to_network(resp.object['network'])
 
-    def ex_get_network(self, network_id):
+    def ex_get_network(self, network_id: str) -> VultrNetwork:
         """Retrieve a private network.
 
         :param network_id: ID of the network to retrieve.
@@ -1712,7 +1749,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
         resp = self.connection.request('/v2/private-networks/%s' % network_id)
         return self._to_network(resp.object['network'])
 
-    def ex_destroy_network(self, network):
+    def ex_destroy_network(self, network: VultrNetwork) -> bool:
         """Delete a private network.
 
         :param network: The network to destroy.
@@ -1725,7 +1762,9 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def ex_list_available_sizes_for_location(self, location):
+    def ex_list_available_sizes_for_location(self,
+                                             location: NodeLocation,
+                                             ) -> List[str]:
         """Get a list of available sizes for the given location.
 
         :param location: The location to get available sizes for.
@@ -1738,7 +1777,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                                        % location.id)
         return resp.object['available_plans']
 
-    def ex_get_volume(self, volume_id):
+    def ex_get_volume(self, volume_id: str) -> StorageVolume:
         """Retrieve a single volume.
 
         :param volume_id: The ID of the volume to fetch.
@@ -1751,7 +1790,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return self._to_volume(resp.object['block'])
 
-    def ex_resize_volume(self, volume, size):
+    def ex_resize_volume(self, volume: StorageVolume, size: int) -> bool:
         """Resize a volume.
 
         :param volume: The volume to resize.
@@ -1773,7 +1812,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                                        method='PATCH')
         return resp.success()
 
-    def _is_bare_metal(self, size):
+    def _is_bare_metal(self, size: Union[NodeSize, str]) -> bool:
         try:
             size_id = size.id
         except AttributeError:
@@ -1781,7 +1820,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return size_id.startswith('vbm')
 
-    def _to_node(self, data):
+    def _to_node(self, data: Dict[str, Any]) -> Node:
         id_ = data['id']
         name = data['label']
         public_ips = data['main_ip'].split() + data['v6_main_ip'].split()
@@ -1830,7 +1869,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                     extra=extra,
                     created_at=created_at)
 
-    def _to_volume(self, data):
+    def _to_volume(self, data: Dict[str, Any]) -> StorageVolume:
         id_ = data['id']
         name = data['label']
         size = data['size_gb']
@@ -1852,7 +1891,10 @@ class VultrNodeDriverV2(VultrNodeDriver):
                              state=state,
                              extra=extra)
 
-    def _get_node_state(self, state, power_state=None):
+    def _get_node_state(self,
+                        state: str,
+                        power_state: Optional[str] = None,
+                        ) -> NodeState:
         try:
             state = self.NODE_STATE_MAP[state]
         except KeyError:
@@ -1865,7 +1907,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
             state = NodeState.STOPPED
         return state
 
-    def _to_key_pair(self, data):
+    def _to_key_pair(self, data: Dict[str, Any]) -> KeyPair:
         name = data['name']
         public_key = data['ssh_key']
         # requires cryptography module
@@ -1884,7 +1926,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                        extra=extra,
                        )
 
-    def _to_location(self, data):
+    def _to_location(self, data: Dict[str, Any]) -> NodeLocation:
         id_ = data['id']
         name = data['city']
         country = data['country']
@@ -1899,7 +1941,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                             extra=extra
                             )
 
-    def _to_image(self, data):
+    def _to_image(self, data: Dict[str, Any]) -> NodeImage:
         id_ = data['id']
         name = data['name']
         extra = {
@@ -1911,7 +1953,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                          driver=self,
                          extra=extra)
 
-    def _to_size(self, data):
+    def _to_size(self, data: Dict[str, Any]) -> NodeSize:
         id_ = data['id']
         ram = data['ram']
         disk = data['disk']
@@ -1942,7 +1984,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                         driver=self,
                         extra=extra)
 
-    def _to_network(self, data):
+    def _to_network(self, data: Dict[str, Any]) -> VultrNetwork:
         id_ = data['id']
         cidr_block = '%s/%s' % (data['v4_subnet'], data['v4_subnet_mask'])
         location = data['region']
@@ -1955,7 +1997,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                             location=location,
                             extra=extra)
 
-    def _to_snapshot(self, data):
+    def _to_snapshot(self, data: Dict[str, Any]) -> VultrNodeSnapshot:
         id_ = data['id']
         created = data['date_created']
         # Size is returned in bytes, convert to GBs
@@ -1976,7 +2018,11 @@ class VultrNodeDriverV2(VultrNodeDriver):
                                  extra=extra,
                                  driver=self)
 
-    def _paginated_request(self, url, key, params=None):
+    def _paginated_request(self,
+                           url: str,
+                           key: str,
+                           params: Optional[Dict[str, Any]] = None
+                           ) -> List[Any]:
         """Perform multiple calls to get the full list of items when
         the API responses are paginated.
 
diff --git a/libcloud/dns/drivers/vultr.py b/libcloud/dns/drivers/vultr.py
index 1dee6c2..3e6551f 100644
--- a/libcloud/dns/drivers/vultr.py
+++ b/libcloud/dns/drivers/vultr.py
@@ -16,6 +16,7 @@
 Vultr DNS Driver
 """
 import json
+from typing import Optional, List, Dict, Any
 
 from libcloud.utils.py3 import urlencode
 from libcloud.common.vultr import VultrConnection
@@ -431,7 +432,7 @@ class VultrDNSDriverV2(VultrDNSDriver):
         RecordType.SSHFP: 'SSHFP',
     }
 
-    def list_zones(self):
+    def list_zones(self) -> List[Zone]:
         """Return a list of zones.
 
         :return: ``list`` of :class:`Zone`
@@ -439,7 +440,7 @@ class VultrDNSDriverV2(VultrDNSDriver):
         data = self._paginated_request('/v2/domains', 'domains')
         return [self._to_zone(item) for item in data]
 
-    def get_zone(self, zone_id):
+    def get_zone(self, zone_id: str) -> Zone:
         """Return a Zone instance.
 
         :param zone_id: ID of the required zone
@@ -450,7 +451,12 @@ class VultrDNSDriverV2(VultrDNSDriver):
         resp = self.connection.request('/v2/domains/%s' % zone_id)
         return self._to_zone(resp.object['domain'])
 
-    def create_zone(self, domain, type='master', ttl=None, extra=None):
+    def create_zone(self,
+                    domain: str,
+                    type: str = 'master',
+                    ttl: Optional[int] = None,
+                    extra: Optional[Dict[str, Any]] = None,
+                    ) -> Zone:
         """Create a new zone.
 
         :param domain: Zone domain name (e.g. example.com)
@@ -486,7 +492,7 @@ class VultrDNSDriverV2(VultrDNSDriver):
                                        method='POST')
         return self._to_zone(resp.object['domain'])
 
-    def delete_zone(self, zone):
+    def delete_zone(self, zone: Zone) -> bool:
         """Delete a zone.
 
         Note: This will delete all the records belonging to this zone.
@@ -500,7 +506,7 @@ class VultrDNSDriverV2(VultrDNSDriver):
                                        method='DELETE')
         return resp.success()
 
-    def list_records(self, zone):
+    def list_records(self, zone: Zone) -> List[Record]:
         """Return a list of records for the provided zone.
 
         :param zone: Zone to list records for.
@@ -512,7 +518,7 @@ class VultrDNSDriverV2(VultrDNSDriver):
                                        'records')
         return [self._to_record(item, zone) for item in data]
 
-    def get_record(self, zone_id, record_id):
+    def get_record(self, zone_id: str, record_id: str) -> Record:
         """Return a Record instance.
 
         :param zone_id: ID of the required zone
@@ -536,7 +542,13 @@ class VultrDNSDriverV2(VultrDNSDriver):
 
         return self._to_record(resp.object['record'], zone)
 
-    def create_record(self, name, zone, type, data, extra=None):
+    def create_record(self,
+                      name: str,
+                      zone: Zone,
+                      type: RecordType,
+                      data: str,
+                      extra: Optional[Dict[str, Any]] = None
+                      ) -> Record:
         """Create a new record.
 
         :param name: Record name without the domain name (e.g. www).
@@ -579,8 +591,13 @@ class VultrDNSDriverV2(VultrDNSDriver):
 
         return self._to_record(resp.object['record'], zone)
 
-    def update_record(self, record, name=None, type=None,
-                      data=None, extra=None):
+    def update_record(self,
+                      record: Record,
+                      name: Optional[str] = None,
+                      type: Optional[RecordType] = None,
+                      data: Optional[str] = None,
+                      extra: Optional[Dict[str, Any]] = None
+                      ) -> bool:
         """Update an existing record.
 
         :param record: Record to update.
@@ -626,7 +643,7 @@ class VultrDNSDriverV2(VultrDNSDriver):
 
         return resp.success()
 
-    def delete_record(self, record):
+    def delete_record(self, record: Record) -> bool:
         """Delete a record.
 
         :param record: Record to delete.
@@ -640,7 +657,7 @@ class VultrDNSDriverV2(VultrDNSDriver):
 
         return resp.success()
 
-    def _to_zone(self, data):
+    def _to_zone(self, data: Dict[str, Any]) -> Zone:
         type_ = 'master'
         domain = data['domain']
         extra = {
@@ -653,7 +670,7 @@ class VultrDNSDriverV2(VultrDNSDriver):
                     ttl=None,
                     extra=extra)
 
-    def _to_record(self, data, zone):
+    def _to_record(self, data: Dict[str, Any], zone: Zone) -> Record:
         id_ = data['id']
         name = data['name']
         type_ = self._string_to_record_type(data['type'])
@@ -672,7 +689,11 @@ class VultrDNSDriverV2(VultrDNSDriver):
                       zone=zone,
                       extra=extra)
 
-    def _paginated_request(self, url, key, params=None):
+    def _paginated_request(self,
+                           url: str,
+                           key: str,
+                           params: Optional[Dict[str, Any]] = None,
+                           ) -> List[Any]:
         """Perform multiple calls to get the full list of items when
         the API responses are paginated.
 

[libcloud] 02/06: Prefix non-standard keyword args with ex

Posted by to...@apache.org.
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 dc61abd06fc6757acad1101cecb45297fb03020c
Author: Dimitris Galanis <di...@gmail.com>
AuthorDate: Sun Nov 7 18:04:12 2021 +0200

    Prefix non-standard keyword args with ex
---
 libcloud/compute/drivers/vultr.py | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/libcloud/compute/drivers/vultr.py b/libcloud/compute/drivers/vultr.py
index 31c9062..2d189d0 100644
--- a/libcloud/compute/drivers/vultr.py
+++ b/libcloud/compute/drivers/vultr.py
@@ -1372,7 +1372,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
                                        method='POST')
         return self._to_volume(resp.object['block'])
 
-    def attach_volume(self, node, volume, live=True):
+    def attach_volume(self, node, volume, ex_live=True):
         """Attaches volume to node.
 
         :param node: Node to attach volume to.
@@ -1381,15 +1381,15 @@ class VultrNodeDriverV2(VultrNodeDriver):
         :param volume: Volume to attach.
         :type volume: :class:`StorageVolume`
 
-        :param live: Attach the volume without restarting the node.
-        :type live: ``bool``
+        :param ex_live: Attach the volume without restarting the node.
+        :type ex_live: ``bool``
 
         :rytpe: ``bool``
         """
 
         data = {
             'instance_id': node.id,
-            'live': live,
+            'live': ex_live,
         }
         resp = self.connection.request('/v2/blocks/%s/attach' % volume.id,
                                        data=json.dumps(data),
@@ -1397,19 +1397,19 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         return resp.success()
 
-    def detach_volume(self, volume, live=True):
+    def detach_volume(self, volume, ex_live=True):
         """Detaches a volume from a node.
 
         :param volume: Volume to be detached
         :type volume: :class:`StorageVolume`
 
-        :param live: Detach the volume without restarting the node.
-        :type live: ``bool``
+        :param ex_live: Detach the volume without restarting the node.
+        :type ex_live: ``bool``
 
         :rtype: ``bool``
         """
         data = {
-            'live': live
+            'live': ex_live
         }
 
         resp = self.connection.request('/v2/blocks/%s/detach' % volume.id,

[libcloud] 01/06: Remove redundant `is True` checks

Posted by to...@apache.org.
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 76025cb1a2287142c3e6a638b13d120ec29e7630
Author: Dimitris Galanis <di...@gmail.com>
AuthorDate: Sun Nov 7 18:01:41 2021 +0200

    Remove redundant `is True` checks
---
 libcloud/compute/drivers/vultr.py | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/libcloud/compute/drivers/vultr.py b/libcloud/compute/drivers/vultr.py
index 501e87d..31c9062 100644
--- a/libcloud/compute/drivers/vultr.py
+++ b/libcloud/compute/drivers/vultr.py
@@ -1074,7 +1074,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
         data = self._paginated_request('/v2/instances', 'instances')
         nodes = [self._to_node(item) for item in data]
 
-        if ex_list_bare_metals is True:
+        if ex_list_bare_metals:
             nodes += self.ex_list_bare_metal_nodes()
         return nodes
 
@@ -1249,7 +1249,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         :rtype: ``bool``
         """
-        if self._is_bare_metal(node.size) is True:
+        if self._is_bare_metal(node.size):
             return self.ex_reboot_bare_metal_node(node)
 
         resp = self.connection.request('/v2/instances/%s/reboot' % node.id,
@@ -1265,7 +1265,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         :rtype: ``bool``
         """
-        if self._is_bare_metal(node.size) is True:
+        if self._is_bare_metal(node.size):
             return self.ex_start_bare_metal_node(node)
 
         resp = self.connection.request('/v2/instances/%s/start' % node.id,
@@ -1281,7 +1281,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         :rtype: ``bool``
         """
-        if self._is_bare_metal(node.size) is True:
+        if self._is_bare_metal(node.size):
             return self.ex_stop_bare_metal_node(node)
 
         return self.ex_stop_nodes([node])
@@ -1294,7 +1294,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
 
         :rtype: ``bool``
         """
-        if self._is_bare_metal(node.size) is True:
+        if self._is_bare_metal(node.size):
             return self.ex_destroy_bare_metal_node(node)
 
         resp = self.connection.request('/v2/instances/%s' % node.id,
@@ -1313,7 +1313,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
         data = self._paginated_request('/v2/plans', 'plans')
         sizes = [self._to_size(item) for item in data]
 
-        if ex_list_bare_metals is True:
+        if ex_list_bare_metals:
             sizes += self.ex_list_bare_metal_sizes()
         return sizes
 
@@ -1803,7 +1803,7 @@ class VultrNodeDriverV2(VultrNodeDriver):
             'os': data['os'],
             'is_bare_metal': is_bare_metal,
         }
-        if is_bare_metal is True:
+        if is_bare_metal:
             state = self._get_node_state(data['status'])
             extra['cpu_count'] = data['cpu_count']
             extra['mac_address'] = data['mac_address']

[libcloud] 03/06: Change delete_key_pair arg to KeyPair

Posted by to...@apache.org.
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 35f4499f8da89940b953e12dbdea659dac3cc3e8
Author: Dimitris Galanis <di...@gmail.com>
AuthorDate: Sun Nov 7 18:14:34 2021 +0200

    Change delete_key_pair arg to KeyPair
---
 libcloud/compute/drivers/vultr.py                           | 11 ++++++-----
 libcloud/test/compute/fixtures/vultr_v2/list_key_pairs.json |  2 +-
 libcloud/test/compute/test_vultr_v2.py                      |  7 ++++---
 3 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/libcloud/compute/drivers/vultr.py b/libcloud/compute/drivers/vultr.py
index 2d189d0..d164b6b 100644
--- a/libcloud/compute/drivers/vultr.py
+++ b/libcloud/compute/drivers/vultr.py
@@ -1471,17 +1471,18 @@ class VultrNodeDriverV2(VultrNodeDriver):
                                        method='POST')
         return self._to_key_pair(resp.object['ssh_key'])
 
-    def delete_key_pair(self, key_id):
+    def delete_key_pair(self, key_pair):
         """Delete existing key pair.
 
-        :param key_id: ID of the key pair to delete.
-        :type  key_id: ``str``
+        :param key_pair: The key pair object to delete.
+        :type key_pair: :class:`.KeyPair`
 
         :rtype: ``bool``
         """
 
-        resp = self.connection.request('/v2/ssh-keys/%s' % key_id,
-                                       method='DELETE')
+        resp = self.connection.request(
+            '/v2/ssh-keys/%s' % key_pair.extra['id'],
+            method='DELETE')
 
         return resp.success()
 
diff --git a/libcloud/test/compute/fixtures/vultr_v2/list_key_pairs.json b/libcloud/test/compute/fixtures/vultr_v2/list_key_pairs.json
index f4414b8..b4e4218 100644
--- a/libcloud/test/compute/fixtures/vultr_v2/list_key_pairs.json
+++ b/libcloud/test/compute/fixtures/vultr_v2/list_key_pairs.json
@@ -1,7 +1,7 @@
 {
     "ssh_keys": [
         {
-            "id": "6d2a787f-4dc5-434e-9ae2-8f54ec5ea5b6",
+            "id": "123",
             "date_created": "2019-09-20T11:14:26+00:00",
             "name": "tester",
             "ssh_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwRaxNA9gsFPVAIq4rkBjTtBAsofSJ0lJS3hPFHiwABpiihu45dcJtcmIqUO2jooVsKCfPJ/KrZ5DqhgPWbHJ/C+ZtHDhZ19jq022nfb+tfqCgwolKd8POlmivtpQdl3AaG4hm/Uh0VICAsrgp1o6EEzRLJE6vWrz4XaIUKYI1idzv/1kF2R9LBb60HXsQaIeV5z0036uy9d55wG+DtwUIpBBfyxevISS9n1kEI+MHi+Ci4D9dmE3SGm+9gDAZ2ZwPjWcAiUnf8SJ5CyA3MwUCa8czPgVMtpt5qZNYxilrGJEpPhnCHwT3YvUbh69F24kMDj2IX9LYjcvUsgIjXuxb"
diff --git a/libcloud/test/compute/test_vultr_v2.py b/libcloud/test/compute/test_vultr_v2.py
index 5ef16ce..f9da81c 100644
--- a/libcloud/test/compute/test_vultr_v2.py
+++ b/libcloud/test/compute/test_vultr_v2.py
@@ -170,7 +170,7 @@ class VultrTestsV2(unittest.TestCase):
         self.assertEqual(key.name, 'tester')
         self.assertIsNone(key.private_key)
         self.assertEqual(key.extra['id'],
-                         '6d2a787f-4dc5-434e-9ae2-8f54ec5ea5b6')
+                         '123')
 
     def test_list_key_pairs_UNAUTHORIZED(self):
         VultrMockHttpV2.type = 'UNAUTHORIZED'
@@ -193,8 +193,9 @@ class VultrTestsV2(unittest.TestCase):
         self.assertIsNone(key.private_key)
 
     def test_delete_key_pair(self):
-        key_id = '123'
-        response = self.driver.delete_key_pair(key_id)
+        keys = self.driver.list_key_pairs()
+        key = keys[0]
+        response = self.driver.delete_key_pair(key)
         self.assertTrue(response)
 
     def test_list_volumes(self):

[libcloud] 06/06: Add changelog entry for #1610.

Posted by to...@apache.org.
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 748dc59d62b451b086443d2efa0e66f58c2a2b93
Author: Tomaz Muraus <to...@tomaz.me>
AuthorDate: Sun Nov 7 19:22:58 2021 +0100

    Add changelog entry for #1610.
    
    Resolves #1609.
---
 CHANGES.rst | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/CHANGES.rst b/CHANGES.rst
index b69911d..8ab5311 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -154,16 +154,21 @@ Compute
 - [OpenStack] Add support for using optional external cache for auth tokens
 
   This cache can be shared by multiple processes which results in much less
-  tokens being allocated when many different instances / processes 
+  tokens being allocated when many different instances / processes
   are utilizing the same set of credentials.
 
-  This functionality can be used by implementing a custom cache class with 
+  This functionality can be used by implementing a custom cache class with
   caching logic (e.g. storing cache context on a local filesystem, external
   system such as Redis or similar) + using ``ex_auth_cache`` driver constructor
   argument.
   (GITHUB-1460, GITHUB-1557)
   [@dpeschman]
 
+- [Vultr] Implement support for Vultr API v2 and update driver to use v2 by
+  default.
+  (GITHUB-1609, GITHUB-1610)
+  [Dimitris Galanis - @dimgal1]
+
 DNS
 ~~~
 
@@ -180,6 +185,11 @@ DNS
   (GITHUB-1571)
   [Gasper Vozel - @karantan]
 
+- [Vultr] Implement support for Vultr API v2 and update driver to use v2 by
+  default.
+  (GITHUB-1609, GITHUB-1610)
+  [Dimitris Galanis - @dimgal1]
+
 Other
 ~~~~~