{"action":"created","comment":{"url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/comments/29132820","id":29132820,"diff_hunk":"@@ -0,0 +1,323 @@\n+#!/usr/bin/env python\n+from assignSession import *\n+from utils import getWorkflows, workflowInfo, getDatasetEventsAndLumis, findCustodialLocation, getDatasetEventsPerLumi, siteInfo, getDatasetPresence, campaignInfo, getWorkflowById, makeReplicaRequest\n+import phedexClient\n+import dbs3Client\n+import reqMgrClient\n+import json\n+from collections import defaultdict\n+import optparse\n+import os\n+import time\n+from htmlor import htmlor\n+\n+class falseDB:\n+    def __init__(self):\n+        self.record = json.loads(open('closedout.json').read())\n+        #print \"got\",len(self.record),\"from close out json\"\n+\n+    #def __del__(self):\n+    #    pass\n+    def summary(self):\n+        #print \"writting\",len(self.record),\"to close out json\"\n+        os.system('cp closedout.json closedout.json.last')\n+        open('closedout.json','w').write( json.dumps( self.record , indent=2 ) )\n+        \n+        html = open('/afs/cern.ch/user/c/cmst2/www/unified/closeout.html','w')\n+        html.write('<html>')\n+        html.write('Last update on %s(CET), %s(GMT), <a href=logs/checkor/ target=_blank> logs</a> <br><br>'%(time.asctime(time.localtime()),time.asctime(time.gmtime())))\n+        html.write('<table border=1><tr><th>workflow</th><th>OutputDataSet</th><th>%Compl</th><th>Dupl</th><th>CorrectLumis</th><th>Scubscr</th><th>Tran</th><th>dbsF</th><th>phdF</th><th>ClosOut</th></tr>')\n+\n+        for wf in sorted(self.record.keys()):\n+            order = ['percentage','duplicate','correctLumis','missingSubs','phedexReqs','dbsFiles','phedexFiles']\n+            wf_and_anchor = '<a id=\"%s\">%s</a>'%(wf,wf)\n+            for out in self.record[wf]['datasets']:\n+                html.write('<tr>')\n+                html.write('<td>%s</td>'% wf_and_anchor)\n+                html.write('<td>%s</td>'% out)\n+                for f in order:\n+                    value = self.record[wf]['datasets'][out][f]\n+                    html.write('<td>%s</td>'% value)\n+                html.write('<td>%s</td>'%self.record[wf]['closeOutWorkflow'])\n+                html.write('</tr>')\n+                wf_and_anchor = wf\n+\n+def checkor(url, spec=None, options=None):\n+    fDB = falseDB()\n+\n+    wfs=[]\n+    if options.fetch:\n+        workflows = getWorkflows(url, status='completed')\n+        for wf in workflows:\n+            wfo = session.query(Workflow).filter(Workflow.name == wf ).first()\n+            if wfo:\n+                if not wfo.status in ['away','assistance']: continue\n+                wfs.append(wfo )\n+    else:\n+        ## than get all in need for assistance\n+        wfs = session.query(Workflow).filter(Workflow.status.startswith('assistance-')).all()\n+\n+\n+    custodials = defaultdict(list) #sites : dataset list\n+    transfers = defaultdict(list) #sites : dataset list\n+    invalidations = [] #a list of files\n+    SI = siteInfo()\n+    CI = campaignInfo()\n+\n+    for wfo in wfs:\n+        if spec and not (spec in wfo.name): continue\n+\n+        ## get info\n+        wfi = workflowInfo(url, wfo.name)\n+\n+        sub_assistance=\"\" # if that string is filled, there will be need for manual assistance\n+\n+        is_closing = True\n+        ## do the closed-out checks one by one\n+\n+        # tuck out DQMIO/DQM\n+        wfi.request['OutputDatasets'] = [ out for out in wfi.request['OutputDatasets'] if not '/DQM' in out]\n+\n+        ## completion check\n+        percent_completions = {}\n+        for output in wfi.request['OutputDatasets']:\n+            event_count,lumi_count = getDatasetEventsAndLumis(dataset=output)\n+            event_expected,lumi_expected =  wfi.request['TotalInputEvents'],wfi.request['TotalInputLumis']\n+            percent_completions[output] = 0\n+            if lumi_expected:\n+                percent_completions[output] = lumi_count / float( lumi_expected )\n+        pf = options.fractionpass\n+        if 'Campaign' in wfi.request and wfi.request['Campaign'] in CI.campaigns and 'fractionpass' in CI.campaigns[wfi.request['Campaign']]:\n+            pf = CI.campaigns[wfi.request['Campaign']]['fractionpass']\n+            print \"overriding fraction to\",pf,\"for\",wfi.request['Campaign']\n+\n+        if not all([fract > pf for fract in percent_completions.values()]):\n+            print wfo.name,\"is not completed\"\n+            print json.dumps(percent_completions, indent=2)\n+            ## hook for creating automatically ACDC ?\n+            sub_assistance+='-recovery'\n+            is_closing = False\n+\n+        ## duplication check\n+        duplications = {}\n+        for output in wfi.request['OutputDatasets']:\n+            duplications[output] = dbs3Client.duplicateRunLumi( output )\n+            \n+        if any(duplications.values()):\n+            print wfo.name,\"has duplicates\",\n+            print json.dumps(duplications,indent=2)\n+            ## hook for making file invalidation ?\n+            sub_assistance+='-duplicates'\n+            is_closing = False \n+\n+        ## correct lumi ??< 300 event per lumi\n+        events_per_lumi = {}\n+        for output in wfi.request['OutputDatasets']:\n+            events_per_lumi[output] = getDatasetEventsPerLumi( output )\n+            if output.endswith('/LHE'):\n+                events_per_lumi[output] = 0.\n+                \n+\n+        if any([ epl> 300. for epl in events_per_lumi.values()]):\n+            print wfo.name,\"has big lumisections\"\n+            print json.dumps(events_per_lumi, indent=2)\n+            ## hook for rejecting the request ?\n+            sub_assistance+='-biglumi'\n+            is_closing = False \n+\n+        any_presence = {}\n+        for output in wfi.request['OutputDatasets']:\n+            any_presence[output] = getDatasetPresence(url, output, vetoes=[])\n+\n+        ## custodial copy\n+        custodial_locations = {}\n+        custodial_presences = {}\n+        for output in wfi.request['OutputDatasets']:\n+            custodial_presences[output] = [s for s in any_presence[output] if 'MSS' in s]\n+            custodial_locations[output] = phedexClient.getCustodialSubscriptionRequestSite(output)\n+\n+            if not custodial_locations[output]:\n+                custodial_locations[output] = []\n+\n+        vetoed_custodial_tier = ['MINIAODSIM']\n+        out_worth_checking = [out for out in custodial_locations.keys() if out.split('/')[-1] not in vetoed_custodial_tier]\n+        if not all(map( lambda sites : len(sites)!=0, [custodial_locations[out] for out in out_worth_checking])):\n+            print wfo.name,\"has not all custodial location\"\n+            print json.dumps(custodial_locations, indent=2)\n+\n+            ##########\n+            ## hook for making a custodial replica ?\n+            custodial = None\n+            ## get from other outputs\n+            for output in out_worth_checking:\n+                if len(custodial_locations[output]): custodial = custodial_locations[output][0]\n+            ## get from the parent\n+            if not custodial and 'InputDataset' in wfi.request:\n+                parents_custodial = findCustodialLocation(url, wfi.request['InputDataset'])\n+                if len(parents_custodial):\n+                    custodial = parents_custodial[0]\n+                else:\n+                    print \"the input dataset\",wfi.request['InputDataset'],\"does not have custodial in the first place. abort\"\n+            else:\n+                ## pick one at random\n+                custodial = SI.pick_SE()\n+\n+            if custodial and not sub_assistance:\n+                ## register the custodial request, if there are no other big issues\n+                for output in out_worth_checking:\n+                    if not len(custodial_locations[output]):\n+                        custodials[custodial].append( output )\n+            else:\n+                print \"cannot find a custodial for\",wfo.name\n+            is_closing = False\n+\n+        ## disk copy \n+        disk_copies = {}\n+        for output in wfi.request['OutputDatasets']:\n+            disk_copies[output] = [s for s in any_presence[output] if (not 'MSS' in s) and (not 'Buffer' in s)]\n+\n+        if not all(map( lambda sites : len(sites)!=0, disk_copies.values())):\n+            print wfo.name,\"has not all output on disk\"\n+            print json.dumps(disk_copies, indent=2)\n+\n+\n+        ## presence in dbs\n+        dbs_presence = {}\n+        for output in wfi.request['OutputDatasets']:\n+            dbs_presence[output] = dbs3Client.getFileCountDataset( output )\n+        \n+        ## presence in phedex\n+        phedex_presence ={}\n+        for output in wfi.request['OutputDatasets']:\n+            phedex_presence[output] = phedexClient.getFileCountDataset(url, output )\n+\n+        if not all([dbs_presence[out] == phedex_presence[out] for out in wfi.request['OutputDatasets']]):\n+            print wfo.name,\"has a dbs,phedex mismatch\"\n+            print json.dumps(dbs_presence, indent=2)\n+            print json.dumps(phedex_presence, indent=2)\n+            ## hook for just waiting ...\n+            is_closing = False\n+\n+        ## anything running on acdc\n+        familly = getWorkflowById(url, wfi.request['PrepID'], details=True)\n+        for member in familly:\n+            if member['RequestName'] == wfo.name: continue\n+            if member['RequestDate'] < wfi.request['RequestDate']: continue\n+            if member['RequestStatus'] in ['running-opened','running-closed','assignment-approved','assigned','acquired']:\n+                print wfo.name,\"still has a member running\",member['RequestName']\n+                #print json.dumps(member,indent=2)\n+                ## hook for just waiting ...\n+                is_closing = False\n+\n+        ## for visualization later on\n+        if not wfo.name in fDB.record: \n+            #print \"adding\",wfo.name,\"to close out record\"\n+            fDB.record[wfo.name] = {\n+            'datasets' :{},\n+            'name' : wfo.name,\n+            'closeOutWorkflow' : None,\n+            }\n+        fDB.record[wfo.name]['closeOutWorkflow'] = is_closing\n+        for output in wfi.request['OutputDatasets']:\n+            if not output in fDB.record[wfo.name]['datasets']: fDB.record[wfo.name]['datasets'][output] = {}\n+            rec = fDB.record[wfo.name]['datasets'][output]\n+            rec['percentage'] = float('%.2f'%(percent_completions[output]*100))\n+            rec['duplicate'] = duplications[output]\n+            rec['phedexReqs'] = float('%.2f'%any_presence[output][custodial_presences[output][0]][1]) if len(custodial_presences[output])!=0 else 'N/A'\n+            rec['closeOutDataset'] = is_closing\n+            rec['transPerc'] = float('%.2f'%any_presence[output][ disk_copies[output][0]][1]) if len(disk_copies[output])!=0 else 'N/A'\n+            rec['correctLumis'] = (events_per_lumi[output] <= 300)\n+            rec['missingSubs'] = False if len(custodial_locations[output])==0 else ','.join(custodial_locations[output])\n+            rec['dbsFiles'] = dbs_presence[output]\n+            rec['phedexFiles'] = phedex_presence[output]\n+\n+        ## and move on\n+        if is_closing:\n+            ## toggle status to closed-out in request manager\n+            print \"setting\",wfo.name,\"closed-out\"\n+            if not options.test:\n+                reqMgrClient.closeOutWorkflowCascade(url, wfo.name)\n+                # set it from away/assistance* to close\n+                wfo.status = 'close'\n+                session.commit()\n+        else:\n+            print wfo.name,\"needs assistance\"\n+            ## that means there is something that needs to be done acdc, lumi invalidation, custodial, name it\n+            wfo.status = 'assistance'+sub_assistance\n+            if not options.test:\n+                print \"setting\",wfo.name,\"to\",wfo.status\n+                session.commit()\n+\n+    fDB.summary()\n+    ## custodial requests","path":"Unified/checkor.py","position":252,"original_position":252,"commit_id":"19c0ec675fb0e60d7eb12b38a853c5e02b3b4b9b","original_commit_id":"19c0ec675fb0e60d7eb12b38a853c5e02b3b4b9b","user":{"login":"vlimant","id":4989875,"avatar_url":"https://avatars.githubusercontent.com/u/4989875?v=3","gravatar_id":"","url":"https://api.github.com/users/vlimant","html_url":"https://github.com/vlimant","followers_url":"https://api.github.com/users/vlimant/followers","following_url":"https://api.github.com/users/vlimant/following{/other_user}","gists_url":"https://api.github.com/users/vlimant/gists{/gist_id}","starred_url":"https://api.github.com/users/vlimant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vlimant/subscriptions","organizations_url":"https://api.github.com/users/vlimant/orgs","repos_url":"https://api.github.com/users/vlimant/repos","events_url":"https://api.github.com/users/vlimant/events{/privacy}","received_events_url":"https://api.github.com/users/vlimant/received_events","type":"User","site_admin":false},"body":"@julianbadillo here is the custodial request for those we could not find a sunscription","created_at":"2015-04-27T09:39:28Z","updated_at":"2015-04-27T09:39:28Z","html_url":"https://github.com/CMSCompOps/WmAgentScripts/pull/101#discussion_r29132820","pull_request_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/101","_links":{"self":{"href":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/comments/29132820"},"html":{"href":"https://github.com/CMSCompOps/WmAgentScripts/pull/101#discussion_r29132820"},"pull_request":{"href":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/101"}}},"pull_request":{"url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/101","id":34044989,"html_url":"https://github.com/CMSCompOps/WmAgentScripts/pull/101","diff_url":"https://github.com/CMSCompOps/WmAgentScripts/pull/101.diff","patch_url":"https://github.com/CMSCompOps/WmAgentScripts/pull/101.patch","issue_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/issues/101","number":101,"state":"open","locked":false,"title":"More development and close out automation","user":{"login":"vlimant","id":4989875,"avatar_url":"https://avatars.githubusercontent.com/u/4989875?v=3","gravatar_id":"","url":"https://api.github.com/users/vlimant","html_url":"https://github.com/vlimant","followers_url":"https://api.github.com/users/vlimant/followers","following_url":"https://api.github.com/users/vlimant/following{/other_user}","gists_url":"https://api.github.com/users/vlimant/gists{/gist_id}","starred_url":"https://api.github.com/users/vlimant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vlimant/subscriptions","organizations_url":"https://api.github.com/users/vlimant/orgs","repos_url":"https://api.github.com/users/vlimant/repos","events_url":"https://api.github.com/users/vlimant/events{/privacy}","received_events_url":"https://api.github.com/users/vlimant/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-04-24T12:45:59Z","updated_at":"2015-04-27T09:39:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2432a0bd41833a878aa2e32f6194a43537418396","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/101/commits","review_comments_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/101/comments","review_comment_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/comments{/number}","comments_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/issues/101/comments","statuses_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/statuses/19c0ec675fb0e60d7eb12b38a853c5e02b3b4b9b","head":{"label":"vlimant:master","ref":"master","sha":"19c0ec675fb0e60d7eb12b38a853c5e02b3b4b9b","user":{"login":"vlimant","id":4989875,"avatar_url":"https://avatars.githubusercontent.com/u/4989875?v=3","gravatar_id":"","url":"https://api.github.com/users/vlimant","html_url":"https://github.com/vlimant","followers_url":"https://api.github.com/users/vlimant/followers","following_url":"https://api.github.com/users/vlimant/following{/other_user}","gists_url":"https://api.github.com/users/vlimant/gists{/gist_id}","starred_url":"https://api.github.com/users/vlimant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vlimant/subscriptions","organizations_url":"https://api.github.com/users/vlimant/orgs","repos_url":"https://api.github.com/users/vlimant/repos","events_url":"https://api.github.com/users/vlimant/events{/privacy}","received_events_url":"https://api.github.com/users/vlimant/received_events","type":"User","site_admin":false},"repo":{"id":32926361,"name":"WmAgentScripts","full_name":"vlimant/WmAgentScripts","owner":{"login":"vlimant","id":4989875,"avatar_url":"https://avatars.githubusercontent.com/u/4989875?v=3","gravatar_id":"","url":"https://api.github.com/users/vlimant","html_url":"https://github.com/vlimant","followers_url":"https://api.github.com/users/vlimant/followers","following_url":"https://api.github.com/users/vlimant/following{/other_user}","gists_url":"https://api.github.com/users/vlimant/gists{/gist_id}","starred_url":"https://api.github.com/users/vlimant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vlimant/subscriptions","organizations_url":"https://api.github.com/users/vlimant/orgs","repos_url":"https://api.github.com/users/vlimant/repos","events_url":"https://api.github.com/users/vlimant/events{/privacy}","received_events_url":"https://api.github.com/users/vlimant/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/vlimant/WmAgentScripts","description":"CMS Workflow Team Scripts","fork":true,"url":"https://api.github.com/repos/vlimant/WmAgentScripts","forks_url":"https://api.github.com/repos/vlimant/WmAgentScripts/forks","keys_url":"https://api.github.com/repos/vlimant/WmAgentScripts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/vlimant/WmAgentScripts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/vlimant/WmAgentScripts/teams","hooks_url":"https://api.github.com/repos/vlimant/WmAgentScripts/hooks","issue_events_url":"https://api.github.com/repos/vlimant/WmAgentScripts/issues/events{/number}","events_url":"https://api.github.com/repos/vlimant/WmAgentScripts/events","assignees_url":"https://api.github.com/repos/vlimant/WmAgentScripts/assignees{/user}","branches_url":"https://api.github.com/repos/vlimant/WmAgentScripts/branches{/branch}","tags_url":"https://api.github.com/repos/vlimant/WmAgentScripts/tags","blobs_url":"https://api.github.com/repos/vlimant/WmAgentScripts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/vlimant/WmAgentScripts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/vlimant/WmAgentScripts/git/refs{/sha}","trees_url":"https://api.github.com/repos/vlimant/WmAgentScripts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/vlimant/WmAgentScripts/statuses/{sha}","languages_url":"https://api.github.com/repos/vlimant/WmAgentScripts/languages","stargazers_url":"https://api.github.com/repos/vlimant/WmAgentScripts/stargazers","contributors_url":"https://api.github.com/repos/vlimant/WmAgentScripts/contributors","subscribers_url":"https://api.github.com/repos/vlimant/WmAgentScripts/subscribers","subscription_url":"https://api.github.com/repos/vlimant/WmAgentScripts/subscription","commits_url":"https://api.github.com/repos/vlimant/WmAgentScripts/commits{/sha}","git_commits_url":"https://api.github.com/repos/vlimant/WmAgentScripts/git/commits{/sha}","comments_url":"https://api.github.com/repos/vlimant/WmAgentScripts/comments{/number}","issue_comment_url":"https://api.github.com/repos/vlimant/WmAgentScripts/issues/comments{/number}","contents_url":"https://api.github.com/repos/vlimant/WmAgentScripts/contents/{+path}","compare_url":"https://api.github.com/repos/vlimant/WmAgentScripts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/vlimant/WmAgentScripts/merges","archive_url":"https://api.github.com/repos/vlimant/WmAgentScripts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/vlimant/WmAgentScripts/downloads","issues_url":"https://api.github.com/repos/vlimant/WmAgentScripts/issues{/number}","pulls_url":"https://api.github.com/repos/vlimant/WmAgentScripts/pulls{/number}","milestones_url":"https://api.github.com/repos/vlimant/WmAgentScripts/milestones{/number}","notifications_url":"https://api.github.com/repos/vlimant/WmAgentScripts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/vlimant/WmAgentScripts/labels{/name}","releases_url":"https://api.github.com/repos/vlimant/WmAgentScripts/releases{/id}","created_at":"2015-03-26T12:33:54Z","updated_at":"2015-04-24T15:48:08Z","pushed_at":"2015-04-24T15:48:08Z","git_url":"git://github.com/vlimant/WmAgentScripts.git","ssh_url":"git@github.com:vlimant/WmAgentScripts.git","clone_url":"https://github.com/vlimant/WmAgentScripts.git","svn_url":"https://github.com/vlimant/WmAgentScripts","homepage":null,"size":1527,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"CMSCompOps:master","ref":"master","sha":"06384d31da6e7a58fb8946dcb0e4797f193b3fbc","user":{"login":"CMSCompOps","id":5306749,"avatar_url":"https://avatars.githubusercontent.com/u/5306749?v=3","gravatar_id":"","url":"https://api.github.com/users/CMSCompOps","html_url":"https://github.com/CMSCompOps","followers_url":"https://api.github.com/users/CMSCompOps/followers","following_url":"https://api.github.com/users/CMSCompOps/following{/other_user}","gists_url":"https://api.github.com/users/CMSCompOps/gists{/gist_id}","starred_url":"https://api.github.com/users/CMSCompOps/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CMSCompOps/subscriptions","organizations_url":"https://api.github.com/users/CMSCompOps/orgs","repos_url":"https://api.github.com/users/CMSCompOps/repos","events_url":"https://api.github.com/users/CMSCompOps/events{/privacy}","received_events_url":"https://api.github.com/users/CMSCompOps/received_events","type":"Organization","site_admin":false},"repo":{"id":12407061,"name":"WmAgentScripts","full_name":"CMSCompOps/WmAgentScripts","owner":{"login":"CMSCompOps","id":5306749,"avatar_url":"https://avatars.githubusercontent.com/u/5306749?v=3","gravatar_id":"","url":"https://api.github.com/users/CMSCompOps","html_url":"https://github.com/CMSCompOps","followers_url":"https://api.github.com/users/CMSCompOps/followers","following_url":"https://api.github.com/users/CMSCompOps/following{/other_user}","gists_url":"https://api.github.com/users/CMSCompOps/gists{/gist_id}","starred_url":"https://api.github.com/users/CMSCompOps/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CMSCompOps/subscriptions","organizations_url":"https://api.github.com/users/CMSCompOps/orgs","repos_url":"https://api.github.com/users/CMSCompOps/repos","events_url":"https://api.github.com/users/CMSCompOps/events{/privacy}","received_events_url":"https://api.github.com/users/CMSCompOps/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CMSCompOps/WmAgentScripts","description":"CMS Workflow Team Scripts","fork":false,"url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts","forks_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/forks","keys_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/teams","hooks_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/hooks","issue_events_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/issues/events{/number}","events_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/events","assignees_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/assignees{/user}","branches_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/branches{/branch}","tags_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/tags","blobs_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/git/refs{/sha}","trees_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/statuses/{sha}","languages_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/languages","stargazers_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/stargazers","contributors_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/contributors","subscribers_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/subscribers","subscription_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/subscription","commits_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/commits{/sha}","git_commits_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/git/commits{/sha}","comments_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/comments{/number}","issue_comment_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/issues/comments{/number}","contents_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/contents/{+path}","compare_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/merges","archive_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/downloads","issues_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/issues{/number}","pulls_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls{/number}","milestones_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/milestones{/number}","notifications_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/labels{/name}","releases_url":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/releases{/id}","created_at":"2013-08-27T13:39:59Z","updated_at":"2015-04-22T10:40:10Z","pushed_at":"2015-04-24T15:48:08Z","git_url":"git://github.com/CMSCompOps/WmAgentScripts.git","ssh_url":"git@github.com:CMSCompOps/WmAgentScripts.git","clone_url":"https://github.com/CMSCompOps/WmAgentScripts.git","svn_url":"https://github.com/CMSCompOps/WmAgentScripts","homepage":null,"size":2755,"stargazers_count":2,"watchers_count":2,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":14,"mirror_url":null,"open_issues_count":5,"forks":14,"open_issues":5,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/101"},"html":{"href":"https://github.com/CMSCompOps/WmAgentScripts/pull/101"},"issue":{"href":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/issues/101"},"comments":{"href":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/issues/101/comments"},"review_comments":{"href":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/101/comments"},"review_comment":{"href":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/pulls/101/commits"},"statuses":{"href":"https://api.github.com/repos/CMSCompOps/WmAgentScripts/statuses/19c0ec675fb0e60d7eb12b38a853c5e02b3b4b9b"}}}}