# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from ecl.block_store.v2 import availability_zone as _availability_zone
from ecl.block_store.v2 import extension as _extension
from ecl.block_store.v2 import limit as _limit
from ecl.block_store.v2 import metadata as _metadata
from ecl.block_store.v2 import quota as _quota
from ecl.block_store.v2 import type as _type
from ecl.block_store.v2 import volume as _volume
from ecl import proxy
[docs]class Proxy(proxy.BaseProxy):
[docs] def types(self):
"""Return a list of types
:returns: A list of Type objects
:rtype: :class:`~ecl.block_store.v2.type.Type`
"""
return list(self._list(_type.Type, paginated=False))
[docs] def find_volume_type(self, name_or_id, ignore_missing=True):
"""Find a volume type
:param name_or_id: The name or ID of a volume type.
:param bool ignore_missing: When set to ``False``
:class:`~ecl.exceptions.ResourceNotFound` will be
raised when the resource does not exist.
When set to ``True``, None will be returned when
attempting to find a nonexistent resource.
:returns: One :class:`~ecl.block_store.v2.type.Type` or None
"""
return self._find(_type.Type, name_or_id,
ignore_missing=ignore_missing)
[docs] def volumes(self):
"""Return a list of volume
:returns: A list of Volume objects
:rtype: :class:`~ecl.block_store.v2.volume.Volume`
"""
return list(self._list(_volume.Volume, paginated=False))
[docs] def get_volume(self, volume):
"""Get a single volume
:param volume: The value can be the ID of a volume or a
:class:`~ecl.volume.v2.volume.Volume` instance.
:returns: One :class:`~ecl.volume.v2.volume.Volume`
:raises: :class:`~ecl.exceptions.ResourceNotFound`
when no resource can be found.
"""
return self._get(_volume.Volume, volume)
[docs] def create_volume(self, size, name=None, description=None,
availability_zone=None, imageRef=None, metadata=None,
snapshot_id=None, volume_type=None, source_volid=None):
"""Create a new volume from attributes
:param int size: size of volume to create
:param string name: name of volume to create
:param string description: description of volume to create
:param string availability_zone: availability zone of volume to create
:param string imageRef: image ID of volume to create from
:param dict metadata: metadata of volume to create
:param string snapshot_id: snapshot ID of volume to create
:param string volume_type: type of volume to create
:param string source_volid: source volume id of volume to create from
:returns: The results of volume creation
:rtype: :class:`~ecl.volume.v2.volume.Volume`
"""
attrs = dict()
attrs.update({"size": size})
if name:
attrs.update({"name": name})
if description:
attrs.update({"description": description})
if availability_zone:
attrs.update({"availability_zone": availability_zone})
if imageRef:
attrs.update({"imageRef": imageRef})
if metadata:
attrs.update({"metadata": metadata})
if snapshot_id:
attrs.update({"snapshot_id": snapshot_id})
if volume_type:
attrs.update({"volume_type": volume_type})
if source_volid:
attrs.update({"source_volid": source_volid})
return self._create(_volume.Volume, **attrs)
[docs] def delete_volume(self, volume, ignore_missing=True):
"""Delete a volume
:param volume: The value can be either the ID of a volume or a
:class:`~ecl.volume.v2.volume.Volume` instance.
:param bool ignore_missing: When set to ``False``
:class:`~ecl.exceptions.ResourceNotFound` will be
raised when the volume does not exist.
When set to ``True``, no exception will be set when
attempting to delete a nonexistent volume.
:returns: ``None``
"""
self._delete(_volume.Volume, volume, ignore_missing=ignore_missing)
[docs] def update_volume(self, volume, **body):
"""Create a new volume from attributes
:param volume: The value can be the ID of a volume or a
:class:`~ecl.volume.v2.volume.Volume` instance.
:param string name: name of volume to update
:param string description: description of volume to update
:returns: The results of volume update
:rtype: :class:`~ecl.volume.v2.volume.Volume`
"""
self._update(_volume.Volume, volume, **body)
[docs] def extend_volume(self, volume, new_size):
"""Extend size of a volume
:param volume: The value can be the ID of a volume or a
:class:`~ecl.volume.v2.volume.Volume` instance.
:param string new_size: size of volume to extend
:returns: The results of volume extend size
:rtype: :class:`~ecl.volume.v2.volume.Volume`
"""
volume = self._get_resource(_volume.Volume, volume)
return volume.extend_size(self.session, new_size)
[docs] def upload_to_image(self, volume, container_format=None,
disk_format=None, image_name=None,
force=False):
"""
:param volume: The value can be the ID of a volume or a
:class:`~ecl.volume.v2.volume.Volume` instance.
:param string container_format: Select one of the following
(bare, ovf, ami, aki, ari)
:param string disk_format: Select one of the following
(raw, vmdk, vdi, qcow2)
:param string image_name: Name of image to upload
:param boolean force: Whether to upload a volume of attached state.
When the state of volume is available,
the value of force option does not affect the operation.
:return: Object describes detail of volume_upload_image
"""
volume = self._get_resource(_volume.Volume, volume)
return volume.upload_to_image(self.session,
container_format=container_format,
disk_format=disk_format,
image_name=image_name,
force=force)
[docs] def update_bootable(self, volume, bootable=False):
"""
:param volume: The value can be the ID of a volume or a
:class:`~ecl.volume.v2.volume.Volume` instance.
:param boolean bootable: bootable status to update
:return: None
"""
volume = self._get_resource(_volume.Volume, volume)
return volume.update_bootable(self.session, bootable)
[docs] def availability_zones(self):
"""Return a list of availability zones
:returns: A list of availability zone
:rtype: :class:`~ecl.block_store.v2.availability_zone.AvailabilityZone`
"""
return list(self._list(_availability_zone.AvailabilityZone, paginated=False))
[docs] def find_availability_zone(self, name_or_id, ignore_missing=True):
"""Find a single availability_zone
:param name_or_id: The name or ID of a availability_zone.
:param bool ignore_missing: When set to ``False``
:class:`~ecl.exceptions.ResourceNotFound` will be
raised when the resource does not exist.
When set to ``True``, None will be returned when
attempting to find a nonexistent resource.
:returns: One :class:`~ecl.block_store.v2.availability_zone.AvailabilityZone` or None
"""
return self._find(_availability_zone.AvailabilityZone, name_or_id,
ignore_missing=ignore_missing)
[docs] def get_quota(self, tenant_id):
"""Get quota info of a tenant
:param tenant_id: The ID for the tenant for which you want to show
quotas. This ID is different from the tenant ID of authentication.
That ID is for the admin tenant.
:returns: One :class:`~ecl.block_store.v2.quota.Quota`
:raises: :class:`~ecl.exceptions.ResourceNotFound`
when no resource can be found.
"""
return self._get(_quota.Quota, tenant_id)
[docs] def get_quota_detail(self, tenant_id, user_id):
"""Get quota info of a tenant
:param tenant_id: The ID for the tenant for which you want to show
quotas. This ID is different from the tenant ID of authentication.
That ID is for the admin tenant.
:param user_id: The user ID. Specify in the URI as a query string
:returns: One :class:`~ecl.block_store.v2.quota.DetailQuota`
:raises: :class:`~ecl.exceptions.ResourceNotFound`
when no resource can be found.
"""
return self._get(_quota.DetailQuota, user_id,
path_args={"tenant_id":tenant_id})
[docs] def get_default_quota(self, tenant_id):
"""Get default quota of a tenant
:param tenant_id: The ID for the tenant for which you want to show
quotas. This ID is different from the tenant ID of authentication.
That ID is for the admin tenant.
:param user_id: The user ID. Specify in the URI as a query string
:returns: One :class:`~ecl.block_store.v2.quota.DefaultQuota`
:raises: :class:`~ecl.exceptions.ResourceNotFound`
when no resource can be found.
"""
return self._get(_quota.DefaultQuota, None,
path_args={"tenant_id": tenant_id})
[docs] def extensions(self):
"""Return a list of Extensions
:returns: A list of Extension objects
:rtype: :class:`~ecl.block_store.v2.extension.Extension`
"""
return list(self._list(_extension.Extension, paginated=False))
[docs] def limits(self):
"""Return a list of Limit
:returns: show Limit objects
:rtype: :class:`~ecl.block_store.v2.limit.Limit`
"""
return self._get(_limit.Limit, None)
[docs] def find_volume(self, name_or_id, ignore_missing=True):
"""Find a single volume
:param name_or_id: The name or ID of a server.
:param bool ignore_missing: When set to ``False``
:class:`~ecl.exceptions.ResourceNotFound` will be
raised when the resource does not exist.
When set to ``True``, None will be returned when
attempting to find a nonexistent resource.
:returns: One :class:`~ecl.compute.v2.volume.Volume` or None
"""
return self._find(_volume.Volume, name_or_id,
ignore_missing=ignore_missing)