diff --git a/src/config/vnc_openstack/vnc_openstack/neutron_plugin_db.py b/src/config/vnc_openstack/vnc_openstack/neutron_plugin_db.py index e0c1ac3c25f..b698a86ff89 100644 --- a/src/config/vnc_openstack/vnc_openstack/neutron_plugin_db.py +++ b/src/config/vnc_openstack/vnc_openstack/neutron_plugin_db.py @@ -1835,15 +1835,18 @@ def _port_neutron_to_vnc(self, port_q, net_obj, oper): # pick binding keys from neutron repr and persist as kvp elements # that are string/string(k/v). # it is assumed allowing/denying oper*key is done at neutron-server. + vmi_binding_kvps = dict((k.replace('binding:',''), v) + for k,v in port_q.items() if k.startswith('binding:')) + for k,v in vmi_binding_kvps.items(): + if isinstance(v, basestring): + continue + vmi_binding_kvps[k] = json.dumps(v) + if oper == CREATE: - vmi_binding_kvps = dict((k.replace('binding:',''), json.dumps(v)) - for k,v in port_q.items() if k.startswith('binding:')) port_obj.set_virtual_machine_interface_bindings( KeyValuePairs([KeyValuePair(k,v) for k,v in vmi_binding_kvps.items()])) elif oper == UPDATE: - vmi_binding_kvps = dict((k.replace('binding:',''), json.dumps(v)) - for k,v in port_q.items() if k.startswith('binding:')) for k,v in vmi_binding_kvps.items(): port_obj.add_virtual_machine_interface_bindings( KeyValuePair(key=k, value=v)) @@ -2033,9 +2036,8 @@ def _port_vnc_to_neutron(self, port_obj, port_req_memo=None): for kvp in kvps: try: port_q_dict['binding:'+kvp.key] = json.loads(kvp.value) - except ValueError: - # upgrade case, earlier version might have saved it - # in non-json format OR vif_details/vif_type/vnic_type + except (ValueError, TypeError): + # native string case, so not stored as json port_q_dict['binding:'+kvp.key] = kvp.value # 1. upgrade case, port created before bindings prop was diff --git a/src/config/vnc_openstack/vnc_openstack/tests/test_basic.py b/src/config/vnc_openstack/vnc_openstack/tests/test_basic.py index ec50bd3705a..350da32fcc0 100644 --- a/src/config/vnc_openstack/vnc_openstack/tests/test_basic.py +++ b/src/config/vnc_openstack/vnc_openstack/tests/test_basic.py @@ -276,11 +276,13 @@ def test_port_bindings(self): 'roles': ''} data = {'resource':{'network_id': vn_obj.uuid, 'tenant_id': proj_uuid, - 'binding:profile': {'foo': 'bar'}}} + 'binding:profile': {'foo': 'bar'}, + 'binding:host_id': 'somehost'}} body = {'context': context, 'data': data} resp = self._api_svr_app.post_json('/neutron/port', body) port_dict = json.loads(resp.text) self.assertTrue(isinstance(port_dict['binding:profile'], dict)) + self.assertTrue(isinstance(port_dict['binding:host_id'], basestring)) # end test_port_bindings # end class TestBasic