commit
35f0744c6a
@ -1,21 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2010 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""
|
|
||||||
WSGI middleware for OpenStack API controllers.
|
|
||||||
"""
|
|
@ -1,54 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2010 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""
|
|
||||||
WSGI middleware for OpenStack Compute API.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import nova.api.openstack
|
|
||||||
from reddwarf.api.database import extensions
|
|
||||||
from reddwarf.api.database import instances
|
|
||||||
from reddwarf.api.database import versions
|
|
||||||
from nova import flags
|
|
||||||
from nova import log as logging
|
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger('reddwarf.api.database')
|
|
||||||
FLAGS = flags.FLAGS
|
|
||||||
|
|
||||||
|
|
||||||
class APIRouter(nova.api.openstack.APIRouter):
|
|
||||||
"""
|
|
||||||
Routes requests on the OpenStack API to the appropriate controller
|
|
||||||
and method.
|
|
||||||
"""
|
|
||||||
ExtensionManager = extensions.ExtensionManager
|
|
||||||
|
|
||||||
def _setup_routes(self, mapper):
|
|
||||||
self.resources['versions'] = versions.create_resource()
|
|
||||||
mapper.connect("versions", "/",
|
|
||||||
controller=self.resources['versions'],
|
|
||||||
action='show')
|
|
||||||
|
|
||||||
mapper.redirect("", "/")
|
|
||||||
|
|
||||||
self.resources['instances'] = instances.create_resource()
|
|
||||||
mapper.resource("instance", "instances",
|
|
||||||
controller=self.resources['instances'],
|
|
||||||
collection={'detail': 'GET'},
|
|
||||||
member={'action': 'POST'})
|
|
@ -1,39 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2011 Justin Santa Barbara
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""Contrib contains extensions that are shipped with nova.
|
|
||||||
|
|
||||||
It can't be called 'extensions' because that causes namespacing problems.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
from nova import flags
|
|
||||||
from nova import log as logging
|
|
||||||
from nova.api.openstack import extensions
|
|
||||||
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
|
||||||
LOG = logging.getLogger('reddwarf.api.database.contrib')
|
|
||||||
|
|
||||||
|
|
||||||
def standard_extensions(ext_mgr):
|
|
||||||
extensions.load_standard_extensions(ext_mgr, LOG, __path__, __package__)
|
|
||||||
|
|
||||||
|
|
||||||
def select_extensions(ext_mgr):
|
|
||||||
extensions.load_standard_extensions(ext_mgr, LOG, __path__, __package__,
|
|
||||||
FLAGS.osapi_compute_ext_list)
|
|
@ -1,75 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2011 OpenStack LLC.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# 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 webob.exc
|
|
||||||
|
|
||||||
from nova.api.openstack import extensions
|
|
||||||
from nova import log as logging
|
|
||||||
|
|
||||||
LOG = logging.getLogger('reddwarf.api.database.contrib.databases')
|
|
||||||
|
|
||||||
|
|
||||||
class DatabasesController(object):
|
|
||||||
|
|
||||||
def index(self, req):
|
|
||||||
LOG.info("index call databases")
|
|
||||||
return "This is a index of databases"
|
|
||||||
|
|
||||||
|
|
||||||
class UsersController(object):
|
|
||||||
|
|
||||||
def index(self, req):
|
|
||||||
LOG.info("index call users")
|
|
||||||
return "This is a index of users"
|
|
||||||
|
|
||||||
|
|
||||||
class Databases(extensions.ExtensionDescriptor):
|
|
||||||
"""The Databases Extension"""
|
|
||||||
|
|
||||||
name = "Databases"
|
|
||||||
alias = "DATABASES"
|
|
||||||
namespace = "http://TBD"
|
|
||||||
updated = "2011-01-22T13:25:27-06:00"
|
|
||||||
|
|
||||||
def __init__(self, ext_mgr):
|
|
||||||
ext_mgr.register(self)
|
|
||||||
|
|
||||||
def get_resources(self):
|
|
||||||
resources = []
|
|
||||||
resource = extensions.ResourceExtension('databases',
|
|
||||||
DatabasesController())
|
|
||||||
resources.append(resource)
|
|
||||||
resource = extensions.ResourceExtension('users',
|
|
||||||
UsersController())
|
|
||||||
resources.append(resource)
|
|
||||||
|
|
||||||
return resources
|
|
||||||
|
|
||||||
def get_controller_extensions(self):
|
|
||||||
extension_list = []
|
|
||||||
|
|
||||||
extension_set = [
|
|
||||||
# (DatabasesControllerExtension, 'instances'),
|
|
||||||
# (FoxInSocksFlavorGooseControllerExtension, 'flavors'),
|
|
||||||
# (FoxInSocksFlavorBandsControllerExtension, 'flavors'),
|
|
||||||
]
|
|
||||||
for klass, collection in extension_set:
|
|
||||||
controller = klass()
|
|
||||||
ext = extensions.ControllerExtension(self, collection, controller)
|
|
||||||
extension_list.append(ext)
|
|
||||||
|
|
||||||
return extension_list
|
|
@ -1,33 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2011 OpenStack LLC.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# 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 nova.api.openstack import extensions as base_extensions
|
|
||||||
from nova import flags
|
|
||||||
from nova import log as logging
|
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger('reddwarf.api.database.extensions')
|
|
||||||
FLAGS = flags.FLAGS
|
|
||||||
|
|
||||||
|
|
||||||
class ExtensionManager(base_extensions.ExtensionManager):
|
|
||||||
def __init__(self):
|
|
||||||
LOG.audit(_('Initializing extension manager.'))
|
|
||||||
|
|
||||||
self.cls_list = FLAGS.reddwarf_api_extension
|
|
||||||
self.extensions = {}
|
|
||||||
self._load_extensions()
|
|
@ -1,106 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2011 OpenStack LLC.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# 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 nova import flags
|
|
||||||
from nova import log as logging
|
|
||||||
from nova.api.openstack import wsgi
|
|
||||||
from novaclient.v1_1.client import Client
|
|
||||||
from nova.openstack.common import cfg
|
|
||||||
from reddwarf.api.database.views import instances as views_instances
|
|
||||||
|
|
||||||
LOG = logging.getLogger('reddwarf.api.database.instances')
|
|
||||||
|
|
||||||
reddwarf_opts = [
|
|
||||||
cfg.StrOpt('reddwarf_proxy_admin_user',
|
|
||||||
default='admin',
|
|
||||||
help='User by which you make proxy requests to the nova api with'),
|
|
||||||
cfg.StrOpt('reddwarf_proxy_admin_pass',
|
|
||||||
default='3de4922d8b6ac5a1aad9',
|
|
||||||
help='Password for the admin user defined in '
|
|
||||||
'reddwarf_proxy_admin_user'),
|
|
||||||
cfg.StrOpt('reddwarf_proxy_admin_tenant_name',
|
|
||||||
default='admin',
|
|
||||||
help='Tenant name for the admin user defined in '
|
|
||||||
'reddwarf_proxy_admin_user'),
|
|
||||||
cfg.StrOpt('reddwarf_auth_url',
|
|
||||||
default='http://0.0.0.0:5000/v2.0',
|
|
||||||
help='Auth url for authing against reddwarf_proxy_admin_user'),
|
|
||||||
]
|
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
|
||||||
FLAGS.register_opts(reddwarf_opts)
|
|
||||||
|
|
||||||
|
|
||||||
class Controller(wsgi.Controller):
|
|
||||||
|
|
||||||
_view_builder_class = views_instances.ViewBuilder
|
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
super(Controller, self).__init__(**kwargs)
|
|
||||||
|
|
||||||
def get_client(self, req):
|
|
||||||
proxy_token = req.headers["X-Auth-Token"]
|
|
||||||
client = Client(FLAGS.reddwarf_proxy_admin_user,
|
|
||||||
FLAGS.reddwarf_proxy_admin_pass,
|
|
||||||
FLAGS.reddwarf_proxy_admin_tenant_name,
|
|
||||||
FLAGS.reddwarf_auth_url,
|
|
||||||
token=proxy_token)
|
|
||||||
client.authenticate()
|
|
||||||
return client
|
|
||||||
|
|
||||||
def index(self, req):
|
|
||||||
"""Return all instances."""
|
|
||||||
servers = self.get_client(req).servers.list()
|
|
||||||
for server in servers:
|
|
||||||
LOG.info(server.__dict__)
|
|
||||||
return self._view_builder.index(req, servers)
|
|
||||||
|
|
||||||
@wsgi.response(204)
|
|
||||||
def delete(self, req, id):
|
|
||||||
"""Deletes an instance."""
|
|
||||||
self.get_client(req).servers.delete(id)
|
|
||||||
|
|
||||||
@wsgi.response(202)
|
|
||||||
@wsgi.serializers(xml=FullServerTemplate)
|
|
||||||
@wsgi.deserializers(xml=CreateDeserializer)
|
|
||||||
def create(self, req, body):
|
|
||||||
"""Creates an instance"""
|
|
||||||
server = self.get_client(req).servers.create(
|
|
||||||
body['name'], body['image'], body['flavor'])
|
|
||||||
LOG.info(server)
|
|
||||||
robj = wsgi.ResponseObject(server)
|
|
||||||
|
|
||||||
return self._add_location(robj)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _add_location(robj):
|
|
||||||
"""Stolen form compute/servers. do we need it?"""
|
|
||||||
# Just in case...
|
|
||||||
if 'server' not in robj.obj:
|
|
||||||
return robj
|
|
||||||
|
|
||||||
link = filter(lambda l: l['rel'] == 'self',
|
|
||||||
robj.obj['server']['links'])
|
|
||||||
if link:
|
|
||||||
robj['Location'] = link[0]['href']
|
|
||||||
|
|
||||||
# Convenience return
|
|
||||||
return robj
|
|
||||||
|
|
||||||
|
|
||||||
def create_resource():
|
|
||||||
return wsgi.Resource(Controller())
|
|
@ -1,236 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2011 OpenStack LLC.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# 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 datetime
|
|
||||||
|
|
||||||
from lxml import etree
|
|
||||||
|
|
||||||
from nova.api.openstack.compute.views import versions as views_versions
|
|
||||||
from nova.api.openstack import wsgi
|
|
||||||
from nova.api.openstack import xmlutil
|
|
||||||
|
|
||||||
|
|
||||||
VERSIONS = {
|
|
||||||
"v2.0": {
|
|
||||||
"id": "v2.0",
|
|
||||||
"status": "CURRENT",
|
|
||||||
"updated": "2012-01-01T11:33:21Z",
|
|
||||||
"links": [
|
|
||||||
{
|
|
||||||
"rel": "describedby",
|
|
||||||
"type": "application/pdf",
|
|
||||||
"href": "http://docs.rackspacecloud.com/"
|
|
||||||
"clouddatabase/api/v1.1/cs-devguide-20110125.pdf",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"rel": "describedby",
|
|
||||||
"type": "application/vnd.sun.wadl+xml",
|
|
||||||
"href": "http://docs.rackspacecloud.com/"
|
|
||||||
"clouddatabase/api/v1.1/application.wadl",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"media-types": [
|
|
||||||
{
|
|
||||||
"base": "application/xml",
|
|
||||||
"type": "application/vnd.openstack.reddwarf+xml;version=2",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"base": "application/json",
|
|
||||||
"type": "application/vnd.openstack.reddwarf+json;version=2",
|
|
||||||
}
|
|
||||||
],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class MediaTypesTemplateElement(xmlutil.TemplateElement):
|
|
||||||
def will_render(self, datum):
|
|
||||||
return 'media-types' in datum
|
|
||||||
|
|
||||||
|
|
||||||
def make_version(elem):
|
|
||||||
elem.set('id')
|
|
||||||
elem.set('status')
|
|
||||||
elem.set('updated')
|
|
||||||
|
|
||||||
mts = MediaTypesTemplateElement('media-types')
|
|
||||||
elem.append(mts)
|
|
||||||
|
|
||||||
mt = xmlutil.SubTemplateElement(mts, 'media-type', selector='media-types')
|
|
||||||
mt.set('base')
|
|
||||||
mt.set('type')
|
|
||||||
|
|
||||||
xmlutil.make_links(elem, 'links')
|
|
||||||
|
|
||||||
|
|
||||||
version_nsmap = {None: xmlutil.XMLNS_V11, 'atom': xmlutil.XMLNS_ATOM}
|
|
||||||
|
|
||||||
|
|
||||||
class VersionTemplate(xmlutil.TemplateBuilder):
|
|
||||||
def construct(self):
|
|
||||||
root = xmlutil.TemplateElement('version', selector='version')
|
|
||||||
make_version(root)
|
|
||||||
return xmlutil.MasterTemplate(root, 1, nsmap=version_nsmap)
|
|
||||||
|
|
||||||
|
|
||||||
class VersionsTemplate(xmlutil.TemplateBuilder):
|
|
||||||
def construct(self):
|
|
||||||
root = xmlutil.TemplateElement('versions')
|
|
||||||
elem = xmlutil.SubTemplateElement(root, 'version', selector='versions')
|
|
||||||
make_version(elem)
|
|
||||||
return xmlutil.MasterTemplate(root, 1, nsmap=version_nsmap)
|
|
||||||
|
|
||||||
|
|
||||||
class ChoicesTemplate(xmlutil.TemplateBuilder):
|
|
||||||
def construct(self):
|
|
||||||
root = xmlutil.TemplateElement('choices')
|
|
||||||
elem = xmlutil.SubTemplateElement(root, 'version', selector='choices')
|
|
||||||
make_version(elem)
|
|
||||||
return xmlutil.MasterTemplate(root, 1, nsmap=version_nsmap)
|
|
||||||
|
|
||||||
|
|
||||||
class AtomSerializer(wsgi.XMLDictSerializer):
|
|
||||||
|
|
||||||
NSMAP = {None: xmlutil.XMLNS_ATOM}
|
|
||||||
|
|
||||||
def __init__(self, metadata=None, xmlns=None):
|
|
||||||
self.metadata = metadata or {}
|
|
||||||
if not xmlns:
|
|
||||||
self.xmlns = wsgi.XMLNS_ATOM
|
|
||||||
else:
|
|
||||||
self.xmlns = xmlns
|
|
||||||
|
|
||||||
def _get_most_recent_update(self, versions):
|
|
||||||
recent = None
|
|
||||||
for version in versions:
|
|
||||||
updated = datetime.datetime.strptime(version['updated'],
|
|
||||||
'%Y-%m-%dT%H:%M:%SZ')
|
|
||||||
if not recent:
|
|
||||||
recent = updated
|
|
||||||
elif updated > recent:
|
|
||||||
recent = updated
|
|
||||||
|
|
||||||
return recent.strftime('%Y-%m-%dT%H:%M:%SZ')
|
|
||||||
|
|
||||||
def _get_base_url(self, link_href):
|
|
||||||
# Make sure no trailing /
|
|
||||||
link_href = link_href.rstrip('/')
|
|
||||||
return link_href.rsplit('/', 1)[0] + '/'
|
|
||||||
|
|
||||||
def _create_feed(self, versions, feed_title, feed_id):
|
|
||||||
feed = etree.Element('feed', nsmap=self.NSMAP)
|
|
||||||
title = etree.SubElement(feed, 'title')
|
|
||||||
title.set('type', 'text')
|
|
||||||
title.text = feed_title
|
|
||||||
|
|
||||||
# Set this updated to the most recently updated version
|
|
||||||
recent = self._get_most_recent_update(versions)
|
|
||||||
etree.SubElement(feed, 'updated').text = recent
|
|
||||||
|
|
||||||
etree.SubElement(feed, 'id').text = feed_id
|
|
||||||
|
|
||||||
link = etree.SubElement(feed, 'link')
|
|
||||||
link.set('rel', 'self')
|
|
||||||
link.set('href', feed_id)
|
|
||||||
|
|
||||||
author = etree.SubElement(feed, 'author')
|
|
||||||
etree.SubElement(author, 'name').text = 'Rackspace'
|
|
||||||
etree.SubElement(author, 'uri').text = 'http://www.rackspace.com/'
|
|
||||||
|
|
||||||
for version in versions:
|
|
||||||
feed.append(self._create_version_entry(version))
|
|
||||||
|
|
||||||
return feed
|
|
||||||
|
|
||||||
def _create_version_entry(self, version):
|
|
||||||
entry = etree.Element('entry')
|
|
||||||
etree.SubElement(entry, 'id').text = version['links'][0]['href']
|
|
||||||
title = etree.SubElement(entry, 'title')
|
|
||||||
title.set('type', 'text')
|
|
||||||
title.text = 'Version %s' % version['id']
|
|
||||||
etree.SubElement(entry, 'updated').text = version['updated']
|
|
||||||
|
|
||||||
for link in version['links']:
|
|
||||||
link_elem = etree.SubElement(entry, 'link')
|
|
||||||
link_elem.set('rel', link['rel'])
|
|
||||||
link_elem.set('href', link['href'])
|
|
||||||
if 'type' in link:
|
|
||||||
link_elem.set('type', link['type'])
|
|
||||||
|
|
||||||
content = etree.SubElement(entry, 'content')
|
|
||||||
content.set('type', 'text')
|
|
||||||
content.text = 'Version %s %s (%s)' % (version['id'],
|
|
||||||
version['status'],
|
|
||||||
version['updated'])
|
|
||||||
return entry
|
|
||||||
|
|
||||||
|
|
||||||
class VersionsAtomSerializer(AtomSerializer):
|
|
||||||
def default(self, data):
|
|
||||||
versions = data['versions']
|
|
||||||
feed_id = self._get_base_url(versions[0]['links'][0]['href'])
|
|
||||||
feed = self._create_feed(versions, 'Available API Versions', feed_id)
|
|
||||||
return self._to_xml(feed)
|
|
||||||
|
|
||||||
|
|
||||||
class VersionAtomSerializer(AtomSerializer):
|
|
||||||
def default(self, data):
|
|
||||||
version = data['version']
|
|
||||||
feed_id = version['links'][0]['href']
|
|
||||||
feed = self._create_feed([version], 'About This Version', feed_id)
|
|
||||||
return self._to_xml(feed)
|
|
||||||
|
|
||||||
|
|
||||||
class Versions(wsgi.Resource):
|
|
||||||
def __init__(self):
|
|
||||||
super(Versions, self).__init__(None)
|
|
||||||
|
|
||||||
@wsgi.serializers(xml=VersionsTemplate,
|
|
||||||
atom=VersionsAtomSerializer)
|
|
||||||
def index(self, req):
|
|
||||||
"""Return all versions."""
|
|
||||||
builder = views_versions.get_view_builder(req)
|
|
||||||
return builder.build_versions(VERSIONS)
|
|
||||||
|
|
||||||
@wsgi.serializers(xml=ChoicesTemplate)
|
|
||||||
@wsgi.response(300)
|
|
||||||
def multi(self, req):
|
|
||||||
"""Return multiple choices."""
|
|
||||||
builder = views_versions.get_view_builder(req)
|
|
||||||
return builder.build_choices(VERSIONS, req)
|
|
||||||
|
|
||||||
def get_action_args(self, request_environment):
|
|
||||||
"""Parse dictionary created by routes library."""
|
|
||||||
args = {}
|
|
||||||
if request_environment['PATH_INFO'] == '/':
|
|
||||||
args['action'] = 'index'
|
|
||||||
else:
|
|
||||||
args['action'] = 'multi'
|
|
||||||
|
|
||||||
return args
|
|
||||||
|
|
||||||
|
|
||||||
class VersionV2(object):
|
|
||||||
@wsgi.serializers(xml=VersionTemplate,
|
|
||||||
atom=VersionAtomSerializer)
|
|
||||||
def show(self, req):
|
|
||||||
builder = views_versions.get_view_builder(req)
|
|
||||||
return builder.build_version(VERSIONS['v2.0'])
|
|
||||||
|
|
||||||
|
|
||||||
def create_resource():
|
|
||||||
return wsgi.Resource(VersionV2())
|
|
@ -1,17 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2010 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# 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.
|
|
@ -1,67 +0,0 @@
|
|||||||
# Copyright 2011 OpenStack LLC
|
|
||||||
#
|
|
||||||
# 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 os
|
|
||||||
|
|
||||||
|
|
||||||
from nova import log as logging
|
|
||||||
from nova.api.openstack.compute.views import servers as views_servers
|
|
||||||
#from reddwarf.api.database.views import flavors
|
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger('reddwarf.api.views.instance')
|
|
||||||
LOG.setLevel(logging.DEBUG)
|
|
||||||
|
|
||||||
|
|
||||||
def _project_id(req):
|
|
||||||
return getattr(req.environ['nova.context'], 'project_id', '')
|
|
||||||
|
|
||||||
|
|
||||||
def _base_url(req):
|
|
||||||
return req.application_url
|
|
||||||
|
|
||||||
|
|
||||||
class ViewBuilder(object):
|
|
||||||
"""Views for an instance"""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.servers_viewbuilder = views_servers.ViewBuilder()
|
|
||||||
|
|
||||||
def basic(self, request, instance):
|
|
||||||
return {
|
|
||||||
"instance": {
|
|
||||||
"id": instance.id,
|
|
||||||
"name": instance.name,
|
|
||||||
"links": self.servers_viewbuilder._get_links(request,
|
|
||||||
instance.id),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
def index(self, request, servers):
|
|
||||||
"""Show a list of servers without many details."""
|
|
||||||
return self._list_view(self.basic, request, servers)
|
|
||||||
|
|
||||||
def _list_view(self, func, request, servers):
|
|
||||||
"""Provide a view for a list of instances."""
|
|
||||||
# This is coming back as a server entity but we change it to instances
|
|
||||||
instance_list = [func(request, instance)["instance"]
|
|
||||||
for instance in servers]
|
|
||||||
servers_links = self.servers_viewbuilder._get_collection_links(
|
|
||||||
request, servers)
|
|
||||||
instances_dict = dict(instances=instance_list)
|
|
||||||
|
|
||||||
if servers_links:
|
|
||||||
instances_dict["servers_links"] = servers_links
|
|
||||||
|
|
||||||
return instances_dict
|
|
Loading…
x
Reference in New Issue
Block a user