jobs/eam-integrations/scripts/workday_xmatters.py (172 lines of code) (raw):

from __future__ import division from api import XMatters, Workday from api.util import Util import sys import os import re import argparse import logging sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/..") # from integrations.api.connectors import XMatters, Workday # from integrations.api.connectors import Util def user_data_matches(wd_user, xm_user): site_key = ( wd_user.get("User_Home_Country", "") + ":" + wd_user.get("User_Home_Postal_Code", "") ) try: if wd_user["User_Preferred_First_Name"] != xm_user["firstName"]: logger.info( "MISMATCH (first name): %s <-> %s" % (wd_user["User_Preferred_First_Name"], xm_user["firstName"]) ) return False elif wd_user["User_Preferred_Last_Name"] != xm_user["lastName"]: logger.info( "MISMATCH (last name): %s <-> %s" % (wd_user["User_Preferred_Last_Name"], xm_user["lastName"]) ) return False elif site_key != xm_user["site"]["name"]: logger.info( "MISMATCH (site name): %s <-> %s" % (site_key, xm_user["site"]["name"]) ) return False elif wd_user.get("User_Home_City", "") != xm_user["properties"]["Home City"]: logger.info( "MISMATCH (home city): %s <-> %s" % (wd_user["User_Home_City"], xm_user["properties"]["Home City"]) ) return False elif ( wd_user.get("User_Home_Country", "") != xm_user["properties"]["Home Country"] ): logger.info( "MISMATCH (home country): %s <-> %s" % (wd_user["User_Home_Country"], xm_user["properties"]["Home Country"]) ) return False elif ( wd_user.get("User_Home_Postal_Code", "") != xm_user["properties"]["Home Zipcode"] ): logger.info( "MISMATCH (home zipcode): %s <-> %s" % ( wd_user["User_Home_Postal_Code"], xm_user["properties"]["Home Zipcode"], ) ) return False else: return True except KeyError: logger.warning("Some key was not found, assuming a missing field in XMatters") return False def iterate_thru_wd_users(wd_users, xm_users, xm_sites, limit): wd_users_seen = {} xm_add_users = [] num_changes = 0 for user in wd_users: if "User_Email_Address" not in user: logger.info( "Workday User ID %s (%s) has no email address! Skipping." % ( user["User_Employee_ID"], user["User_Preferred_First_Name"] + " " + user["User_Preferred_Last_Name"], ) ) continue elif not re.search( "(?:mozilla.com|mozillafoundation.org)$", user["User_Email_Address"], ): logger.info( "User {} has non-matching email. Skipping.".format( user["User_Email_Address"] ) ) continue wd_users_seen[user["User_Email_Address"]] = 1 if user["User_Email_Address"] in xm_users: logger.debug("User %s found in XM" % user["User_Email_Address"]) if not user_data_matches(user, xm_users[user["User_Email_Address"]]): if num_changes < limit: logger.debug("USER DATA NO MATCHES!") XMatters.update_user( user, xm_users[user["User_Email_Address"]], xm_sites ) num_changes +=1 else: logger.debug("%s good" % user["User_Email_Address"]) else: # add user to XM # XMatters.add_user(user, xm_sites) xm_add_users.append(user) # time.sleep(5) logger.info(f"Number of updated users:{num_changes}") return wd_users_seen, xm_add_users def get_wd_sites_from_users(users): unique_sites = {} for user in users: city = user.get("User_Home_City", "") country = user.get("User_Home_Country", "") postal = user.get("User_Home_Postal_Code", "") unq_key = country + ":" + postal if not country: logger.debug("NO COUNTRY!!") logger.debug(user) country = "United States of America" if not postal: logger.debug("NO POSTAL!!") logger.debug(user) postal = "97209" if unq_key not in unique_sites: unique_sites[unq_key] = { "name": unq_key, "country": country, "city": city, "postal_code": postal, } return unique_sites if __name__ == "__main__": parser = argparse.ArgumentParser(description="Sync up XMatters with Workday") parser.add_argument( "-l", "--level", action="store", help="log level (debug, info, warning, error, or critical)", type=str, default="info", ) parser.add_argument( "-m", "--max_limit", action="store", type=int, help="limit the number of changes in Everfi", default=20 ) args = parser.parse_args() Util.set_up_logging(args.level) logger = logging.getLogger(__name__) logger.info("Starting...") # get all sites in xmatters xm_sites, xm_sites_inactive = XMatters.get_all_sites() # get all users from workday wd_users = Workday.get_users() # get the new style (zipcodes) sites from the user list wd_sites = get_wd_sites_from_users(wd_users) logger.info(f"Number of XMatters sites: {len(xm_sites)}") logger.info(f"Number of Workday sites: {len(wd_sites)}") logger.info(f"Number of Workday users: {len(wd_users)}") # # get list of sites from workday users # wd_sites = Workday.get_sites() # sites_percentage = len(xm_sites) / len(wd_sites) # if sites_percentage > 1.1 or sites_percentage < 0.9: # logger.critical( # "The number of sites in Workday vs XMatters is \ # different by more than 10%% (%.02f%%)." # % (abs(100 - sites_percentage * 100)) # ) # logger.critical("Stopping unless --force") # if not args.force: # exit(42) # add_task any sites in workday that aren't in xmatters to xmatters xm_sites_in_wd = XMatters.add_new_sites(wd_sites, xm_sites, xm_sites_inactive, args.max_limit) # delete any sites NOT in workday that ARE in xmatters XMatters.delete_sites(xm_sites, xm_sites_in_wd, args.max_limit) # re-get all sites in xmatters xm_sites, xm_sites_inactive = XMatters.get_all_sites() # get all users from xmatters xm_users = XMatters.get_all_people() logger.info(f"Number of XMatters users: {len(xm_users)}") # users_percentage = len(xm_users) / len(wd_users) # if users_percentage > 1.1 or users_percentage < 0.9: # logger.critical( # "The number of users in Workday vs XMatters is \ # different by more than 10%% (%.02f%%)." # % (abs(100 - users_percentage * 100)) # ) # logger.critical("Stopping unless --force") # if not args.force: # exit(42) # iterate thru users in workday: # if not in xmatters, add_task to xmatters # if data doesn't match xmatters, update xmatters # mark-as-seen in xmatters users_seen_in_workday, xm_add_users = iterate_thru_wd_users(wd_users, xm_users, xm_sites, args.max_limit) # iterate through xmatters users who aren't marked-as-seen # remove from xmatters XMatters.delete_users(xm_users, users_seen_in_workday, args.max_limit) for user in xm_add_users[:args.max_limit]: logger.info(f"Adding user: {user['User_Email_Address']}") XMatters.add_user(user, xm_sites) logger.info(f"Number of users added:{len(xm_add_users[:args.max_limit])}") logger.info("Finished.")