Skip to content

Commit

Permalink
Add templates for selected resource extensions.
Browse files Browse the repository at this point in the history
Related to bug 852141; adds XML serialization and deserialization for
the following extensions:

* SecurityGroups (security_groups)
* SimpleTenantUsage (os-simple-tenant-usage)
* VirtualInterfaces (virtual_interfaces)
* Volumes (os-volumes)
* VolumeTypes (os-volume-types)

Change-Id: Ia3aef79c1912d3df14ab72bbdda3768ae131a19e
  • Loading branch information
Kevin L. Mitchell committed Dec 9, 2011
1 parent fb479f3 commit f7df18f
Show file tree
Hide file tree
Showing 11 changed files with 946 additions and 54 deletions.
100 changes: 86 additions & 14 deletions nova/api/openstack/v2/contrib/security_groups.py
Expand Up @@ -24,6 +24,7 @@
from nova.api.openstack import common
from nova.api.openstack.v2 import extensions
from nova.api.openstack import wsgi
from nova.api.openstack import xmlutil
from nova import compute
from nova import db
from nova import exception
Expand Down Expand Up @@ -355,6 +356,85 @@ def delete(self, req, id):
return webob.Response(status_int=202)


def make_rule(elem):
elem.set('id')
elem.set('parent_group_id')

proto = xmlutil.SubTemplateElement(elem, 'ip_protocol')
proto.text = 'ip_protocol'

from_port = xmlutil.SubTemplateElement(elem, 'from_port')
from_port.text = 'from_port'

to_port = xmlutil.SubTemplateElement(elem, 'to_port')
to_port.text = 'to_port'

group = xmlutil.SubTemplateElement(elem, 'group', selector='group')
name = xmlutil.SubTemplateElement(group, 'name')
name.text = 'name'
tenant_id = xmlutil.SubTemplateElement(group, 'tenant_id')
tenant_id.text = 'tenant_id'

ip_range = xmlutil.SubTemplateElement(elem, 'ip_range',
selector='ip_range')
cidr = xmlutil.SubTemplateElement(ip_range, 'cidr')
cidr.text = 'cidr'


def make_sg(elem):
elem.set('id')
elem.set('tenant_id')
elem.set('name')

desc = xmlutil.SubTemplateElement(elem, 'description')
desc.text = 'description'

rules = xmlutil.SubTemplateElement(elem, 'rules')
rule = xmlutil.SubTemplateElement(rules, 'rule', selector='rules')
make_rule(rule)


sg_nsmap = {None: wsgi.XMLNS_V11}


class SecurityGroupRuleTemplate(xmlutil.TemplateBuilder):
def construct(self):
root = xmlutil.TemplateElement('security_group_rule',
selector='security_group_rule')
make_rule(root)
return xmlutil.MasterTemplate(root, 1, nsmap=sg_nsmap)


class SecurityGroupTemplate(xmlutil.TemplateBuilder):
def construct(self):
root = xmlutil.TemplateElement('security_group',
selector='security_group')
make_sg(root)
return xmlutil.MasterTemplate(root, 1, nsmap=sg_nsmap)


class SecurityGroupsTemplate(xmlutil.TemplateBuilder):
def construct(self):
root = xmlutil.TemplateElement('security_groups')
elem = xmlutil.SubTemplateElement(root, 'security_group',
selector='security_groups')
make_sg(elem)
return xmlutil.MasterTemplate(root, 1, nsmap=sg_nsmap)


class SecurityGroupXMLSerializer(xmlutil.XMLTemplateSerializer):
def index(self):
return SecurityGroupsTemplate()

def default(self):
return SecurityGroupTemplate()


class SecurityGroupRulesXMLSerializer(xmlutil.XMLTemplateSerializer):
def default(self):
return SecurityGroupRuleTemplate()


class Security_groups(extensions.ExtensionDescriptor):
"""Security group support"""

Expand Down Expand Up @@ -439,10 +519,8 @@ def get_actions(self):
def get_resources(self):
resources = []

metadata = _get_metadata()
body_serializers = {
'application/xml': wsgi.XMLDictSerializer(metadata=metadata,
xmlns=wsgi.XMLNS_V11),
'application/xml': SecurityGroupXMLSerializer(),
}
serializer = wsgi.ResponseSerializer(body_serializers, None)

Expand All @@ -458,6 +536,11 @@ def get_resources(self):

resources.append(res)

body_serializers = {
'application/xml': SecurityGroupRulesXMLSerializer(),
}
serializer = wsgi.ResponseSerializer(body_serializers, None)

body_deserializers = {
'application/xml': SecurityGroupRulesXMLDeserializer(),
}
Expand Down Expand Up @@ -538,14 +621,3 @@ def _extract_security_group_rule(self, node):
sg_rule['cidr'] = self.extract_text(cidr_node)

return sg_rule


