[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