def object_update(self, obj_cls, new_obj_dict): """From resource ID, update the corresponding IF-MAP identity.""" ifmap_id = get_ifmap_id_from_fq_name(obj_cls.resource_type, new_obj_dict['fq_name']) # read in refs from ifmap to determine which ones become inactive after # update existing_links = VncIfmapServer.get_links(ifmap_id) if not existing_links: # UPDATE notify queued before CREATE notify, Skip publish to IFMAP. return (True, '') # remove properties that are no longer active delete_links = [] for prop, meta in obj_cls.prop_field_metas.items(): meta_name = 'contrail:%s' % meta if meta_name in existing_links and new_obj_dict.get(prop) is None: delete_links.append(meta_name) # remove refs that are no longer active refs = dict((obj_cls.ref_field_metas[rf], obj_cls.ref_field_types[rf][0]) for rf in obj_cls.ref_fields) # refs = {'virtual-network-qos-forwarding-class': 'qos-forwarding-...', # 'virtual-network-network-ipam': 'network-ipam', # 'virtual-network-network-policy': 'network-policy', # 'virtual-network-route-table': 'route-table'} for meta, ref_res_type in refs.items(): old_refs = set(link_key for link_key in existing_links.keys() if meta in link_key) new_refs = set() ref_obj_type = self._db_client_mgr.get_resource_class( ref_res_type).object_type for ref in new_obj_dict.get(ref_obj_type + '_refs', []): to_imid = get_ifmap_id_from_fq_name(ref_res_type, ref['to']) new_refs.add('contrail:%s %s' % (meta, to_imid)) delete_links.extend(list(old_refs - new_refs)) if delete_links: VncIfmapServer.delete(ifmap_id, delete_links) return self._object_set(obj_cls, ifmap_id, new_obj_dict, existing_links)
def object_update(self, obj_cls, new_obj_dict): ifmap_id = get_ifmap_id_from_fq_name(obj_cls.resource_type, new_obj_dict['fq_name']) # read in refs from ifmap to determine which ones become inactive after update existing_metas = self._object_read_to_meta_index(ifmap_id) if not existing_metas: # UPDATE notify queued before CREATE notify, Skip publish to IFMAP. return (True, '') # remove properties that are no longer active props = obj_cls.prop_field_metas for prop, meta in props.items(): if meta in existing_metas and new_obj_dict.get(prop) is None: self._delete_id_self_meta(ifmap_id, meta) # remove refs that are no longer active delete_list = [] refs = dict( (obj_cls.ref_field_metas[rf], obj_cls.ref_field_types[rf][0]) for rf in obj_cls.ref_fields) #refs = {'virtual-network-qos-forwarding-class': 'qos-forwarding-class', # 'virtual-network-network-ipam': 'network-ipam', # 'virtual-network-network-policy': 'network-policy', # 'virtual-network-route-table': 'route-table'} for meta, ref_res_type in refs.items(): old_set = set(existing_metas.get(meta, {}).keys()) new_set = set() ref_obj_type = self._db_client_mgr.get_resource_class( ref_res_type).object_type for ref in new_obj_dict.get(ref_obj_type + '_refs', []): to_imid = get_ifmap_id_from_fq_name(ref_res_type, ref['to']) new_set.add(to_imid) for inact_ref in old_set - new_set: delete_list.append((inact_ref, meta)) if delete_list: self._delete_id_pair_meta_list(ifmap_id, delete_list) (ok, result) = self.object_set(obj_cls, ifmap_id, existing_metas, new_obj_dict) return (ok, result)
def object_update(self, obj_cls, new_obj_dict): ifmap_id = get_ifmap_id_from_fq_name(obj_cls.resource_type, new_obj_dict['fq_name']) # read in refs from ifmap to determine which ones become inactive after update existing_metas = self._object_read_to_meta_index(ifmap_id) if not existing_metas: # UPDATE notify queued before CREATE notify, Skip publish to IFMAP. return (True, '') # remove properties that are no longer active props = obj_cls.prop_field_metas for prop, meta in props.items(): if meta in existing_metas and new_obj_dict.get(prop) is None: self._delete_id_self_meta(ifmap_id, meta) # remove refs that are no longer active delete_list = [] refs = dict((obj_cls.ref_field_metas[rf], obj_cls.ref_field_types[rf][0]) for rf in obj_cls.ref_fields) #refs = {'virtual-network-qos-forwarding-class': 'qos-forwarding-class', # 'virtual-network-network-ipam': 'network-ipam', # 'virtual-network-network-policy': 'network-policy', # 'virtual-network-route-table': 'route-table'} for meta, ref_res_type in refs.items(): old_set = set(existing_metas.get(meta, {}).keys()) new_set = set() ref_obj_type = self._db_client_mgr.get_resource_class( ref_res_type).object_type for ref in new_obj_dict.get(ref_obj_type+'_refs', []): to_imid = get_ifmap_id_from_fq_name(ref_res_type, ref['to']) new_set.add(to_imid) for inact_ref in old_set - new_set: delete_list.append((inact_ref, meta)) if delete_list: self._delete_id_pair_meta_list(ifmap_id, delete_list) (ok, result) = self.object_set(obj_cls, ifmap_id, existing_metas, new_obj_dict) return (ok, result)
def ifmap_has_ident(self, obj=None, id=None): if obj: _type = obj.get_type() _fq_name = obj.get_fq_name() if id: _type = self._vnc_lib.id_to_fq_name_type(id) _fq_name = self._vnc_lib.id_to_fq_name(id) ifmap_id = imid.get_ifmap_id_from_fq_name(_type, _fq_name) if ifmap_id in FakeIfmapClient._graph: return True return False
def ifmap_has_ident(self, obj=None, id=None, port='8443'): if obj: _type = obj.get_type() _fq_name = obj.get_fq_name() if id: _type = self._vnc_lib.id_to_fq_name_type(id) _fq_name = self._vnc_lib.id_to_fq_name(id) ifmap_id = imid.get_ifmap_id_from_fq_name(_type, _fq_name) if ifmap_id in FakeIfmapClient._graph[port]: return True return False
def object_update(self, obj_cls, new_obj_dict): """From resource ID, update the corresponding IF-MAP identity.""" ifmap_id = get_ifmap_id_from_fq_name(obj_cls.resource_type, new_obj_dict["fq_name"]) # read in refs from ifmap to determine which ones become inactive after # update existing_links = VncIfmapServer.get_links(ifmap_id) if not existing_links: # UPDATE notify queued before CREATE notify, Skip publish to IFMAP. return (True, "") # remove properties that are no longer active delete_links = [] for prop, meta in obj_cls.prop_field_metas.items(): meta_name = "contrail:%s" % meta if meta_name in existing_links and new_obj_dict.get(prop) is None: delete_links.append(meta_name) # remove refs that are no longer active refs = dict((obj_cls.ref_field_metas[rf], obj_cls.ref_field_types[rf][0]) for rf in obj_cls.ref_fields) # refs = {'virtual-network-qos-forwarding-class': 'qos-forwarding-...', # 'virtual-network-network-ipam': 'network-ipam', # 'virtual-network-network-policy': 'network-policy', # 'virtual-network-route-table': 'route-table'} for meta, ref_res_type in refs.items(): old_refs = set(link_key for link_key in existing_links.keys() if meta in link_key) new_refs = set() ref_obj_type = self._db_client_mgr.get_resource_class(ref_res_type).object_type for ref in new_obj_dict.get(ref_obj_type + "_refs", []): to_imid = get_ifmap_id_from_fq_name(ref_res_type, ref["to"]) new_refs.add("contrail:%s %s" % (meta, to_imid)) delete_links.extend(list(old_refs - new_refs)) if delete_links: VncIfmapServer.delete(ifmap_id, delete_links) return self._object_set(obj_cls, ifmap_id, new_obj_dict, existing_links)
def ifmap_has_ident(self, obj=None, id=None, type_fq_name=None): if obj: _type = obj.get_type() _fq_name = obj.get_fq_name() if id: _type = self._vnc_lib.id_to_fq_name_type(id) _fq_name = self._vnc_lib.id_to_fq_name(id) if type_fq_name: _type = type_fq_name[0] _fq_name = type_fq_name[1] ifmap_id = imid.get_ifmap_id_from_fq_name(_type, _fq_name) if ifmap_id in vnc_cfg_api_server.VncIfmapServer._graph: return vnc_cfg_api_server.VncIfmapServer._graph[ifmap_id] return None
def ifmap_has_ident(self, obj=None, id=None, type_fq_name=None): if obj: _type = obj.get_type() _fq_name = obj.get_fq_name() if id: _type = self._vnc_lib.id_to_fq_name_type(id) _fq_name = self._vnc_lib.id_to_fq_name(id) if type_fq_name: _type = type_fq_name[0] _fq_name = type_fq_name[1] ifmap_id = imid.get_ifmap_id_from_fq_name(_type, _fq_name) if self._ifmap_server_ip is not None: port = str(self._api_ifmap_port) if ifmap_id in FakeIfmapClient._graph[port]: # Old ifmap fake client store identity and link in lxml object # in memory, we need to convert them in string return self._xml_to_string( FakeIfmapClient._graph[port][ifmap_id]) else: if ifmap_id in vnc_cfg_api_server.VncIfmapServer._graph: return vnc_cfg_api_server.VncIfmapServer._graph[ifmap_id] return None
def ifmap_has_ident(self, obj=None, id=None, type_fq_name=None): if obj: _type = obj.get_type() _fq_name = obj.get_fq_name() if id: _type = self._vnc_lib.id_to_fq_name_type(id) _fq_name = self._vnc_lib.id_to_fq_name(id) if type_fq_name: _type = type_fq_name[0] _fq_name = type_fq_name[1] ifmap_id = imid.get_ifmap_id_from_fq_name(_type, _fq_name) if self._ifmap_server_ip is not None: port = str(self._api_ifmap_port) if ifmap_id in FakeIfmapClient._graph[port]: # Old ifmap fake client store identity and link in lxml object # in memory, we need to convert them in string return self._xml_to_string( FakeIfmapClient._graph[port][ifmap_id]) else: if ifmap_id in vnc_cfg_api_server.VncIfmapServer._graph: return vnc_cfg_api_server.VncIfmapServer._graph[ifmap_id] return None
def _object_set(self, obj_class, ifmap_id, obj_dict, existing_links=None): # Properties Metadata metadatas = [] for prop_field in obj_class.prop_fields: prop_value = obj_dict.get(prop_field) if prop_value is None: continue # construct object of xsd-type and get its xml repr # e.g. virtual_network_properties prop_field_types = obj_class.prop_field_types[prop_field] is_simple = not prop_field_types['is_complex'] prop_type = prop_field_types['xsd_type'] # e.g. virtual-network-properties meta_name = obj_class.prop_field_metas[prop_field] meta_long_name = 'contrail:%s' % meta_name meta_value = '' meta_elements = '' if prop_field in self.IFMAP_PUBLISH_SKIP_LIST: # Field not relevant, skip publishing to IfMap if not self.IFMAP_PUBLISH_SKIP_LIST[prop_field]: continue # Call the handler fn to generate the relevant fields. try: func = getattr(self, self.IFMAP_PUBLISH_SKIP_LIST[prop_field]) meta_elements = func(prop_field, prop_value) except AttributeError: log_str = ("%s is marked for partial publish to Ifmap but " "handler not defined" % prop_field) self._log(log_str, level=SandeshLevel.SYS_DEBUG) continue elif is_simple: meta_value = escape(str(prop_value)) else: # complex type prop_cls = str_to_class(prop_type, __name__) buf = StringIO() # perms might be inserted at server as obj. # obj construction diff from dict construction. if isinstance(prop_value, dict): prop_cls(**prop_value).exportChildren(buf, level=1, name_=meta_name, pretty_print=False) elif isinstance(prop_value, list): for elem in prop_value: if isinstance(elem, dict): prop_cls(**elem).exportChildren(buf, level=1, name_=meta_name, pretty_print=False) else: elem.exportChildren(buf, level=1, name_=meta_name, pretty_print=False) else: # object prop_value.exportChildren(buf, level=1, name_=meta_name, pretty_print=False) meta_elements = buf.getvalue() buf.close() meta = Metadata(meta_name, meta_value, {'ifmap-cardinality': 'singleValue'}, ns_prefix='contrail', elements=meta_elements) # If obj is new (existing metas is none) or # if obj does not have this meta (or) # or if the meta is different from what we have currently, # then update if (not existing_links or meta_long_name not in existing_links or ('meta' in existing_links[meta_long_name] and unicode(meta) != existing_links[meta_long_name]['meta'])): metadatas.append(meta) # end for all property types VncIfmapServer.update(ifmap_id, metadatas=metadatas) # References Metadata for ref_field in obj_class.ref_fields: refs = obj_dict.get(ref_field) if not refs: continue for ref in refs: ref_fq_name = ref['to'] ref_fld_types_list = list(obj_class.ref_field_types[ref_field]) ref_res_type = ref_fld_types_list[0] ref_link_type = ref_fld_types_list[1] ref_meta = obj_class.ref_field_metas[ref_field] ref_ifmap_id = get_ifmap_id_from_fq_name(ref_res_type, ref_fq_name) ref_data = ref.get('attr') if ref_data: buf = StringIO() attr_cls = str_to_class(ref_link_type, __name__) attr_cls(**ref_data).exportChildren(buf, level=1, name_=ref_meta, pretty_print=False) ref_link_xml = buf.getvalue() buf.close() else: ref_link_xml = '' metadata = Metadata(ref_meta, '', {'ifmap-cardinality': 'singleValue'}, ns_prefix='contrail', elements=ref_link_xml) VncIfmapServer.update(ifmap_id, ref_ifmap_id, [metadata]) # end for all ref types return (True, '')
def get_obj_imid(self, obj): return imid.get_ifmap_id_from_fq_name(obj._type, obj.get_fq_name_str())
def get_obj_imid(self, obj): return imid.get_ifmap_id_from_fq_name(obj._type, obj.get_fq_name_str())
def object_set(self, obj_class, my_imid, existing_metas, obj_dict): update = {} # Properties Meta for prop_field in obj_class.prop_fields: field = obj_dict.get(prop_field) if field is None: continue # construct object of xsd-type and get its xml repr # e.g. virtual_network_properties prop_field_types = obj_class.prop_field_types[prop_field] is_simple = not prop_field_types['is_complex'] prop_type = prop_field_types['xsd_type'] # e.g. virtual-network-properties prop_meta = obj_class.prop_field_metas[prop_field] if prop_field in VncIfmapClient.IFMAP_PUBLISH_SKIP_LIST: # Field not relevant, skip publishing to IfMap if not VncIfmapClient.IFMAP_PUBLISH_SKIP_LIST[prop_field]: continue # Call the handler fn to generate the relevant fields. if callable( VncIfmapClient.IFMAP_PUBLISH_SKIP_LIST[prop_field]): prop_xml = VncIfmapClient.IFMAP_PUBLISH_SKIP_LIST[ prop_field](prop_field, field) meta = Metadata(prop_meta, '', {'ifmap-cardinality': 'singleValue'}, ns_prefix='contrail', elements=prop_xml) else: log_str = '%s is marked for partial publish\ to Ifmap but handler not defined' % (prop_field) self.config_log(log_str, level=SandeshLevel.SYS_DEBUG) continue elif is_simple: norm_str = escape(str(field)) meta = Metadata(prop_meta, norm_str, {'ifmap-cardinality': 'singleValue'}, ns_prefix='contrail') else: # complex type prop_cls = str_to_class(prop_type, __name__) buf = cStringIO.StringIO() # perms might be inserted at server as obj. # obj construction diff from dict construction. if isinstance(field, dict): prop_cls(**field).exportChildren(buf, level=1, name_=prop_meta, pretty_print=False) elif isinstance(field, list): for elem in field: if isinstance(elem, dict): prop_cls(**elem).exportChildren(buf, level=1, name_=prop_meta, pretty_print=False) else: elem.exportChildren(buf, level=1, name_=prop_meta, pretty_print=False) else: # object field.exportChildren(buf, level=1, name_=prop_meta, pretty_print=False) prop_xml = buf.getvalue() buf.close() meta = Metadata(prop_meta, '', {'ifmap-cardinality': 'singleValue'}, ns_prefix='contrail', elements=prop_xml) # If obj is new (existing metas is none) or # if obj does not have this prop_meta (or) # or if the prop_meta is different from what we have currently, # then update if (not existing_metas or not prop_meta in existing_metas or ('' in existing_metas[prop_meta] and str(meta) != str(existing_metas[prop_meta]['']))): self._update_id_self_meta(update, meta) # end for all property types # References Meta for ref_field in obj_class.ref_fields: refs = obj_dict.get(ref_field) if not refs: continue for ref in refs: ref_fq_name = ref['to'] ref_fld_types_list = list(obj_class.ref_field_types[ref_field]) ref_res_type = ref_fld_types_list[0] ref_link_type = ref_fld_types_list[1] ref_meta = obj_class.ref_field_metas[ref_field] ref_imid = get_ifmap_id_from_fq_name(ref_res_type, ref_fq_name) ref_data = ref.get('attr') if ref_data: buf = cStringIO.StringIO() attr_cls = str_to_class(ref_link_type, __name__) attr_cls(**ref_data).exportChildren(buf, level=1, name_=ref_meta, pretty_print=False) ref_link_xml = buf.getvalue() buf.close() else: ref_link_xml = '' meta = Metadata(ref_meta, '', {'ifmap-cardinality': 'singleValue'}, ns_prefix='contrail', elements=ref_link_xml) self._update_id_pair_meta(update, ref_imid, meta) # end for all ref types self._publish_update(my_imid, update) return (True, '')
def object_set(self, obj_class, my_imid, existing_metas, obj_dict): update = {} # Properties Meta for prop_field in obj_class.prop_fields: field = obj_dict.get(prop_field) if field is None: continue # construct object of xsd-type and get its xml repr # e.g. virtual_network_properties prop_field_types = obj_class.prop_field_types[prop_field] is_simple = not prop_field_types['is_complex'] prop_type = prop_field_types['xsd_type'] # e.g. virtual-network-properties prop_meta = obj_class.prop_field_metas[prop_field] if prop_field in VncIfmapClient.IFMAP_PUBLISH_SKIP_LIST: # Field not relevant, skip publishing to IfMap if not VncIfmapClient.IFMAP_PUBLISH_SKIP_LIST[prop_field]: continue # Call the handler fn to generate the relevant fields. if callable(VncIfmapClient.IFMAP_PUBLISH_SKIP_LIST[prop_field]): prop_xml = VncIfmapClient.IFMAP_PUBLISH_SKIP_LIST[prop_field]( prop_field, field) meta = Metadata(prop_meta, '', {'ifmap-cardinality':'singleValue'}, ns_prefix='contrail', elements=prop_xml) else: log_str = '%s is marked for partial publish\ to Ifmap but handler not defined' %( prop_field) self.config_log(log_str, level=SandeshLevel.SYS_DEBUG) continue elif is_simple: norm_str = escape(str(field)) meta = Metadata(prop_meta, norm_str, {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail') else: # complex type prop_cls = str_to_class(prop_type, __name__) buf = cStringIO.StringIO() # perms might be inserted at server as obj. # obj construction diff from dict construction. if isinstance(field, dict): prop_cls(**field).exportChildren( buf, level=1, name_=prop_meta, pretty_print=False) elif isinstance(field, list): for elem in field: if isinstance(elem, dict): prop_cls(**elem).exportChildren( buf, level=1, name_=prop_meta, pretty_print=False) else: elem.exportChildren( buf, level=1, name_=prop_meta, pretty_print=False) else: # object field.exportChildren( buf, level=1, name_=prop_meta, pretty_print=False) prop_xml = buf.getvalue() buf.close() meta = Metadata(prop_meta, '', {'ifmap-cardinality':'singleValue'}, ns_prefix='contrail', elements=prop_xml) # If obj is new (existing metas is none) or # if obj does not have this prop_meta (or) # or if the prop_meta is different from what we have currently, # then update if (not existing_metas or not prop_meta in existing_metas or ('' in existing_metas[prop_meta] and str(meta) != str(existing_metas[prop_meta]['']))): self._update_id_self_meta(update, meta) # end for all property types # References Meta for ref_field in obj_class.ref_fields: refs = obj_dict.get(ref_field) if not refs: continue for ref in refs: ref_fq_name = ref['to'] ref_fld_types_list = list( obj_class.ref_field_types[ref_field]) ref_res_type = ref_fld_types_list[0] ref_link_type = ref_fld_types_list[1] ref_meta = obj_class.ref_field_metas[ref_field] ref_imid = get_ifmap_id_from_fq_name(ref_res_type, ref_fq_name) ref_data = ref.get('attr') if ref_data: buf = cStringIO.StringIO() attr_cls = str_to_class(ref_link_type, __name__) attr_cls(**ref_data).exportChildren( buf, level=1, name_=ref_meta, pretty_print=False) ref_link_xml = buf.getvalue() buf.close() else: ref_link_xml = '' meta = Metadata(ref_meta, '', {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail', elements=ref_link_xml) self._update_id_pair_meta(update, ref_imid, meta) # end for all ref types self._publish_update(my_imid, update) return (True, '')
def _object_set(self, obj_class, ifmap_id, obj_dict, existing_links=None): # Properties Metadata metadatas = [] for prop_field in obj_class.prop_fields: prop_value = obj_dict.get(prop_field) if prop_value is None: continue # construct object of xsd-type and get its xml repr # e.g. virtual_network_properties prop_field_types = obj_class.prop_field_types[prop_field] is_simple = not prop_field_types["is_complex"] prop_type = prop_field_types["xsd_type"] # e.g. virtual-network-properties meta_name = obj_class.prop_field_metas[prop_field] meta_long_name = "contrail:%s" % meta_name meta_value = "" meta_elements = "" if prop_field in self.IFMAP_PUBLISH_SKIP_LIST: # Field not relevant, skip publishing to IfMap if not self.IFMAP_PUBLISH_SKIP_LIST[prop_field]: continue # Call the handler fn to generate the relevant fields. try: func = getattr(self, self.IFMAP_PUBLISH_SKIP_LIST[prop_field]) meta_elements = func(prop_field, prop_value) except AttributeError: log_str = "%s is marked for partial publish to Ifmap but " "handler not defined" % prop_field self._log(log_str, level=SandeshLevel.SYS_DEBUG) continue elif is_simple: meta_value = escape(str(prop_value)) else: # complex type prop_cls = str_to_class(prop_type, __name__) buf = StringIO() # perms might be inserted at server as obj. # obj construction diff from dict construction. if isinstance(prop_value, dict): prop_cls(**prop_value).exportChildren(buf, level=1, name_=meta_name, pretty_print=False) elif isinstance(prop_value, list): for elem in prop_value: if isinstance(elem, dict): prop_cls(**elem).exportChildren(buf, level=1, name_=meta_name, pretty_print=False) else: elem.exportChildren(buf, level=1, name_=meta_name, pretty_print=False) else: # object prop_value.exportChildren(buf, level=1, name_=meta_name, pretty_print=False) meta_elements = buf.getvalue() buf.close() meta = Metadata( meta_name, meta_value, {"ifmap-cardinality": "singleValue"}, ns_prefix="contrail", elements=meta_elements, ) # If obj is new (existing metas is none) or # if obj does not have this meta (or) # or if the meta is different from what we have currently, # then update if ( not existing_links or meta_long_name not in existing_links or ( "meta" in existing_links[meta_long_name] and unicode(meta) != existing_links[meta_long_name]["meta"] ) ): metadatas.append(meta) # end for all property types VncIfmapServer.update(ifmap_id, metadatas=metadatas) # References Metadata for ref_field in obj_class.ref_fields: refs = obj_dict.get(ref_field) if not refs: continue for ref in refs: ref_fq_name = ref["to"] ref_fld_types_list = list(obj_class.ref_field_types[ref_field]) ref_res_type = ref_fld_types_list[0] ref_link_type = ref_fld_types_list[1] ref_meta = obj_class.ref_field_metas[ref_field] ref_ifmap_id = get_ifmap_id_from_fq_name(ref_res_type, ref_fq_name) ref_data = ref.get("attr") if ref_data: buf = StringIO() attr_cls = str_to_class(ref_link_type, __name__) attr_cls(**ref_data).exportChildren(buf, level=1, name_=ref_meta, pretty_print=False) ref_link_xml = buf.getvalue() buf.close() else: ref_link_xml = "" metadata = Metadata( ref_meta, "", {"ifmap-cardinality": "singleValue"}, ns_prefix="contrail", elements=ref_link_xml ) VncIfmapServer.update(ifmap_id, ref_ifmap_id, [metadata]) # end for all ref types return (True, "")