{"action":"created","comment":{"url":"https://api.github.com/repos/ocf/ocfweb/pulls/comments/227662622","pull_request_review_id":167754003,"id":227662622,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNzY2MjYyMg==","diff_hunk":"@@ -57,81 +56,90 @@ def has_munin(self):\n         return self.type in ('hypervisor', 'vm', 'server', 'desktop')\n \n \n+def is_hidden(host):\n+    return host['cn'][0].startswith('hozer-') or host['cn'][0].startswith('dev-')\n+\n+\n+TEMP_GET_CHILDREN = \"facts { name = 'vms' }\"\n+TEMP_IS_VIRT_FALSE = \"facts { name = 'is_virtual' and value = false }\"\n+\n+\n+def query_puppet(query):\n+    \"\"\"Placeholder function for puppet queries\n+    Accepts a PQL query, returns a dictionary with hostname as keys and\n+    'value' in the query output as values\n+    \"\"\"\n+    if query == TEMP_IS_VIRT_FALSE:\n+        output = '[ { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"firewhirl.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"outbreak.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"avalanche.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"abizer_aux\", \"certname\": \"dataloss.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"bigbang.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"blackout.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"wildfire.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"famine.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"meteorstorm.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"sinkhole.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"abizer\", \"certname\": \"hal.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"invasion.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"abizer_aux\", \"certname\": \"jaws.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"destruction.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"bzh\", \"certname\": \"corruption.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"tornado.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"cyanide.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"plague.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"gleeb\", \"certname\": \"drought.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"blizzard.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"acid.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"venom.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"hurricane.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"heatwave.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"chaos.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"volcano.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"blight.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"riptide.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"hailstorm.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"pandemic.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"asteroid.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"headcrash.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"arsenic.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"eruption.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"cooperc\", \"certname\": \"madcow.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"cyclone.ocf.berkeley.edu\", \"value\": false }, { \"name\": \"is_virtual\", \"environment\": \"production\", \"certname\": \"surge.ocf.berkeley.edu\", \"value\": false } ]'  # noqa: E501\n+        output = eval(output.replace('false', 'False'))\n+    if query == TEMP_GET_CHILDREN:\n+        output = eval('[ { \"name\": \"vms\", \"environment\": \"abizer_aux\", \"value\": [], \"certname\": \"jaws.ocf.berkeley.edu\" }, { \"name\": \"vms\", \"environment\": \"production\", \"value\": [ \"fallingrocks\", \"cataclysm\", \"dev-flood\", \"dev-maelstrom\", \"dev-pestilence\", \"dev-tsunami\", \"dev-werewolves\", \"dev-whiteout\", \"doom\", \"fraud\", \"hozer-62\", \"limniceruption\", \"lowgpa\", \"miasma\" ], \"certname\": \"hal.ocf.berkeley.edu\" }, { \"name\": \"vms\", \"environment\": \"production\", \"value\": [], \"certname\": \"mudslide.ocf.berkeley.edu\" }, { \"name\": \"vms\", \"environment\": \"production\", \"value\": [ \"pox\", \"alamo\", \"apocalypse\", \"blackrain\", \"fallout\", \"falsevacuum\", \"fireball\", \"fukushima\", \"gnats\", \"leprosy\", \"malaria\", \"nuke\", \"oilspill\", \"panic\", \"pileup\", \"riot\", \"sarin\", \"shipwreck\", \"virus\", \"vortex\", \"war\", \"zerg\", \"walpurgisnacht\", \"mudslide\", \"pompeii\", \"locusts\", \"fire\", \"rapture\", \"smallpox\", \"aliens\", \"cloudburst\", \"coldwave\", \"coma\", \"dev-firestorm\", \"emp\", \"meltdown\", \"meteorite\", \"old-vampires\", \"quasar\", \"ragnarok\", \"revolution\", \"sauron\", \"skynet\", \"tempest\" ], \"certname\": \"pandemic.ocf.berkeley.edu\" }, { \"name\": \"vms\", \"environment\": \"production\", \"value\": [ \"nyx\", \"dementors\", \"democracy\", \"whiteout\", \"reaper\", \"segfault\", \"monsoon\", \"fraud\", \"gridlock\", \"lethe\", \"anthrax\", \"supernova\", \"firestorm\", \"pestilence\", \"flood\", \"maelstrom\", \"thunder\", \"death\", \"tsunami\", \"lightning\", \"vampires\", \"werewolves\", \"biohazard\", \"cataclysm\", \"dev-dementors\", \"dev-flood\", \"dev-whiteout\", \"doom\", \"hozer-69\", \"hozer-70\", \"hozer-71\", \"hozer-73\", \"hozer-74\", \"limniceruption\", \"matrix\", \"miasma\", \"zombies\" ], \"certname\": \"riptide.ocf.berkeley.edu\" }, { \"name\": \"vms\", \"environment\": \"production\", \"value\": [], \"certname\": \"gnats.ocf.berkeley.edu\" }, { \"name\": \"vms\", \"environment\": \"production\", \"value\": [], \"certname\": \"smallpox.ocf.berkeley.edu\" } ]')  # noqa: E501\n+    result = {}\n+    for d in output:\n+        hostname = d['certname'].split('.')[0]\n+        result[hostname] = d['value']\n+    return result\n+\n+\n @periodic(120)\n def get_hosts():\n-    return [\n-        Host.from_ldap(\n-            hostname='hal',\n-            type='hypervisor',\n-            children=[\n-                Host.from_ldap(hostname)\n-                for hostname in (\n-                    'fallingrocks',\n-                    'monsoon',\n-                )\n-            ],\n-        ),\n-\n-        Host.from_ldap(\n-            hostname='jaws',\n-            type='hypervisor',\n-            children=[\n-                Host.from_ldap(hostname)\n-                for hostname in (\n-                    'anthrax',\n-                    'biohazard',\n-                    'death',\n-                    'dementors',\n-                    'democracy',\n-                    'firestorm',\n-                    'flood',\n-                    'lightning',\n-                    'maelstrom',\n-                    'pestilence',\n-                    'reaper',\n-                    'supernova',\n-                    'thunder',\n-                    'tsunami',\n-                    'werewolves',\n-                    'whirlwind',\n-                    'whiteout',\n-                    'zombies',\n-                )\n-            ],\n-        ),\n-\n-        Host.from_ldap(\n-            hostname='pandemic',\n-            type='hypervisor',\n-            children=[\n-                Host.from_ldap(hostname)\n-                for hostname in (\n-                    'pileup',\n-                )\n-            ],\n-        ),\n-\n-        Host.from_ldap(\n-            hostname='riptide',\n-            type='hypervisor',\n-        ),\n-\n-        Host.from_ldap(\n-            hostname='corruption',\n-            type='server',\n-        ),\n-\n-        Host('blackhole', 'network', 'Managed Cisco Catalyst 2960S-48TS-L Switch.', []),\n-\n-        Host('logjam', 'printer', '', []),\n-        Host('pagefault', 'printer', '', []),\n-        Host('papercut', 'printer', '', []),\n-        Host.from_ldap('overheat', type='raspi'),\n-        Host.from_ldap('tornado', type='nuc'),\n-\n-        *(Host.from_ldap(desktop, type='desktop')\n-          for desktop in sorted(list_desktops())),\n-    ]\n+    def create_hosts(lst):\n+        \"\"\"Accepts a list of raw ldap output, returns a dictionary of host\n+        objects indexed by hostname\n+        \"\"\"\n+        hosts = {}\n+        for h in lst:\n+            if not is_hidden(h):\n+                description = h.get('description', [''])[0]\n+                hostname = h['cn'][0]\n+                hosts[hostname] = (Host(hostname, h['type'], description, ()))\n+        return hosts\n+\n+    servers = create_hosts(hosts_by_filter('(type=server)'))\n+    desktops = create_hosts(hosts_by_filter('(type=desktop)'))\n+    misc = create_hosts(hosts_by_filter('(type=printer)'))\n+    hypervisors = {}\n+\n+    physical_hosts = query_puppet(TEMP_IS_VIRT_FALSE)\n+    all_children = query_puppet(TEMP_GET_CHILDREN)\n+\n+    # Add children to hypervisors\n+    for h in list(servers.values()):\n+        if h.hostname in physical_hosts:\n+            # Populate a list of children\n+            children = []\n+            for child_hostname in all_children.get(h.hostname, []):\n+                child = servers.get(child_hostname, False)\n+                if child:\n+                    del servers[child.hostname]\n+                    children.append(Host(child.hostname, 'vm', child.description, ()))\n+            # Associate host with its children and move it to the hypervisors dictionary\n+            del servers[h.hostname]\n+            hypervisors[h.hostname] = Host(\n+                h.hostname,\n+                'hypervisor',\n+                h.description,\n+                children,\n+            )\n+\n+    # Handle special cases\n+    def change_host_type(hostname, host_type, origin_type_dict, target_type_dict):\n+        \"\"\"Pop Host with hostname from servers, change its type, and add to misc\n+        \"\"\"\n+        del origin_type_dict[hostname]\n+        target_type_dict[hostname] = Host.from_ldap(hostname, type=host_type)\n+\n+    change_host_type('overheat', 'raspi', servers, misc)\n+    change_host_type('tornado', 'nuc', hypervisors, misc)\n+    change_host_type('ransomware', 'hypervisor', servers, hypervisors)\n+    change_host_type('dataloss', 'server', hypervisors, servers)\n+    change_host_type('corruption', 'server', hypervisors, servers)\n+    misc['blackhole'] = Host(\n+        'blackhole', 'network',\n+        'Arista 7050SX Switch.', [],","path":"ocfweb/docs/views/servers.py","position":165,"original_position":165,"commit_id":"5be4acd48428aaaacafa3e3c3a495c49ddf43685","original_commit_id":"5be4acd48428aaaacafa3e3c3a495c49ddf43685","user":{"login":"kpengboy","id":4122890,"node_id":"MDQ6VXNlcjQxMjI4OTA=","avatar_url":"https://avatars3.githubusercontent.com/u/4122890?v=4","gravatar_id":"","url":"https://api.github.com/users/kpengboy","html_url":"https://github.com/kpengboy","followers_url":"https://api.github.com/users/kpengboy/followers","following_url":"https://api.github.com/users/kpengboy/following{/other_user}","gists_url":"https://api.github.com/users/kpengboy/gists{/gist_id}","starred_url":"https://api.github.com/users/kpengboy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kpengboy/subscriptions","organizations_url":"https://api.github.com/users/kpengboy/orgs","repos_url":"https://api.github.com/users/kpengboy/repos","events_url":"https://api.github.com/users/kpengboy/events{/privacy}","received_events_url":"https://api.github.com/users/kpengboy/received_events","type":"User","site_admin":false},"body":"Actually never mind","created_at":"2018-10-24T06:59:05Z","updated_at":"2018-10-24T06:59:05Z","html_url":"https://github.com/ocf/ocfweb/pull/406#discussion_r227662622","pull_request_url":"https://api.github.com/repos/ocf/ocfweb/pulls/406","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/ocf/ocfweb/pulls/comments/227662622"},"html":{"href":"https://github.com/ocf/ocfweb/pull/406#discussion_r227662622"},"pull_request":{"href":"https://api.github.com/repos/ocf/ocfweb/pulls/406"}},"in_reply_to_id":227660084},"pull_request":{"url":"https://api.github.com/repos/ocf/ocfweb/pulls/406","id":224174508,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI0MTc0NTA4","html_url":"https://github.com/ocf/ocfweb/pull/406","diff_url":"https://github.com/ocf/ocfweb/pull/406.diff","patch_url":"https://github.com/ocf/ocfweb/pull/406.patch","issue_url":"https://api.github.com/repos/ocf/ocfweb/issues/406","number":406,"state":"open","locked":false,"title":"Auto-update ocf.io/servers","user":{"login":"ziyaointl","id":18119047,"node_id":"MDQ6VXNlcjE4MTE5MDQ3","avatar_url":"https://avatars2.githubusercontent.com/u/18119047?v=4","gravatar_id":"","url":"https://api.github.com/users/ziyaointl","html_url":"https://github.com/ziyaointl","followers_url":"https://api.github.com/users/ziyaointl/followers","following_url":"https://api.github.com/users/ziyaointl/following{/other_user}","gists_url":"https://api.github.com/users/ziyaointl/gists{/gist_id}","starred_url":"https://api.github.com/users/ziyaointl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ziyaointl/subscriptions","organizations_url":"https://api.github.com/users/ziyaointl/orgs","repos_url":"https://api.github.com/users/ziyaointl/repos","events_url":"https://api.github.com/users/ziyaointl/events{/privacy}","received_events_url":"https://api.github.com/users/ziyaointl/received_events","type":"User","site_admin":false},"body":"Updated servers.py to dynamically fetch servers from LDAP.\r\nHypervisor/vm relationships are still hard coded, but should be easy to auto-update once we figure out how to run puppet queries in python.\r\n\r\nDiscourse link: https://leprosy.ocf.berkeley.edu/forum/t/auto-update-ocf-io-servers/162","created_at":"2018-10-19T05:26:39Z","updated_at":"2018-10-24T06:59:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2dc801a3042c0a95a65b60fb7ea0873f6928ca41","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/ocf/ocfweb/pulls/406/commits","review_comments_url":"https://api.github.com/repos/ocf/ocfweb/pulls/406/comments","review_comment_url":"https://api.github.com/repos/ocf/ocfweb/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ocf/ocfweb/issues/406/comments","statuses_url":"https://api.github.com/repos/ocf/ocfweb/statuses/5be4acd48428aaaacafa3e3c3a495c49ddf43685","head":{"label":"ziyaointl:master","ref":"master","sha":"5be4acd48428aaaacafa3e3c3a495c49ddf43685","user":{"login":"ziyaointl","id":18119047,"node_id":"MDQ6VXNlcjE4MTE5MDQ3","avatar_url":"https://avatars2.githubusercontent.com/u/18119047?v=4","gravatar_id":"","url":"https://api.github.com/users/ziyaointl","html_url":"https://github.com/ziyaointl","followers_url":"https://api.github.com/users/ziyaointl/followers","following_url":"https://api.github.com/users/ziyaointl/following{/other_user}","gists_url":"https://api.github.com/users/ziyaointl/gists{/gist_id}","starred_url":"https://api.github.com/users/ziyaointl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ziyaointl/subscriptions","organizations_url":"https://api.github.com/users/ziyaointl/orgs","repos_url":"https://api.github.com/users/ziyaointl/repos","events_url":"https://api.github.com/users/ziyaointl/events{/privacy}","received_events_url":"https://api.github.com/users/ziyaointl/received_events","type":"User","site_admin":false},"repo":{"id":153729050,"node_id":"MDEwOlJlcG9zaXRvcnkxNTM3MjkwNTA=","name":"ocfweb","full_name":"ziyaointl/ocfweb","private":false,"owner":{"login":"ziyaointl","id":18119047,"node_id":"MDQ6VXNlcjE4MTE5MDQ3","avatar_url":"https://avatars2.githubusercontent.com/u/18119047?v=4","gravatar_id":"","url":"https://api.github.com/users/ziyaointl","html_url":"https://github.com/ziyaointl","followers_url":"https://api.github.com/users/ziyaointl/followers","following_url":"https://api.github.com/users/ziyaointl/following{/other_user}","gists_url":"https://api.github.com/users/ziyaointl/gists{/gist_id}","starred_url":"https://api.github.com/users/ziyaointl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ziyaointl/subscriptions","organizations_url":"https://api.github.com/users/ziyaointl/orgs","repos_url":"https://api.github.com/users/ziyaointl/repos","events_url":"https://api.github.com/users/ziyaointl/events{/privacy}","received_events_url":"https://api.github.com/users/ziyaointl/received_events","type":"User","site_admin":false},"html_url":"https://github.com/ziyaointl/ocfweb","description":"The main ocf website","fork":true,"url":"https://api.github.com/repos/ziyaointl/ocfweb","forks_url":"https://api.github.com/repos/ziyaointl/ocfweb/forks","keys_url":"https://api.github.com/repos/ziyaointl/ocfweb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ziyaointl/ocfweb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ziyaointl/ocfweb/teams","hooks_url":"https://api.github.com/repos/ziyaointl/ocfweb/hooks","issue_events_url":"https://api.github.com/repos/ziyaointl/ocfweb/issues/events{/number}","events_url":"https://api.github.com/repos/ziyaointl/ocfweb/events","assignees_url":"https://api.github.com/repos/ziyaointl/ocfweb/assignees{/user}","branches_url":"https://api.github.com/repos/ziyaointl/ocfweb/branches{/branch}","tags_url":"https://api.github.com/repos/ziyaointl/ocfweb/tags","blobs_url":"https://api.github.com/repos/ziyaointl/ocfweb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ziyaointl/ocfweb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ziyaointl/ocfweb/git/refs{/sha}","trees_url":"https://api.github.com/repos/ziyaointl/ocfweb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ziyaointl/ocfweb/statuses/{sha}","languages_url":"https://api.github.com/repos/ziyaointl/ocfweb/languages","stargazers_url":"https://api.github.com/repos/ziyaointl/ocfweb/stargazers","contributors_url":"https://api.github.com/repos/ziyaointl/ocfweb/contributors","subscribers_url":"https://api.github.com/repos/ziyaointl/ocfweb/subscribers","subscription_url":"https://api.github.com/repos/ziyaointl/ocfweb/subscription","commits_url":"https://api.github.com/repos/ziyaointl/ocfweb/commits{/sha}","git_commits_url":"https://api.github.com/repos/ziyaointl/ocfweb/git/commits{/sha}","comments_url":"https://api.github.com/repos/ziyaointl/ocfweb/comments{/number}","issue_comment_url":"https://api.github.com/repos/ziyaointl/ocfweb/issues/comments{/number}","contents_url":"https://api.github.com/repos/ziyaointl/ocfweb/contents/{+path}","compare_url":"https://api.github.com/repos/ziyaointl/ocfweb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ziyaointl/ocfweb/merges","archive_url":"https://api.github.com/repos/ziyaointl/ocfweb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ziyaointl/ocfweb/downloads","issues_url":"https://api.github.com/repos/ziyaointl/ocfweb/issues{/number}","pulls_url":"https://api.github.com/repos/ziyaointl/ocfweb/pulls{/number}","milestones_url":"https://api.github.com/repos/ziyaointl/ocfweb/milestones{/number}","notifications_url":"https://api.github.com/repos/ziyaointl/ocfweb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ziyaointl/ocfweb/labels{/name}","releases_url":"https://api.github.com/repos/ziyaointl/ocfweb/releases{/id}","deployments_url":"https://api.github.com/repos/ziyaointl/ocfweb/deployments","created_at":"2018-10-19T05:03:28Z","updated_at":"2018-10-23T05:14:32Z","pushed_at":"2018-10-23T05:14:30Z","git_url":"git://github.com/ziyaointl/ocfweb.git","ssh_url":"git@github.com:ziyaointl/ocfweb.git","clone_url":"https://github.com/ziyaointl/ocfweb.git","svn_url":"https://github.com/ziyaointl/ocfweb","homepage":"https://www.ocf.berkeley.edu","size":3844,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ocf:master","ref":"master","sha":"aa12feca634f7f32f422890f1642fbe82580d1df","user":{"login":"ocf","id":1504667,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE1MDQ2Njc=","avatar_url":"https://avatars2.githubusercontent.com/u/1504667?v=4","gravatar_id":"","url":"https://api.github.com/users/ocf","html_url":"https://github.com/ocf","followers_url":"https://api.github.com/users/ocf/followers","following_url":"https://api.github.com/users/ocf/following{/other_user}","gists_url":"https://api.github.com/users/ocf/gists{/gist_id}","starred_url":"https://api.github.com/users/ocf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ocf/subscriptions","organizations_url":"https://api.github.com/users/ocf/orgs","repos_url":"https://api.github.com/users/ocf/repos","events_url":"https://api.github.com/users/ocf/events{/privacy}","received_events_url":"https://api.github.com/users/ocf/received_events","type":"Organization","site_admin":false},"repo":{"id":41186799,"node_id":"MDEwOlJlcG9zaXRvcnk0MTE4Njc5OQ==","name":"ocfweb","full_name":"ocf/ocfweb","private":false,"owner":{"login":"ocf","id":1504667,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE1MDQ2Njc=","avatar_url":"https://avatars2.githubusercontent.com/u/1504667?v=4","gravatar_id":"","url":"https://api.github.com/users/ocf","html_url":"https://github.com/ocf","followers_url":"https://api.github.com/users/ocf/followers","following_url":"https://api.github.com/users/ocf/following{/other_user}","gists_url":"https://api.github.com/users/ocf/gists{/gist_id}","starred_url":"https://api.github.com/users/ocf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ocf/subscriptions","organizations_url":"https://api.github.com/users/ocf/orgs","repos_url":"https://api.github.com/users/ocf/repos","events_url":"https://api.github.com/users/ocf/events{/privacy}","received_events_url":"https://api.github.com/users/ocf/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/ocf/ocfweb","description":"The main ocf website","fork":false,"url":"https://api.github.com/repos/ocf/ocfweb","forks_url":"https://api.github.com/repos/ocf/ocfweb/forks","keys_url":"https://api.github.com/repos/ocf/ocfweb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ocf/ocfweb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ocf/ocfweb/teams","hooks_url":"https://api.github.com/repos/ocf/ocfweb/hooks","issue_events_url":"https://api.github.com/repos/ocf/ocfweb/issues/events{/number}","events_url":"https://api.github.com/repos/ocf/ocfweb/events","assignees_url":"https://api.github.com/repos/ocf/ocfweb/assignees{/user}","branches_url":"https://api.github.com/repos/ocf/ocfweb/branches{/branch}","tags_url":"https://api.github.com/repos/ocf/ocfweb/tags","blobs_url":"https://api.github.com/repos/ocf/ocfweb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ocf/ocfweb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ocf/ocfweb/git/refs{/sha}","trees_url":"https://api.github.com/repos/ocf/ocfweb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ocf/ocfweb/statuses/{sha}","languages_url":"https://api.github.com/repos/ocf/ocfweb/languages","stargazers_url":"https://api.github.com/repos/ocf/ocfweb/stargazers","contributors_url":"https://api.github.com/repos/ocf/ocfweb/contributors","subscribers_url":"https://api.github.com/repos/ocf/ocfweb/subscribers","subscription_url":"https://api.github.com/repos/ocf/ocfweb/subscription","commits_url":"https://api.github.com/repos/ocf/ocfweb/commits{/sha}","git_commits_url":"https://api.github.com/repos/ocf/ocfweb/git/commits{/sha}","comments_url":"https://api.github.com/repos/ocf/ocfweb/comments{/number}","issue_comment_url":"https://api.github.com/repos/ocf/ocfweb/issues/comments{/number}","contents_url":"https://api.github.com/repos/ocf/ocfweb/contents/{+path}","compare_url":"https://api.github.com/repos/ocf/ocfweb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ocf/ocfweb/merges","archive_url":"https://api.github.com/repos/ocf/ocfweb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ocf/ocfweb/downloads","issues_url":"https://api.github.com/repos/ocf/ocfweb/issues{/number}","pulls_url":"https://api.github.com/repos/ocf/ocfweb/pulls{/number}","milestones_url":"https://api.github.com/repos/ocf/ocfweb/milestones{/number}","notifications_url":"https://api.github.com/repos/ocf/ocfweb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ocf/ocfweb/labels{/name}","releases_url":"https://api.github.com/repos/ocf/ocfweb/releases{/id}","deployments_url":"https://api.github.com/repos/ocf/ocfweb/deployments","created_at":"2015-08-22T02:43:14Z","updated_at":"2018-10-18T16:39:37Z","pushed_at":"2018-10-23T05:14:31Z","git_url":"git://github.com/ocf/ocfweb.git","ssh_url":"git@github.com:ocf/ocfweb.git","clone_url":"https://github.com/ocf/ocfweb.git","svn_url":"https://github.com/ocf/ocfweb","homepage":"https://www.ocf.berkeley.edu","size":3817,"stargazers_count":17,"watchers_count":17,"language":"HTML","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":54,"mirror_url":null,"archived":false,"open_issues_count":31,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":54,"open_issues":31,"watchers":17,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ocf/ocfweb/pulls/406"},"html":{"href":"https://github.com/ocf/ocfweb/pull/406"},"issue":{"href":"https://api.github.com/repos/ocf/ocfweb/issues/406"},"comments":{"href":"https://api.github.com/repos/ocf/ocfweb/issues/406/comments"},"review_comments":{"href":"https://api.github.com/repos/ocf/ocfweb/pulls/406/comments"},"review_comment":{"href":"https://api.github.com/repos/ocf/ocfweb/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ocf/ocfweb/pulls/406/commits"},"statuses":{"href":"https://api.github.com/repos/ocf/ocfweb/statuses/5be4acd48428aaaacafa3e3c3a495c49ddf43685"}},"author_association":"NONE"}}
{"actor":{"display_login":"kpengboy"}}