def _get_metadata():
metadata = {
"attributes": {
"security_group": ["id", "tenant_id", "name"],
"rule": ["id", "parent_group_id"],
"security_group_rule": ["id", "parent_group_id"],
}
}
return metadata
51 changes: 50 additions & 1 deletion nova/api/openstack/v2/contrib/simple_tenant_usage.py
Expand Up @@ -23,6 +23,8 @@

from nova.api.openstack.v2 import extensions
from nova.api.openstack.v2 import views
from nova.api.openstack import wsgi
from nova.api.openstack import xmlutil
from nova.compute import api
from nova.db.sqlalchemy.session import get_session
from nova import exception
Expand Down Expand Up @@ -211,6 +213,47 @@ def show(self, req, id):
return {'tenant_usage': usage}


def make_usage(elem):
for subelem_tag in ('tenant_id', 'total_local_gb_usage',
'total_vcpus_usage', 'total_memory_mb_usage',
'total_hours', 'start', 'stop'):
subelem = xmlutil.SubTemplateElement(elem, subelem_tag)
subelem.text = subelem_tag

server_usages = xmlutil.SubTemplateElement(elem, 'server_usages')
server_usage = xmlutil.SubTemplateElement(server_usages, 'server_usage',
selector='server_usages')
for subelem_tag in ('name', 'hours', 'memory_mb', 'local_gb', 'vcpus',
'tenant_id', 'flavor', 'started_at', 'ended_at',
'state', 'uptime'):
subelem = xmlutil.SubTemplateElement(server_usage, subelem_tag)
subelem.text = subelem_tag


class SimpleTenantUsageTemplate(xmlutil.TemplateBuilder):
def construct(self):
root = xmlutil.TemplateElement('tenant_usage', selector='tenant_usage')
make_usage(root)
return xmlutil.MasterTemplate(root, 1)


class SimpleTenantUsagesTemplate(xmlutil.TemplateBuilder):
def construct(self):
root = xmlutil.TemplateElement('tenant_usages')
elem = xmlutil.SubTemplateElement(root, 'tenant_usage',
selector='tenant_usages')
make_usage(elem)
return xmlutil.MasterTemplate(root, 1)


class SimpleTenantUsageSerializer(xmlutil.XMLTemplateSerializer):
def index(self):
return SimpleTenantUsagesTemplate()

def show(self):
return SimpleTenantUsageTemplate()


class Simple_tenant_usage(extensions.ExtensionDescriptor):
"""Simple tenant usage extension"""

Expand All @@ -222,8 +265,14 @@ class Simple_tenant_usage(extensions.ExtensionDescriptor):
def get_resources(self):
resources = []

body_serializers = {
'application/xml': SimpleTenantUsageSerializer(),
}
serializer = wsgi.ResponseSerializer(body_serializers)

res = extensions.ResourceExtension('os-simple-tenant-usage',
SimpleTenantUsageController())
SimpleTenantUsageController(),
serializer=serializer)
resources.append(res)

return resources
31 changes: 21 additions & 10 deletions nova/api/openstack/v2/contrib/virtual_interfaces.py
Expand Up @@ -18,6 +18,7 @@
from nova.api.openstack import common
from nova.api.openstack.v2 import extensions
from nova.api.openstack import wsgi
from nova.api.openstack import xmlutil
from nova import log as logging
from nova import network

Expand All @@ -33,13 +34,6 @@ def _translate_vif_summary_view(_context, vif):
return d


def _get_metadata():
metadata = {
"attributes": {
'virtual_interface': ["id", "mac_address"]}}
return metadata


class ServerVirtualInterfaceController(object):
"""The instance VIF API controller for the Openstack API.
"""
Expand All @@ -63,6 +57,24 @@ def index(self, req, server_id):
entity_maker=_translate_vif_summary_view)


vif_nsmap = {None: wsgi.XMLNS_V11}


class VirtualInterfaceTemplate(xmlutil.TemplateBuilder):
def construct(self):
root = xmlutil.TemplateElement('virtual_interfaces')
elem = xmlutil.SubTemplateElement(root, 'virtual_interface',
selector='virtual_interfaces')
elem.set('id')
elem.set('mac_address')
return xmlutil.MasterTemplate(root, 1, nsmap=vif_nsmap)


class VirtualInterfaceSerializer(xmlutil.XMLTemplateSerializer):
def default(self):
return VirtualInterfaceTemplate()


class Virtual_interfaces(extensions.ExtensionDescriptor):
"""Virtual interface support"""

Expand All @@ -74,10 +86,9 @@ class Virtual_interfaces(extensions.ExtensionDescriptor):
def get_resources(self):
resources = []

metadata = _get_metadata()
body_serializers = {
'application/xml': wsgi.XMLDictSerializer(metadata=metadata,
xmlns=wsgi.XMLNS_V11)}
'application/xml': VirtualInterfaceSerializer()
}
serializer = wsgi.ResponseSerializer(body_serializers, None)
res = extensions.ResourceExtension(
'os-virtual-interfaces',
Expand Down

0 comments on commit f7df18f

Please sign in to comment.