Skip to content

Commit

Permalink
[google compute] adding new DiskType resource
Browse files Browse the repository at this point in the history
  • Loading branch information
erjohnso committed Dec 9, 2014
1 parent 71bf9a3 commit 247491c
Show file tree
Hide file tree
Showing 6 changed files with 292 additions and 0 deletions.
94 changes: 94 additions & 0 deletions libcloud/compute/drivers/gce.py
Expand Up @@ -26,6 +26,7 @@
from libcloud.common.google import GoogleBaseError
from libcloud.common.google import ResourceNotFoundError
from libcloud.common.google import ResourceExistsError
from libcloud.common.types import ProviderError

from libcloud.compute.base import Node, NodeDriver, NodeImage, NodeLocation
from libcloud.compute.base import NodeSize, StorageVolume, VolumeSnapshot
Expand Down Expand Up @@ -76,6 +77,24 @@ def __init__(self, user_id, key, secure, auth_type=None,
project)


class GCEDiskType(UuidMixin):
"""A GCE DiskType resource."""
def __init__(self, id, name, zone, driver, extra=None):
self.id = str(id)
self.name = name
self.zone = zone
self.driver = driver
self.extra = extra
UuidMixin.__init__(self)

def destroy(self):
raise ProviderError("Can not destroy a DiskType resource.")

def __repr__(self):
return '<GCEDiskType id="%s" name="%s" zone="%s">' % (
self.id, self.name, self.zone)


