def render(self, session, grn, eon_id, disabled, **arguments): Grn.get_unique(session, grn=grn, preclude=True) Grn.get_unique(session, eon_id=eon_id, preclude=True) if disabled is None: disabled = False dbgrn = Grn(grn=grn, eon_id=eon_id, disabled=disabled) session.add(dbgrn) session.flush() return
def update_grn_map(config, session, logger): if not config.get("broker", "grn_to_eonid_map_location"): # pragma: no cover raise ArgumentError("GRN synchronization is disabled.") q = session.query(Grn) grns = {} for dbgrn in q: grns[dbgrn.eon_id] = dbgrn name = os.path.join(config.get("broker", "grn_to_eonid_map_location"), "eon_catalog.csv") added = 0 updated = 0 deleted = 0 with open(name) as f: reader = DictReader(f) for row in reader: changed = False eon_id = int(row["id"]) disabled = int(row["can_map_resources"]) == 0 or \ int(row["deleted"]) != 0 if eon_id not in grns: dbgrn = Grn(eon_id=eon_id, grn=row["name"], disabled=disabled) session.add(dbgrn) added += 1 else: dbgrn = grns[eon_id] # Mark it as processed del grns[eon_id] if dbgrn.grn != row["name"]: dbgrn.grn = row["name"] changed = True if dbgrn.disabled != disabled: dbgrn.disabled = disabled changed = True if changed: updated += 1 # Should not really happen in practice... for dbgrn in grns.values(): session.delete(dbgrn) deleted += 1 if logger: logger.client_info("Added %d, updated %d, deleted %d GRNs." % (added, updated, deleted)) session.flush() return