From 3c353131873ab8b5d33faa656c0d8e181fbc464a Mon Sep 17 00:00:00 2001 From: Max Illfelder Date: Tue, 23 Feb 2016 11:24:32 -0800 Subject: [PATCH] Support not using standard projects on images get. Support families from copy image. --- libcloud/compute/drivers/gce.py | 25 +++++++++++++++++++------ libcloud/test/compute/test_gce.py | 10 +++++++++- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/libcloud/compute/drivers/gce.py b/libcloud/compute/drivers/gce.py index c3fcf6b64c..7b4960d1b4 100644 --- a/libcloud/compute/drivers/gce.py +++ b/libcloud/compute/drivers/gce.py @@ -4060,7 +4060,8 @@ def ex_get_forwarding_rule(self, name, region=None, global_rule=False): response = self.connection.request(request, method='GET').object return self._to_forwarding_rule(response) - def ex_get_image(self, partial_name, ex_project_list=None): + def ex_get_image(self, partial_name, ex_project_list=None, + ex_standard_projects=True): """ Return an GCENodeImage object based on the name or link provided. @@ -4068,6 +4069,14 @@ def ex_get_image(self, partial_name, ex_project_list=None): image. :type partial_name: ``str`` + :param ex_project_list: The name of the project to list for images. + Examples include: 'debian-cloud'. + :type ex_project_List: ``str``, ``list`` of ``str``, or ``None`` + + :param ex_standard_projects: If true, check in standard projects if + the image is not found. + :type ex_standard_projects: ``bool`` + :return: GCENodeImage object based on provided information or None if an image with that name is not found. :rtype: :class:`GCENodeImage` or raise ``ResourceNotFoundError`` @@ -4076,7 +4085,7 @@ def ex_get_image(self, partial_name, ex_project_list=None): response = self.connection.request(partial_name, method='GET') return self._to_node_image(response.object) image = self._match_images(ex_project_list, partial_name) - if not image: + if not image and ex_standard_projects: for img_proj, short_list in self.IMAGE_PROJECTS.items(): for short_name in short_list: if partial_name.startswith(short_name): @@ -4319,7 +4328,7 @@ def ex_get_zone(self, name): return None return self._to_zone(response) - def ex_copy_image(self, name, url, description=None): + def ex_copy_image(self, name, url, description=None, family=None): """ Copy an image to your image collection. @@ -4332,6 +4341,9 @@ def ex_copy_image(self, name, url, description=None): :param description: The description of the image :type description: ``str`` + :param family: The family of the image + :type family: ``str`` + :return: NodeImage object based on provided information or None if an image with that name is not found. :rtype: :class:`NodeImage` or ``None`` @@ -4344,6 +4356,7 @@ def ex_copy_image(self, name, url, description=None): image_data = { 'name': name, 'description': description, + 'family': family, 'sourceType': 'RAW', 'rawDisk': { 'source': url, @@ -4490,9 +4503,9 @@ def _match_images(self, project, partial_name): supplied project. If no project is given, it will search your own project. - :param project: The name of the project to search for images. - Examples include: 'debian-cloud' and 'centos-cloud'. - :type project: ``str`` or ``None`` + :param project: The name of the project to search for images. + Examples include: 'debian-cloud' and 'centos-cloud'. + :type project: ``str``, ``list`` of ``str``, or ``None`` :param partial_name: The full name or beginning of a name for an image. diff --git a/libcloud/test/compute/test_gce.py b/libcloud/test/compute/test_gce.py index 15247e3ed6..ef6a158d33 100644 --- a/libcloud/test/compute/test_gce.py +++ b/libcloud/test/compute/test_gce.py @@ -1139,13 +1139,21 @@ def test_ex_get_image(self): image = self.driver.ex_get_image(partial_name, ['debian-cloud']) self.assertEqual(image.name, 'debian-7-wheezy-v20131120') + partial_name = 'debian-7' + self.assertRaises(ResourceNotFoundError, self.driver.ex_get_image, + partial_name, 'suse-cloud', + ex_standard_projects=False) + def test_ex_copy_image(self): name = 'coreos' url = 'gs://storage.core-os.net/coreos/amd64-generic/247.0.0/coreos_production_gce.tar.gz' description = 'CoreOS beta 522.3.0' - image = self.driver.ex_copy_image(name, url, description) + family = 'coreos' + image = self.driver.ex_copy_image(name, url, description=description, + family=family) self.assertTrue(image.name.startswith(name)) self.assertEqual(image.extra['description'], description) + self.assertEqual(image.extra['family'], family) def test_ex_get_route(self): route_name = 'lcdemoroute'