{"action":"created","comment":{"url":"https://api.github.com/repos/autotest/tp-libvirt/pulls/comments/175709988","pull_request_review_id":105275425,"id":175709988,"diff_hunk":"@@ -0,0 +1,199 @@\n+import os\n+import time\n+import logging\n+import glob\n+\n+from avocado.utils import cpu\n+from avocado.utils.software_manager import SoftwareManager\n+from avocado.utils import process\n+\n+from virttest import data_dir\n+from virttest import virsh\n+from virttest import libvirt_xml\n+from virttest import utils_test\n+\n+\n+def run(test, params, env):\n+    \"\"\"\n+    Test different hmi injections with guest\n+\n+    :param test: QEMU test object\n+    :param params: Dictionary with the test parameters\n+    :param env: Dictionary with test environment.\n+    \"\"\"\n+\n+    def set_condn(condn, recover=False):\n+        \"\"\"\n+        Set/reset guest state/action\n+        :param condn: Guest state change/action\n+        :param recover: whether to recover given state default: False\n+        \"\"\"\n+        if not recover:\n+            if condn == \"pin_vcpu\":\n+                for i in range(cur_vcpu):\n+                    virsh.vcpupin(vm_name, i, hmi_cpu, \"--live\",\n+                                  ignore_status=False, debug=True)\n+                    virsh.emulatorpin(vm_name,  hmi_cpu, \"live\",\n+                                      ignore_status=False, debug=True)\n+            elif condn == \"filetrans\":\n+                utils_test.run_file_transfer(test, params, env)\n+            elif condn == \"save\":\n+                save_file = os.path.join(data_dir.get_tmp_dir(),\n+                                         vm_name + \".save\")\n+                result = virsh.save(vm_name, save_file, ignore_status=True,\n+                                    debug=True)\n+                utils_test.libvirt.check_exit_status(result)\n+                time.sleep(10)\n+                if os.path.exists(save_file):\n+                    result = virsh.restore(save_file, ignore_status=True,\n+                                           debug=True)\n+                    utils_test.libvirt.check_exit_status(result)\n+                    os.remove(save_file)\n+            elif condn == \"suspend\":\n+                result = virsh.suspend(vm_name, ignore_status=True, debug=True)\n+                utils_test.libvirt.check_exit_status(result)\n+                time.sleep(10)\n+                result = virsh.resume(vm_name, ignore_status=True, debug=True)\n+                utils_test.libvirt.check_exit_status(result)\n+        return\n+\n+    def get_cpu_idle():\n+        \"\"\"\n+        Get current cpu idle values\n+        \"\"\"\n+        states = range(len(glob.glob(\"/sys/devices/system/cpu/cpu0/cpuidle/state*\")))\n+        cpu_idle_state = [[0]*len(states)]*len(cpus_list)\n+        for c in cpus_list:\n+            for state in states:\n+                state_file = \"/sys/devices/system/cpu/cpu%s/cpuidle/state%s/disable\" % (c, state)\n+                try:\n+                    cpu_idle_state[c][state] = int(open(state_file).read())\n+                except Exception:\n+                    pass  # Ignore if states are not available\n+        return cpu_idle_state\n+\n+    def set_cpu_idle(state=\"all\", disable=True, old_value=None):\n+        \"\"\"\n+        Set/Reset cpu idle states for all cpus\n+\n+        :param state: cpuidle state number, default: all states\n+        :param disable: whether to disable/enable given cpu idle state\n+        :param old_value: whether to reset to old value if given\n+        \"\"\"\n+        logging.debug(\"CPU idle disable\")\n+        cpus_list = cpu.cpu_online_list()\n+        if not old_value:\n+            states = []\n+            if 'all' in state:\n+                states = range(1, len(glob.glob(\"/sys/devices/system/cpu/cpu0/cpuidle/state*\")))\n+            else:\n+                states.append(int(state))\n+            if disable:\n+                value = str(1)\n+            else:\n+                value = str(0)\n+            for c in cpus_list:\n+                for state in states:\n+                    state_file = \"/sys/devices/system/cpu/cpu%s/cpuidle/state%s/disable\" % (c, state)\n+                    try:\n+                        open(state_file, \"w\").write(value)\n+                    except Exception as e:\n+                        logging.debug(\"Hi %s\", e)\n+                        pass  # Ignore if states are not available\n+        else:\n+            for c in cpus_list:\n+                for state in range(len(old_value[c])):\n+                    state_file = \"/sys/devices/system/cpu/cpu%s/cpuidle/state%s/disable\" % (c, state)\n+                    try:\n+                        open(state_file, \"w\").write(str(old_value[c][state]))\n+                    except Exception as e:\n+                        logging.debug(\"Hi-1 %s\", e)\n+                        pass  # Ignore if states are not available\n+\n+    vm_name = params.get(\"main_vm\")\n+    vm = env.get_vm(vm_name)\n+    host_version = params.get(\"host_version\")\n+    guest_version = params.get(\"guest_version\", \"\")\n+    max_vcpu = int(params.get(\"ppchmi_vcpu_max\", '1'))\n+    cur_vcpu = int(params.get(\"ppchmi_vcpu_cur\", \"1\"))\n+    cores = int(params.get(\"ppchmi_cores\", '1'))\n+    sockets = int(params.get(\"ppchmi_sockets\", '1'))\n+    threads = int(params.get(\"ppchmi_threads\", '1'))\n+    status_error = \"yes\" == params.get(\"status_error\", \"no\")\n+    condition = params.get(\"condn\", \"\")\n+    inject_code = params.get(\"inject_code\", \"\")\n+    scom_base = params.get(\"scom_base\", \"\")\n+    hmi_name = params.get(\"hmi_name\", \"\")\n+    hmi_iterations = int(params.get(\"hmi_iterations\", 1))\n+\n+    if host_version not in cpu.get_cpu_arch():\n+        test.cancel(\"Unsupported Host cpu version\")\n+    sm = SoftwareManager()\n+    if not sm.check_installed(\"opal-utils\") and not sm.install(\"opal-utils\"):\n+        test.error(\"opal-utils package install failed\")\n+    cpus_list = cpu.cpu_online_list()\n+    cpu_idle_state = get_cpu_idle()\n+    set_cpu_idle()\n+    # Lets use second available host cpu\n+    hmi_cpu = cpus_list[1]\n+    pir = int(open('/sys/devices/system/cpu/cpu%s/pir' % hmi_cpu).read().strip(), 16)\n+    if host_version == 'power9':\n+        coreid = (((pir) >> 2) & 0x3f)\n+        nodeid = (((pir) >> 8) & 0x7f) & 0xf\n+        hmi_scom_addr = hex(((coreid & 0x1f + 0x20) << 24) | int(scom_base, 16))\n+    if host_version == 'power8':\n+        coreid = (((pir) >> 3) & 0xf)\n+        nodeid = (((pir) >> 7) & 0x3f)\n+        hmi_scom_addr = hex(((coreid & 0xf) << 24) | int(scom_base, 16))\n+    hmi_cmd = \"putscom -c %s %s %s\" % (nodeid, hmi_scom_addr, inject_code)\n+\n+    vmxml = libvirt_xml.VMXML.new_from_inactive_dumpxml(vm_name)\n+    org_xml = vmxml.copy()\n+    # Destroy the vm\n+    vm.destroy()\n+    try:\n+        session = None\n+        bgt = None\n+        libvirt_xml.VMXML.set_vm_vcpus(vm_name, max_vcpu, cur_vcpu,\n+                                       sockets=sockets, cores=cores,\n+                                       threads=threads, add_topology=True)\n+        if guest_version:\n+            libvirt_xml.VMXML.set_cpu_mode(vm_name, model=guest_version)\n+        vm.start()\n+        # Lets clear host and guest dmesg\n+        process.system(\"dmesg -C\", verbose=False)\n+        session = vm.wait_for_login()\n+        session.cmd(\"dmesg -C\")\n+\n+        # Set condn\n+        if \"vcpupin\" in condition:\n+            set_condn(\"pin_vcpu\")\n+        if \"stress\" in condition:\n+            session.cmd('while true;do echo \"no\" >/dev/null;done&')\n+        if \"save\" in condition:\n+            set_condn(\"save\")\n+        if \"suspend\" in condition:\n+            set_condn(\"suspend\")\n+\n+        # hmi inject\n+        logging.debug(\"Injecting %s HMI on cpu %s\", hmi_name, hmi_cpu)\n+        logging.debug(\"HMI Command: %s\", hmi_cmd)\n+        process.run(hmi_cmd)","path":"libvirt/tests/src/cpu/ppchmi.py","position":181,"original_position":181,"commit_id":"6620efb3ac786fb5ed17d116bdb5be78d0ac7d20","original_commit_id":"6620efb3ac786fb5ed17d116bdb5be78d0ac7d20","user":{"login":"balamuruhans","id":16498077,"avatar_url":"https://avatars0.githubusercontent.com/u/16498077?v=4","gravatar_id":"","url":"https://api.github.com/users/balamuruhans","html_url":"https://github.com/balamuruhans","followers_url":"https://api.github.com/users/balamuruhans/followers","following_url":"https://api.github.com/users/balamuruhans/following{/other_user}","gists_url":"https://api.github.com/users/balamuruhans/gists{/gist_id}","starred_url":"https://api.github.com/users/balamuruhans/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/balamuruhans/subscriptions","organizations_url":"https://api.github.com/users/balamuruhans/orgs","repos_url":"https://api.github.com/users/balamuruhans/repos","events_url":"https://api.github.com/users/balamuruhans/events{/privacy}","received_events_url":"https://api.github.com/users/balamuruhans/received_events","type":"User","site_admin":false},"body":"dont we have to check for return ? and let us log the injection by setting verbose ","created_at":"2018-03-20T10:05:22Z","updated_at":"2018-03-20T10:08:28Z","html_url":"https://github.com/autotest/tp-libvirt/pull/1446#discussion_r175709988","pull_request_url":"https://api.github.com/repos/autotest/tp-libvirt/pulls/1446","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/autotest/tp-libvirt/pulls/comments/175709988"},"html":{"href":"https://github.com/autotest/tp-libvirt/pull/1446#discussion_r175709988"},"pull_request":{"href":"https://api.github.com/repos/autotest/tp-libvirt/pulls/1446"}}},"pull_request":{"url":"https://api.github.com/repos/autotest/tp-libvirt/pulls/1446","id":175137554,"html_url":"https://github.com/autotest/tp-libvirt/pull/1446","diff_url":"https://github.com/autotest/tp-libvirt/pull/1446.diff","patch_url":"https://github.com/autotest/tp-libvirt/pull/1446.patch","issue_url":"https://api.github.com/repos/autotest/tp-libvirt/issues/1446","number":1446,"state":"open","locked":false,"title":"Add test to validate Pseries HMI error injection with KVM guest active","user":{"login":"sathnaga","id":1841809,"avatar_url":"https://avatars3.githubusercontent.com/u/1841809?v=4","gravatar_id":"","url":"https://api.github.com/users/sathnaga","html_url":"https://github.com/sathnaga","followers_url":"https://api.github.com/users/sathnaga/followers","following_url":"https://api.github.com/users/sathnaga/following{/other_user}","gists_url":"https://api.github.com/users/sathnaga/gists{/gist_id}","starred_url":"https://api.github.com/users/sathnaga/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sathnaga/subscriptions","organizations_url":"https://api.github.com/users/sathnaga/orgs","repos_url":"https://api.github.com/users/sathnaga/repos","events_url":"https://api.github.com/users/sathnaga/events{/privacy}","received_events_url":"https://api.github.com/users/sathnaga/received_events","type":"User","site_admin":false},"body":"Add test to validate Pseries HMI error injection with KVM guest\r\nrunning in the given cpu core.\r\n\r\nSigned-off-by: Satheesh Rajendran <sathnaga@linux.vnet.ibm.com>","created_at":"2018-03-15T03:07:02Z","updated_at":"2018-03-20T10:08:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e0b904022d3dac744cbc6c763281babd1ebe753b","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/autotest/tp-libvirt/pulls/1446/commits","review_comments_url":"https://api.github.com/repos/autotest/tp-libvirt/pulls/1446/comments","review_comment_url":"https://api.github.com/repos/autotest/tp-libvirt/pulls/comments{/number}","comments_url":"https://api.github.com/repos/autotest/tp-libvirt/issues/1446/comments","statuses_url":"https://api.github.com/repos/autotest/tp-libvirt/statuses/6620efb3ac786fb5ed17d116bdb5be78d0ac7d20","head":{"label":"sathnaga:guest_hmi","ref":"guest_hmi","sha":"6620efb3ac786fb5ed17d116bdb5be78d0ac7d20","user":{"login":"sathnaga","id":1841809,"avatar_url":"https://avatars3.githubusercontent.com/u/1841809?v=4","gravatar_id":"","url":"https://api.github.com/users/sathnaga","html_url":"https://github.com/sathnaga","followers_url":"https://api.github.com/users/sathnaga/followers","following_url":"https://api.github.com/users/sathnaga/following{/other_user}","gists_url":"https://api.github.com/users/sathnaga/gists{/gist_id}","starred_url":"https://api.github.com/users/sathnaga/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sathnaga/subscriptions","organizations_url":"https://api.github.com/users/sathnaga/orgs","repos_url":"https://api.github.com/users/sathnaga/repos","events_url":"https://api.github.com/users/sathnaga/events{/privacy}","received_events_url":"https://api.github.com/users/sathnaga/received_events","type":"User","site_admin":false},"repo":{"id":31525369,"name":"tp-libvirt","full_name":"sathnaga/tp-libvirt","owner":{"login":"sathnaga","id":1841809,"avatar_url":"https://avatars3.githubusercontent.com/u/1841809?v=4","gravatar_id":"","url":"https://api.github.com/users/sathnaga","html_url":"https://github.com/sathnaga","followers_url":"https://api.github.com/users/sathnaga/followers","following_url":"https://api.github.com/users/sathnaga/following{/other_user}","gists_url":"https://api.github.com/users/sathnaga/gists{/gist_id}","starred_url":"https://api.github.com/users/sathnaga/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sathnaga/subscriptions","organizations_url":"https://api.github.com/users/sathnaga/orgs","repos_url":"https://api.github.com/users/sathnaga/repos","events_url":"https://api.github.com/users/sathnaga/events{/privacy}","received_events_url":"https://api.github.com/users/sathnaga/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sathnaga/tp-libvirt","description":"Test Provider for Libvirt and related virtualization backends","fork":true,"url":"https://api.github.com/repos/sathnaga/tp-libvirt","forks_url":"https://api.github.com/repos/sathnaga/tp-libvirt/forks","keys_url":"https://api.github.com/repos/sathnaga/tp-libvirt/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sathnaga/tp-libvirt/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sathnaga/tp-libvirt/teams","hooks_url":"https://api.github.com/repos/sathnaga/tp-libvirt/hooks","issue_events_url":"https://api.github.com/repos/sathnaga/tp-libvirt/issues/events{/number}","events_url":"https://api.github.com/repos/sathnaga/tp-libvirt/events","assignees_url":"https://api.github.com/repos/sathnaga/tp-libvirt/assignees{/user}","branches_url":"https://api.github.com/repos/sathnaga/tp-libvirt/branches{/branch}","tags_url":"https://api.github.com/repos/sathnaga/tp-libvirt/tags","blobs_url":"https://api.github.com/repos/sathnaga/tp-libvirt/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sathnaga/tp-libvirt/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sathnaga/tp-libvirt/git/refs{/sha}","trees_url":"https://api.github.com/repos/sathnaga/tp-libvirt/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sathnaga/tp-libvirt/statuses/{sha}","languages_url":"https://api.github.com/repos/sathnaga/tp-libvirt/languages","stargazers_url":"https://api.github.com/repos/sathnaga/tp-libvirt/stargazers","contributors_url":"https://api.github.com/repos/sathnaga/tp-libvirt/contributors","subscribers_url":"https://api.github.com/repos/sathnaga/tp-libvirt/subscribers","subscription_url":"https://api.github.com/repos/sathnaga/tp-libvirt/subscription","commits_url":"https://api.github.com/repos/sathnaga/tp-libvirt/commits{/sha}","git_commits_url":"https://api.github.com/repos/sathnaga/tp-libvirt/git/commits{/sha}","comments_url":"https://api.github.com/repos/sathnaga/tp-libvirt/comments{/number}","issue_comment_url":"https://api.github.com/repos/sathnaga/tp-libvirt/issues/comments{/number}","contents_url":"https://api.github.com/repos/sathnaga/tp-libvirt/contents/{+path}","compare_url":"https://api.github.com/repos/sathnaga/tp-libvirt/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sathnaga/tp-libvirt/merges","archive_url":"https://api.github.com/repos/sathnaga/tp-libvirt/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sathnaga/tp-libvirt/downloads","issues_url":"https://api.github.com/repos/sathnaga/tp-libvirt/issues{/number}","pulls_url":"https://api.github.com/repos/sathnaga/tp-libvirt/pulls{/number}","milestones_url":"https://api.github.com/repos/sathnaga/tp-libvirt/milestones{/number}","notifications_url":"https://api.github.com/repos/sathnaga/tp-libvirt/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sathnaga/tp-libvirt/labels{/name}","releases_url":"https://api.github.com/repos/sathnaga/tp-libvirt/releases{/id}","deployments_url":"https://api.github.com/repos/sathnaga/tp-libvirt/deployments","created_at":"2015-03-02T05:50:06Z","updated_at":"2018-03-15T03:07:50Z","pushed_at":"2018-03-15T03:07:47Z","git_url":"git://github.com/sathnaga/tp-libvirt.git","ssh_url":"git@github.com:sathnaga/tp-libvirt.git","clone_url":"https://github.com/sathnaga/tp-libvirt.git","svn_url":"https://github.com/sathnaga/tp-libvirt","homepage":null,"size":11901,"stargazers_count":1,"watchers_count":1,"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":null,"url":null},"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"autotest:master","ref":"master","sha":"79f051759aac5e537e2bb60a236812c9dd300205","user":{"login":"autotest","id":472856,"avatar_url":"https://avatars1.githubusercontent.com/u/472856?v=4","gravatar_id":"","url":"https://api.github.com/users/autotest","html_url":"https://github.com/autotest","followers_url":"https://api.github.com/users/autotest/followers","following_url":"https://api.github.com/users/autotest/following{/other_user}","gists_url":"https://api.github.com/users/autotest/gists{/gist_id}","starred_url":"https://api.github.com/users/autotest/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/autotest/subscriptions","organizations_url":"https://api.github.com/users/autotest/orgs","repos_url":"https://api.github.com/users/autotest/repos","events_url":"https://api.github.com/users/autotest/events{/privacy}","received_events_url":"https://api.github.com/users/autotest/received_events","type":"Organization","site_admin":false},"repo":{"id":16180517,"name":"tp-libvirt","full_name":"autotest/tp-libvirt","owner":{"login":"autotest","id":472856,"avatar_url":"https://avatars1.githubusercontent.com/u/472856?v=4","gravatar_id":"","url":"https://api.github.com/users/autotest","html_url":"https://github.com/autotest","followers_url":"https://api.github.com/users/autotest/followers","following_url":"https://api.github.com/users/autotest/following{/other_user}","gists_url":"https://api.github.com/users/autotest/gists{/gist_id}","starred_url":"https://api.github.com/users/autotest/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/autotest/subscriptions","organizations_url":"https://api.github.com/users/autotest/orgs","repos_url":"https://api.github.com/users/autotest/repos","events_url":"https://api.github.com/users/autotest/events{/privacy}","received_events_url":"https://api.github.com/users/autotest/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/autotest/tp-libvirt","description":"Test Provider for Libvirt and related virtualization backends","fork":false,"url":"https://api.github.com/repos/autotest/tp-libvirt","forks_url":"https://api.github.com/repos/autotest/tp-libvirt/forks","keys_url":"https://api.github.com/repos/autotest/tp-libvirt/keys{/key_id}","collaborators_url":"https://api.github.com/repos/autotest/tp-libvirt/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/autotest/tp-libvirt/teams","hooks_url":"https://api.github.com/repos/autotest/tp-libvirt/hooks","issue_events_url":"https://api.github.com/repos/autotest/tp-libvirt/issues/events{/number}","events_url":"https://api.github.com/repos/autotest/tp-libvirt/events","assignees_url":"https://api.github.com/repos/autotest/tp-libvirt/assignees{/user}","branches_url":"https://api.github.com/repos/autotest/tp-libvirt/branches{/branch}","tags_url":"https://api.github.com/repos/autotest/tp-libvirt/tags","blobs_url":"https://api.github.com/repos/autotest/tp-libvirt/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/autotest/tp-libvirt/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/autotest/tp-libvirt/git/refs{/sha}","trees_url":"https://api.github.com/repos/autotest/tp-libvirt/git/trees{/sha}","statuses_url":"https://api.github.com/repos/autotest/tp-libvirt/statuses/{sha}","languages_url":"https://api.github.com/repos/autotest/tp-libvirt/languages","stargazers_url":"https://api.github.com/repos/autotest/tp-libvirt/stargazers","contributors_url":"https://api.github.com/repos/autotest/tp-libvirt/contributors","subscribers_url":"https://api.github.com/repos/autotest/tp-libvirt/subscribers","subscription_url":"https://api.github.com/repos/autotest/tp-libvirt/subscription","commits_url":"https://api.github.com/repos/autotest/tp-libvirt/commits{/sha}","git_commits_url":"https://api.github.com/repos/autotest/tp-libvirt/git/commits{/sha}","comments_url":"https://api.github.com/repos/autotest/tp-libvirt/comments{/number}","issue_comment_url":"https://api.github.com/repos/autotest/tp-libvirt/issues/comments{/number}","contents_url":"https://api.github.com/repos/autotest/tp-libvirt/contents/{+path}","compare_url":"https://api.github.com/repos/autotest/tp-libvirt/compare/{base}...{head}","merges_url":"https://api.github.com/repos/autotest/tp-libvirt/merges","archive_url":"https://api.github.com/repos/autotest/tp-libvirt/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/autotest/tp-libvirt/downloads","issues_url":"https://api.github.com/repos/autotest/tp-libvirt/issues{/number}","pulls_url":"https://api.github.com/repos/autotest/tp-libvirt/pulls{/number}","milestones_url":"https://api.github.com/repos/autotest/tp-libvirt/milestones{/number}","notifications_url":"https://api.github.com/repos/autotest/tp-libvirt/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/autotest/tp-libvirt/labels{/name}","releases_url":"https://api.github.com/repos/autotest/tp-libvirt/releases{/id}","deployments_url":"https://api.github.com/repos/autotest/tp-libvirt/deployments","created_at":"2014-01-23T17:58:18Z","updated_at":"2018-03-20T03:38:08Z","pushed_at":"2018-03-20T03:37:56Z","git_url":"git://github.com/autotest/tp-libvirt.git","ssh_url":"git@github.com:autotest/tp-libvirt.git","clone_url":"https://github.com/autotest/tp-libvirt.git","svn_url":"https://github.com/autotest/tp-libvirt","homepage":null,"size":11940,"stargazers_count":15,"watchers_count":15,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":101,"mirror_url":null,"archived":false,"open_issues_count":91,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":101,"open_issues":91,"watchers":15,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/autotest/tp-libvirt/pulls/1446"},"html":{"href":"https://github.com/autotest/tp-libvirt/pull/1446"},"issue":{"href":"https://api.github.com/repos/autotest/tp-libvirt/issues/1446"},"comments":{"href":"https://api.github.com/repos/autotest/tp-libvirt/issues/1446/comments"},"review_comments":{"href":"https://api.github.com/repos/autotest/tp-libvirt/pulls/1446/comments"},"review_comment":{"href":"https://api.github.com/repos/autotest/tp-libvirt/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/autotest/tp-libvirt/pulls/1446/commits"},"statuses":{"href":"https://api.github.com/repos/autotest/tp-libvirt/statuses/6620efb3ac786fb5ed17d116bdb5be78d0ac7d20"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"balamuruhans"}}