ooi/ooi/api/storage_link.py

98 lines
4.0 KiB
Python

# Copyright 2015 Spanish National Research Council
#
# 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 ooi.api import base
import ooi.api.helpers
from ooi import exception
from ooi.occi.core import collection
from ooi.occi.infrastructure import compute
from ooi.occi.infrastructure import storage
from ooi.occi.infrastructure import storage_link
from ooi.occi import validator as occi_validator
class Controller(base.Controller):
def __init__(self, *args, **kwargs):
super(Controller, self).__init__(*args, **kwargs)
self.os_helper = ooi.api.helpers.OpenStackHelper(
self.app,
self.openstack_version
)
def index(self, req):
volumes = self.os_helper.get_volumes(req)
occi_link_resources = []
for v in volumes:
for attach in v["attachments"]:
if attach:
c = compute.ComputeResource(title="Compute",
id=attach["serverId"])
s = storage.StorageResource(title="Storage", id=v["id"])
l = storage_link.StorageLink(c, s,
deviceid=attach.get("device",
None))
occi_link_resources.append(l)
return collection.Collection(resources=occi_link_resources)
def _get_attachment_from_id(self, req, attachment_id):
try:
server_id, vol_id = attachment_id.split('_', 1)
except ValueError:
raise exception.LinkNotFound(link_id=attachment_id)
vols = self.os_helper.get_server_volumes_link(req, server_id)
for v in vols:
if vol_id == v["volumeId"]:
return v
raise exception.LinkNotFound(link_id=attachment_id)
def show(self, req, id):
v = self._get_attachment_from_id(req, id)
c = compute.ComputeResource(title="Compute", id=v["serverId"])
s = storage.StorageResource(title="Storage", id=v["volumeId"])
return storage_link.StorageLink(c, s, deviceid=v.get("device", None))
def create(self, req, body):
parser = req.get_parser()(req.headers, req.body)
scheme = {"category": storage_link.StorageLink.kind}
obj = parser.parse()
validator = occi_validator.Validator(obj)
validator.validate(scheme)
attrs = obj.get("attributes", {})
_, vol_id = ooi.api.helpers.get_id_with_kind(
req,
attrs.get("occi.core.target"),
storage.StorageResource.kind)
_, server_id = ooi.api.helpers.get_id_with_kind(
req,
attrs.get("occi.core.source"),
compute.ComputeResource.kind)
device = attrs.get("occi.storagelink.deviceid", None)
attachment = self.os_helper.create_server_volumes_link(req,
server_id,
vol_id,
dev=device)
c = compute.ComputeResource(title="Compute", id=server_id)
s = storage.StorageResource(title="Storage", id=vol_id)
l = storage_link.StorageLink(c, s, deviceid=attachment["device"])
return collection.Collection(resources=[l])
def delete(self, req, id):
v = self._get_attachment_from_id(req, id)
self.os_helper.delete_server_volumes_link(req,
v["serverId"], v["volumeId"])
return []