import logging import itertools import requests import urlparse import xml.etree.ElementTree as ET from ncgx.inventory import Hosts, Checks, Groups from vofeed.api import VOFeed log = logging.getLogger('ncgx') FLAVOR_MAP = {'CREAM-CE': 'cream', 'ARC-CE': 'arc', 'HTCONDOR-CE': 'condor', 'GLOBUS': 'gt', 'OSG-CE': 'gt'} CE_STATE_METRICS = ( 'org.sam.CONDOR-JobState-/cms/Role=lcgadmin', 'org.sam.CONDOR-JobState-/cms/Role=pilot', 'org.sam.CONDOR-JobState-/cms/Role=production',) CE_METRICS = ( 'org.sam.CONDOR-JobSubmit-/cms/Role=lcgadmin', 'org.sam.CONDOR-JobSubmit-/cms/Role=pilot', 'org.sam.CONDOR-JobSubmit-/cms/Role=production', 'org.cms.glexec.WN-gLExec-/cms/Role=pilot', 'org.cms.WN-analysis-/cms/Role=lcgadmin', 'org.cms.WN-basic-/cms/Role=lcgadmin', 'org.cms.WN-cvmfs-/cms/Role=lcgadmin', 'org.cms.WN-env-/cms/Role=lcgadmin', 'org.cms.WN-frontier-/cms/Role=lcgadmin', 'org.cms.WN-mc-/cms/Role=production', 'org.cms.WN-remotestageout-/cms/Role=lcgadmin', 'org.cms.WN-squid-/cms/Role=lcgadmin', 'org.cms.WN-swinst-/cms/Role=lcgadmin', 'org.cms.WN-singularity-/cms/Role=lcgadmin', 'org.cms.WN-xrootd-access-/cms/Role=lcgadmin', 'org.cms.WN-xrootd-fallback-/cms/Role=lcgadmin') SE_METRICS = ( 'org.cms.SRM-AllCMS-/cms/Role=production', 'org.cms.SRM-GetPFNFromTFC-/cms/Role=production', 'org.cms.SRM-VODel-/cms/Role=production', 'org.cms.SRM-VOGet-/cms/Role=production', 'org.cms.SRM-VOGetTURLs-/cms/Role=production', 'org.cms.SRM-VOLs-/cms/Role=production', 'org.cms.SRM-VOLsDir-/cms/Role=production', 'org.cms.SRM-VOPut-/cms/Role=production') def run(url): log.info("Processing vo feed: %s" % url) # Get services from the VO feed, i.e # list of tuples (hostname, flavor, endpoint) feed = VOFeed(url) services = feed.get_services() # Add hosts, each tagged with corresponding flavors # creates /etc/ncgx/conf.d/generated_hosts.cfg h = Hosts() for service in services: h.add(service[0], tags=[service[1]]) h.serialize() # Add corresponding metrics to tags # creates /etc/ncgx/conf.d/generated_checks.cfg c = Checks() c.add_all(CE_METRICS, tags=["CREAM-CE", "ARC-CE", "GLOBUS", "HTCONDOR-CE"]) c.add_all(SE_METRICS, tags=["SRM"]) for service in services: host = service[0] flavor = service[1] if flavor not in ["CREAM-CE", "ARC-CE", "GLOBUS", "HTCONDOR-CE"]: continue if flavor == 'HTCONDOR-CE': # special handling for HTCONDOR-CE, no queues for m in CE_STATE_METRICS: c.add(m, hosts=(service[0],), params={ 'args': { '--resource': 'htcondor://%s' % service[0] }}) continue ce_resources = feed.get_ce_resources(host, flavor) if ce_resources: batch = ce_resources[0][0] queue = ce_resources[0][1] if not batch: batch = "nopbs" if flavor not in FLAVOR_MAP.keys(): log.warning("Unable to determine type for flavour %s" % flavor) continue res = "%s://%s/%s/%s/%s" % (FLAVOR_MAP[flavor], host, 'nosched', batch, queue) for m in CE_STATE_METRICS: c.add(m, hosts=(service[0],), params={ 'args': { '--resource': '%s' % res }}) else: log.warning("No ce_resources found for host %s, BDII will used" % host) c.serialize() # Add host groups sites = feed.get_groups("CMS_Site") hg = Groups("host_groups") for site, hosts in sites.iteritems(): for host in hosts: hg.add(site, host) hg.serialize()