{"action":"created","comment":{"url":"https://api.github.com/repos/kubevirt/kubevirt/pulls/comments/126250517","pull_request_review_id":48723992,"id":126250517,"diff_hunk":"@@ -0,0 +1,180 @@\n+# Defaulting Service Proposal\n+\n+This Proposal fills a gap between KubeVirt as Runtime and Higher level\n+management, like proposed in #272. It lays out a design wich overcomes the\n+necessity for asynchronous specification updates, which has it's origin in the\n+fact that a lot of the defaulting is done on the host, so after scheduling.\n+\n+With the proposal here, which will provide a synchronous way of fully\n+populating a VM specification, we come much closer to the meaning of a Pod\n+specification in Kubernetes, but most important, this allows decoupling\n+administrative tasks completely from the runtime, when manipulating VM Specs\n+(the need to run VMs, to get a full VM spec).\n+\n+## Current situation\n+\n+Libvirt allows you to post very minimal Domain specifications. It will then\n+fill out a lot of device details for you. On cluster level this can lead to\n+difficulties, since depending on the fact if the VM has ever run before, you\n+will have to operate on different specs, and you have to incoroporate VM\n+specification changes once a VM was started the first time.\n+\n+The following illustrates how immense the defaulting is.\n+\n+First let's have a look on a fairly minimal KubeVirt VM Specification:\n+\n+```yaml\n+apiVersion: kubevirt.io/v1alpha1\n+kind: VM\n+metadata:\n+  name: testvm\n+spec:\n+  domain:\n+    devices:\n+      interfaces:\n+      - type: network\n+        source:\n+          network: default\n+    memory:\n+      unit: MB\n+      value: 64\n+    os:\n+      type:\n+        os: hvm\n+    type: qemu\n+```\n+\n+This can be translated to a quite small Domain XML:\n+\n+```xml\n+<domain type=\"qemu\" xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>\n+  <name>testvm</name>\n+  <memory unit=\"MB\">64</memory>\n+  <os>\n+    <type>hvm</type>\n+  </os>\n+  <devices>\n+      <interface type=\"network\">\n+      <source network=\"default\"></source>\n+    </interface>\n+   </devices>\n+</domain>\n+```\n+\n+After we have defined the domain in libvirt, the XML looks like this:\n+\n+```xml\n+<domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>\n+  <name>testvm</name>\n+  <uuid>a8335812-53d4-4e57-ac0b-72951c885a57</uuid>\n+  <memory unit='KiB'>62500</memory>\n+  <currentMemory unit='KiB'>62500</currentMemory>\n+  <vcpu placement='static'>1</vcpu>\n+  <os>\n+    <type arch='x86_64' machine='pc-i440fx-2.7'>hvm</type>\n+    <boot dev='hd'/>\n+  </os>\n+  <clock offset='utc'/>\n+  <on_poweroff>destroy</on_poweroff>\n+  <on_reboot>restart</on_reboot>\n+  <on_crash>destroy</on_crash>\n+  <devices>\n+    <emulator>/usr/bin/qemu-system-x86_64</emulator>\n+    <controller type='usb' index='0' model='piix3-uhci'>\n+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>\n+    </controller>\n+    <controller type='pci' index='0' model='pci-root'/>\n+    <interface type='network'>\n+      <mac address='52:54:00:2e:84:30'/>\n+      <source network='default'/>\n+      <model type='rtl8139'/>\n+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>\n+    </interface>\n+    <input type='mouse' bus='ps2'/>\n+    <input type='keyboard' bus='ps2'/>\n+    <memballoon model='virtio'>\n+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>\n+    </memballoon>\n+  </devices>\n+</domain>\n+```\n+\n+Finally, when a Domain was successfully started by Libvirt, Libvirt assigns an\n+`alias` to every device in the XML.\n+\n+## The Problem\n+\n+ * Hotplug operations are not possible with the minimal VM spec of kubevirt,\n+   since we could match wrong devices.\n+ * After VM restarts, different devices or addresses could be assigned to a VM\n+   by libvirt\n+ * Libvirt assigns all that data on the host, either when defining the Domain,\n+   or after the Domain was started. That requires asynchronous lookups, and\n+   when thinking about administrating offline VMs, it binds your domain\n+   specification management to the kubevirt runtime.\n+\n+If your VMs are ephemeral (no migrations, recreating VMs vs. restarting VMs, no\n+hotplug), you are not affected by that.\n+\n+## Proposed Solution\n+\n+### Defaulting service based on libvirt\n+\n+Except for some runtime information, which is normally not included in\n+migratable domain XMLs, libvirt fills in all defaults when defining a domain.\n+We can leverage that with a simple REST based service, which defines VMs in an\n+isolated libvirt (running libvirt and the small REST service in a Pod). The\n+service is a standalone component in KubeVirt and can then be integrated into\n+two different flows:\n+\n+ 1. When doing a POST to\n+    `/apis/kubevirt.io/v1alpha1/namespaces/mynamespace/vms`, `virt-api` can do\n+    a roundtrip to that service and prefill the defaults. As the response of\n+    the POST to `virt-api`, you will get the completely prefilled VM\n+    specification. This updated spec contains all the necessary bits, to allow\n+    consistent hotplugging and keeping the VM definition consistent between\n+    redefines.\n+ 2. Add an extra endpoint to `virt-api` which only purpose is to prefill the VM","path":"docs/defaulting.md","position":137,"original_position":137,"commit_id":"f181be30120a4add2c21c9879d133cb16bd5f264","original_commit_id":"f181be30120a4add2c21c9879d133cb16bd5f264","user":{"login":"rmohr","id":4534621,"avatar_url":"https://avatars0.githubusercontent.com/u/4534621?v=3","gravatar_id":"","url":"https://api.github.com/users/rmohr","html_url":"https://github.com/rmohr","followers_url":"https://api.github.com/users/rmohr/followers","following_url":"https://api.github.com/users/rmohr/following{/other_user}","gists_url":"https://api.github.com/users/rmohr/gists{/gist_id}","starred_url":"https://api.github.com/users/rmohr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmohr/subscriptions","organizations_url":"https://api.github.com/users/rmohr/orgs","repos_url":"https://api.github.com/users/rmohr/repos","events_url":"https://api.github.com/users/rmohr/events{/privacy}","received_events_url":"https://api.github.com/users/rmohr/received_events","type":"User","site_admin":false},"body":"Ok, so option 1 is great, if you don't care about UIs, or anything. It is like with the Kubernetes runtime. You have your VM spec somewhere, and want to start your VM. You post it, and as a result  you get a full spec back. Additionally, sooner or later your VM will run. Also hotplug, ... can just be done by modifying the object.\r\n\r\nHowever, if you want to build something like nice management UIs on top, and you want to support hotplug and modifications for next runs in combination with a consistend VM Spec, it gets more difficult. \r\nYour management app would have to deal with VM Spec which are not yet fully defaulted, because they never ran. If libvirt on the node adds relevant spec info for persistend VM specs, you have asynchronous spec updates, which you have to consider. If you hotplug a sparse device, which you want to keep for the next run, you need the fully populated device after it was added by libvirt. \r\n\r\nThat all can be worked around by the endpoint in option 2. It allows you to always fill out all the relevant data like PCI addresses, without every having to even ru n a VM. I don't see option 2 as something important, if you use the runtime directly without a management app on top, but it could still be useful.\r\n\r\nDoes that make sense?\r\n\r\n\r\n","created_at":"2017-07-07T21:36:46Z","updated_at":"2017-07-07T21:36:47Z","html_url":"https://github.com/kubevirt/kubevirt/pull/281#discussion_r126250517","pull_request_url":"https://api.github.com/repos/kubevirt/kubevirt/pulls/281","_links":{"self":{"href":"https://api.github.com/repos/kubevirt/kubevirt/pulls/comments/126250517"},"html":{"href":"https://github.com/kubevirt/kubevirt/pull/281#discussion_r126250517"},"pull_request":{"href":"https://api.github.com/repos/kubevirt/kubevirt/pulls/281"}}},"pull_request":{"url":"https://api.github.com/repos/kubevirt/kubevirt/pulls/281","id":128620592,"html_url":"https://github.com/kubevirt/kubevirt/pull/281","diff_url":"https://github.com/kubevirt/kubevirt/pull/281.diff","patch_url":"https://github.com/kubevirt/kubevirt/pull/281.patch","issue_url":"https://api.github.com/repos/kubevirt/kubevirt/issues/281","number":281,"state":"open","locked":false,"title":"docs: Defaulting","user":{"login":"rmohr","id":4534621,"avatar_url":"https://avatars0.githubusercontent.com/u/4534621?v=3","gravatar_id":"","url":"https://api.github.com/users/rmohr","html_url":"https://github.com/rmohr","followers_url":"https://api.github.com/users/rmohr/followers","following_url":"https://api.github.com/users/rmohr/following{/other_user}","gists_url":"https://api.github.com/users/rmohr/gists{/gist_id}","starred_url":"https://api.github.com/users/rmohr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmohr/subscriptions","organizations_url":"https://api.github.com/users/rmohr/orgs","repos_url":"https://api.github.com/users/rmohr/repos","events_url":"https://api.github.com/users/rmohr/events{/privacy}","received_events_url":"https://api.github.com/users/rmohr/received_events","type":"User","site_admin":false},"body":"This Proposal fills a gap between KubeVirt as Runtime and Higher level management, like proposed in #272. Without the necessity for asynchronous specification updates, we come much closer to the meaning of a Pod specification in Kubernetes, but most important, this allows decoupling administrative tasks completely from the runtime (the need to run VMs, to get a full VM spec), when manipulating VM Specs.","created_at":"2017-07-03T12:44:22Z","updated_at":"2017-07-07T21:36:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"331add3a3c4fb410b13eac78d26ac146a09b07da","assignee":null,"assignees":[],"requested_reviewers":[{"login":"fabiand","id":83456,"avatar_url":"https://avatars2.githubusercontent.com/u/83456?v=3","gravatar_id":"","url":"https://api.github.com/users/fabiand","html_url":"https://github.com/fabiand","followers_url":"https://api.github.com/users/fabiand/followers","following_url":"https://api.github.com/users/fabiand/following{/other_user}","gists_url":"https://api.github.com/users/fabiand/gists{/gist_id}","starred_url":"https://api.github.com/users/fabiand/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fabiand/subscriptions","organizations_url":"https://api.github.com/users/fabiand/orgs","repos_url":"https://api.github.com/users/fabiand/repos","events_url":"https://api.github.com/users/fabiand/events{/privacy}","received_events_url":"https://api.github.com/users/fabiand/received_events","type":"User","site_admin":false},{"login":"berrange","id":1517315,"avatar_url":"https://avatars2.githubusercontent.com/u/1517315?v=3","gravatar_id":"","url":"https://api.github.com/users/berrange","html_url":"https://github.com/berrange","followers_url":"https://api.github.com/users/berrange/followers","following_url":"https://api.github.com/users/berrange/following{/other_user}","gists_url":"https://api.github.com/users/berrange/gists{/gist_id}","starred_url":"https://api.github.com/users/berrange/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/berrange/subscriptions","organizations_url":"https://api.github.com/users/berrange/orgs","repos_url":"https://api.github.com/users/berrange/repos","events_url":"https://api.github.com/users/berrange/events{/privacy}","received_events_url":"https://api.github.com/users/berrange/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubevirt/kubevirt/pulls/281/commits","review_comments_url":"https://api.github.com/repos/kubevirt/kubevirt/pulls/281/comments","review_comment_url":"https://api.github.com/repos/kubevirt/kubevirt/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubevirt/kubevirt/issues/281/comments","statuses_url":"https://api.github.com/repos/kubevirt/kubevirt/statuses/f181be30120a4add2c21c9879d133cb16bd5f264","head":{"label":"rmohr:defaulting","ref":"defaulting","sha":"f181be30120a4add2c21c9879d133cb16bd5f264","user":{"login":"rmohr","id":4534621,"avatar_url":"https://avatars0.githubusercontent.com/u/4534621?v=3","gravatar_id":"","url":"https://api.github.com/users/rmohr","html_url":"https://github.com/rmohr","followers_url":"https://api.github.com/users/rmohr/followers","following_url":"https://api.github.com/users/rmohr/following{/other_user}","gists_url":"https://api.github.com/users/rmohr/gists{/gist_id}","starred_url":"https://api.github.com/users/rmohr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmohr/subscriptions","organizations_url":"https://api.github.com/users/rmohr/orgs","repos_url":"https://api.github.com/users/rmohr/repos","events_url":"https://api.github.com/users/rmohr/events{/privacy}","received_events_url":"https://api.github.com/users/rmohr/received_events","type":"User","site_admin":false},"repo":{"id":76846344,"name":"kubevirt","full_name":"rmohr/kubevirt","owner":{"login":"rmohr","id":4534621,"avatar_url":"https://avatars0.githubusercontent.com/u/4534621?v=3","gravatar_id":"","url":"https://api.github.com/users/rmohr","html_url":"https://github.com/rmohr","followers_url":"https://api.github.com/users/rmohr/followers","following_url":"https://api.github.com/users/rmohr/following{/other_user}","gists_url":"https://api.github.com/users/rmohr/gists{/gist_id}","starred_url":"https://api.github.com/users/rmohr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmohr/subscriptions","organizations_url":"https://api.github.com/users/rmohr/orgs","repos_url":"https://api.github.com/users/rmohr/repos","events_url":"https://api.github.com/users/rmohr/events{/privacy}","received_events_url":"https://api.github.com/users/rmohr/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rmohr/kubevirt","description":"KubeVirt is a virtual machine management architecture built around Kubernetes.","fork":true,"url":"https://api.github.com/repos/rmohr/kubevirt","forks_url":"https://api.github.com/repos/rmohr/kubevirt/forks","keys_url":"https://api.github.com/repos/rmohr/kubevirt/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rmohr/kubevirt/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rmohr/kubevirt/teams","hooks_url":"https://api.github.com/repos/rmohr/kubevirt/hooks","issue_events_url":"https://api.github.com/repos/rmohr/kubevirt/issues/events{/number}","events_url":"https://api.github.com/repos/rmohr/kubevirt/events","assignees_url":"https://api.github.com/repos/rmohr/kubevirt/assignees{/user}","branches_url":"https://api.github.com/repos/rmohr/kubevirt/branches{/branch}","tags_url":"https://api.github.com/repos/rmohr/kubevirt/tags","blobs_url":"https://api.github.com/repos/rmohr/kubevirt/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rmohr/kubevirt/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rmohr/kubevirt/git/refs{/sha}","trees_url":"https://api.github.com/repos/rmohr/kubevirt/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rmohr/kubevirt/statuses/{sha}","languages_url":"https://api.github.com/repos/rmohr/kubevirt/languages","stargazers_url":"https://api.github.com/repos/rmohr/kubevirt/stargazers","contributors_url":"https://api.github.com/repos/rmohr/kubevirt/contributors","subscribers_url":"https://api.github.com/repos/rmohr/kubevirt/subscribers","subscription_url":"https://api.github.com/repos/rmohr/kubevirt/subscription","commits_url":"https://api.github.com/repos/rmohr/kubevirt/commits{/sha}","git_commits_url":"https://api.github.com/repos/rmohr/kubevirt/git/commits{/sha}","comments_url":"https://api.github.com/repos/rmohr/kubevirt/comments{/number}","issue_comment_url":"https://api.github.com/repos/rmohr/kubevirt/issues/comments{/number}","contents_url":"https://api.github.com/repos/rmohr/kubevirt/contents/{+path}","compare_url":"https://api.github.com/repos/rmohr/kubevirt/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rmohr/kubevirt/merges","archive_url":"https://api.github.com/repos/rmohr/kubevirt/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rmohr/kubevirt/downloads","issues_url":"https://api.github.com/repos/rmohr/kubevirt/issues{/number}","pulls_url":"https://api.github.com/repos/rmohr/kubevirt/pulls{/number}","milestones_url":"https://api.github.com/repos/rmohr/kubevirt/milestones{/number}","notifications_url":"https://api.github.com/repos/rmohr/kubevirt/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rmohr/kubevirt/labels{/name}","releases_url":"https://api.github.com/repos/rmohr/kubevirt/releases{/id}","deployments_url":"https://api.github.com/repos/rmohr/kubevirt/deployments","created_at":"2016-12-19T09:10:20Z","updated_at":"2016-12-19T09:10:21Z","pushed_at":"2017-07-06T16:15:57Z","git_url":"git://github.com/rmohr/kubevirt.git","ssh_url":"git@github.com:rmohr/kubevirt.git","clone_url":"https://github.com/rmohr/kubevirt.git","svn_url":"https://github.com/rmohr/kubevirt","homepage":null,"size":16472,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"kubevirt:master","ref":"master","sha":"658942b6adbceae4f394b8c7bf2433b6db0d444c","user":{"login":"kubevirt","id":18700703,"avatar_url":"https://avatars2.githubusercontent.com/u/18700703?v=3","gravatar_id":"","url":"https://api.github.com/users/kubevirt","html_url":"https://github.com/kubevirt","followers_url":"https://api.github.com/users/kubevirt/followers","following_url":"https://api.github.com/users/kubevirt/following{/other_user}","gists_url":"https://api.github.com/users/kubevirt/gists{/gist_id}","starred_url":"https://api.github.com/users/kubevirt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubevirt/subscriptions","organizations_url":"https://api.github.com/users/kubevirt/orgs","repos_url":"https://api.github.com/users/kubevirt/repos","events_url":"https://api.github.com/users/kubevirt/events{/privacy}","received_events_url":"https://api.github.com/users/kubevirt/received_events","type":"Organization","site_admin":false},"repo":{"id":76686583,"name":"kubevirt","full_name":"kubevirt/kubevirt","owner":{"login":"kubevirt","id":18700703,"avatar_url":"https://avatars2.githubusercontent.com/u/18700703?v=3","gravatar_id":"","url":"https://api.github.com/users/kubevirt","html_url":"https://github.com/kubevirt","followers_url":"https://api.github.com/users/kubevirt/followers","following_url":"https://api.github.com/users/kubevirt/following{/other_user}","gists_url":"https://api.github.com/users/kubevirt/gists{/gist_id}","starred_url":"https://api.github.com/users/kubevirt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubevirt/subscriptions","organizations_url":"https://api.github.com/users/kubevirt/orgs","repos_url":"https://api.github.com/users/kubevirt/repos","events_url":"https://api.github.com/users/kubevirt/events{/privacy}","received_events_url":"https://api.github.com/users/kubevirt/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kubevirt/kubevirt","description":"KubeVirt is a virtual machine management add-on for Kubernetes.","fork":false,"url":"https://api.github.com/repos/kubevirt/kubevirt","forks_url":"https://api.github.com/repos/kubevirt/kubevirt/forks","keys_url":"https://api.github.com/repos/kubevirt/kubevirt/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubevirt/kubevirt/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubevirt/kubevirt/teams","hooks_url":"https://api.github.com/repos/kubevirt/kubevirt/hooks","issue_events_url":"https://api.github.com/repos/kubevirt/kubevirt/issues/events{/number}","events_url":"https://api.github.com/repos/kubevirt/kubevirt/events","assignees_url":"https://api.github.com/repos/kubevirt/kubevirt/assignees{/user}","branches_url":"https://api.github.com/repos/kubevirt/kubevirt/branches{/branch}","tags_url":"https://api.github.com/repos/kubevirt/kubevirt/tags","blobs_url":"https://api.github.com/repos/kubevirt/kubevirt/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubevirt/kubevirt/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubevirt/kubevirt/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubevirt/kubevirt/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubevirt/kubevirt/statuses/{sha}","languages_url":"https://api.github.com/repos/kubevirt/kubevirt/languages","stargazers_url":"https://api.github.com/repos/kubevirt/kubevirt/stargazers","contributors_url":"https://api.github.com/repos/kubevirt/kubevirt/contributors","subscribers_url":"https://api.github.com/repos/kubevirt/kubevirt/subscribers","subscription_url":"https://api.github.com/repos/kubevirt/kubevirt/subscription","commits_url":"https://api.github.com/repos/kubevirt/kubevirt/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubevirt/kubevirt/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubevirt/kubevirt/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubevirt/kubevirt/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubevirt/kubevirt/contents/{+path}","compare_url":"https://api.github.com/repos/kubevirt/kubevirt/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubevirt/kubevirt/merges","archive_url":"https://api.github.com/repos/kubevirt/kubevirt/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubevirt/kubevirt/downloads","issues_url":"https://api.github.com/repos/kubevirt/kubevirt/issues{/number}","pulls_url":"https://api.github.com/repos/kubevirt/kubevirt/pulls{/number}","milestones_url":"https://api.github.com/repos/kubevirt/kubevirt/milestones{/number}","notifications_url":"https://api.github.com/repos/kubevirt/kubevirt/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubevirt/kubevirt/labels{/name}","releases_url":"https://api.github.com/repos/kubevirt/kubevirt/releases{/id}","deployments_url":"https://api.github.com/repos/kubevirt/kubevirt/deployments","created_at":"2016-12-16T21:24:26Z","updated_at":"2017-07-04T12:53:24Z","pushed_at":"2017-07-07T21:02:25Z","git_url":"git://github.com/kubevirt/kubevirt.git","ssh_url":"git@github.com:kubevirt/kubevirt.git","clone_url":"https://github.com/kubevirt/kubevirt.git","svn_url":"https://github.com/kubevirt/kubevirt","homepage":"","size":1935,"stargazers_count":220,"watchers_count":220,"language":"Go","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":44,"mirror_url":null,"open_issues_count":55,"forks":44,"open_issues":55,"watchers":220,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubevirt/kubevirt/pulls/281"},"html":{"href":"https://github.com/kubevirt/kubevirt/pull/281"},"issue":{"href":"https://api.github.com/repos/kubevirt/kubevirt/issues/281"},"comments":{"href":"https://api.github.com/repos/kubevirt/kubevirt/issues/281/comments"},"review_comments":{"href":"https://api.github.com/repos/kubevirt/kubevirt/pulls/281/comments"},"review_comment":{"href":"https://api.github.com/repos/kubevirt/kubevirt/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubevirt/kubevirt/pulls/281/commits"},"statuses":{"href":"https://api.github.com/repos/kubevirt/kubevirt/statuses/f181be30120a4add2c21c9879d133cb16bd5f264"}}}}
{"actor":{"display_login":"rmohr"}}