def _populate_policy_profiles(self): """Populate all the policy profiles from VSM.""" hosts = self.n1kvclient.get_vsm_hosts() for vsm_ip in hosts: try: policy_profiles = self.n1kvclient.list_port_profiles(vsm_ip) vsm_profiles = {} plugin_profiles_set = set() # Fetch policy profiles from VSM for profile_name in policy_profiles: profile_id = (policy_profiles[profile_name][ n1kv_const.PROPERTIES][n1kv_const.ID]) vsm_profiles[profile_id] = profile_name # Fetch policy profiles previously populated for profile in self._get_policy_profiles_by_host(vsm_ip): plugin_profiles_set.add(profile.id) vsm_profiles_set = set(vsm_profiles) # Update database if the profile sets differ. if vsm_profiles_set.symmetric_difference(plugin_profiles_set): # Add new profiles to database if they were created in VSM for pid in vsm_profiles_set.difference( plugin_profiles_set): self._add_policy_profile(pid, vsm_profiles[pid], vsm_ip) # Delete profiles from database if they were deleted in VSM for pid in plugin_profiles_set.difference( vsm_profiles_set): if not n1kv_db.policy_profile_in_use(pid): self._remove_policy_profile(pid, vsm_ip) else: LOG.warning(_LW('Policy profile %s in use'), pid) except (n1kv_exc.VSMError, n1kv_exc.VSMConnectionFailed): with excutils.save_and_reraise_exception(reraise=False): LOG.warning(_LW('No policy profile populated from VSM'))
def _populate_policy_profiles(self): """Populate all the policy profiles from VSM.""" hosts = self.n1kvclient.get_vsm_hosts() for vsm_ip in hosts: try: policy_profiles = self.n1kvclient.list_port_profiles(vsm_ip) vsm_profiles = {} plugin_profiles_set = set() # Fetch policy profiles from VSM for profile_name in policy_profiles: profile_id = (policy_profiles[profile_name] [n1kv_const.PROPERTIES][n1kv_const.ID]) vsm_profiles[profile_id] = profile_name # Fetch policy profiles previously populated for profile in self._get_policy_profiles_by_host(vsm_ip): plugin_profiles_set.add(profile.id) vsm_profiles_set = set(vsm_profiles) # Update database if the profile sets differ. if vsm_profiles_set.symmetric_difference(plugin_profiles_set): # Add new profiles to database if they were created in VSM for pid in vsm_profiles_set.difference( plugin_profiles_set): self._add_policy_profile(pid, vsm_profiles[pid], vsm_ip) # Delete profiles from database if they were deleted in VSM for pid in plugin_profiles_set.difference( vsm_profiles_set): if not n1kv_db.policy_profile_in_use(pid): self._remove_policy_profile(pid, vsm_ip) else: LOG.warning(_LW('Policy profile %s in use'), pid) except (n1kv_exc.VSMError, n1kv_exc.VSMConnectionFailed): with excutils.save_and_reraise_exception(reraise=False): LOG.warning(_LW('No policy profile populated from VSM'))
def sanitize_policy_profile_table(self): """Clear policy profiles from stale VSM.""" db_session = db.get_session() hosts = config.get_vsm_hosts() vsm_info = db_session.query( n1kv_models.PolicyProfile.vsm_ip).distinct() if vsm_info is None or hosts is None: return vsm_ips = [vsm_ip[0] for vsm_ip in vsm_info if vsm_ip[0] not in hosts] for vsm_ip in vsm_ips: pprofiles = n1kv_db.get_policy_profiles_by_host(vsm_ip, db_session) for pprofile in pprofiles: # Do not delete profile if it is in use and if it # is the only VSM to have it configured pp_in_use = n1kv_db.policy_profile_in_use(pprofile['id'], db_session) num_vsm_using_pp = db_session.query( n1kv_models.PolicyProfile).filter_by( id=pprofile['id']).count() if (not pp_in_use) or (num_vsm_using_pp > 1): db_session.delete(pprofile) db_session.flush() else: LOG.warning(_LW('Cannot delete policy profile %s ' 'as it is in use.'), pprofile['id'])
def sanitize_policy_profile_table(self): """Clear policy profiles from stale VSM.""" db_session = db.get_session() hosts = config.get_vsm_hosts() vsm_info = db_session.query( n1kv_models.PolicyProfile.vsm_ip).distinct() if vsm_info is None or hosts is None: return vsm_ips = [vsm_ip[0] for vsm_ip in vsm_info if vsm_ip[0] not in hosts] for vsm_ip in vsm_ips: pprofiles = n1kv_db.get_policy_profiles_by_host(vsm_ip, db_session) for pprofile in pprofiles: # Do not delete profile if it is in use and if it # is the only VSM to have it configured pp_in_use = n1kv_db.policy_profile_in_use( pprofile['id'], db_session) num_vsm_using_pp = db_session.query( n1kv_models.PolicyProfile).filter_by( id=pprofile['id']).count() if (not pp_in_use) or (num_vsm_using_pp > 1): db_session.delete(pprofile) db_session.flush() else: LOG.warning( _LW('Cannot delete policy profile %s ' 'as it is in use.'), pprofile['id'])