class GCEAddress(UuidMixin):
"""A GCE Static address."""
def __init__(self, id, name, address, region, driver, extra=None):
Expand Down Expand Up @@ -621,6 +640,38 @@ def __init__(self, user_id, key=None, datacenter=None, project=None,
else:
self.region = None

def ex_list_disktypes(self, zone=None):
"""
Return a list of DiskTypes for a zone or all.
:keyword zone: The zone to return DiskTypes from. For example:
'us-central1-a'. If None, will return DiskTypes from
self.zone. If 'all', will return all DiskTypes.
:type zone: ``str`` or ``None``
:return: A list of static DiskType objects.
:rtype: ``list`` of :class:`GCEDiskType`
"""
list_disktypes = []
zone = self._set_zone(zone)
if zone is None:
request = '/aggregated/diskTypes'
else:
request = '/zones/%s/diskTypes' % (zone.name)
response = self.connection.request(request, method='GET').object

if 'items' in response:
# The aggregated result returns dictionaries for each region
if zone is None:
for v in response['items'].values():
zone_disktypes = [self._to_disktype(a) for a in
v.get('diskTypes', [])]
list_disktypes.extend(zone_disktypes)
else:
list_disktypes = [self._to_disktype(a) for a in
response['items']]
return list_disktypes

def ex_list_addresses(self, region=None):
"""
Return a list of static addresses for a region or all.
Expand Down Expand Up @@ -2446,6 +2497,25 @@ def destroy_volume_snapshot(self, snapshot):
self.connection.async_request(request, method='DELETE')
return True

def ex_get_disktype(self, name, zone=None):
"""
Return a DiskType object based on a name and optional zone.
:param name: The name of the DiskType
:type name: ``str``
:keyword zone: The zone to search for the DiskType in (set to
'all' to search all zones)
:type zone: ``str`` :class:`GCEZone` or ``None``
:return: A DiskType object for the name
:rtype: :class:`GCEDiskType`
"""
zone = self._set_zone(zone)
request = '/zones/%s/diskTypes/%s' % (zone.name, name)
response = self.connection.request(request, method='GET').object
return self._to_disktype(response)

def ex_get_address(self, name, region=None):
"""
Return an Address object based on an address name and optional region.
Expand Down Expand Up @@ -3269,6 +3339,30 @@ def _create_vol_req(self, size, name, location=None, snapshot=None,

return request, volume_data, params

def _to_disktype(self, disktype):
"""
Return a DiskType object from the json-response dictionary.
:param disktype: The dictionary describing the disktype.
:type disktype: ``dict``
:return: DiskType object
:rtype: :class:`GCEDiskType`
"""
extra = {}

zone = self.ex_get_zone(disktype['zone'])

extra['selfLink'] = disktype.get('selfLink')
extra['creationTimestamp'] = disktype.get('creationTimestamp')
extra['description'] = disktype.get('description')
extra['valid_disk_size'] = disktype.get('validDiskSize')
extra['default_disk_size_gb'] = disktype.get('defaultDiskSizeGb')
type_id = "%s:%s" % (zone.name, disktype['name'])

return GCEDiskType(id=type_id, name=disktype['name'],
zone=zone, driver=self, extra=extra)

def _to_address(self, address):
"""
Return an Address object from the json-response dictionary.
Expand Down
113 changes: 113 additions & 0 deletions libcloud/test/compute/fixtures/gce/aggregated_disktypes.json
@@ -0,0 +1,113 @@
{
"kind": "compute#diskTypeAggregatedList",
"selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/aggregated/diskTypes",
"items": {
"zones/us-central1-a": {
"diskTypes": [
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.529-07:00",
"name": "pd-ssd",
"description": "SSD Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/diskTypes/pd-ssd",
"defaultDiskSizeGb": "100"
},
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.529-07:00",
"name": "local-ssd",
"description": "Local SSD",
"validDiskSize": "375GB-375",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/diskTypes/local-ssd",
"defaultDiskSizeGb": "375"
},
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.530-07:00",
"name": "pd-standard",
"description": "Standard Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/diskTypes/pd-standard",
"defaultDiskSizeGb": "500"
}
]
},
"zones/us-central1-b": {
"diskTypes": [
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.529-07:00",
"name": "pd-ssd",
"description": "SSD Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-b",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-b/diskTypes/pd-ssd",
"defaultDiskSizeGb": "100"
},
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.530-07:00",
"name": "pd-standard",
"description": "Standard Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-b",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-b/diskTypes/pd-standard",
"defaultDiskSizeGb": "500"
}
]
},
"zones/europe-west1-a": {
"diskTypes": [
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.529-07:00",
"name": "pd-ssd",
"description": "SSD Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/diskTypes/pd-ssd",
"defaultDiskSizeGb": "100"
},
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.530-07:00",
"name": "pd-standard",
"description": "Standard Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-a/diskTypes/pd-standard",
"defaultDiskSizeGb": "500"
}
]
},
"zones/europe-west1-b": {
"diskTypes": [
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.529-07:00",
"name": "pd-ssd",
"description": "SSD Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-b",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-b/diskTypes/pd-ssd",
"defaultDiskSizeGb": "100"
},
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.530-07:00",
"name": "pd-standard",
"description": "Standard Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-b",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/europe-west1-b/diskTypes/pd-standard",
"defaultDiskSizeGb": "500"
}
]
}
}
}

@@ -0,0 +1,28 @@
{
"kind": "compute#diskTypeList",
"selfLink": "https://www.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/diskTypes",
"id": "projects/project_name/zones/us-central1-a/diskTypes",
"items": [
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.529-07:00",
"name": "pd-ssd",
"description": "SSD Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/diskTypes/pd-ssd",
"defaultDiskSizeGb": "100"
},
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.530-07:00",
"name": "pd-standard",
"description": "Standard Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/diskTypes/pd-standard",
"defaultDiskSizeGb": "500"
}
]
}

@@ -0,0 +1,10 @@
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.529-07:00",
"name": "pd-ssd",
"description": "SSD Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/diskTypes/pd-ssd",
"defaultDiskSizeGb": "100"
}
@@ -0,0 +1,10 @@
{
"kind": "compute#diskType",
"creationTimestamp": "2014-06-02T11:07:28.529-07:00",
"name": "pd-ssd",
"description": "SSD Persistent Disk",
"validDiskSize": "10GB-10240GB",
"zone": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a",
"selfLink": "https://content.googleapis.com/compute/v1/projects/project_name/zones/us-central1-a/diskTypes/pd-ssd",
"defaultDiskSizeGb": "100"
}
37 changes: 37 additions & 0 deletions libcloud/test/compute/test_gce.py
Expand Up @@ -201,6 +201,19 @@ def test_list_sizes(self):
names = [s.name for s in sizes_all]
self.assertEqual(names.count('n1-standard-1'), 5)

def test_list_disktypes(self):
disktypes = self.driver.ex_list_disktypes()
disktypes_all = self.driver.ex_list_disktypes('all')
disktypes_uc1a = self.driver.ex_list_disktypes('us-central1-a')
self.assertEqual(len(disktypes), 2)
self.assertEqual(len(disktypes_all), 9)
self.assertEqual(len(disktypes_uc1a), 2)
self.assertEqual(disktypes[0].name, 'pd-ssd')
self.assertEqual(disktypes_uc1a[0].name, 'pd-ssd')
names = [v.name for v in disktypes_all]
self.assertTrue('pd-standard' in names)
self.assertTrue('local-ssd' in names)

def test_list_volumes(self):
volumes = self.driver.list_volumes()
volumes_all = self.driver.list_volumes('all')
Expand Down Expand Up @@ -701,6 +714,16 @@ def test_ex_get_volume(self):
self.assertEqual(volume.extra['status'], 'READY')
self.assertEqual(volume.extra['type'], 'pd-ssd')

def test_ex_get_disktype(self):
disktype_name = 'pd-ssd'
disktype_zone = 'us-central1-a'
disktype = self.driver.ex_get_disktype(disktype_name, disktype_zone)
self.assertEqual(disktype.name, disktype_name)
self.assertEqual(disktype.zone.name, disktype_zone)
self.assertEqual(disktype.extra['description'], 'SSD Persistent Disk')
self.assertEqual(disktype.extra['valid_disk_size'], '10GB-10240GB')
self.assertEqual(disktype.extra['default_disk_size_gb'], '100')

def test_ex_get_zone(self):
zone_name = 'us-central1-b'
zone = self.driver.ex_get_zone(zone_name)
Expand Down Expand Up @@ -736,6 +759,10 @@ def _aggregated_addresses(self, method, url, body, headers):
body = self.fixtures.load('aggregated_addresses.json')
return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])

def _aggregated_diskTypes(self, method, url, body, headers):
body = self.fixtures.load('aggregated_disktypes.json')
return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])

def _aggregated_disks(self, method, url, body, headers):
body = self.fixtures.load('aggregated_disks.json')
return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])
Expand Down Expand Up @@ -1185,6 +1212,16 @@ def _zones(self, method, url, body, headers):
body = self.fixtures.load('zones.json')
return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])

def _zones_us_central1_a_diskTypes(self, method, url, body, headers):
if method == 'GET':
body = self.fixtures.load('zones_us-central1-a_diskTypes.json')
return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])

def _zones_us_central1_a_diskTypes_pd_ssd(self, method, url, body, headers):
if method == 'GET':
body = self.fixtures.load('zones_us-central1-a_diskTypes_pd_ssd.json')
return (httplib.OK, body, self.json_hdr, httplib.responses[httplib.OK])

def _zones_us_central1_a_disks(self, method, url, body, headers):
if method == 'POST':
body = self.fixtures.load('zones_us-central1-a_disks_post.json')
Expand Down

0 comments on commit 247491c

Please sign in to comment.