def drv_attr_make_diff(cls, context, dep_id, old_driver_attr_list, new_driver_attr_list): """Diff new dirver-side Attribute Object lists with the old one.""" LOG.info("Start differing attributes.") new_key_list = [ driver_attr_obj.key for driver_attr_obj in new_driver_attr_list ] old_key_list = [ driver_attr_obj.key for driver_attr_obj in old_driver_attr_list ] same = set(new_key_list) & set(old_key_list) # key is same, diff the value. for s in same: # value is not same, update new_driver_attr_obj = new_driver_attr_list[new_key_list.index(s)] old_driver_attr_obj = old_driver_attr_list[old_key_list.index(s)] if new_driver_attr_obj.value != old_driver_attr_obj.value: attr_obj = Attribute.get_by_dep_key(context, dep_id, s) attr_obj.value = new_driver_attr_obj.value attr_obj.save(context) # key is deleted. deleted = set(old_key_list) - same for d in deleted: old_driver_attr_obj = old_driver_attr_list[old_key_list.index(d)] old_driver_attr_obj.destroy(context, dep_id) # key is added. added = set(new_key_list) - same for a in added: new_driver_attr_obj = new_driver_attr_list[new_key_list.index(a)] new_driver_attr_obj.create(context, dep_id)
def drv_attr_make_diff(self, context, dep_id, old_driver_attr_list, new_driver_attr_list): """Diff new driver-side Attribute Object lists with the old one.""" LOG.info("Start differing attributes.") dep_obj = Deployable.get_by_id(context, dep_id) driver_dep = DriverDeployable.get_by_name(context, dep_obj.name) rp_uuid = self.get_rp_uuid_from_obj(driver_dep) new_key_list = [ driver_attr_obj.key for driver_attr_obj in new_driver_attr_list ] old_key_list = [ driver_attr_obj.key for driver_attr_obj in old_driver_attr_list ] same = set(new_key_list) & set(old_key_list) # key is deleted. deleted = set(old_key_list) - same for d in deleted: old_driver_attr_obj = old_driver_attr_list[old_key_list.index(d)] self.placement_client.delete_trait_by_name( context, rp_uuid, old_driver_attr_obj.value) old_driver_attr_obj.delete_by_key(context, dep_id, d) # key is added. added = set(new_key_list) - same for a in added: new_driver_attr_obj = new_driver_attr_list[new_key_list.index(a)] new_driver_attr_obj.create(context, dep_id) self.placement_client.add_traits_to_rp(rp_uuid, [new_driver_attr_obj.value]) # key is same, diff the value. for s in same: # value is not same, update new_driver_attr_obj = new_driver_attr_list[new_key_list.index(s)] old_driver_attr_obj = old_driver_attr_list[old_key_list.index(s)] if new_driver_attr_obj.value != old_driver_attr_obj.value: attr_obj = Attribute.get_by_dep_key(context, dep_id, s) attr_obj.value = new_driver_attr_obj.value attr_obj.save(context) # Update traits here. if new_driver_attr_obj.key.startswith("trait"): self.placement_client.delete_trait_by_name( context, rp_uuid, old_driver_attr_obj.value) self.placement_client.add_traits_to_rp( rp_uuid, [new_driver_attr_obj.value]) # Update resource classes here. if new_driver_attr_obj.key.startswith("rc"): self.placement_client.ensure_resource_classes( context, [new_driver_attr_obj.value]) inv_data = _gen_resource_inventory( new_driver_attr_obj.value, dep_obj.num_accelerators) self.placement_client.update_inventory(rp_uuid, inv_data) self.placement_client.delete_rc_by_name( context, old_driver_attr_obj.value)