181 lines
6.0 KiB
Python
181 lines
6.0 KiB
Python
"""
|
|
Copyright 2013 Rackspace
|
|
|
|
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.
|
|
"""
|
|
|
|
import json
|
|
from xml.etree import ElementTree
|
|
|
|
from cafe.engine.models.base import AutoMarshallingModel
|
|
from cloudcafe.blockstorage.volumes_api.common.models.automarshalling import \
|
|
CommonModelProperties
|
|
|
|
# Import common requests
|
|
from cloudcafe.blockstorage.volumes_api.common.models.requests import \
|
|
StatusResetRequest, VolumeTransferRequest
|
|
|
|
|
|
class VolumeRequest(CommonModelProperties, AutoMarshallingModel):
|
|
|
|
def __init__(
|
|
self, size=None, volume_type=None, name=None,
|
|
description=None, metadata=None, availability_zone=None,
|
|
snapshot_id=None, bootable=None, source_volid=None,
|
|
image_ref=None):
|
|
|
|
super(VolumeRequest, self).__init__()
|
|
self._name = None
|
|
self._description = None
|
|
self.size = size
|
|
self.volume_type = volume_type
|
|
self.name = name
|
|
self.description = description
|
|
self.metadata = metadata or dict()
|
|
self.availability_zone = availability_zone
|
|
self.snapshot_id = snapshot_id
|
|
self.bootable = bootable
|
|
self.source_volid = source_volid
|
|
self.image_ref = image_ref
|
|
|
|
def _obj_to_json(self):
|
|
return json.dumps(self._obj_to_json_dict())
|
|
|
|
def _obj_to_json_dict(self):
|
|
volume_attrs = {
|
|
"size": self.size,
|
|
"volume_type": self.volume_type,
|
|
"name": self.name,
|
|
"description": self.description,
|
|
"metadata": self.metadata,
|
|
"availability_zone": self.availability_zone,
|
|
"bootable": self.bootable,
|
|
"imageRef": self.image_ref,
|
|
"source_volid": self.source_volid,
|
|
"snapshot_id": self.snapshot_id}
|
|
|
|
return {'volume': self._remove_empty_values(volume_attrs)}
|
|
|
|
def _obj_to_xml_ele(self):
|
|
element = ElementTree.Element('volume')
|
|
volume_attrs = {
|
|
"size": self.size,
|
|
"volume_type": self.volume_type,
|
|
"name": self.name,
|
|
"description": self.description,
|
|
"availability_zone": self.availability_zone,
|
|
"bootable": self.bootable,
|
|
"imageRef": self.image_ref,
|
|
"source_volid": self.source_volid,
|
|
"snapshot_id": self.snapshot_id}
|
|
element = self._set_xml_etree_element(element, volume_attrs)
|
|
|
|
if len(self.metadata.keys()) > 0:
|
|
metadata_element = ElementTree.Element('metadata')
|
|
for key in self.metadata.keys():
|
|
meta_element = ElementTree.Element('meta')
|
|
meta_element.set('key', key)
|
|
meta_element.text = self.metadata[key]
|
|
metadata_element.append(meta_element)
|
|
element.append(metadata_element)
|
|
|
|
return element
|
|
|
|
def _obj_to_xml(self):
|
|
return ElementTree.tostring(self._obj_to_xml_ele())
|
|
|
|
|
|
class VolumeSnapshotRequest(CommonModelProperties, AutoMarshallingModel):
|
|
|
|
def __init__(
|
|
self, volume_id, force=True, name=None, description=None):
|
|
|
|
super(VolumeSnapshotRequest, self).__init__()
|
|
self._name = None
|
|
self._description = None
|
|
self.volume_id = volume_id
|
|
self.name = name
|
|
self.description = description
|
|
self.force = force
|
|
|
|
def _obj_to_json(self):
|
|
return json.dumps(self._obj_to_json_dict())
|
|
|
|
def _obj_to_json_dict(self):
|
|
snapshot_attrs = {
|
|
"volume_id": self.volume_id,
|
|
"name": self.name,
|
|
"description": self.description,
|
|
"force": self.force}
|
|
|
|
return {"snapshot": self._remove_empty_values(snapshot_attrs)}
|
|
|
|
def _obj_to_xml(self):
|
|
return ElementTree.tostring(self._obj_to_xml_ele())
|
|
|
|
def _obj_to_xml_ele(self):
|
|
element = ElementTree.Element('snapshot')
|
|
snapshot_attrs = {
|
|
"volume_id": self.volume_id,
|
|
"name": self.name,
|
|
"description": self.description,
|
|
"force": str(self.force)}
|
|
return self._set_xml_etree_element(element, snapshot_attrs)
|
|
|
|
|
|
class VolumeTypeCreateRequest(AutoMarshallingModel):
|
|
|
|
def __init__(self, name, extra_specs=None):
|
|
super(VolumeTypeCreateRequest, self).__init__()
|
|
self.name = name
|
|
self.extra_specs = extra_specs
|
|
|
|
def _obj_to_json(self):
|
|
return json.dumps(self._obj_to_json_dict())
|
|
|
|
def _obj_to_json_dict(self):
|
|
attrs = {
|
|
"name": self.name,
|
|
"extra_specs": self.extra_specs}
|
|
return dict(volume_type=self._remove_empty_values(attrs))
|
|
|
|
def _obj_to_xml(self):
|
|
return ElementTree.tostring(self._obj_to_xml_ele())
|
|
|
|
def _obj_to_xml_ele(self):
|
|
element = ElementTree.Element('volume_type')
|
|
attrs = {"name": self.name}
|
|
|
|
if len(self.extra_specs.keys()) > 0:
|
|
extra_specs = ElementTree.Element('extra_specs')
|
|
for key in self.extra_specs.keys():
|
|
spec = ElementTree.Element('extra_spec')
|
|
spec.set('key', key)
|
|
spec.text = self.extra_specs[key]
|
|
extra_specs.append(spec)
|
|
element.append(extra_specs)
|
|
|
|
return self._set_xml_etree_element(element, attrs)
|
|
|
|
|
|
class VolumeTypeExtraSpecsUpdateRequest(AutoMarshallingModel):
|
|
def __init__(self, extra_specs=None):
|
|
super(VolumeTypeExtraSpecsUpdateRequest, self).__init__()
|
|
self.extra_specs = extra_specs
|
|
|
|
def _obj_to_json(self):
|
|
return json.dumps(self._obj_to_json_dict())
|
|
|
|
def _obj_to_json_dict(self):
|
|
return dict(extra_specs=self._remove_empty_values(self.extra_specs))
|