{"action":"created","comment":{"url":"https://api.github.com/repos/quipucords/camayoc/pulls/comments/169503534","pull_request_review_id":98040226,"id":169503534,"diff_hunk":"@@ -0,0 +1,240 @@\n+# coding=utf-8\n+\"\"\"Tests for  quipucords scans and reports.\n+\n+These tests are parametrized on the inventory listed in the config file.\n+\n+:caseautomation: automated\n+:casecomponent: api\n+:caseimportance: high\n+:caselevel: integration\n+:requirement: quipucords\n+:testtype: functional\n+:upstream: yes\n+\"\"\"\n+\n+import pytest\n+\n+from camayoc import api, utils\n+from camayoc.qcs_models import (\n+        Credential,\n+        Source,\n+        Scan\n+)\n+from camayoc.config import get_config\n+from camayoc.constants import (\n+    VCENTER_CLUSTER,\n+    VCENTER_DATA_CENTER,\n+    VCENTER_HOST,\n+)\n+from camayoc.exceptions import ConfigFileNotFoundError\n+from camayoc.tests.remote.utils import wait_until_live\n+from camayoc.tests.qcs.api.v1.utils import wait_until_state\n+\n+\n+SCAN_REPORTS = {}\n+\"\"\"Cache to associate the report ids with the scans named in config file.\"\"\"\n+\n+@pytest.fixture(scope='module')\n+def cleanup():\n+    \"\"\"Fixture that cleans up any created host credentials.\"\"\"\n+    trash = []\n+\n+    yield trash\n+\n+    for obj in trash:\n+        obj.delete()\n+\n+def create_cred(cred_info, cleanup):\n+    \"\"\"Given info about cred from config file, create it and return id. \"\"\"\n+    c = Credential(\n+        cred_type=cred_info['type'],\n+        username=cred_info['username'],\n+    )\n+    if cred_info.get('sshkeyfile'):\n+        c.ssh_keyfile = cred_info['sshkeyfile']\n+    else:\n+        c.password = cred_info['password']\n+    c.create()\n+    cleanup.append(c)\n+    return c._id\n+\n+def create_source(source_info,cred_name_to_id_dict, cleanup):\n+    \"\"\"Given info about source from config file, create it and return id.\"\"\"\n+    cred_ids = [value for key,value in cred_name_to_id_dict.items() if key in source_info['credentials']]\n+    host = source_info.get('ipv4') if source_info.get('ipv4') else source_info.get('hostname')\n+    src = Source(\n+        source_type=source_info.get('type', 'network'),\n+        hosts=[host],\n+        credential_ids=cred_ids,\n+        options=source_info.get('options')\n+    )\n+    src.create()\n+    cleanup.append(src)\n+    return src._id\n+\n+def run_scan(src_ids, scan_type='inspect'):\n+    \"\"\"Scan a machine and return its report id.\n+\n+    If the scan fails to generate a report, an AssertionError will be raised.\n+    \"\"\"\n+    scan = Scan(source_ids=src_ids, scan_type=scan_type)\n+    scan.create()\n+    wait_until_state(scan, timeout=600, state='completed')\n+    report_id = scan.results().json()\n+    return report_id\n+\n+@pytest.fixture(scope='module', autouse=True)\n+def run_all_scans(vcenter_client, cleanup):\n+    \"\"\"Run all configured scans caching the report id associated with each.\n+\n+    Run each scan defined in the ``qcs`` section of the configuration file.\n+\n+    Cache the report id of the scan, associating it with its scan.\n+\n+    The expected configuration in the Camayoc's configuration file is as\n+    follows::\n+\n+        qcs:\n+        # other needed qcs config data\n+        #\n+        # specific for remote scans:\n+            - remote_scans:\n+                -name: network-vcenter-sat-mix \n+                 sources:\n+                     - sample-none-rhel-5-vc\n+                     - sample-sat-6\n+                     - sample-vcenter\n+        inventory:\n+          - hostname: sample-none-rhel-5-vc\n+            ipv4: 10.10.10.1\n+            hypervisor: vcenter\n+            distribution:\n+                name: rhel\n+                version: '5.9'\n+            products: {}\n+            credentials:\n+                - root\n+          - hostname: sample-sat-6\n+            type: 'vcenter'\n+            options:\n+                ssl_cert_verify: false\n+                satellite_version: '6.2'\n+            credentials:\n+                - sat6_admin\n+          - hostname: sample-vcenter\n+            type: 'vcenter'\n+            credentials:\n+                - vcenter_admin\n+\n+        credentials:\n+            - name: root\n+              sshkeyfile: /path/to/.ssh/id_rsa\n+              username: root\n+              type: network\n+\n+            - name: sat6_admin\n+              password: foo\n+              username: admin\n+              type: satellite\n+\n+            - name: vcenter_admin\n+              password: foo\n+              username: admin\n+              type: vcenter\n+\n+    In the sample configuration file above, one machine will be turned on, \n+    and one scan will be run against the three sources each created with\n+    their own credential.\n+    \"\"\"\n+    config = get_config()\n+    creds = config['credentials']\n+    scans = config.get('qcs', {}).get('remote_scans')\n+    inventory = {machine['hostname']:machine for machine in config['inventory']}\n+    vcenter_inventory = {\n+        machine['hostname']: machine for machine in config['inventory']\n+        if machine.get('hypervisor') == 'vcenter'\n+    }\n+    other_inventory = {\n+        machine['hostname']: machine for machine in config['inventory'] \n+        if not machine.get('hypervisor', False)\n+        }\n+    if not creds or not inventory:\n+        raise ValueError(\n+            'Make sure to have credentials and inventory'\n+            ' items in the config file'\n+        )\n+    vcenter_hostnames = list(vcenter_inventory.keys())\n+    host_folder = vcenter_client.content.rootFolder \\\n+        .childEntity[VCENTER_DATA_CENTER].hostFolder\n+    host = host_folder.childEntity[VCENTER_CLUSTER].host[VCENTER_HOST]\n+    cred_ids = {}\n+    source_ids = {}\n+    for cred in creds:\n+        # create creds on server\n+        # create dict that associates the name of the cred to the cred id\n+        cred_ids[cred['name']] = create_cred(cred, cleanup)\n+    for hostname,source in inventory.items():\n+        # create sources on server, and keep track of source ids for each scan\n+        # name of cred to cred id on server\n+        source_ids[hostname] = create_source(source, cred_ids, cleanup)\n+        for scan in scans:\n+            scan['source_ids'] = scan.get('source_ids', [])\n+            for source in scan['sources']:\n+                if hostname == source:\n+                    scan['source_ids'].append(source_ids[hostname])\n+    for scan in scans:\n+        # update the sources dict of each item in the scans list with the source id\n+        # if hosts are marked as being hosted on vcenter, turn them on.\n+        # then wait until they are live\n+        # then run the scan, caching the report id associated with the scan\n+        # and finally turn the managed machines off.\n+        vcenter_vms = [\n+            vm for vm in host.vm\n+            if (vm.name in vcenter_hostnames) and (vm.name in scan['sources'])\n+        ]\n+        machines_to_wait = []\n+        for vm in vcenter_vms:\n+            if vm.runtime.powerState == 'poweredOff':\n+                vm.PowerOnVM_Task()\n+                machines_to_wait.append(inventory[vm.name])\n+        wait_until_live(machines_to_wait)\n+        # now all host should be live\n+        report_id = run_scan(scan['source_ids'])\n+        # cache the report id\n+        SCAN_REPORTS[scan['name']] = report_id \n+        # if no report generated, mark as failed somehow\n+        for vm in vcenter_vms:\n+            if vm.runtime.powerState == 'poweredOn':\n+                vm.PowerOffVM_Task()\n+\n+\n+def scan_info():\n+    \"\"\"Generate list of scan dict objects found in config file.\"\"\"\n+    try:\n+        cfg = get_config()\n+        scans = cfg.get('qcs',{}).get('remote_scans', [])\n+        return scans\n+    except (ConfigFileNotFoundError, KeyError):\n+        return []\n+\n+@pytest.mark.parametrize(\n+    'scan_info', scan_info())\n+def test_scan(scan_info):","path":"camayoc/tests/remote/quipucords/test_scan.py","position":222,"original_position":222,"commit_id":"7c5fe225d88683da73e4615632b3d1ab9a183086","original_commit_id":"7c5fe225d88683da73e4615632b3d1ab9a183086","user":{"login":"kdelee","id":29239279,"avatar_url":"https://avatars1.githubusercontent.com/u/29239279?v=4","gravatar_id":"","url":"https://api.github.com/users/kdelee","html_url":"https://github.com/kdelee","followers_url":"https://api.github.com/users/kdelee/followers","following_url":"https://api.github.com/users/kdelee/following{/other_user}","gists_url":"https://api.github.com/users/kdelee/gists{/gist_id}","starred_url":"https://api.github.com/users/kdelee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kdelee/subscriptions","organizations_url":"https://api.github.com/users/kdelee/orgs","repos_url":"https://api.github.com/users/kdelee/repos","events_url":"https://api.github.com/users/kdelee/events{/privacy}","received_events_url":"https://api.github.com/users/kdelee/received_events","type":"User","site_admin":false},"body":"need to make this test generate a more informative test id","created_at":"2018-02-21T00:24:50Z","updated_at":"2018-02-21T00:24:50Z","html_url":"https://github.com/quipucords/camayoc/pull/154#discussion_r169503534","pull_request_url":"https://api.github.com/repos/quipucords/camayoc/pulls/154","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/quipucords/camayoc/pulls/comments/169503534"},"html":{"href":"https://github.com/quipucords/camayoc/pull/154#discussion_r169503534"},"pull_request":{"href":"https://api.github.com/repos/quipucords/camayoc/pulls/154"}}},"pull_request":{"url":"https://api.github.com/repos/quipucords/camayoc/pulls/154","id":170346163,"html_url":"https://github.com/quipucords/camayoc/pull/154","diff_url":"https://github.com/quipucords/camayoc/pull/154.diff","patch_url":"https://github.com/quipucords/camayoc/pull/154.patch","issue_url":"https://api.github.com/repos/quipucords/camayoc/issues/154","number":154,"state":"open","locked":false,"title":"[WIP] Scan remote systems Issues/148","user":{"login":"kdelee","id":29239279,"avatar_url":"https://avatars1.githubusercontent.com/u/29239279?v=4","gravatar_id":"","url":"https://api.github.com/users/kdelee","html_url":"https://github.com/kdelee","followers_url":"https://api.github.com/users/kdelee/followers","following_url":"https://api.github.com/users/kdelee/following{/other_user}","gists_url":"https://api.github.com/users/kdelee/gists{/gist_id}","starred_url":"https://api.github.com/users/kdelee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kdelee/subscriptions","organizations_url":"https://api.github.com/users/kdelee/orgs","repos_url":"https://api.github.com/users/kdelee/repos","events_url":"https://api.github.com/users/kdelee/events{/privacy}","received_events_url":"https://api.github.com/users/kdelee/received_events","type":"User","site_admin":false},"body":"Push vcenter client fixture up a level so it can be shared across rho/quipucords remote scans.\r\n\r\nThis would entail another :disappointed: update to the config file -- putting vcenter and satellite sources we want to scan down in the inventory, and associating creds directly with the items in the inventory.\r\n\r\nReally, it only adds info to the config, so doesn't seem to be breaking anything yet. I've run the rho remote scan test and seems to be working, just needed minor tweak to get('hypervisor') instead of directly accessing it and the extra `credentials` key does not seem to matter. \r\n\r\nI've gotten my \"minimum viable\" scan to run with the following config:\r\n\r\n```\r\n---\r\ncredentials:\r\n    - name: root\r\n      type: 'network'\r\n      sshkeyfile: /sshkeys/id_sonar_jenkins_rsa\r\n      username: root\r\n    - name: 'vcenter'\r\n      type: 'vcenter'\r\n      password: 'foo'\r\n      username: 'bar'\r\n      rho: false\r\n    - name: 'sat6'\r\n      type: 'satellite'\r\n      password: 'foo'\r\n      username: 'bar'\r\n      rho: false\r\nqcs:\r\n    hostname: '127.0.0.1'\r\n    https: true\r\n    port: 443\r\n    ssl-verify: false\r\n    username: 'admin'\r\n    password: 'pass'\r\n    sources:\r\n          # this section is used by other qcs that don't rely being able\r\n          # to turn on/off machines\r\n          # could try and get rid of it\r\n          # or it could stay. it is not that big\r\n          # but it does contain some duplicate content\r\n          # and the remote scan test does not use it at all\r\n    remote_scans:\r\n        - name: mvp\r\n          sources:\r\n              - 'sonar-jbossamq-rhel-7-vc'\r\n              - 'vcenter.example.com'\r\n              - 'sat.six.example.com'\r\n\r\nvcenter:\r\n    hostname: vcenter.example.com\r\n    password: \"foo\"\r\n    username: bar\r\n\r\ninventory:\r\n    - hostname: 'vcenter.example.com'\r\n      credentials:\r\n          - 'vcenter'\r\n      type: 'vcenter'\r\n      options:\r\n          ssl_cert_verify: false\r\n    - hostname: 'sat.six.example.com'\r\n      credentials:\r\n          - 'sat6'\r\n      name: 'sat6'\r\n      type: 'satellite'\r\n      options:\r\n          satellite_version: '6.2'\r\n          ssl_cert_verify: false\r\n    - hostname: sonar-jbossamq-rhel-7-vc\r\n      ipv4: 10.10.181.154\r\n      hypervisor: vcenter\r\n      distribution:\r\n          name: rhel\r\n          version: '7.4'\r\n      products:\r\n          jboss-amq:\r\n              install-process: zip\r\n              version: '7.0.2'\r\n          openjdk:\r\n              version: '1.8'\r\n      credentials:\r\n          - root\r\n```\r\n\r\nSo it creates a source for each individual host and then runs the scan on all of them at the same time.\r\nI don't have any mechanism for creating a multi host network source item at the moment.\r\n\r\nI need to make this pretty/make the linter happy/work on doc strings but I wanted to get your feedback on the general idea so I could finish it up on Thursday.\r\n\r\nAlso want to assert on something in the report.\r\n\r\nThanks!\r\n","created_at":"2018-02-21T00:20:55Z","updated_at":"2018-02-21T00:24:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"889078f43340696a97bc422e0cdd2aef6567ee2d","assignee":null,"assignees":[],"requested_reviewers":[{"login":"elyezer","id":48132,"avatar_url":"https://avatars1.githubusercontent.com/u/48132?v=4","gravatar_id":"","url":"https://api.github.com/users/elyezer","html_url":"https://github.com/elyezer","followers_url":"https://api.github.com/users/elyezer/followers","following_url":"https://api.github.com/users/elyezer/following{/other_user}","gists_url":"https://api.github.com/users/elyezer/gists{/gist_id}","starred_url":"https://api.github.com/users/elyezer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elyezer/subscriptions","organizations_url":"https://api.github.com/users/elyezer/orgs","repos_url":"https://api.github.com/users/elyezer/repos","events_url":"https://api.github.com/users/elyezer/events{/privacy}","received_events_url":"https://api.github.com/users/elyezer/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/quipucords/camayoc/pulls/154/commits","review_comments_url":"https://api.github.com/repos/quipucords/camayoc/pulls/154/comments","review_comment_url":"https://api.github.com/repos/quipucords/camayoc/pulls/comments{/number}","comments_url":"https://api.github.com/repos/quipucords/camayoc/issues/154/comments","statuses_url":"https://api.github.com/repos/quipucords/camayoc/statuses/7c5fe225d88683da73e4615632b3d1ab9a183086","head":{"label":"quipucords:issues/148","ref":"issues/148","sha":"7c5fe225d88683da73e4615632b3d1ab9a183086","user":{"login":"quipucords","id":29148065,"avatar_url":"https://avatars0.githubusercontent.com/u/29148065?v=4","gravatar_id":"","url":"https://api.github.com/users/quipucords","html_url":"https://github.com/quipucords","followers_url":"https://api.github.com/users/quipucords/followers","following_url":"https://api.github.com/users/quipucords/following{/other_user}","gists_url":"https://api.github.com/users/quipucords/gists{/gist_id}","starred_url":"https://api.github.com/users/quipucords/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quipucords/subscriptions","organizations_url":"https://api.github.com/users/quipucords/orgs","repos_url":"https://api.github.com/users/quipucords/repos","events_url":"https://api.github.com/users/quipucords/events{/privacy}","received_events_url":"https://api.github.com/users/quipucords/received_events","type":"Organization","site_admin":false},"repo":{"id":95137300,"name":"camayoc","full_name":"quipucords/camayoc","owner":{"login":"quipucords","id":29148065,"avatar_url":"https://avatars0.githubusercontent.com/u/29148065?v=4","gravatar_id":"","url":"https://api.github.com/users/quipucords","html_url":"https://github.com/quipucords","followers_url":"https://api.github.com/users/quipucords/followers","following_url":"https://api.github.com/users/quipucords/following{/other_user}","gists_url":"https://api.github.com/users/quipucords/gists{/gist_id}","starred_url":"https://api.github.com/users/quipucords/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quipucords/subscriptions","organizations_url":"https://api.github.com/users/quipucords/orgs","repos_url":"https://api.github.com/users/quipucords/repos","events_url":"https://api.github.com/users/quipucords/events{/privacy}","received_events_url":"https://api.github.com/users/quipucords/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/quipucords/camayoc","description":"A GPL-licensed Python library that facilitates functional testing of quipucords.","fork":false,"url":"https://api.github.com/repos/quipucords/camayoc","forks_url":"https://api.github.com/repos/quipucords/camayoc/forks","keys_url":"https://api.github.com/repos/quipucords/camayoc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/quipucords/camayoc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/quipucords/camayoc/teams","hooks_url":"https://api.github.com/repos/quipucords/camayoc/hooks","issue_events_url":"https://api.github.com/repos/quipucords/camayoc/issues/events{/number}","events_url":"https://api.github.com/repos/quipucords/camayoc/events","assignees_url":"https://api.github.com/repos/quipucords/camayoc/assignees{/user}","branches_url":"https://api.github.com/repos/quipucords/camayoc/branches{/branch}","tags_url":"https://api.github.com/repos/quipucords/camayoc/tags","blobs_url":"https://api.github.com/repos/quipucords/camayoc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/quipucords/camayoc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/quipucords/camayoc/git/refs{/sha}","trees_url":"https://api.github.com/repos/quipucords/camayoc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/quipucords/camayoc/statuses/{sha}","languages_url":"https://api.github.com/repos/quipucords/camayoc/languages","stargazers_url":"https://api.github.com/repos/quipucords/camayoc/stargazers","contributors_url":"https://api.github.com/repos/quipucords/camayoc/contributors","subscribers_url":"https://api.github.com/repos/quipucords/camayoc/subscribers","subscription_url":"https://api.github.com/repos/quipucords/camayoc/subscription","commits_url":"https://api.github.com/repos/quipucords/camayoc/commits{/sha}","git_commits_url":"https://api.github.com/repos/quipucords/camayoc/git/commits{/sha}","comments_url":"https://api.github.com/repos/quipucords/camayoc/comments{/number}","issue_comment_url":"https://api.github.com/repos/quipucords/camayoc/issues/comments{/number}","contents_url":"https://api.github.com/repos/quipucords/camayoc/contents/{+path}","compare_url":"https://api.github.com/repos/quipucords/camayoc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/quipucords/camayoc/merges","archive_url":"https://api.github.com/repos/quipucords/camayoc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/quipucords/camayoc/downloads","issues_url":"https://api.github.com/repos/quipucords/camayoc/issues{/number}","pulls_url":"https://api.github.com/repos/quipucords/camayoc/pulls{/number}","milestones_url":"https://api.github.com/repos/quipucords/camayoc/milestones{/number}","notifications_url":"https://api.github.com/repos/quipucords/camayoc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/quipucords/camayoc/labels{/name}","releases_url":"https://api.github.com/repos/quipucords/camayoc/releases{/id}","deployments_url":"https://api.github.com/repos/quipucords/camayoc/deployments","created_at":"2017-06-22T16:53:41Z","updated_at":"2017-06-22T17:59:04Z","pushed_at":"2018-02-21T00:20:56Z","git_url":"git://github.com/quipucords/camayoc.git","ssh_url":"git@github.com:quipucords/camayoc.git","clone_url":"https://github.com/quipucords/camayoc.git","svn_url":"https://github.com/quipucords/camayoc","homepage":null,"size":244,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":11,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0"},"forks":1,"open_issues":11,"watchers":0,"default_branch":"master"}},"base":{"label":"quipucords:master","ref":"master","sha":"c5f47980d88a0d32cb364d25249b541238987b4a","user":{"login":"quipucords","id":29148065,"avatar_url":"https://avatars0.githubusercontent.com/u/29148065?v=4","gravatar_id":"","url":"https://api.github.com/users/quipucords","html_url":"https://github.com/quipucords","followers_url":"https://api.github.com/users/quipucords/followers","following_url":"https://api.github.com/users/quipucords/following{/other_user}","gists_url":"https://api.github.com/users/quipucords/gists{/gist_id}","starred_url":"https://api.github.com/users/quipucords/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quipucords/subscriptions","organizations_url":"https://api.github.com/users/quipucords/orgs","repos_url":"https://api.github.com/users/quipucords/repos","events_url":"https://api.github.com/users/quipucords/events{/privacy}","received_events_url":"https://api.github.com/users/quipucords/received_events","type":"Organization","site_admin":false},"repo":{"id":95137300,"name":"camayoc","full_name":"quipucords/camayoc","owner":{"login":"quipucords","id":29148065,"avatar_url":"https://avatars0.githubusercontent.com/u/29148065?v=4","gravatar_id":"","url":"https://api.github.com/users/quipucords","html_url":"https://github.com/quipucords","followers_url":"https://api.github.com/users/quipucords/followers","following_url":"https://api.github.com/users/quipucords/following{/other_user}","gists_url":"https://api.github.com/users/quipucords/gists{/gist_id}","starred_url":"https://api.github.com/users/quipucords/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quipucords/subscriptions","organizations_url":"https://api.github.com/users/quipucords/orgs","repos_url":"https://api.github.com/users/quipucords/repos","events_url":"https://api.github.com/users/quipucords/events{/privacy}","received_events_url":"https://api.github.com/users/quipucords/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/quipucords/camayoc","description":"A GPL-licensed Python library that facilitates functional testing of quipucords.","fork":false,"url":"https://api.github.com/repos/quipucords/camayoc","forks_url":"https://api.github.com/repos/quipucords/camayoc/forks","keys_url":"https://api.github.com/repos/quipucords/camayoc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/quipucords/camayoc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/quipucords/camayoc/teams","hooks_url":"https://api.github.com/repos/quipucords/camayoc/hooks","issue_events_url":"https://api.github.com/repos/quipucords/camayoc/issues/events{/number}","events_url":"https://api.github.com/repos/quipucords/camayoc/events","assignees_url":"https://api.github.com/repos/quipucords/camayoc/assignees{/user}","branches_url":"https://api.github.com/repos/quipucords/camayoc/branches{/branch}","tags_url":"https://api.github.com/repos/quipucords/camayoc/tags","blobs_url":"https://api.github.com/repos/quipucords/camayoc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/quipucords/camayoc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/quipucords/camayoc/git/refs{/sha}","trees_url":"https://api.github.com/repos/quipucords/camayoc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/quipucords/camayoc/statuses/{sha}","languages_url":"https://api.github.com/repos/quipucords/camayoc/languages","stargazers_url":"https://api.github.com/repos/quipucords/camayoc/stargazers","contributors_url":"https://api.github.com/repos/quipucords/camayoc/contributors","subscribers_url":"https://api.github.com/repos/quipucords/camayoc/subscribers","subscription_url":"https://api.github.com/repos/quipucords/camayoc/subscription","commits_url":"https://api.github.com/repos/quipucords/camayoc/commits{/sha}","git_commits_url":"https://api.github.com/repos/quipucords/camayoc/git/commits{/sha}","comments_url":"https://api.github.com/repos/quipucords/camayoc/comments{/number}","issue_comment_url":"https://api.github.com/repos/quipucords/camayoc/issues/comments{/number}","contents_url":"https://api.github.com/repos/quipucords/camayoc/contents/{+path}","compare_url":"https://api.github.com/repos/quipucords/camayoc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/quipucords/camayoc/merges","archive_url":"https://api.github.com/repos/quipucords/camayoc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/quipucords/camayoc/downloads","issues_url":"https://api.github.com/repos/quipucords/camayoc/issues{/number}","pulls_url":"https://api.github.com/repos/quipucords/camayoc/pulls{/number}","milestones_url":"https://api.github.com/repos/quipucords/camayoc/milestones{/number}","notifications_url":"https://api.github.com/repos/quipucords/camayoc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/quipucords/camayoc/labels{/name}","releases_url":"https://api.github.com/repos/quipucords/camayoc/releases{/id}","deployments_url":"https://api.github.com/repos/quipucords/camayoc/deployments","created_at":"2017-06-22T16:53:41Z","updated_at":"2017-06-22T17:59:04Z","pushed_at":"2018-02-21T00:20:56Z","git_url":"git://github.com/quipucords/camayoc.git","ssh_url":"git@github.com:quipucords/camayoc.git","clone_url":"https://github.com/quipucords/camayoc.git","svn_url":"https://github.com/quipucords/camayoc","homepage":null,"size":244,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":11,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0"},"forks":1,"open_issues":11,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/quipucords/camayoc/pulls/154"},"html":{"href":"https://github.com/quipucords/camayoc/pull/154"},"issue":{"href":"https://api.github.com/repos/quipucords/camayoc/issues/154"},"comments":{"href":"https://api.github.com/repos/quipucords/camayoc/issues/154/comments"},"review_comments":{"href":"https://api.github.com/repos/quipucords/camayoc/pulls/154/comments"},"review_comment":{"href":"https://api.github.com/repos/quipucords/camayoc/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/quipucords/camayoc/pulls/154/commits"},"statuses":{"href":"https://api.github.com/repos/quipucords/camayoc/statuses/7c5fe225d88683da73e4615632b3d1ab9a183086"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"kdelee"}}