From 30d89919b557fb2e34953641be85eeaa84f06274 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Fri, 31 Aug 2012 12:51:52 -0700 Subject: Add extensions for flavor swap and rxtx_factor The swap and flavor attributes of a flavor are not in the spec. This moves the properties so they are generated by extensions. The output will not be changed if all extensions are enabled (by default), but we now have a way to document these extra attributes and disable them. DocImpact Change-Id: Iee1cb1b1ee4116a38b90db581c38468d3d92afaf --- nova/api/openstack/compute/contrib/flavor_rxtx.py | 87 ++++++++++++++++++++++ nova/api/openstack/compute/contrib/flavor_swap.py | 87 ++++++++++++++++++++++ nova/api/openstack/compute/flavors.py | 4 +- nova/api/openstack/compute/schemas/v1.1/flavor.rng | 2 - nova/api/openstack/compute/views/flavors.py | 2 - 5 files changed, 175 insertions(+), 7 deletions(-) create mode 100644 nova/api/openstack/compute/contrib/flavor_rxtx.py create mode 100644 nova/api/openstack/compute/contrib/flavor_swap.py (limited to 'nova/api') diff --git a/nova/api/openstack/compute/contrib/flavor_rxtx.py b/nova/api/openstack/compute/contrib/flavor_rxtx.py new file mode 100644 index 000000000..6dce1bee1 --- /dev/null +++ b/nova/api/openstack/compute/contrib/flavor_rxtx.py @@ -0,0 +1,87 @@ +# Copyright 2012 Nebula, Inc. +# +# 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. + +"""The Flavor Rxtx API extension.""" + +from nova.api.openstack import extensions +from nova.api.openstack import wsgi +from nova.api.openstack import xmlutil + + +authorize = extensions.soft_extension_authorizer('compute', 'flavor_rxtx') + + +class FlavorRxtxController(wsgi.Controller): + def _extend_flavors(self, req, flavors): + for flavor in flavors: + db_flavor = req.get_db_flavor(flavor['id']) + key = 'rxtx_factor' + flavor[key] = db_flavor['rxtx_factor'] or "" + + def _show(self, req, resp_obj): + if not authorize(req.environ['nova.context']): + return + if 'flavor' in resp_obj.obj: + resp_obj.attach(xml=FlavorRxtxTemplate()) + self._extend_flavors(req, [resp_obj.obj['flavor']]) + + @wsgi.extends + def show(self, req, resp_obj, id): + return self._show(req, resp_obj) + + @wsgi.extends(action='create') + def create(self, req, resp_obj, body): + return self._show(req, resp_obj) + + @wsgi.extends + def detail(self, req, resp_obj): + if not authorize(req.environ['nova.context']): + return + resp_obj.attach(xml=FlavorsRxtxTemplate()) + self._extend_flavors(req, list(resp_obj.obj['flavors'])) + + +class Flavor_rxtx(extensions.ExtensionDescriptor): + """Support to show the rxtx status of a flavor""" + + name = "FlavorRxtx" + alias = "os-flavor-rxtx" + namespace = ("http://docs.openstack.org/compute/ext/" + "flavor_rxtx/api/v1.1") + updated = "2012-08-29T00:00:00+00:00" + + def get_controller_extensions(self): + controller = FlavorRxtxController() + extension = extensions.ControllerExtension(self, 'flavors', controller) + return [extension] + + +def make_flavor(elem): + # NOTE(vish): this was originally added without a namespace + elem.set('rxtx_factor', xmlutil.EmptyStringSelector('rxtx_factor')) + + +class FlavorRxtxTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('flavor', selector='flavor') + make_flavor(root) + return xmlutil.SlaveTemplate(root, 1) + + +class FlavorsRxtxTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('flavors') + elem = xmlutil.SubTemplateElement(root, 'flavor', selector='flavors') + make_flavor(elem) + return xmlutil.SlaveTemplate(root, 1) diff --git a/nova/api/openstack/compute/contrib/flavor_swap.py b/nova/api/openstack/compute/contrib/flavor_swap.py new file mode 100644 index 000000000..8e0277979 --- /dev/null +++ b/nova/api/openstack/compute/contrib/flavor_swap.py @@ -0,0 +1,87 @@ +# Copyright 2012 Nebula, Inc. +# +# 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. + +"""The Flavor Swap API extension.""" + +from nova.api.openstack import extensions +from nova.api.openstack import wsgi +from nova.api.openstack import xmlutil + + +authorize = extensions.soft_extension_authorizer('compute', 'flavor_swap') + + +class FlavorSwapController(wsgi.Controller): + def _extend_flavors(self, req, flavors): + for flavor in flavors: + db_flavor = req.get_db_flavor(flavor['id']) + key = 'swap' + flavor[key] = db_flavor['swap'] or "" + + def _show(self, req, resp_obj): + if not authorize(req.environ['nova.context']): + return + if 'flavor' in resp_obj.obj: + resp_obj.attach(xml=FlavorSwapTemplate()) + self._extend_flavors(req, [resp_obj.obj['flavor']]) + + @wsgi.extends + def show(self, req, resp_obj, id): + return self._show(req, resp_obj) + + @wsgi.extends(action='create') + def create(self, req, resp_obj, body): + return self._show(req, resp_obj) + + @wsgi.extends + def detail(self, req, resp_obj): + if not authorize(req.environ['nova.context']): + return + resp_obj.attach(xml=FlavorsSwapTemplate()) + self._extend_flavors(req, list(resp_obj.obj['flavors'])) + + +class Flavor_swap(extensions.ExtensionDescriptor): + """Support to show the swap status of a flavor""" + + name = "FlavorSwap" + alias = "os-flavor-swap" + namespace = ("http://docs.openstack.org/compute/ext/" + "flavor_swap/api/v1.1") + updated = "2012-08-29T00:00:00+00:00" + + def get_controller_extensions(self): + controller = FlavorSwapController() + extension = extensions.ControllerExtension(self, 'flavors', controller) + return [extension] + + +def make_flavor(elem): + # NOTE(vish): this was originally added without a namespace + elem.set('swap', xmlutil.EmptyStringSelector('swap')) + + +class FlavorSwapTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('flavor', selector='flavor') + make_flavor(root) + return xmlutil.SlaveTemplate(root, 1) + + +class FlavorsSwapTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('flavors') + elem = xmlutil.SubTemplateElement(root, 'flavor', selector='flavors') + make_flavor(elem) + return xmlutil.SlaveTemplate(root, 1) diff --git a/nova/api/openstack/compute/flavors.py b/nova/api/openstack/compute/flavors.py index e04ade437..8aa57a2b1 100644 --- a/nova/api/openstack/compute/flavors.py +++ b/nova/api/openstack/compute/flavors.py @@ -31,9 +31,7 @@ def make_flavor(elem, detailed=False): if detailed: elem.set('ram') elem.set('disk') - - for attr in ("vcpus", "swap", "rxtx_factor"): - elem.set(attr, xmlutil.EmptyStringSelector(attr)) + elem.set('vcpus', xmlutil.EmptyStringSelector('vcpus')) xmlutil.make_links(elem, 'links') diff --git a/nova/api/openstack/compute/schemas/v1.1/flavor.rng b/nova/api/openstack/compute/schemas/v1.1/flavor.rng index 08746ce3d..a97a3a972 100644 --- a/nova/api/openstack/compute/schemas/v1.1/flavor.rng +++ b/nova/api/openstack/compute/schemas/v1.1/flavor.rng @@ -4,8 +4,6 @@ - - diff --git a/nova/api/openstack/compute/views/flavors.py b/nova/api/openstack/compute/views/flavors.py index 2900ccf64..fbbe5c45e 100644 --- a/nova/api/openstack/compute/views/flavors.py +++ b/nova/api/openstack/compute/views/flavors.py @@ -41,8 +41,6 @@ class ViewBuilder(common.ViewBuilder): "ram": flavor["memory_mb"], "disk": flavor["root_gb"], "vcpus": flavor.get("vcpus") or "", - "swap": flavor.get("swap") or "", - "rxtx_factor": flavor.get("rxtx_factor") or "", "links": self._get_links(request, flavor["flavorid"], self._collection_name), -- cgit