[openstack-dev] [Quantum] A generic approach for converting DB objects into dictionaries
Avishay Balderman
AvishayB at Radware.com
Wed Jan 16 13:57:32 UTC 2013
Background:
When a read operation is preformed via quantum API the result of the DB query is converted into python dictionary.
So we have a function like this for each DB entity:
def _make_router_dict(self, router, fields=None):
res = {'id': router['id'],
'name': router['name'],
'tenant_id': router['tenant_id'],
'admin_state_up': router['admin_state_up'],
'status': router['status'],
'external_gateway_info': None}
if router['gw_port_id']:
nw_id = router.gw_port['network_id']
res['external_gateway_info'] = {'network_id': nw_id}
return self._fields(res, fields)
A generic approach:
The idea is to have ONE "as_dict" function that will get the DB object plus meta data that explains how to "dict it".
What we gain here:
1. We have the mapping of the DB objects to dicts in one central location (See the Appendix below)
2. All "_make_XYZ_dict" functions are gone and no need to write them in the future
So we created this configuration and a generic function that does the "magic".
We have also created 9 unit tests that use the current quantum as_dict functions in one hand and the generic as_dict function on the other hand.
Code is here:
https://www.dropbox.com/s/d9qx16r6ocp4veo/db2dict.py (please ignore alignment issues - the code needs cleanup)
You can actually run it - just put it under quantum/db
Thanks
Avishay
Appendix
MODEL_TO_API_MAP = {
"quantum.db.l3_db.Router":["id",
"name",
"tenant_id",
"admin_state_up",
"status",
{"external_gateway_info":{"gw_port":["network_id"]}}
],
"quantum.db.models_v2.Network":["id",
"name",
"tenant_id",
"admin_state_up",
"status",
"shared",
{"subnets":["id"]},
],
"quantum.db.models_v2.Subnet":["id",
"name",
"tenant_id",
"network_id",
"ip_version",
"cidr",
{"allocation_pools":[{"start":"first_ip"},{"end":"last_ip"}]},
"gateway_ip",
"enable_dhcp",
{"dns_nameservers":["address"]},
{"host_routes":{"routes":["destination","nexthop"]}},
"shared",
"gateway_ip"
],
"quantum.db.models_v2.Port":["id",
"name",
"tenant_id",
"network_id",
"admin_state_up",
"mac_address",
"status",
{"fixed_ips":["subnet_id","ip_address"]},
"device_id",
"device_owner"
],
"quantum.db.l3_db.FloatingIP" : ["id",
"tenant_id",
"floating_ip_address",
"floating_network_id",
"router_id",
{"port_id":"fixed_port_id"},
"fixed_ip_address"
],
"quantum.db.securitygroups_db.SecurityGroup" : ["id",
"tenant_id",
"name",
"description",
"external_id"
],
"quantum.db.securitygroups_db.SecurityGroupRule" : ["id",
"tenant_id",
"external_id",
"security_group_id",
"ethertype",
"direction",
"protocol",
"port_range_min",
"port_range_max",
"source_ip_prefix",
"source_group_id"
]
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20130116/61447e7c/attachment.html>
More information about the OpenStack-dev
mailing list