summaryrefslogtreecommitdiffstats
path: root/Testcases/vnc_api/gen/vnc_ifmap_client_gen.py
diff options
context:
space:
mode:
Diffstat (limited to 'Testcases/vnc_api/gen/vnc_ifmap_client_gen.py')
-rw-r--r--Testcases/vnc_api/gen/vnc_ifmap_client_gen.py10533
1 files changed, 10533 insertions, 0 deletions
diff --git a/Testcases/vnc_api/gen/vnc_ifmap_client_gen.py b/Testcases/vnc_api/gen/vnc_ifmap_client_gen.py
new file mode 100644
index 0000000..c07130d
--- /dev/null
+++ b/Testcases/vnc_api/gen/vnc_ifmap_client_gen.py
@@ -0,0 +1,10533 @@
+
+# AUTO-GENERATED file from IFMapApiGenerator. Do Not Edit!
+
+import re
+import json
+import cStringIO
+from lxml import etree
+
+from cfgm_common.ifmap.client import client, namespaces
+from cfgm_common.ifmap.request import NewSessionRequest, RenewSessionRequest
+from cfgm_common.ifmap.request import EndSessionRequest, PublishRequest
+from cfgm_common.ifmap.request import SearchRequest, SubscribeRequest, PurgeRequest, PollRequest
+from cfgm_common.ifmap.id import IPAddress, MACAddress, Device, AccessRequest, Identity, CustomIdentity
+from cfgm_common.ifmap.operations import PublishUpdateOperation, PublishNotifyOperation
+from cfgm_common.ifmap.operations import PublishDeleteOperation, SubscribeUpdateOperation, SubscribeDeleteOperation
+from cfgm_common.ifmap.util import attr, link_ids
+from cfgm_common.ifmap.response import Response, newSessionResult
+from cfgm_common.ifmap.metadata import Metadata
+
+import cfgm_common.imid
+import cfgm_common.exceptions
+from cfgm_common.imid import escape
+from resource_xsd import *
+
+class VncIfmapClientGen(object):
+ def __init__(self):
+ self._parent_metas = {}
+ self._parent_metas['domain'] = {}
+ self._parent_metas['domain']['project'] = 'domain-project'
+ self._parent_metas['domain']['namespace'] = 'domain-namespace'
+ self._parent_metas['domain']['service-template'] = 'domain-service-template'
+ self._parent_metas['domain']['virtual-DNS'] = 'domain-virtual-DNS'
+ self._parent_metas['global-vrouter-config'] = {}
+ self._parent_metas['instance-ip'] = {}
+ self._parent_metas['network-policy'] = {}
+ self._parent_metas['loadbalancer-pool'] = {}
+ self._parent_metas['loadbalancer-pool']['loadbalancer-member'] = 'loadbalancer-pool-loadbalancer-member'
+ self._parent_metas['virtual-DNS-record'] = {}
+ self._parent_metas['route-target'] = {}
+ self._parent_metas['floating-ip'] = {}
+ self._parent_metas['floating-ip-pool'] = {}
+ self._parent_metas['floating-ip-pool']['floating-ip'] = 'floating-ip-pool-floating-ip'
+ self._parent_metas['physical-router'] = {}
+ self._parent_metas['physical-router']['physical-interface'] = 'physical-router-physical-interface'
+ self._parent_metas['physical-router']['logical-interface'] = 'physical-router-logical-interface'
+ self._parent_metas['bgp-router'] = {}
+ self._parent_metas['virtual-router'] = {}
+ self._parent_metas['config-root'] = {}
+ self._parent_metas['config-root']['global-system-config'] = 'config-root-global-system-config'
+ self._parent_metas['config-root']['domain'] = 'config-root-domain'
+ self._parent_metas['subnet'] = {}
+ self._parent_metas['global-system-config'] = {}
+ self._parent_metas['global-system-config']['global-vrouter-config'] = 'global-system-config-global-vrouter-config'
+ self._parent_metas['global-system-config']['physical-router'] = 'global-system-config-physical-router'
+ self._parent_metas['global-system-config']['virtual-router'] = 'global-system-config-virtual-router'
+ self._parent_metas['global-system-config']['config-node'] = 'global-system-config-config-node'
+ self._parent_metas['global-system-config']['analytics-node'] = 'global-system-config-analytics-node'
+ self._parent_metas['global-system-config']['database-node'] = 'global-system-config-database-node'
+ self._parent_metas['global-system-config']['service-appliance-set'] = 'global-system-config-service-appliance-set'
+ self._parent_metas['service-appliance'] = {}
+ self._parent_metas['service-instance'] = {}
+ self._parent_metas['namespace'] = {}
+ self._parent_metas['logical-interface'] = {}
+ self._parent_metas['route-table'] = {}
+ self._parent_metas['physical-interface'] = {}
+ self._parent_metas['physical-interface']['logical-interface'] = 'physical-interface-logical-interface'
+ self._parent_metas['access-control-list'] = {}
+ self._parent_metas['analytics-node'] = {}
+ self._parent_metas['virtual-DNS'] = {}
+ self._parent_metas['virtual-DNS']['virtual-DNS-record'] = 'virtual-DNS-virtual-DNS-record'
+ self._parent_metas['customer-attachment'] = {}
+ self._parent_metas['service-appliance-set'] = {}
+ self._parent_metas['service-appliance-set']['service-appliance'] = 'service-appliance-set-service-appliance'
+ self._parent_metas['config-node'] = {}
+ self._parent_metas['qos-queue'] = {}
+ self._parent_metas['virtual-machine'] = {}
+ self._parent_metas['virtual-machine']['virtual-machine-interface'] = 'virtual-machine-virtual-machine-interface'
+ self._parent_metas['interface-route-table'] = {}
+ self._parent_metas['service-template'] = {}
+ self._parent_metas['virtual-ip'] = {}
+ self._parent_metas['loadbalancer-member'] = {}
+ self._parent_metas['security-group'] = {}
+ self._parent_metas['security-group']['access-control-list'] = 'security-group-access-control-list'
+ self._parent_metas['provider-attachment'] = {}
+ self._parent_metas['virtual-machine-interface'] = {}
+ self._parent_metas['loadbalancer-healthmonitor'] = {}
+ self._parent_metas['virtual-network'] = {}
+ self._parent_metas['virtual-network']['access-control-list'] = 'virtual-network-access-control-list'
+ self._parent_metas['virtual-network']['floating-ip-pool'] = 'virtual-network-floating-ip-pool'
+ self._parent_metas['virtual-network']['routing-instance'] = 'virtual-network-routing-instance'
+ self._parent_metas['project'] = {}
+ self._parent_metas['project']['security-group'] = 'project-security-group'
+ self._parent_metas['project']['virtual-network'] = 'project-virtual-network'
+ self._parent_metas['project']['qos-queue'] = 'project-qos-queue'
+ self._parent_metas['project']['qos-forwarding-class'] = 'project-qos-forwarding-class'
+ self._parent_metas['project']['network-ipam'] = 'project-network-ipam'
+ self._parent_metas['project']['network-policy'] = 'project-network-policy'
+ self._parent_metas['project']['virtual-machine-interface'] = 'project-virtual-machine-interface'
+ self._parent_metas['project']['service-instance'] = 'project-service-instance'
+ self._parent_metas['project']['route-table'] = 'project-route-table'
+ self._parent_metas['project']['interface-route-table'] = 'project-interface-route-table'
+ self._parent_metas['project']['logical-router'] = 'project-logical-router'
+ self._parent_metas['project']['loadbalancer-pool'] = 'project-loadbalancer-pool'
+ self._parent_metas['project']['loadbalancer-healthmonitor'] = 'project-loadbalancer-healthmonitor'
+ self._parent_metas['project']['virtual-ip'] = 'project-virtual-ip'
+ self._parent_metas['qos-forwarding-class'] = {}
+ self._parent_metas['database-node'] = {}
+ self._parent_metas['routing-instance'] = {}
+ self._parent_metas['routing-instance']['bgp-router'] = 'instance-bgp-router'
+ self._parent_metas['network-ipam'] = {}
+ self._parent_metas['logical-router'] = {}
+ #end __init__
+
+ def _ifmap_domain_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.domain_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_domain_alloc
+
+ def _ifmap_domain_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('domain_limits', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['domain_limits']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ DomainLimitsType(**field).exportChildren(buf, level = 1, name_ = 'domain-limits', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'domain-limits', pretty_print = False)
+ domain_limits_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('domain-limits' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = domain_limits_xml)
+
+ if (existing_metas and 'domain-limits' in existing_metas and
+ str(existing_metas['domain-limits'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('api_access_list', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['api_access_list']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ ApiAccessListType(**field).exportChildren(buf, level = 1, name_ = 'api-access-list', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'api-access-list', pretty_print = False)
+ api_access_list_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('api-access-list' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = api_access_list_xml)
+
+ if (existing_metas and 'api-access-list' in existing_metas and
+ str(existing_metas['api-access-list'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('project_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'project'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ domain_project_xml = ''
+ meta = Metadata('domain-project' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = domain_project_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('namespace_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'namespace'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ domain_namespace_xml = ''
+ meta = Metadata('domain-namespace' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = domain_namespace_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('service_template_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'service-template'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ domain_service_template_xml = ''
+ meta = Metadata('domain-service-template' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = domain_service_template_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_DNS_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-DNS'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ domain_virtual_DNS_xml = ''
+ meta = Metadata('domain-virtual-DNS' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = domain_virtual_DNS_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_domain_set
+
+ def _ifmap_domain_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['domain']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_domain_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_domain_create
+
+
+ def _ifmap_domain_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'domain-limits', u'api-access-list', u'id-perms', u'display-name', u'domain-project', u'domain-namespace', u'domain-service-template', u'domain-virtual-DNS']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_domain_read_to_meta_index
+
+ def _ifmap_domain_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_domain_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['domain-limits', 'api-access-list', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_domain_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_domain_update
+
+ def _ifmap_domain_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_domain_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_domain_delete
+
+ def _ifmap_global_vrouter_config_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.global_vrouter_config_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_global_vrouter_config_alloc
+
+ def _ifmap_global_vrouter_config_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('linklocal_services', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['linklocal_services']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ LinklocalServicesTypes(**field).exportChildren(buf, level = 1, name_ = 'linklocal-services', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'linklocal-services', pretty_print = False)
+ linklocal_services_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('linklocal-services' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = linklocal_services_xml)
+
+ if (existing_metas and 'linklocal-services' in existing_metas and
+ str(existing_metas['linklocal-services'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('encapsulation_priorities', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['encapsulation_priorities']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ EncapsulationPrioritiesType(**field).exportChildren(buf, level = 1, name_ = 'encapsulation-priorities', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'encapsulation-priorities', pretty_print = False)
+ encapsulation_priorities_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('encapsulation-priorities' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = encapsulation_priorities_xml)
+
+ if (existing_metas and 'encapsulation-priorities' in existing_metas and
+ str(existing_metas['encapsulation-priorities'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('vxlan_network_identifier_mode', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['vxlan_network_identifier_mode']))
+ meta = Metadata('vxlan-network-identifier-mode', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'vxlan-network-identifier-mode' in existing_metas and
+ str(existing_metas['vxlan-network-identifier-mode'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_global_vrouter_config_set
+
+ def _ifmap_global_vrouter_config_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['global-vrouter-config']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_global_vrouter_config_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_global_vrouter_config_create
+
+
+ def _ifmap_global_vrouter_config_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'linklocal-services', u'encapsulation-priorities', u'vxlan-network-identifier-mode', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_global-vrouter-config_read_to_meta_index
+
+ def _ifmap_global_vrouter_config_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_global_vrouter_config_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['linklocal-services', 'encapsulation-priorities', 'vxlan-network-identifier-mode', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_global_vrouter_config_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_global_vrouter_config_update
+
+ def _ifmap_global_vrouter_config_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_global_vrouter_config_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_global_vrouter_config_delete
+
+ def _ifmap_instance_ip_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.instance_ip_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_instance_ip_alloc
+
+ def _ifmap_instance_ip_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('instance_ip_address', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['instance_ip_address']))
+ meta = Metadata('instance-ip-address', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'instance-ip-address' in existing_metas and
+ str(existing_metas['instance-ip-address'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('instance_ip_family', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['instance_ip_family']))
+ meta = Metadata('instance-ip-family', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'instance-ip-family' in existing_metas and
+ str(existing_metas['instance-ip-family'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('instance_ip_mode', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['instance_ip_mode']))
+ meta = Metadata('instance-ip-mode', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'instance-ip-mode' in existing_metas and
+ str(existing_metas['instance-ip-mode'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('subnet_uuid', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['subnet_uuid']))
+ meta = Metadata('subnet-uuid', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'subnet-uuid' in existing_metas and
+ str(existing_metas['subnet-uuid'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_network_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-network'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ instance_ip_virtual_network_xml = ''
+ meta = Metadata('instance-ip-virtual-network' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = instance_ip_virtual_network_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ instance_ip_virtual_machine_interface_xml = ''
+ meta = Metadata('instance-ip-virtual-machine-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = instance_ip_virtual_machine_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_instance_ip_set
+
+ def _ifmap_instance_ip_create(self, obj_ids, obj_dict):
+ (ok, result) = self._ifmap_instance_ip_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_instance_ip_create
+
+
+ def _ifmap_instance_ip_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'instance-ip-virtual-network', u'instance-ip-virtual-machine-interface', u'instance-ip-address', u'instance-ip-family', u'instance-ip-mode', u'subnet-uuid', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_instance-ip_read_to_meta_index
+
+ def _ifmap_instance_ip_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_instance_ip_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['instance-ip-address', 'instance-ip-family', 'instance-ip-mode', 'subnet-uuid', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'instance-ip-virtual-network': 'virtual-network',
+ 'instance-ip-virtual-machine-interface': 'virtual-machine-interface'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_instance_ip_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_instance_ip_update
+
+ def _ifmap_instance_ip_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_instance_ip_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_instance_ip_delete
+
+ def _ifmap_network_policy_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.network_policy_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_network_policy_alloc
+
+ def _ifmap_network_policy_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('network_policy_entries', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['network_policy_entries']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ PolicyEntriesType(**field).exportChildren(buf, level = 1, name_ = 'network-policy-entries', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'network-policy-entries', pretty_print = False)
+ network_policy_entries_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('network-policy-entries' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = network_policy_entries_xml)
+
+ if (existing_metas and 'network-policy-entries' in existing_metas and
+ str(existing_metas['network-policy-entries'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_network_policy_set
+
+ def _ifmap_network_policy_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['network-policy']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_network_policy_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_network_policy_create
+
+
+ def _ifmap_network_policy_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'virtual-network-network-policy', u'network-policy-entries', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_network-policy_read_to_meta_index
+
+ def _ifmap_network_policy_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_network_policy_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['network-policy-entries', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_network_policy_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_network_policy_update
+
+ def _ifmap_network_policy_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_network_policy_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_network_policy_delete
+
+ def _ifmap_loadbalancer_pool_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.loadbalancer_pool_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_loadbalancer_pool_alloc
+
+ def _ifmap_loadbalancer_pool_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('loadbalancer_pool_properties', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['loadbalancer_pool_properties']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ LoadbalancerPoolType(**field).exportChildren(buf, level = 1, name_ = 'loadbalancer-pool-properties', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'loadbalancer-pool-properties', pretty_print = False)
+ loadbalancer_pool_properties_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('loadbalancer-pool-properties' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = loadbalancer_pool_properties_xml)
+
+ if (existing_metas and 'loadbalancer-pool-properties' in existing_metas and
+ str(existing_metas['loadbalancer-pool-properties'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('loadbalancer_pool_provider', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['loadbalancer_pool_provider']))
+ meta = Metadata('loadbalancer-pool-provider', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'loadbalancer-pool-provider' in existing_metas and
+ str(existing_metas['loadbalancer-pool-provider'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('service_instance_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'service-instance'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ loadbalancer_pool_service_instance_xml = ''
+ meta = Metadata('loadbalancer-pool-service-instance' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = loadbalancer_pool_service_instance_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ loadbalancer_pool_virtual_machine_interface_xml = ''
+ meta = Metadata('loadbalancer-pool-virtual-machine-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = loadbalancer_pool_virtual_machine_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('service_appliance_set_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'service-appliance-set'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ loadbalancer_pool_service_appliance_set_xml = ''
+ meta = Metadata('loadbalancer-pool-service-appliance-set' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = loadbalancer_pool_service_appliance_set_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('loadbalancer_member_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'loadbalancer-member'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ loadbalancer_pool_loadbalancer_member_xml = ''
+ meta = Metadata('loadbalancer-pool-loadbalancer-member' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = loadbalancer_pool_loadbalancer_member_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('loadbalancer_healthmonitor_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'loadbalancer-healthmonitor'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ loadbalancer_pool_loadbalancer_healthmonitor_xml = ''
+ meta = Metadata('loadbalancer-pool-loadbalancer-healthmonitor' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = loadbalancer_pool_loadbalancer_healthmonitor_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_loadbalancer_pool_set
+
+ def _ifmap_loadbalancer_pool_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['loadbalancer-pool']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_loadbalancer_pool_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_loadbalancer_pool_create
+
+
+ def _ifmap_loadbalancer_pool_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'loadbalancer-pool-service-instance', u'loadbalancer-pool-virtual-machine-interface', u'loadbalancer-pool-service-appliance-set', u'loadbalancer-pool-loadbalancer-healthmonitor', u'virtual-ip-loadbalancer-pool', u'loadbalancer-pool-properties', u'loadbalancer-pool-provider', u'id-perms', u'display-name', u'loadbalancer-pool-loadbalancer-member']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_loadbalancer-pool_read_to_meta_index
+
+ def _ifmap_loadbalancer_pool_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_loadbalancer_pool_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['loadbalancer-pool-properties', 'loadbalancer-pool-provider', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'loadbalancer-pool-service-instance': 'service-instance',
+ 'loadbalancer-pool-virtual-machine-interface': 'virtual-machine-interface',
+ 'loadbalancer-pool-service-appliance-set': 'service-appliance-set',
+ 'loadbalancer-pool-loadbalancer-healthmonitor': 'loadbalancer-healthmonitor'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_loadbalancer_pool_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_loadbalancer_pool_update
+
+ def _ifmap_loadbalancer_pool_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_loadbalancer_pool_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_loadbalancer_pool_delete
+
+ def _ifmap_virtual_DNS_record_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.virtual_DNS_record_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_virtual_DNS_record_alloc
+
+ def _ifmap_virtual_DNS_record_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('virtual_DNS_record_data', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['virtual_DNS_record_data']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ VirtualDnsRecordType(**field).exportChildren(buf, level = 1, name_ = 'virtual-DNS-record-data', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'virtual-DNS-record-data', pretty_print = False)
+ virtual_DNS_record_data_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-DNS-record-data' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_DNS_record_data_xml)
+
+ if (existing_metas and 'virtual-DNS-record-data' in existing_metas and
+ str(existing_metas['virtual-DNS-record-data'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_virtual_DNS_record_set
+
+ def _ifmap_virtual_DNS_record_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['virtual-DNS-record']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_virtual_DNS_record_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_DNS_record_create
+
+
+ def _ifmap_virtual_DNS_record_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'virtual-DNS-record-data', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_virtual-DNS-record_read_to_meta_index
+
+ def _ifmap_virtual_DNS_record_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_virtual_DNS_record_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['virtual-DNS-record-data', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_virtual_DNS_record_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_DNS_record_update
+
+ def _ifmap_virtual_DNS_record_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_virtual_DNS_record_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_virtual_DNS_record_delete
+
+ def _ifmap_route_target_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.route_target_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_route_target_alloc
+
+ def _ifmap_route_target_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_route_target_set
+
+ def _ifmap_route_target_create(self, obj_ids, obj_dict):
+ (ok, result) = self._ifmap_route_target_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_route_target_create
+
+
+ def _ifmap_route_target_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'logical-router-target', u'instance-target', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_route-target_read_to_meta_index
+
+ def _ifmap_route_target_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_route_target_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_route_target_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_route_target_update
+
+ def _ifmap_route_target_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_route_target_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_route_target_delete
+
+ def _ifmap_floating_ip_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.floating_ip_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_floating_ip_alloc
+
+ def _ifmap_floating_ip_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('floating_ip_address', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['floating_ip_address']))
+ meta = Metadata('floating-ip-address', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'floating-ip-address' in existing_metas and
+ str(existing_metas['floating-ip-address'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('floating_ip_is_virtual_ip', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['floating_ip_is_virtual_ip']))
+ meta = Metadata('floating-ip-is-virtual-ip', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'floating-ip-is-virtual-ip' in existing_metas and
+ str(existing_metas['floating-ip-is-virtual-ip'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('floating_ip_fixed_ip_address', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['floating_ip_fixed_ip_address']))
+ meta = Metadata('floating-ip-fixed-ip-address', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'floating-ip-fixed-ip-address' in existing_metas and
+ str(existing_metas['floating-ip-fixed-ip-address'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('floating_ip_address_family', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['floating_ip_address_family']))
+ meta = Metadata('floating-ip-address-family', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'floating-ip-address-family' in existing_metas and
+ str(existing_metas['floating-ip-address-family'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('project_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'project'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ floating_ip_project_xml = ''
+ meta = Metadata('floating-ip-project' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = floating_ip_project_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ floating_ip_virtual_machine_interface_xml = ''
+ meta = Metadata('floating-ip-virtual-machine-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = floating_ip_virtual_machine_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_floating_ip_set
+
+ def _ifmap_floating_ip_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['floating-ip']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_floating_ip_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_floating_ip_create
+
+
+ def _ifmap_floating_ip_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'floating-ip-project', u'floating-ip-virtual-machine-interface', u'customer-attachment-floating-ip', u'floating-ip-address', u'floating-ip-is-virtual-ip', u'floating-ip-fixed-ip-address', u'floating-ip-address-family', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_floating-ip_read_to_meta_index
+
+ def _ifmap_floating_ip_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_floating_ip_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['floating-ip-address', 'floating-ip-is-virtual-ip', 'floating-ip-fixed-ip-address', 'floating-ip-address-family', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'floating-ip-project': 'project',
+ 'floating-ip-virtual-machine-interface': 'virtual-machine-interface'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_floating_ip_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_floating_ip_update
+
+ def _ifmap_floating_ip_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_floating_ip_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_floating_ip_delete
+
+ def _ifmap_floating_ip_pool_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.floating_ip_pool_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_floating_ip_pool_alloc
+
+ def _ifmap_floating_ip_pool_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('floating_ip_pool_prefixes', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['floating_ip_pool_prefixes']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ FloatingIpPoolType(**field).exportChildren(buf, level = 1, name_ = 'floating-ip-pool-prefixes', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'floating-ip-pool-prefixes', pretty_print = False)
+ floating_ip_pool_prefixes_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('floating-ip-pool-prefixes' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = floating_ip_pool_prefixes_xml)
+
+ if (existing_metas and 'floating-ip-pool-prefixes' in existing_metas and
+ str(existing_metas['floating-ip-pool-prefixes'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('floating_ip_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'floating-ip'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ floating_ip_pool_floating_ip_xml = ''
+ meta = Metadata('floating-ip-pool-floating-ip' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = floating_ip_pool_floating_ip_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_floating_ip_pool_set
+
+ def _ifmap_floating_ip_pool_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['floating-ip-pool']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_floating_ip_pool_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_floating_ip_pool_create
+
+
+ def _ifmap_floating_ip_pool_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'project-floating-ip-pool', u'floating-ip-pool-prefixes', u'id-perms', u'display-name', u'floating-ip-pool-floating-ip']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_floating-ip-pool_read_to_meta_index
+
+ def _ifmap_floating_ip_pool_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_floating_ip_pool_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['floating-ip-pool-prefixes', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_floating_ip_pool_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_floating_ip_pool_update
+
+ def _ifmap_floating_ip_pool_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_floating_ip_pool_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_floating_ip_pool_delete
+
+ def _ifmap_physical_router_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.physical_router_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_physical_router_alloc
+
+ def _ifmap_physical_router_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('physical_router_management_ip', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['physical_router_management_ip']))
+ meta = Metadata('physical-router-management-ip', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'physical-router-management-ip' in existing_metas and
+ str(existing_metas['physical-router-management-ip'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('physical_router_dataplane_ip', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['physical_router_dataplane_ip']))
+ meta = Metadata('physical-router-dataplane-ip', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'physical-router-dataplane-ip' in existing_metas and
+ str(existing_metas['physical-router-dataplane-ip'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('physical_router_vendor_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['physical_router_vendor_name']))
+ meta = Metadata('physical-router-vendor-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'physical-router-vendor-name' in existing_metas and
+ str(existing_metas['physical-router-vendor-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('physical_router_product_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['physical_router_product_name']))
+ meta = Metadata('physical-router-product-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'physical-router-product-name' in existing_metas and
+ str(existing_metas['physical-router-product-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('physical_router_vnc_managed', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['physical_router_vnc_managed']))
+ meta = Metadata('physical-router-vnc-managed', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'physical-router-vnc-managed' in existing_metas and
+ str(existing_metas['physical-router-vnc-managed'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('physical_router_user_credentials', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['physical_router_user_credentials']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ UserCredentials(**field).exportChildren(buf, level = 1, name_ = 'physical-router-user-credentials', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'physical-router-user-credentials', pretty_print = False)
+ physical_router_user_credentials_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('physical-router-user-credentials' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = physical_router_user_credentials_xml)
+
+ if (existing_metas and 'physical-router-user-credentials' in existing_metas and
+ str(existing_metas['physical-router-user-credentials'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('physical_router_snmp_credentials', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['physical_router_snmp_credentials']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ SNMPCredentials(**field).exportChildren(buf, level = 1, name_ = 'physical-router-snmp-credentials', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'physical-router-snmp-credentials', pretty_print = False)
+ physical_router_snmp_credentials_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('physical-router-snmp-credentials' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = physical_router_snmp_credentials_xml)
+
+ if (existing_metas and 'physical-router-snmp-credentials' in existing_metas and
+ str(existing_metas['physical-router-snmp-credentials'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('physical_router_junos_service_ports', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['physical_router_junos_service_ports']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ JunosServicePorts(**field).exportChildren(buf, level = 1, name_ = 'physical-router-junos-service-ports', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'physical-router-junos-service-ports', pretty_print = False)
+ physical_router_junos_service_ports_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('physical-router-junos-service-ports' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = physical_router_junos_service_ports_xml)
+
+ if (existing_metas and 'physical-router-junos-service-ports' in existing_metas and
+ str(existing_metas['physical-router-junos-service-ports'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_router_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-router'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ physical_router_virtual_router_xml = ''
+ meta = Metadata('physical-router-virtual-router' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = physical_router_virtual_router_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('bgp_router_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'bgp-router'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ physical_router_bgp_router_xml = ''
+ meta = Metadata('physical-router-bgp-router' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = physical_router_bgp_router_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_network_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-network'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ physical_router_virtual_network_xml = ''
+ meta = Metadata('physical-router-virtual-network' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = physical_router_virtual_network_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('physical_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'physical-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ physical_router_physical_interface_xml = ''
+ meta = Metadata('physical-router-physical-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = physical_router_physical_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('logical_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'logical-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ physical_router_logical_interface_xml = ''
+ meta = Metadata('physical-router-logical-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = physical_router_logical_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_physical_router_set
+
+ def _ifmap_physical_router_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['physical-router']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_physical_router_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_physical_router_create
+
+
+ def _ifmap_physical_router_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'physical-router-virtual-router', u'physical-router-bgp-router', u'physical-router-virtual-network', u'physical-router-management-ip', u'physical-router-dataplane-ip', u'physical-router-vendor-name', u'physical-router-product-name', u'physical-router-vnc-managed', u'physical-router-user-credentials', u'physical-router-snmp-credentials', u'physical-router-junos-service-ports', u'id-perms', u'display-name', u'physical-router-physical-interface', u'physical-router-logical-interface']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_physical-router_read_to_meta_index
+
+ def _ifmap_physical_router_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_physical_router_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['physical-router-management-ip', 'physical-router-dataplane-ip', 'physical-router-vendor-name', 'physical-router-product-name', 'physical-router-vnc-managed', 'physical-router-user-credentials', 'physical-router-snmp-credentials', 'physical-router-junos-service-ports', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'physical-router-virtual-router': 'virtual-router',
+ 'physical-router-bgp-router': 'bgp-router',
+ 'physical-router-virtual-network': 'virtual-network'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_physical_router_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_physical_router_update
+
+ def _ifmap_physical_router_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_physical_router_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_physical_router_delete
+
+ def _ifmap_bgp_router_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.bgp_router_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_bgp_router_alloc
+
+ def _ifmap_bgp_router_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('bgp_router_parameters', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['bgp_router_parameters']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ BgpRouterParams(**field).exportChildren(buf, level = 1, name_ = 'bgp-router-parameters', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'bgp-router-parameters', pretty_print = False)
+ bgp_router_parameters_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('bgp-router-parameters' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = bgp_router_parameters_xml)
+
+ if (existing_metas and 'bgp-router-parameters' in existing_metas and
+ str(existing_metas['bgp-router-parameters'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('bgp_router_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'bgp-router'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ bgp_peering_xml = ''
+ ref_data = ref['attr']
+ if ref_data:
+ buf = cStringIO.StringIO()
+ BgpPeeringAttributes(**ref_data).exportChildren(buf, level = 1, name_ = 'bgp-peering', pretty_print = False)
+ bgp_peering_xml = bgp_peering_xml + buf.getvalue()
+ buf.close()
+ meta = Metadata('bgp-peering' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = bgp_peering_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_bgp_router_set
+
+ def _ifmap_bgp_router_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['bgp-router']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_bgp_router_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_bgp_router_create
+
+
+ def _ifmap_bgp_router_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'bgp-peering', u'global-system-config-bgp-router', u'physical-router-bgp-router', u'virtual-router-bgp-router', u'bgp-peering', u'bgp-router-parameters', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_bgp-router_read_to_meta_index
+
+ def _ifmap_bgp_router_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_bgp_router_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['bgp-router-parameters', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'bgp-peering': 'bgp-router'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_bgp_router_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_bgp_router_update
+
+ def _ifmap_bgp_router_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_bgp_router_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_bgp_router_delete
+
+ def _ifmap_virtual_router_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.virtual_router_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_virtual_router_alloc
+
+ def _ifmap_virtual_router_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('virtual_router_type', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['virtual_router_type']))
+ meta = Metadata('virtual-router-type', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'virtual-router-type' in existing_metas and
+ str(existing_metas['virtual-router-type'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('virtual_router_ip_address', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['virtual_router_ip_address']))
+ meta = Metadata('virtual-router-ip-address', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'virtual-router-ip-address' in existing_metas and
+ str(existing_metas['virtual-router-ip-address'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('bgp_router_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'bgp-router'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_router_bgp_router_xml = ''
+ meta = Metadata('virtual-router-bgp-router' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_router_bgp_router_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_router_virtual_machine_xml = ''
+ meta = Metadata('virtual-router-virtual-machine' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_router_virtual_machine_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_virtual_router_set
+
+ def _ifmap_virtual_router_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['virtual-router']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_virtual_router_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_router_create
+
+
+ def _ifmap_virtual_router_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'virtual-router-bgp-router', u'virtual-router-virtual-machine', u'physical-router-virtual-router', u'provider-attachment-virtual-router', u'virtual-router-type', u'virtual-router-ip-address', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_virtual-router_read_to_meta_index
+
+ def _ifmap_virtual_router_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_virtual_router_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['virtual-router-type', 'virtual-router-ip-address', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'virtual-router-bgp-router': 'bgp-router',
+ 'virtual-router-virtual-machine': 'virtual-machine'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_virtual_router_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_router_update
+
+ def _ifmap_virtual_router_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_virtual_router_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_virtual_router_delete
+
+ def _ifmap_config_root_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.config_root_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_config_root_alloc
+
+ def _ifmap_config_root_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('global_system_config_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'global-system-config'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ config_root_global_system_config_xml = ''
+ meta = Metadata('config-root-global-system-config' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = config_root_global_system_config_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('domain_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'domain'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ config_root_domain_xml = ''
+ meta = Metadata('config-root-domain' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = config_root_domain_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_config_root_set
+
+ def _ifmap_config_root_create(self, obj_ids, obj_dict):
+ (ok, result) = self._ifmap_config_root_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_config_root_create
+
+
+ def _ifmap_config_root_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'id-perms', u'display-name', u'config-root-global-system-config', u'config-root-domain']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_config-root_read_to_meta_index
+
+ def _ifmap_config_root_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_config_root_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_config_root_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_config_root_update
+
+ def _ifmap_config_root_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_config_root_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_config_root_delete
+
+ def _ifmap_subnet_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.subnet_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_subnet_alloc
+
+ def _ifmap_subnet_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('subnet_ip_prefix', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['subnet_ip_prefix']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ SubnetType(**field).exportChildren(buf, level = 1, name_ = 'subnet-ip-prefix', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'subnet-ip-prefix', pretty_print = False)
+ subnet_ip_prefix_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('subnet-ip-prefix' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = subnet_ip_prefix_xml)
+
+ if (existing_metas and 'subnet-ip-prefix' in existing_metas and
+ str(existing_metas['subnet-ip-prefix'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ subnet_virtual_machine_interface_xml = ''
+ meta = Metadata('subnet-virtual-machine-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = subnet_virtual_machine_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_subnet_set
+
+ def _ifmap_subnet_create(self, obj_ids, obj_dict):
+ (ok, result) = self._ifmap_subnet_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_subnet_create
+
+
+ def _ifmap_subnet_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'subnet-virtual-machine-interface', u'subnet-ip-prefix', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_subnet_read_to_meta_index
+
+ def _ifmap_subnet_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_subnet_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['subnet-ip-prefix', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'subnet-virtual-machine-interface': 'virtual-machine-interface'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_subnet_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_subnet_update
+
+ def _ifmap_subnet_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_subnet_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_subnet_delete
+
+ def _ifmap_global_system_config_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.global_system_config_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_global_system_config_alloc
+
+ def _ifmap_global_system_config_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('autonomous_system', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['autonomous_system']))
+ meta = Metadata('autonomous-system', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'autonomous-system' in existing_metas and
+ str(existing_metas['autonomous-system'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('config_version', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['config_version']))
+ meta = Metadata('config-version', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'config-version' in existing_metas and
+ str(existing_metas['config-version'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('plugin_tuning', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['plugin_tuning']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ PluginProperties(**field).exportChildren(buf, level = 1, name_ = 'plugin-tuning', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'plugin-tuning', pretty_print = False)
+ plugin_tuning_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('plugin-tuning' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = plugin_tuning_xml)
+
+ if (existing_metas and 'plugin-tuning' in existing_metas and
+ str(existing_metas['plugin-tuning'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('ibgp_auto_mesh', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['ibgp_auto_mesh']))
+ meta = Metadata('ibgp-auto-mesh', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'ibgp-auto-mesh' in existing_metas and
+ str(existing_metas['ibgp-auto-mesh'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('ip_fabric_subnets', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['ip_fabric_subnets']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ SubnetListType(**field).exportChildren(buf, level = 1, name_ = 'ip-fabric-subnets', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'ip-fabric-subnets', pretty_print = False)
+ ip_fabric_subnets_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('ip-fabric-subnets' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = ip_fabric_subnets_xml)
+
+ if (existing_metas and 'ip-fabric-subnets' in existing_metas and
+ str(existing_metas['ip-fabric-subnets'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('bgp_router_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'bgp-router'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ global_system_config_bgp_router_xml = ''
+ meta = Metadata('global-system-config-bgp-router' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = global_system_config_bgp_router_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('global_vrouter_config_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'global-vrouter-config'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ global_system_config_global_vrouter_config_xml = ''
+ meta = Metadata('global-system-config-global-vrouter-config' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = global_system_config_global_vrouter_config_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('physical_router_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'physical-router'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ global_system_config_physical_router_xml = ''
+ meta = Metadata('global-system-config-physical-router' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = global_system_config_physical_router_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_router_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-router'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ global_system_config_virtual_router_xml = ''
+ meta = Metadata('global-system-config-virtual-router' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = global_system_config_virtual_router_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('config_node_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'config-node'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ global_system_config_config_node_xml = ''
+ meta = Metadata('global-system-config-config-node' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = global_system_config_config_node_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('analytics_node_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'analytics-node'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ global_system_config_analytics_node_xml = ''
+ meta = Metadata('global-system-config-analytics-node' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = global_system_config_analytics_node_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('database_node_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'database-node'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ global_system_config_database_node_xml = ''
+ meta = Metadata('global-system-config-database-node' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = global_system_config_database_node_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('service_appliance_set_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'service-appliance-set'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ global_system_config_service_appliance_set_xml = ''
+ meta = Metadata('global-system-config-service-appliance-set' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = global_system_config_service_appliance_set_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_global_system_config_set
+
+ def _ifmap_global_system_config_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['global-system-config']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_global_system_config_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_global_system_config_create
+
+
+ def _ifmap_global_system_config_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'global-system-config-bgp-router', u'autonomous-system', u'config-version', u'plugin-tuning', u'ibgp-auto-mesh', u'ip-fabric-subnets', u'id-perms', u'display-name', u'global-system-config-global-vrouter-config', u'global-system-config-physical-router', u'global-system-config-virtual-router', u'global-system-config-config-node', u'global-system-config-analytics-node', u'global-system-config-database-node', u'global-system-config-service-appliance-set']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_global-system-config_read_to_meta_index
+
+ def _ifmap_global_system_config_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_global_system_config_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['autonomous-system', 'config-version', 'plugin-tuning', 'ibgp-auto-mesh', 'ip-fabric-subnets', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'global-system-config-bgp-router': 'bgp-router'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_global_system_config_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_global_system_config_update
+
+ def _ifmap_global_system_config_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_global_system_config_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_global_system_config_delete
+
+ def _ifmap_service_appliance_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.service_appliance_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_service_appliance_alloc
+
+ def _ifmap_service_appliance_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('service_appliance_user_credentials', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['service_appliance_user_credentials']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ UserCredentials(**field).exportChildren(buf, level = 1, name_ = 'service-appliance-user-credentials', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'service-appliance-user-credentials', pretty_print = False)
+ service_appliance_user_credentials_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('service-appliance-user-credentials' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = service_appliance_user_credentials_xml)
+
+ if (existing_metas and 'service-appliance-user-credentials' in existing_metas and
+ str(existing_metas['service-appliance-user-credentials'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('service_appliance_ip_address', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['service_appliance_ip_address']))
+ meta = Metadata('service-appliance-ip-address', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'service-appliance-ip-address' in existing_metas and
+ str(existing_metas['service-appliance-ip-address'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('service_appliance_properties', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['service_appliance_properties']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ KeyValuePairs(**field).exportChildren(buf, level = 1, name_ = 'service-appliance-properties', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'service-appliance-properties', pretty_print = False)
+ service_appliance_properties_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('service-appliance-properties' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = service_appliance_properties_xml)
+
+ if (existing_metas and 'service-appliance-properties' in existing_metas and
+ str(existing_metas['service-appliance-properties'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_service_appliance_set
+
+ def _ifmap_service_appliance_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['service-appliance']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_service_appliance_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_service_appliance_create
+
+
+ def _ifmap_service_appliance_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'service-appliance-user-credentials', u'service-appliance-ip-address', u'service-appliance-properties', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_service-appliance_read_to_meta_index
+
+ def _ifmap_service_appliance_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_service_appliance_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['service-appliance-user-credentials', 'service-appliance-ip-address', 'service-appliance-properties', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_service_appliance_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_service_appliance_update
+
+ def _ifmap_service_appliance_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_service_appliance_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_service_appliance_delete
+
+ def _ifmap_service_instance_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.service_instance_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_service_instance_alloc
+
+ def _ifmap_service_instance_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('service_instance_properties', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['service_instance_properties']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ ServiceInstanceType(**field).exportChildren(buf, level = 1, name_ = 'service-instance-properties', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'service-instance-properties', pretty_print = False)
+ service_instance_properties_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('service-instance-properties' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = service_instance_properties_xml)
+
+ if (existing_metas and 'service-instance-properties' in existing_metas and
+ str(existing_metas['service-instance-properties'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('service_template_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'service-template'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ service_instance_service_template_xml = ''
+ meta = Metadata('service-instance-service-template' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = service_instance_service_template_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_service_instance_set
+
+ def _ifmap_service_instance_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['service-instance']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_service_instance_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_service_instance_create
+
+
+ def _ifmap_service_instance_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'service-instance-service-template', u'virtual-machine-service-instance', u'logical-router-service-instance', u'loadbalancer-pool-service-instance', u'service-instance-properties', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_service-instance_read_to_meta_index
+
+ def _ifmap_service_instance_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_service_instance_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['service-instance-properties', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'service-instance-service-template': 'service-template'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_service_instance_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_service_instance_update
+
+ def _ifmap_service_instance_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_service_instance_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_service_instance_delete
+
+ def _ifmap_namespace_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.namespace_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_namespace_alloc
+
+ def _ifmap_namespace_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('namespace_cidr', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['namespace_cidr']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ SubnetType(**field).exportChildren(buf, level = 1, name_ = 'namespace-cidr', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'namespace-cidr', pretty_print = False)
+ namespace_cidr_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('namespace-cidr' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = namespace_cidr_xml)
+
+ if (existing_metas and 'namespace-cidr' in existing_metas and
+ str(existing_metas['namespace-cidr'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_namespace_set
+
+ def _ifmap_namespace_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['namespace']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_namespace_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_namespace_create
+
+
+ def _ifmap_namespace_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'project-namespace', u'namespace-cidr', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_namespace_read_to_meta_index
+
+ def _ifmap_namespace_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_namespace_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['namespace-cidr', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_namespace_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_namespace_update
+
+ def _ifmap_namespace_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_namespace_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_namespace_delete
+
+ def _ifmap_logical_interface_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.logical_interface_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_logical_interface_alloc
+
+ def _ifmap_logical_interface_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('logical_interface_vlan_tag', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['logical_interface_vlan_tag']))
+ meta = Metadata('logical-interface-vlan-tag', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'logical-interface-vlan-tag' in existing_metas and
+ str(existing_metas['logical-interface-vlan-tag'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('logical_interface_type', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['logical_interface_type']))
+ meta = Metadata('logical-interface-type', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'logical-interface-type' in existing_metas and
+ str(existing_metas['logical-interface-type'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ logical_interface_virtual_machine_interface_xml = ''
+ meta = Metadata('logical-interface-virtual-machine-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = logical_interface_virtual_machine_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_logical_interface_set
+
+ def _ifmap_logical_interface_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['logical-interface']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_logical_interface_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_logical_interface_create
+
+
+ def _ifmap_logical_interface_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'logical-interface-virtual-machine-interface', u'logical-interface-vlan-tag', u'logical-interface-type', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_logical-interface_read_to_meta_index
+
+ def _ifmap_logical_interface_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_logical_interface_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['logical-interface-vlan-tag', 'logical-interface-type', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'logical-interface-virtual-machine-interface': 'virtual-machine-interface'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_logical_interface_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_logical_interface_update
+
+ def _ifmap_logical_interface_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_logical_interface_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_logical_interface_delete
+
+ def _ifmap_route_table_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.route_table_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_route_table_alloc
+
+ def _ifmap_route_table_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('routes', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['routes']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ RouteTableType(**field).exportChildren(buf, level = 1, name_ = 'routes', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'routes', pretty_print = False)
+ routes_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('routes' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = routes_xml)
+
+ if (existing_metas and 'routes' in existing_metas and
+ str(existing_metas['routes'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_route_table_set
+
+ def _ifmap_route_table_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['route-table']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_route_table_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_route_table_create
+
+
+ def _ifmap_route_table_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'virtual-network-route-table', u'routes', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_route-table_read_to_meta_index
+
+ def _ifmap_route_table_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_route_table_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['routes', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_route_table_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_route_table_update
+
+ def _ifmap_route_table_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_route_table_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_route_table_delete
+
+ def _ifmap_physical_interface_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.physical_interface_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_physical_interface_alloc
+
+ def _ifmap_physical_interface_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('logical_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'logical-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ physical_interface_logical_interface_xml = ''
+ meta = Metadata('physical-interface-logical-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = physical_interface_logical_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_physical_interface_set
+
+ def _ifmap_physical_interface_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['physical-interface']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_physical_interface_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_physical_interface_create
+
+
+ def _ifmap_physical_interface_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'id-perms', u'display-name', u'physical-interface-logical-interface']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_physical-interface_read_to_meta_index
+
+ def _ifmap_physical_interface_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_physical_interface_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_physical_interface_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_physical_interface_update
+
+ def _ifmap_physical_interface_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_physical_interface_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_physical_interface_delete
+
+ def _ifmap_access_control_list_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.access_control_list_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_access_control_list_alloc
+
+ def _ifmap_access_control_list_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('access_control_list_entries', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['access_control_list_entries']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ AclEntriesType(**field).exportChildren(buf, level = 1, name_ = 'access-control-list-entries', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'access-control-list-entries', pretty_print = False)
+ access_control_list_entries_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('access-control-list-entries' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = access_control_list_entries_xml)
+
+ if (existing_metas and 'access-control-list-entries' in existing_metas and
+ str(existing_metas['access-control-list-entries'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_access_control_list_set
+
+ def _ifmap_access_control_list_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['access-control-list']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_access_control_list_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_access_control_list_create
+
+
+ def _ifmap_access_control_list_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'access-control-list-entries', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_access-control-list_read_to_meta_index
+
+ def _ifmap_access_control_list_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_access_control_list_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['access-control-list-entries', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_access_control_list_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_access_control_list_update
+
+ def _ifmap_access_control_list_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_access_control_list_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_access_control_list_delete
+
+ def _ifmap_analytics_node_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.analytics_node_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_analytics_node_alloc
+
+ def _ifmap_analytics_node_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('analytics_node_ip_address', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['analytics_node_ip_address']))
+ meta = Metadata('analytics-node-ip-address', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'analytics-node-ip-address' in existing_metas and
+ str(existing_metas['analytics-node-ip-address'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_analytics_node_set
+
+ def _ifmap_analytics_node_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['analytics-node']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_analytics_node_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_analytics_node_create
+
+
+ def _ifmap_analytics_node_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'analytics-node-ip-address', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_analytics-node_read_to_meta_index
+
+ def _ifmap_analytics_node_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_analytics_node_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['analytics-node-ip-address', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_analytics_node_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_analytics_node_update
+
+ def _ifmap_analytics_node_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_analytics_node_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_analytics_node_delete
+
+ def _ifmap_virtual_DNS_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.virtual_DNS_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_virtual_DNS_alloc
+
+ def _ifmap_virtual_DNS_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('virtual_DNS_data', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['virtual_DNS_data']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ VirtualDnsType(**field).exportChildren(buf, level = 1, name_ = 'virtual-DNS-data', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'virtual-DNS-data', pretty_print = False)
+ virtual_DNS_data_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-DNS-data' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_DNS_data_xml)
+
+ if (existing_metas and 'virtual-DNS-data' in existing_metas and
+ str(existing_metas['virtual-DNS-data'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_DNS_record_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-DNS-record'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_DNS_virtual_DNS_record_xml = ''
+ meta = Metadata('virtual-DNS-virtual-DNS-record' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_DNS_virtual_DNS_record_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_virtual_DNS_set
+
+ def _ifmap_virtual_DNS_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['virtual-DNS']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_virtual_DNS_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_DNS_create
+
+
+ def _ifmap_virtual_DNS_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'network-ipam-virtual-DNS', u'virtual-DNS-data', u'id-perms', u'display-name', u'virtual-DNS-virtual-DNS-record']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_virtual-DNS_read_to_meta_index
+
+ def _ifmap_virtual_DNS_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_virtual_DNS_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['virtual-DNS-data', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_virtual_DNS_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_DNS_update
+
+ def _ifmap_virtual_DNS_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_virtual_DNS_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_virtual_DNS_delete
+
+ def _ifmap_customer_attachment_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.customer_attachment_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_customer_attachment_alloc
+
+ def _ifmap_customer_attachment_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('attachment_address', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['attachment_address']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ AttachmentAddressType(**field).exportChildren(buf, level = 1, name_ = 'attachment-address', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'attachment-address', pretty_print = False)
+ attachment_address_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('attachment-address' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = attachment_address_xml)
+
+ if (existing_metas and 'attachment-address' in existing_metas and
+ str(existing_metas['attachment-address'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ customer_attachment_virtual_machine_interface_xml = ''
+ meta = Metadata('customer-attachment-virtual-machine-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = customer_attachment_virtual_machine_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('floating_ip_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'floating-ip'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ customer_attachment_floating_ip_xml = ''
+ meta = Metadata('customer-attachment-floating-ip' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = customer_attachment_floating_ip_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('routing_instance_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'routing-instance'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ binding_xml = ''
+ ref_data = ref['attr']
+ if ref_data:
+ buf = cStringIO.StringIO()
+ BindingType(**ref_data).exportChildren(buf, level = 1, name_ = 'binding', pretty_print = False)
+ binding_xml = binding_xml + buf.getvalue()
+ buf.close()
+ meta = Metadata('binding' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = binding_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('provider_attachment_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'provider-attachment'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ attachment_info_xml = ''
+ ref_data = ref['attr']
+ if ref_data:
+ buf = cStringIO.StringIO()
+ AttachmentInfoType(**ref_data).exportChildren(buf, level = 1, name_ = 'attachment-info', pretty_print = False)
+ attachment_info_xml = attachment_info_xml + buf.getvalue()
+ buf.close()
+ meta = Metadata('attachment-info' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = attachment_info_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_customer_attachment_set
+
+ def _ifmap_customer_attachment_create(self, obj_ids, obj_dict):
+ (ok, result) = self._ifmap_customer_attachment_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_customer_attachment_create
+
+
+ def _ifmap_customer_attachment_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'customer-attachment-virtual-machine-interface', u'customer-attachment-floating-ip', u'attachment-address', u'id-perms', u'display-name', u'binding', u'attachment-info']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_customer-attachment_read_to_meta_index
+
+ def _ifmap_customer_attachment_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_customer_attachment_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['attachment-address', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'customer-attachment-virtual-machine-interface': 'virtual-machine-interface',
+ 'customer-attachment-floating-ip': 'floating-ip'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_customer_attachment_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_customer_attachment_update
+
+ def _ifmap_customer_attachment_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_customer_attachment_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_customer_attachment_delete
+
+ def _ifmap_service_appliance_set_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.service_appliance_set_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_service_appliance_set_alloc
+
+ def _ifmap_service_appliance_set_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('service_appliance_set_properties', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['service_appliance_set_properties']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ KeyValuePairs(**field).exportChildren(buf, level = 1, name_ = 'service-appliance-set-properties', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'service-appliance-set-properties', pretty_print = False)
+ service_appliance_set_properties_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('service-appliance-set-properties' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = service_appliance_set_properties_xml)
+
+ if (existing_metas and 'service-appliance-set-properties' in existing_metas and
+ str(existing_metas['service-appliance-set-properties'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('service_appliance_driver', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['service_appliance_driver']))
+ meta = Metadata('service-appliance-driver', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'service-appliance-driver' in existing_metas and
+ str(existing_metas['service-appliance-driver'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('service_appliance_ha_mode', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['service_appliance_ha_mode']))
+ meta = Metadata('service-appliance-ha-mode', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'service-appliance-ha-mode' in existing_metas and
+ str(existing_metas['service-appliance-ha-mode'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('service_appliance_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'service-appliance'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ service_appliance_set_service_appliance_xml = ''
+ meta = Metadata('service-appliance-set-service-appliance' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = service_appliance_set_service_appliance_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_service_appliance_set_set
+
+ def _ifmap_service_appliance_set_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['service-appliance-set']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_service_appliance_set_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_service_appliance_set_create
+
+
+ def _ifmap_service_appliance_set_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'loadbalancer-pool-service-appliance-set', u'service-appliance-set-properties', u'service-appliance-driver', u'service-appliance-ha-mode', u'id-perms', u'display-name', u'service-appliance-set-service-appliance']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_service-appliance-set_read_to_meta_index
+
+ def _ifmap_service_appliance_set_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_service_appliance_set_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['service-appliance-set-properties', 'service-appliance-driver', 'service-appliance-ha-mode', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_service_appliance_set_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_service_appliance_set_update
+
+ def _ifmap_service_appliance_set_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_service_appliance_set_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_service_appliance_set_delete
+
+ def _ifmap_config_node_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.config_node_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_config_node_alloc
+
+ def _ifmap_config_node_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('config_node_ip_address', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['config_node_ip_address']))
+ meta = Metadata('config-node-ip-address', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'config-node-ip-address' in existing_metas and
+ str(existing_metas['config-node-ip-address'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_config_node_set
+
+ def _ifmap_config_node_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['config-node']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_config_node_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_config_node_create
+
+
+ def _ifmap_config_node_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'config-node-ip-address', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_config-node_read_to_meta_index
+
+ def _ifmap_config_node_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_config_node_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['config-node-ip-address', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_config_node_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_config_node_update
+
+ def _ifmap_config_node_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_config_node_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_config_node_delete
+
+ def _ifmap_qos_queue_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.qos_queue_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_qos_queue_alloc
+
+ def _ifmap_qos_queue_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('min_bandwidth', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['min_bandwidth']))
+ meta = Metadata('min-bandwidth', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'min-bandwidth' in existing_metas and
+ str(existing_metas['min-bandwidth'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('max_bandwidth', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['max_bandwidth']))
+ meta = Metadata('max-bandwidth', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'max-bandwidth' in existing_metas and
+ str(existing_metas['max-bandwidth'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_qos_queue_set
+
+ def _ifmap_qos_queue_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['qos-queue']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_qos_queue_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_qos_queue_create
+
+
+ def _ifmap_qos_queue_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'qos-forwarding-class-qos-queue', u'min-bandwidth', u'max-bandwidth', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_qos-queue_read_to_meta_index
+
+ def _ifmap_qos_queue_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_qos_queue_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['min-bandwidth', 'max-bandwidth', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_qos_queue_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_qos_queue_update
+
+ def _ifmap_qos_queue_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_qos_queue_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_qos_queue_delete
+
+ def _ifmap_virtual_machine_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.virtual_machine_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_virtual_machine_alloc
+
+ def _ifmap_virtual_machine_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_machine_virtual_machine_interface_xml = ''
+ meta = Metadata('virtual-machine-virtual-machine-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_virtual_machine_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('service_instance_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'service-instance'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_machine_service_instance_xml = ''
+ meta = Metadata('virtual-machine-service-instance' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_service_instance_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_virtual_machine_set
+
+ def _ifmap_virtual_machine_create(self, obj_ids, obj_dict):
+ (ok, result) = self._ifmap_virtual_machine_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_machine_create
+
+
+ def _ifmap_virtual_machine_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'virtual-machine-service-instance', u'virtual-machine-interface-virtual-machine', u'virtual-router-virtual-machine', u'id-perms', u'display-name', u'virtual-machine-virtual-machine-interface']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_virtual-machine_read_to_meta_index
+
+ def _ifmap_virtual_machine_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_virtual_machine_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'virtual-machine-service-instance': 'service-instance'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_virtual_machine_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_machine_update
+
+ def _ifmap_virtual_machine_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_virtual_machine_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_virtual_machine_delete
+
+ def _ifmap_interface_route_table_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.interface_route_table_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_interface_route_table_alloc
+
+ def _ifmap_interface_route_table_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('interface_route_table_routes', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['interface_route_table_routes']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ RouteTableType(**field).exportChildren(buf, level = 1, name_ = 'interface-route-table-routes', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'interface-route-table-routes', pretty_print = False)
+ interface_route_table_routes_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('interface-route-table-routes' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = interface_route_table_routes_xml)
+
+ if (existing_metas and 'interface-route-table-routes' in existing_metas and
+ str(existing_metas['interface-route-table-routes'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_interface_route_table_set
+
+ def _ifmap_interface_route_table_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['interface-route-table']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_interface_route_table_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_interface_route_table_create
+
+
+ def _ifmap_interface_route_table_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'virtual-machine-interface-route-table', u'interface-route-table-routes', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_interface-route-table_read_to_meta_index
+
+ def _ifmap_interface_route_table_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_interface_route_table_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['interface-route-table-routes', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_interface_route_table_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_interface_route_table_update
+
+ def _ifmap_interface_route_table_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_interface_route_table_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_interface_route_table_delete
+
+ def _ifmap_service_template_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.service_template_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_service_template_alloc
+
+ def _ifmap_service_template_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('service_template_properties', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['service_template_properties']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ ServiceTemplateType(**field).exportChildren(buf, level = 1, name_ = 'service-template-properties', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'service-template-properties', pretty_print = False)
+ service_template_properties_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('service-template-properties' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = service_template_properties_xml)
+
+ if (existing_metas and 'service-template-properties' in existing_metas and
+ str(existing_metas['service-template-properties'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_service_template_set
+
+ def _ifmap_service_template_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['service-template']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_service_template_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_service_template_create
+
+
+ def _ifmap_service_template_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'service-instance-service-template', u'service-template-properties', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_service-template_read_to_meta_index
+
+ def _ifmap_service_template_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_service_template_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['service-template-properties', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_service_template_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_service_template_update
+
+ def _ifmap_service_template_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_service_template_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_service_template_delete
+
+ def _ifmap_virtual_ip_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.virtual_ip_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_virtual_ip_alloc
+
+ def _ifmap_virtual_ip_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('virtual_ip_properties', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['virtual_ip_properties']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ VirtualIpType(**field).exportChildren(buf, level = 1, name_ = 'virtual-ip-properties', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'virtual-ip-properties', pretty_print = False)
+ virtual_ip_properties_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-ip-properties' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_ip_properties_xml)
+
+ if (existing_metas and 'virtual-ip-properties' in existing_metas and
+ str(existing_metas['virtual-ip-properties'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('loadbalancer_pool_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'loadbalancer-pool'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_ip_loadbalancer_pool_xml = ''
+ meta = Metadata('virtual-ip-loadbalancer-pool' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_ip_loadbalancer_pool_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_ip_virtual_machine_interface_xml = ''
+ meta = Metadata('virtual-ip-virtual-machine-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_ip_virtual_machine_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_virtual_ip_set
+
+ def _ifmap_virtual_ip_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['virtual-ip']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_virtual_ip_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_ip_create
+
+
+ def _ifmap_virtual_ip_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'virtual-ip-loadbalancer-pool', u'virtual-ip-virtual-machine-interface', u'virtual-ip-properties', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_virtual-ip_read_to_meta_index
+
+ def _ifmap_virtual_ip_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_virtual_ip_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['virtual-ip-properties', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'virtual-ip-loadbalancer-pool': 'loadbalancer-pool',
+ 'virtual-ip-virtual-machine-interface': 'virtual-machine-interface'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_virtual_ip_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_ip_update
+
+ def _ifmap_virtual_ip_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_virtual_ip_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_virtual_ip_delete
+
+ def _ifmap_loadbalancer_member_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.loadbalancer_member_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_loadbalancer_member_alloc
+
+ def _ifmap_loadbalancer_member_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('loadbalancer_member_properties', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['loadbalancer_member_properties']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ LoadbalancerMemberType(**field).exportChildren(buf, level = 1, name_ = 'loadbalancer-member-properties', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'loadbalancer-member-properties', pretty_print = False)
+ loadbalancer_member_properties_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('loadbalancer-member-properties' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = loadbalancer_member_properties_xml)
+
+ if (existing_metas and 'loadbalancer-member-properties' in existing_metas and
+ str(existing_metas['loadbalancer-member-properties'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_loadbalancer_member_set
+
+ def _ifmap_loadbalancer_member_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['loadbalancer-member']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_loadbalancer_member_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_loadbalancer_member_create
+
+
+ def _ifmap_loadbalancer_member_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'loadbalancer-member-properties', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_loadbalancer-member_read_to_meta_index
+
+ def _ifmap_loadbalancer_member_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_loadbalancer_member_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['loadbalancer-member-properties', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_loadbalancer_member_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_loadbalancer_member_update
+
+ def _ifmap_loadbalancer_member_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_loadbalancer_member_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_loadbalancer_member_delete
+
+ def _ifmap_security_group_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.security_group_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_security_group_alloc
+
+ def _ifmap_security_group_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('security_group_id', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['security_group_id']))
+ meta = Metadata('security-group-id', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'security-group-id' in existing_metas and
+ str(existing_metas['security-group-id'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('configured_security_group_id', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['configured_security_group_id']))
+ meta = Metadata('configured-security-group-id', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'configured-security-group-id' in existing_metas and
+ str(existing_metas['configured-security-group-id'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('security_group_entries', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['security_group_entries']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ PolicyEntriesType(**field).exportChildren(buf, level = 1, name_ = 'security-group-entries', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'security-group-entries', pretty_print = False)
+ security_group_entries_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('security-group-entries' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = security_group_entries_xml)
+
+ if (existing_metas and 'security-group-entries' in existing_metas and
+ str(existing_metas['security-group-entries'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('access_control_list_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'access-control-list'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ security_group_access_control_list_xml = ''
+ meta = Metadata('security-group-access-control-list' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = security_group_access_control_list_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_security_group_set
+
+ def _ifmap_security_group_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['security-group']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_security_group_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_security_group_create
+
+
+ def _ifmap_security_group_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'virtual-machine-interface-security-group', u'security-group-id', u'configured-security-group-id', u'security-group-entries', u'id-perms', u'display-name', u'security-group-access-control-list']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_security-group_read_to_meta_index
+
+ def _ifmap_security_group_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_security_group_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['security-group-id', 'configured-security-group-id', 'security-group-entries', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_security_group_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_security_group_update
+
+ def _ifmap_security_group_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_security_group_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_security_group_delete
+
+ def _ifmap_provider_attachment_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.provider_attachment_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_provider_attachment_alloc
+
+ def _ifmap_provider_attachment_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_router_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-router'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ provider_attachment_virtual_router_xml = ''
+ meta = Metadata('provider-attachment-virtual-router' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = provider_attachment_virtual_router_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_provider_attachment_set
+
+ def _ifmap_provider_attachment_create(self, obj_ids, obj_dict):
+ (ok, result) = self._ifmap_provider_attachment_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_provider_attachment_create
+
+
+ def _ifmap_provider_attachment_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'provider-attachment-virtual-router', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_provider-attachment_read_to_meta_index
+
+ def _ifmap_provider_attachment_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_provider_attachment_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'provider-attachment-virtual-router': 'virtual-router'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_provider_attachment_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_provider_attachment_update
+
+ def _ifmap_provider_attachment_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_provider_attachment_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_provider_attachment_delete
+
+ def _ifmap_virtual_machine_interface_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.virtual_machine_interface_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_virtual_machine_interface_alloc
+
+ def _ifmap_virtual_machine_interface_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('virtual_machine_interface_mac_addresses', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['virtual_machine_interface_mac_addresses']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ MacAddressesType(**field).exportChildren(buf, level = 1, name_ = 'virtual-machine-interface-mac-addresses', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'virtual-machine-interface-mac-addresses', pretty_print = False)
+ virtual_machine_interface_mac_addresses_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-machine-interface-mac-addresses' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_mac_addresses_xml)
+
+ if (existing_metas and 'virtual-machine-interface-mac-addresses' in existing_metas and
+ str(existing_metas['virtual-machine-interface-mac-addresses'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('virtual_machine_interface_dhcp_option_list', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['virtual_machine_interface_dhcp_option_list']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ DhcpOptionsListType(**field).exportChildren(buf, level = 1, name_ = 'virtual-machine-interface-dhcp-option-list', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'virtual-machine-interface-dhcp-option-list', pretty_print = False)
+ virtual_machine_interface_dhcp_option_list_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-machine-interface-dhcp-option-list' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_dhcp_option_list_xml)
+
+ if (existing_metas and 'virtual-machine-interface-dhcp-option-list' in existing_metas and
+ str(existing_metas['virtual-machine-interface-dhcp-option-list'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('virtual_machine_interface_host_routes', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['virtual_machine_interface_host_routes']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ RouteTableType(**field).exportChildren(buf, level = 1, name_ = 'virtual-machine-interface-host-routes', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'virtual-machine-interface-host-routes', pretty_print = False)
+ virtual_machine_interface_host_routes_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-machine-interface-host-routes' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_host_routes_xml)
+
+ if (existing_metas and 'virtual-machine-interface-host-routes' in existing_metas and
+ str(existing_metas['virtual-machine-interface-host-routes'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('virtual_machine_interface_allowed_address_pairs', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['virtual_machine_interface_allowed_address_pairs']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ AllowedAddressPairs(**field).exportChildren(buf, level = 1, name_ = 'virtual-machine-interface-allowed-address-pairs', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'virtual-machine-interface-allowed-address-pairs', pretty_print = False)
+ virtual_machine_interface_allowed_address_pairs_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-machine-interface-allowed-address-pairs' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_allowed_address_pairs_xml)
+
+ if (existing_metas and 'virtual-machine-interface-allowed-address-pairs' in existing_metas and
+ str(existing_metas['virtual-machine-interface-allowed-address-pairs'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('vrf_assign_table', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['vrf_assign_table']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ VrfAssignTableType(**field).exportChildren(buf, level = 1, name_ = 'vrf-assign-table', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'vrf-assign-table', pretty_print = False)
+ vrf_assign_table_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('vrf-assign-table' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = vrf_assign_table_xml)
+
+ if (existing_metas and 'vrf-assign-table' in existing_metas and
+ str(existing_metas['vrf-assign-table'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('virtual_machine_interface_device_owner', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['virtual_machine_interface_device_owner']))
+ meta = Metadata('virtual-machine-interface-device-owner', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'virtual-machine-interface-device-owner' in existing_metas and
+ str(existing_metas['virtual-machine-interface-device-owner'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('virtual_machine_interface_properties', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['virtual_machine_interface_properties']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ VirtualMachineInterfacePropertiesType(**field).exportChildren(buf, level = 1, name_ = 'virtual-machine-interface-properties', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'virtual-machine-interface-properties', pretty_print = False)
+ virtual_machine_interface_properties_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-machine-interface-properties' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_properties_xml)
+
+ if (existing_metas and 'virtual-machine-interface-properties' in existing_metas and
+ str(existing_metas['virtual-machine-interface-properties'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('qos_forwarding_class_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'qos-forwarding-class'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_machine_interface_qos_forwarding_class_xml = ''
+ meta = Metadata('virtual-machine-interface-qos-forwarding-class' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_qos_forwarding_class_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('security_group_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'security-group'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_machine_interface_security_group_xml = ''
+ meta = Metadata('virtual-machine-interface-security-group' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_security_group_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_machine_interface_sub_interface_xml = ''
+ meta = Metadata('virtual-machine-interface-sub-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_sub_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_machine_interface_virtual_machine_xml = ''
+ meta = Metadata('virtual-machine-interface-virtual-machine' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_virtual_machine_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_network_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-network'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_machine_interface_virtual_network_xml = ''
+ meta = Metadata('virtual-machine-interface-virtual-network' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_virtual_network_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('routing_instance_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'routing-instance'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_machine_interface_routing_instance_xml = ''
+ ref_data = ref['attr']
+ if ref_data:
+ buf = cStringIO.StringIO()
+ PolicyBasedForwardingRuleType(**ref_data).exportChildren(buf, level = 1, name_ = 'virtual-machine-interface-routing-instance', pretty_print = False)
+ virtual_machine_interface_routing_instance_xml = virtual_machine_interface_routing_instance_xml + buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-machine-interface-routing-instance' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_routing_instance_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('interface_route_table_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'interface-route-table'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_machine_interface_route_table_xml = ''
+ meta = Metadata('virtual-machine-interface-route-table' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_machine_interface_route_table_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_virtual_machine_interface_set
+
+ def _ifmap_virtual_machine_interface_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['virtual-machine-interface']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_virtual_machine_interface_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_machine_interface_create
+
+
+ def _ifmap_virtual_machine_interface_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'virtual-machine-interface-qos-forwarding-class', u'virtual-machine-interface-security-group', u'virtual-machine-interface-sub-interface', u'virtual-machine-interface-virtual-machine', u'virtual-machine-interface-virtual-network', u'virtual-machine-interface-routing-instance', u'virtual-machine-interface-route-table', u'virtual-machine-interface-sub-interface', u'instance-ip-virtual-machine-interface', u'subnet-virtual-machine-interface', u'floating-ip-virtual-machine-interface', u'logical-interface-virtual-machine-interface', u'customer-attachment-virtual-machine-interface', u'logical-router-interface', u'loadbalancer-pool-virtual-machine-interface', u'virtual-ip-virtual-machine-interface', u'virtual-machine-interface-mac-addresses', u'virtual-machine-interface-dhcp-option-list', u'virtual-machine-interface-host-routes', u'virtual-machine-interface-allowed-address-pairs', u'vrf-assign-table', u'virtual-machine-interface-device-owner', u'virtual-machine-interface-properties', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_virtual-machine-interface_read_to_meta_index
+
+ def _ifmap_virtual_machine_interface_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_virtual_machine_interface_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['virtual-machine-interface-mac-addresses', 'virtual-machine-interface-dhcp-option-list', 'virtual-machine-interface-host-routes', 'virtual-machine-interface-allowed-address-pairs', 'vrf-assign-table', 'virtual-machine-interface-device-owner', 'virtual-machine-interface-properties', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'virtual-machine-interface-qos-forwarding-class': 'qos-forwarding-class',
+ 'virtual-machine-interface-security-group': 'security-group',
+ 'virtual-machine-interface-sub-interface': 'virtual-machine-interface',
+ 'virtual-machine-interface-virtual-machine': 'virtual-machine',
+ 'virtual-machine-interface-virtual-network': 'virtual-network',
+ 'virtual-machine-interface-routing-instance': 'routing-instance',
+ 'virtual-machine-interface-route-table': 'interface-route-table'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_virtual_machine_interface_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_machine_interface_update
+
+ def _ifmap_virtual_machine_interface_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_virtual_machine_interface_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_virtual_machine_interface_delete
+
+ def _ifmap_loadbalancer_healthmonitor_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.loadbalancer_healthmonitor_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_loadbalancer_healthmonitor_alloc
+
+ def _ifmap_loadbalancer_healthmonitor_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('loadbalancer_healthmonitor_properties', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['loadbalancer_healthmonitor_properties']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ LoadbalancerHealthmonitorType(**field).exportChildren(buf, level = 1, name_ = 'loadbalancer-healthmonitor-properties', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'loadbalancer-healthmonitor-properties', pretty_print = False)
+ loadbalancer_healthmonitor_properties_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('loadbalancer-healthmonitor-properties' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = loadbalancer_healthmonitor_properties_xml)
+
+ if (existing_metas and 'loadbalancer-healthmonitor-properties' in existing_metas and
+ str(existing_metas['loadbalancer-healthmonitor-properties'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_loadbalancer_healthmonitor_set
+
+ def _ifmap_loadbalancer_healthmonitor_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['loadbalancer-healthmonitor']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_loadbalancer_healthmonitor_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_loadbalancer_healthmonitor_create
+
+
+ def _ifmap_loadbalancer_healthmonitor_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'loadbalancer-pool-loadbalancer-healthmonitor', u'loadbalancer-healthmonitor-properties', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_loadbalancer-healthmonitor_read_to_meta_index
+
+ def _ifmap_loadbalancer_healthmonitor_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_loadbalancer_healthmonitor_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['loadbalancer-healthmonitor-properties', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_loadbalancer_healthmonitor_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_loadbalancer_healthmonitor_update
+
+ def _ifmap_loadbalancer_healthmonitor_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_loadbalancer_healthmonitor_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_loadbalancer_healthmonitor_delete
+
+ def _ifmap_virtual_network_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.virtual_network_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_virtual_network_alloc
+
+ def _ifmap_virtual_network_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('virtual_network_properties', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['virtual_network_properties']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ VirtualNetworkType(**field).exportChildren(buf, level = 1, name_ = 'virtual-network-properties', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'virtual-network-properties', pretty_print = False)
+ virtual_network_properties_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-network-properties' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_network_properties_xml)
+
+ if (existing_metas and 'virtual-network-properties' in existing_metas and
+ str(existing_metas['virtual-network-properties'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('virtual_network_network_id', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['virtual_network_network_id']))
+ meta = Metadata('virtual-network-network-id', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'virtual-network-network-id' in existing_metas and
+ str(existing_metas['virtual-network-network-id'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('route_target_list', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['route_target_list']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ RouteTargetList(**field).exportChildren(buf, level = 1, name_ = 'route-target-list', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'route-target-list', pretty_print = False)
+ route_target_list_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('route-target-list' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = route_target_list_xml)
+
+ if (existing_metas and 'route-target-list' in existing_metas and
+ str(existing_metas['route-target-list'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('router_external', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['router_external']))
+ meta = Metadata('router-external', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'router-external' in existing_metas and
+ str(existing_metas['router-external'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('is_shared', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['is_shared']))
+ meta = Metadata('is-shared', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'is-shared' in existing_metas and
+ str(existing_metas['is-shared'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('external_ipam', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['external_ipam']))
+ meta = Metadata('external-ipam', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'external-ipam' in existing_metas and
+ str(existing_metas['external-ipam'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('flood_unknown_unicast', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['flood_unknown_unicast']))
+ meta = Metadata('flood-unknown-unicast', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'flood-unknown-unicast' in existing_metas and
+ str(existing_metas['flood-unknown-unicast'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('qos_forwarding_class_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'qos-forwarding-class'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_network_qos_forwarding_class_xml = ''
+ meta = Metadata('virtual-network-qos-forwarding-class' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_network_qos_forwarding_class_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('network_ipam_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'network-ipam'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_network_network_ipam_xml = ''
+ ref_data = ref['attr']
+ if ref_data:
+ buf = cStringIO.StringIO()
+ VnSubnetsType(**ref_data).exportChildren(buf, level = 1, name_ = 'virtual-network-network-ipam', pretty_print = False)
+ virtual_network_network_ipam_xml = virtual_network_network_ipam_xml + buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-network-network-ipam' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_network_network_ipam_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('network_policy_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'network-policy'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_network_network_policy_xml = ''
+ ref_data = ref['attr']
+ if ref_data:
+ buf = cStringIO.StringIO()
+ VirtualNetworkPolicyType(**ref_data).exportChildren(buf, level = 1, name_ = 'virtual-network-network-policy', pretty_print = False)
+ virtual_network_network_policy_xml = virtual_network_network_policy_xml + buf.getvalue()
+ buf.close()
+ meta = Metadata('virtual-network-network-policy' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_network_network_policy_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('access_control_list_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'access-control-list'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_network_access_control_list_xml = ''
+ meta = Metadata('virtual-network-access-control-list' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_network_access_control_list_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('floating_ip_pool_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'floating-ip-pool'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_network_floating_ip_pool_xml = ''
+ meta = Metadata('virtual-network-floating-ip-pool' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_network_floating_ip_pool_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('routing_instance_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'routing-instance'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_network_routing_instance_xml = ''
+ meta = Metadata('virtual-network-routing-instance' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_network_routing_instance_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('route_table_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'route-table'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ virtual_network_route_table_xml = ''
+ meta = Metadata('virtual-network-route-table' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = virtual_network_route_table_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_virtual_network_set
+
+ def _ifmap_virtual_network_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['virtual-network']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_virtual_network_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_network_create
+
+
+ def _ifmap_virtual_network_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'virtual-network-qos-forwarding-class', u'virtual-network-network-ipam', u'virtual-network-network-policy', u'virtual-network-route-table', u'virtual-machine-interface-virtual-network', u'instance-ip-virtual-network', u'physical-router-virtual-network', u'logical-router-gateway', u'virtual-network-properties', u'virtual-network-network-id', u'route-target-list', u'router-external', u'is-shared', u'external-ipam', u'flood-unknown-unicast', u'id-perms', u'display-name', u'virtual-network-access-control-list', u'virtual-network-floating-ip-pool', u'virtual-network-routing-instance']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_virtual-network_read_to_meta_index
+
+ def _ifmap_virtual_network_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_virtual_network_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['virtual-network-properties', 'virtual-network-network-id', 'route-target-list', 'router-external', 'is-shared', 'external-ipam', 'flood-unknown-unicast', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ 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, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_virtual_network_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_virtual_network_update
+
+ def _ifmap_virtual_network_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_virtual_network_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_virtual_network_delete
+
+ def _ifmap_project_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.project_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_project_alloc
+
+ def _ifmap_project_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('quota', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['quota']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ QuotaType(**field).exportChildren(buf, level = 1, name_ = 'quota', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'quota', pretty_print = False)
+ quota_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('quota' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = quota_xml)
+
+ if (existing_metas and 'quota' in existing_metas and
+ str(existing_metas['quota'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('namespace_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'namespace'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_namespace_xml = ''
+ ref_data = ref['attr']
+ if ref_data:
+ buf = cStringIO.StringIO()
+ SubnetType(**ref_data).exportChildren(buf, level = 1, name_ = 'project-namespace', pretty_print = False)
+ project_namespace_xml = project_namespace_xml + buf.getvalue()
+ buf.close()
+ meta = Metadata('project-namespace' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_namespace_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('security_group_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'security-group'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_security_group_xml = ''
+ meta = Metadata('project-security-group' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_security_group_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_network_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-network'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_virtual_network_xml = ''
+ meta = Metadata('project-virtual-network' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_virtual_network_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('qos_queue_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'qos-queue'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_qos_queue_xml = ''
+ meta = Metadata('project-qos-queue' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_qos_queue_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('qos_forwarding_class_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'qos-forwarding-class'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_qos_forwarding_class_xml = ''
+ meta = Metadata('project-qos-forwarding-class' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_qos_forwarding_class_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('network_ipam_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'network-ipam'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_network_ipam_xml = ''
+ meta = Metadata('project-network-ipam' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_network_ipam_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('network_policy_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'network-policy'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_network_policy_xml = ''
+ meta = Metadata('project-network-policy' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_network_policy_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_virtual_machine_interface_xml = ''
+ meta = Metadata('project-virtual-machine-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_virtual_machine_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('floating_ip_pool_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'floating-ip-pool'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_floating_ip_pool_xml = ''
+ meta = Metadata('project-floating-ip-pool' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_floating_ip_pool_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('service_instance_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'service-instance'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_service_instance_xml = ''
+ meta = Metadata('project-service-instance' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_service_instance_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('route_table_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'route-table'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_route_table_xml = ''
+ meta = Metadata('project-route-table' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_route_table_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('interface_route_table_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'interface-route-table'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_interface_route_table_xml = ''
+ meta = Metadata('project-interface-route-table' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_interface_route_table_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('logical_router_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'logical-router'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_logical_router_xml = ''
+ meta = Metadata('project-logical-router' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_logical_router_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('loadbalancer_pool_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'loadbalancer-pool'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_loadbalancer_pool_xml = ''
+ meta = Metadata('project-loadbalancer-pool' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_loadbalancer_pool_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('loadbalancer_healthmonitor_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'loadbalancer-healthmonitor'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_loadbalancer_healthmonitor_xml = ''
+ meta = Metadata('project-loadbalancer-healthmonitor' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_loadbalancer_healthmonitor_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_ip_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-ip'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ project_virtual_ip_xml = ''
+ meta = Metadata('project-virtual-ip' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = project_virtual_ip_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_project_set
+
+ def _ifmap_project_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['project']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_project_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_project_create
+
+
+ def _ifmap_project_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'project-namespace', u'project-floating-ip-pool', u'floating-ip-project', u'quota', u'id-perms', u'display-name', u'project-security-group', u'project-virtual-network', u'project-qos-queue', u'project-qos-forwarding-class', u'project-network-ipam', u'project-network-policy', u'project-virtual-machine-interface', u'project-service-instance', u'project-route-table', u'project-interface-route-table', u'project-logical-router', u'project-loadbalancer-pool', u'project-loadbalancer-healthmonitor', u'project-virtual-ip']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_project_read_to_meta_index
+
+ def _ifmap_project_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_project_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['quota', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'project-namespace': 'namespace',
+ 'project-floating-ip-pool': 'floating-ip-pool'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_project_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_project_update
+
+ def _ifmap_project_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_project_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_project_delete
+
+ def _ifmap_qos_forwarding_class_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.qos_forwarding_class_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_qos_forwarding_class_alloc
+
+ def _ifmap_qos_forwarding_class_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('dscp', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['dscp']))
+ meta = Metadata('dscp', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'dscp' in existing_metas and
+ str(existing_metas['dscp'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('trusted', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['trusted']))
+ meta = Metadata('trusted', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'trusted' in existing_metas and
+ str(existing_metas['trusted'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('qos_queue_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'qos-queue'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ qos_forwarding_class_qos_queue_xml = ''
+ meta = Metadata('qos-forwarding-class-qos-queue' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = qos_forwarding_class_qos_queue_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_qos_forwarding_class_set
+
+ def _ifmap_qos_forwarding_class_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['qos-forwarding-class']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_qos_forwarding_class_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_qos_forwarding_class_create
+
+
+ def _ifmap_qos_forwarding_class_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'qos-forwarding-class-qos-queue', u'virtual-network-qos-forwarding-class', u'virtual-machine-interface-qos-forwarding-class', u'dscp', u'trusted', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_qos-forwarding-class_read_to_meta_index
+
+ def _ifmap_qos_forwarding_class_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_qos_forwarding_class_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['dscp', 'trusted', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'qos-forwarding-class-qos-queue': 'qos-queue'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_qos_forwarding_class_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_qos_forwarding_class_update
+
+ def _ifmap_qos_forwarding_class_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_qos_forwarding_class_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_qos_forwarding_class_delete
+
+ def _ifmap_database_node_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.database_node_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_database_node_alloc
+
+ def _ifmap_database_node_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('database_node_ip_address', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['database_node_ip_address']))
+ meta = Metadata('database-node-ip-address', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'database-node-ip-address' in existing_metas and
+ str(existing_metas['database-node-ip-address'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_database_node_set
+
+ def _ifmap_database_node_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['database-node']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_database_node_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_database_node_create
+
+
+ def _ifmap_database_node_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'database-node-ip-address', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_database-node_read_to_meta_index
+
+ def _ifmap_database_node_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_database_node_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['database-node-ip-address', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_database_node_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_database_node_update
+
+ def _ifmap_database_node_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_database_node_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_database_node_delete
+
+ def _ifmap_routing_instance_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.routing_instance_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_routing_instance_alloc
+
+ def _ifmap_routing_instance_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('service_chain_information', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['service_chain_information']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ ServiceChainInfo(**field).exportChildren(buf, level = 1, name_ = 'service-chain-information', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'service-chain-information', pretty_print = False)
+ service_chain_information_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('service-chain-information' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = service_chain_information_xml)
+
+ if (existing_metas and 'service-chain-information' in existing_metas and
+ str(existing_metas['service-chain-information'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('routing_instance_is_default', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['routing_instance_is_default']))
+ meta = Metadata('routing-instance-is-default', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'routing-instance-is-default' in existing_metas and
+ str(existing_metas['routing-instance-is-default'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('static_route_entries', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['static_route_entries']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ StaticRouteEntriesType(**field).exportChildren(buf, level = 1, name_ = 'static-route-entries', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'static-route-entries', pretty_print = False)
+ static_route_entries_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('static-route-entries' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = static_route_entries_xml)
+
+ if (existing_metas and 'static-route-entries' in existing_metas and
+ str(existing_metas['static-route-entries'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('default_ce_protocol', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['default_ce_protocol']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ DefaultProtocolType(**field).exportChildren(buf, level = 1, name_ = 'default-ce-protocol', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'default-ce-protocol', pretty_print = False)
+ default_ce_protocol_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('default-ce-protocol' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = default_ce_protocol_xml)
+
+ if (existing_metas and 'default-ce-protocol' in existing_metas and
+ str(existing_metas['default-ce-protocol'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('bgp_router_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'bgp-router'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ instance_bgp_router_xml = ''
+ meta = Metadata('instance-bgp-router' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = instance_bgp_router_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('routing_instance_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'routing-instance'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ connection_xml = ''
+ ref_data = ref['attr']
+ if ref_data:
+ buf = cStringIO.StringIO()
+ ConnectionType(**ref_data).exportChildren(buf, level = 1, name_ = 'connection', pretty_print = False)
+ connection_xml = connection_xml + buf.getvalue()
+ buf.close()
+ meta = Metadata('connection' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = connection_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('route_target_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'route-target'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ instance_target_xml = ''
+ ref_data = ref['attr']
+ if ref_data:
+ buf = cStringIO.StringIO()
+ InstanceTargetType(**ref_data).exportChildren(buf, level = 1, name_ = 'instance-target', pretty_print = False)
+ instance_target_xml = instance_target_xml + buf.getvalue()
+ buf.close()
+ meta = Metadata('instance-target' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = instance_target_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_routing_instance_set
+
+ def _ifmap_routing_instance_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['routing-instance']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_routing_instance_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_routing_instance_create
+
+
+ def _ifmap_routing_instance_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'connection', u'instance-target', u'virtual-machine-interface-routing-instance', u'connection', u'service-chain-information', u'routing-instance-is-default', u'static-route-entries', u'default-ce-protocol', u'id-perms', u'display-name', u'instance-bgp-router']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_routing-instance_read_to_meta_index
+
+ def _ifmap_routing_instance_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_routing_instance_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['service-chain-information', 'routing-instance-is-default', 'static-route-entries', 'default-ce-protocol', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'connection': 'routing-instance',
+ 'instance-target': 'route-target'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_routing_instance_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_routing_instance_update
+
+ def _ifmap_routing_instance_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_routing_instance_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_routing_instance_delete
+
+ def _ifmap_network_ipam_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.network_ipam_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_network_ipam_alloc
+
+ def _ifmap_network_ipam_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('network_ipam_mgmt', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['network_ipam_mgmt']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IpamType(**field).exportChildren(buf, level = 1, name_ = 'network-ipam-mgmt', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'network-ipam-mgmt', pretty_print = False)
+ network_ipam_mgmt_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('network-ipam-mgmt' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = network_ipam_mgmt_xml)
+
+ if (existing_metas and 'network-ipam-mgmt' in existing_metas and
+ str(existing_metas['network-ipam-mgmt'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_DNS_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-DNS'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ network_ipam_virtual_DNS_xml = ''
+ meta = Metadata('network-ipam-virtual-DNS' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = network_ipam_virtual_DNS_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_network_ipam_set
+
+ def _ifmap_network_ipam_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['network-ipam']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_network_ipam_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_network_ipam_create
+
+
+ def _ifmap_network_ipam_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'network-ipam-virtual-DNS', u'virtual-network-network-ipam', u'network-ipam-mgmt', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_network-ipam_read_to_meta_index
+
+ def _ifmap_network_ipam_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_network_ipam_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['network-ipam-mgmt', 'id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'network-ipam-virtual-DNS': 'virtual-DNS'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_network_ipam_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_network_ipam_update
+
+ def _ifmap_network_ipam_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_network_ipam_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_network_ipam_delete
+
+ def _ifmap_logical_router_alloc(self, parent_type, fq_name):
+ imid = self._imid_handler
+ (my_imid, parent_imid) = \
+ imid.logical_router_alloc_ifmap_id(parent_type, fq_name)
+ if my_imid is None or parent_imid is None:
+ return (False, (my_imid, parent_imid))
+ return (True, (my_imid, parent_imid))
+ #end _ifmap_logical_router_alloc
+
+ def _ifmap_logical_router_set(self, my_imid, existing_metas, obj_dict):
+ # Properties Meta
+ update = {}
+ field = obj_dict.get('id_perms', None)
+ if field is not None:
+ # construct object of xsd-type and get its xml repr
+ field = obj_dict['id_perms']
+ buf = cStringIO.StringIO()
+ # perms might be inserted at server as obj.
+ # obj construction diff from dict construction.
+ if isinstance(field, dict):
+ IdPermsType(**field).exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ else: # object
+ field.exportChildren(buf, level = 1, name_ = 'id-perms', pretty_print = False)
+ id_perms_xml = buf.getvalue()
+ buf.close()
+ meta = Metadata('id-perms' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = id_perms_xml)
+
+ if (existing_metas and 'id-perms' in existing_metas and
+ str(existing_metas['id-perms'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ field = obj_dict.get('display_name', None)
+ if field is not None:
+ norm_str = escape(str(obj_dict['display_name']))
+ meta = Metadata('display-name', norm_str,
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+
+ if (existing_metas and 'display-name' in existing_metas and
+ str(existing_metas['display-name'][0]['meta']) == str(meta)):
+ # no change
+ pass
+ else:
+ self._update_id_self_meta(update, meta)
+
+ # Ref Link Metas
+ imid = self._imid_handler
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_machine_interface_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-machine-interface'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ logical_router_interface_xml = ''
+ meta = Metadata('logical-router-interface' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = logical_router_interface_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('route_target_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'route-target'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ logical_router_target_xml = ''
+ meta = Metadata('logical-router-target' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = logical_router_target_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('virtual_network_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'virtual-network'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ logical_router_gateway_xml = ''
+ meta = Metadata('logical-router-gateway' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = logical_router_gateway_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+ # construct object of xsd-type and get its xml repr
+ refs = obj_dict.get('service_instance_refs', None)
+ if refs:
+ for ref in refs:
+ ref_fq_name = ref['to']
+ obj_type = 'service-instance'
+ to_imid = cfgm_common.imid.get_ifmap_id_from_fq_name(obj_type, ref_fq_name)
+ logical_router_service_instance_xml = ''
+ meta = Metadata('logical-router-service-instance' , '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail',
+ elements = logical_router_service_instance_xml)
+ self._update_id_pair_meta(update, to_imid, meta)
+
+
+ self._publish_update(my_imid, update)
+ return (True, '')
+ #end _ifmap_logical_router_set
+
+ def _ifmap_logical_router_create(self, obj_ids, obj_dict):
+ if not 'parent_type' in obj_dict:
+ # parent is config-root
+ parent_type = 'config-root'
+ parent_imid = 'contrail:config-root:root'
+ else:
+ parent_type = obj_dict['parent_type']
+ parent_imid = obj_ids.get('parent_imid', None)
+
+ # Parent Link Meta
+ update = {}
+ parent_link_meta = self._parent_metas[parent_type]['logical-router']
+ meta = Metadata(parent_link_meta, '',
+ {'ifmap-cardinality':'singleValue'}, ns_prefix = 'contrail')
+ self._update_id_pair_meta(update, obj_ids['imid'], meta)
+ self._publish_update(parent_imid, update)
+
+ (ok, result) = self._ifmap_logical_router_set(obj_ids['imid'], None, obj_dict)
+ return (ok, result)
+ #end _ifmap_logical_router_create
+
+
+ def _ifmap_logical_router_read_to_meta_index(self, ifmap_id, field_names = None):
+ # field_names = None means all fields will be read
+ imid = self._imid_handler
+ start_id = str(Identity(name = ifmap_id, type = 'other',
+ other_type = 'extended'))
+ # if id-perms missing, identity doesn't exist
+
+ all_metas = [u'logical-router-interface', u'logical-router-target', u'logical-router-gateway', u'logical-router-service-instance', u'id-perms', u'display-name']
+ if not field_names:
+ metas_to_read = all_metas
+ else: # read only requested fields
+ metas_to_read = set(all_metas) & set(field_names.keys())
+
+ # metas is a dict where key is meta-name and val is list of dict
+ # of form [{'meta':meta}, {'id':id1, 'meta':meta}, {'id':id2, 'meta':meta}]
+ metas = {}
+ for meta_name in metas_to_read:
+ if meta_name in self._id_to_metas[ifmap_id]:
+ metas[meta_name] = self._id_to_metas[ifmap_id][meta_name]
+ return metas
+ #end _ifmap_logical-router_read_to_meta_index
+
+ def _ifmap_logical_router_update(self, ifmap_id, new_obj_dict):
+ # read in refs from ifmap to determine which ones become inactive after update
+ existing_metas = self._ifmap_logical_router_read_to_meta_index(ifmap_id)
+
+ # remove properties that are no longer active
+ props = ['id-perms', 'display-name']
+ for prop in props:
+ prop_m = prop.replace('-', '_')
+ if prop in existing_metas and prop_m not in new_obj_dict:
+ self._delete_id_self_meta(ifmap_id, 'contrail:'+prop)
+ # remove refs that are no longer active
+ delete_list = []
+ refs = {'logical-router-interface': 'virtual-machine-interface',
+ 'logical-router-target': 'route-target',
+ 'logical-router-gateway': 'virtual-network',
+ 'logical-router-service-instance': 'service-instance'}
+ for meta, to_name in refs.items():
+ old_set = set([m['id'] for m in existing_metas.get(meta, [])])
+ new_set = set()
+ to_name_m = to_name.replace('-', '_')
+ for ref in new_obj_dict.get(to_name_m+'_refs', []):
+ to_imid = self.fq_name_to_ifmap_id(to_name, ref['to'])
+ new_set.add(to_imid)
+
+ for inact_ref in old_set - new_set:
+ delete_list.append((inact_ref, 'contrail:'+meta))
+
+ if delete_list:
+ self._delete_id_pair_meta_list(ifmap_id, delete_list)
+
+ (ok, result) = self._ifmap_logical_router_set(ifmap_id, existing_metas, new_obj_dict)
+ return (ok, result)
+ #end _ifmap_logical_router_update
+
+ def _ifmap_logical_router_delete(self, obj_ids):
+ ifmap_id = obj_ids['imid']
+ parent_imid = obj_ids.get('parent_imid', None)
+ existing_metas = self._ifmap_logical_router_read_to_meta_index(ifmap_id)
+ meta_list = []
+ for meta_name, meta_infos in existing_metas.items():
+ for meta_info in meta_infos:
+ ref_imid = meta_info.get('id')
+ if ref_imid is None:
+ continue
+ meta_list.append((ref_imid, 'contrail:'+meta_name))
+
+ if parent_imid:
+ # Remove link from parent
+ meta_list.append((parent_imid, None))
+
+ if meta_list:
+ self._delete_id_pair_meta_list(ifmap_id, meta_list)
+
+ # Remove all property metadata associated with this ident
+ self._delete_id_self_meta(ifmap_id, None)
+
+ return (True, '')
+ #end _ifmap_logical_router_delete
+
+#end class VncIfmapClientGen
+
+class ImidGen(object):
+ def domain_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:domain:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end domain_alloc_ifmap_id
+
+ def global_vrouter_config_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:global-vrouter-config:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end global_vrouter_config_alloc_ifmap_id
+
+ def instance_ip_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:instance-ip:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end instance_ip_alloc_ifmap_id
+
+ def network_policy_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:network-policy:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end network_policy_alloc_ifmap_id
+
+ def loadbalancer_pool_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:loadbalancer-pool:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end loadbalancer_pool_alloc_ifmap_id
+
+ def virtual_DNS_record_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:virtual-DNS-record:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end virtual_DNS_record_alloc_ifmap_id
+
+ def route_target_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:route-target:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end route_target_alloc_ifmap_id
+
+ def floating_ip_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:floating-ip:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end floating_ip_alloc_ifmap_id
+
+ def floating_ip_pool_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:floating-ip-pool:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end floating_ip_pool_alloc_ifmap_id
+
+ def physical_router_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:physical-router:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end physical_router_alloc_ifmap_id
+
+ def bgp_router_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:bgp-router:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end bgp_router_alloc_ifmap_id
+
+ def virtual_router_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:virtual-router:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end virtual_router_alloc_ifmap_id
+
+ def config_root_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:config-root:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end config_root_alloc_ifmap_id
+
+ def subnet_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:subnet:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end subnet_alloc_ifmap_id
+
+ def global_system_config_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:global-system-config:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end global_system_config_alloc_ifmap_id
+
+ def service_appliance_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:service-appliance:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end service_appliance_alloc_ifmap_id
+
+ def service_instance_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:service-instance:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end service_instance_alloc_ifmap_id
+
+ def namespace_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:namespace:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end namespace_alloc_ifmap_id
+
+ def logical_interface_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:logical-interface:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end logical_interface_alloc_ifmap_id
+
+ def route_table_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:route-table:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end route_table_alloc_ifmap_id
+
+ def physical_interface_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:physical-interface:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end physical_interface_alloc_ifmap_id
+
+ def access_control_list_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:access-control-list:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end access_control_list_alloc_ifmap_id
+
+ def analytics_node_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:analytics-node:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end analytics_node_alloc_ifmap_id
+
+ def virtual_DNS_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:virtual-DNS:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end virtual_DNS_alloc_ifmap_id
+
+ def customer_attachment_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:customer-attachment:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end customer_attachment_alloc_ifmap_id
+
+ def service_appliance_set_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:service-appliance-set:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end service_appliance_set_alloc_ifmap_id
+
+ def config_node_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:config-node:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end config_node_alloc_ifmap_id
+
+ def qos_queue_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:qos-queue:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end qos_queue_alloc_ifmap_id
+
+ def virtual_machine_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:virtual-machine:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end virtual_machine_alloc_ifmap_id
+
+ def interface_route_table_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:interface-route-table:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end interface_route_table_alloc_ifmap_id
+
+ def service_template_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:service-template:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end service_template_alloc_ifmap_id
+
+ def virtual_ip_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:virtual-ip:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end virtual_ip_alloc_ifmap_id
+
+ def loadbalancer_member_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:loadbalancer-member:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end loadbalancer_member_alloc_ifmap_id
+
+ def security_group_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:security-group:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end security_group_alloc_ifmap_id
+
+ def provider_attachment_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:provider-attachment:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end provider_attachment_alloc_ifmap_id
+
+ def virtual_machine_interface_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:virtual-machine-interface:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end virtual_machine_interface_alloc_ifmap_id
+
+ def loadbalancer_healthmonitor_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:loadbalancer-healthmonitor:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end loadbalancer_healthmonitor_alloc_ifmap_id
+
+ def virtual_network_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:virtual-network:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end virtual_network_alloc_ifmap_id
+
+ def project_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:project:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end project_alloc_ifmap_id
+
+ def qos_forwarding_class_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:qos-forwarding-class:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end qos_forwarding_class_alloc_ifmap_id
+
+ def database_node_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:database-node:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end database_node_alloc_ifmap_id
+
+ def routing_instance_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:routing-instance:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end routing_instance_alloc_ifmap_id
+
+ def network_ipam_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:network-ipam:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end network_ipam_alloc_ifmap_id
+
+ def logical_router_alloc_ifmap_id(self, parent_type, fq_name):
+ my_fqn = ':'.join(fq_name)
+ parent_fqn = ':'.join(fq_name[:-1])
+
+ my_imid = 'contrail:logical-router:' + my_fqn
+ if parent_fqn:
+ if parent_type is None:
+ return (None, None)
+ parent_imid = 'contrail:' + parent_type + ':' + parent_fqn
+ else: # parent is config-root
+ parent_imid = 'contrail:config-root:root'
+
+ # Normalize/escape special chars
+ my_imid = escape(my_imid)
+ parent_imid = escape(parent_imid)
+
+ return (my_imid, parent_imid)
+ #end logical_router_alloc_ifmap_id
+
+
+link_name_to_xsd_type = {
+ "project-namespace":"SubnetType",
+ "connection":"ConnectionType",
+ "bgp-peering":"BgpPeeringAttributes",
+ "virtual-machine-interface-routing-instance":"PolicyBasedForwardingRuleType",
+ "virtual-network-network-policy":"VirtualNetworkPolicyType",
+ "instance-target":"InstanceTargetType",
+ "virtual-network-network-ipam":"VnSubnetsType"
+}
+