{"action":"created","comment":{"url":"https://api.github.com/repos/containers/virtcontainers/pulls/comments/144202764","pull_request_review_id":68819653,"id":144202764,"diff_hunk":"@@ -230,13 +278,191 @@ func getLinkByName(netHandle *netlink.Handle, name string, expectedLink netlink.\n \t\tif l, ok := link.(*netlink.Veth); ok {\n \t\t\treturn l, nil\n \t\t}\n+\tcase (&netlink.Macvtap{}).Type():\n+\t\tif l, ok := link.(*netlink.Macvtap); ok {\n+\t\t\treturn l, nil\n+\t\t}\n \tdefault:\n \t\treturn nil, fmt.Errorf(\"Unsupported link type %s\", expectedLink.Type())\n \t}\n \n \treturn nil, fmt.Errorf(\"Incorrect link type %s, expecting %s\", link.Type(), expectedLink.Type())\n }\n \n+func xconnectVMNetwork(netPair *NetworkInterfacePair, connect bool) error {\n+\tswitch DefaultNetInterworkingModel {\n+\tcase ModelBridged:\n+\t\tnetPair.NetInterworkingModel = ModelBridged\n+\t\tif connect {\n+\t\t\treturn bridgeNetworkPair(netPair)\n+\t\t} else {\n+\t\t\treturn unBridgeNetworkPair(*netPair)\n+\t\t}\n+\tcase ModelMacVtap:\n+\t\tnetPair.NetInterworkingModel = ModelMacVtap\n+\t\tif connect {\n+\t\t\treturn tapNetworkPair(netPair)\n+\t\t} else {\n+\t\t\treturn untapNetworkPair(*netPair)\n+\t\t}\n+\tcase ModelEnlightened:\n+\t\treturn fmt.Errorf(\"Unsupported networking model\")\n+\tdefault:\n+\t\treturn fmt.Errorf(\"Invalid networking model\")\n+\t}\n+}\n+\n+func cleanupFds(fds []*os.File, numFds int) {\n+\n+\tmaxFds := len(fds)\n+\n+\tif numFds < maxFds {\n+\t\tmaxFds = numFds\n+\t}\n+\n+\tfor i := 0; i < maxFds; i++ {\n+\t\t_ = fds[i].Close()\n+\t}\n+}\n+\n+func createMacvtapFds(linkIndex int, queues int) ([]*os.File, error) {\n+\tfds := make([]*os.File, queues)\n+\n+\t//mq support\n+\tfor q := 0; q < queues; q++ {\n+\n+\t\ttapDev := fmt.Sprintf(\"/dev/tap%d\", linkIndex)\n+\n+\t\tf, err := os.OpenFile(tapDev, os.O_RDWR, defaultFilePerms)\n+\t\tif err != nil {\n+\t\t\tcleanupFds(fds, q)\n+\t\t\treturn nil, err\n+\t\t}\n+\t\tfds[q] = f\n+\t}\n+\n+\treturn fds, nil\n+}\n+\n+// There is a limitation in the linux kernel that prevents a macvtap/macvlan link\n+// from getting the correct link index when created in a network namespace\n+// https://github.com/clearcontainers/runtime/issues/708\n+//\n+// Till that bug is fixed we need to pick a random non conflicting index and try to\n+// create a link. If that fails, we need to try with another.\n+// All the kernel does not check if the link id conflicts with a link id on the host\n+// hence we need to offset the link id to prevent any overlaps with the host index\n+//\n+// Here the kernel will ensure that there is no race condition\n+\n+const hostLinkOffset = 8192 // Host should not have more than 8k interfaces\n+const linkRange = 0xFFFF    // This will allow upto 2^16 containers\n+const linkRetries = 128     // The numbers of time we try to find a non conflicting index\n+const macvtapWorkaround = true\n+\n+func createMacVtap(netHandle *netlink.Handle, name string, link netlink.Link) (taplink netlink.Link, err error) {\n+\n+\tif !macvtapWorkaround {\n+\t\ttaplink, err = createLink(netHandle, name, link)\n+\t\treturn\n+\t}\n+\n+\tr := rand.New(rand.NewSource(time.Now().UnixNano()))\n+\n+\tfor i := 0; i < linkRetries; i++ {\n+\t\tindex := hostLinkOffset + (r.Int() & linkRange)\n+\t\tlink.Attrs().Index = index\n+\t\ttaplink, err = createLink(netHandle, name, link)\n+\t\tif err == nil {\n+\t\t\tbreak\n+\t\t}\n+\t}\n+\n+\treturn\n+}\n+\n+func tapNetworkPair(netPair *NetworkInterfacePair) error {\n+\tnetHandle, err := netlink.NewHandle()\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\tdefer netHandle.Delete()\n+\n+\tvethLink, err := getLinkByName(netHandle, netPair.VirtIface.Name, &netlink.Veth{})\n+\tif err != nil {\n+\t\treturn fmt.Errorf(\"Could not get veth interface: %s\", err)\n+\t}\n+\tvethLinkAttrs := vethLink.Attrs()\n+\n+\t// Attach the macvtap interface to the underlying container\n+\t// interface. Also picks relevant attributes from the parent\n+\ttapLink, err := createMacVtap(netHandle, netPair.TAPIface.Name,\n+\t\t&netlink.Macvtap{\n+\t\t\tnetlink.Macvlan{\n+\t\t\t\tLinkAttrs: netlink.LinkAttrs{\n+\t\t\t\t\tTxQLen:      vethLinkAttrs.TxQLen,\n+\t\t\t\t\tParentIndex: vethLinkAttrs.Index,\n+\t\t\t\t},\n+\t\t\t},\n+\t\t})\n+\n+\tif err != nil {\n+\t\treturn fmt.Errorf(\"Could not create TAP interface: %s\", err)\n+\t}\n+\n+\t// Save the veth MAC address to the TAP so that it can later be used\n+\t// to build the hypervisor command line. This MAC address has to be\n+\t// the one inside the VM in order to avoid any firewall issues. The\n+\t// bridge created by the network plugin on the host actually expects\n+\t// to see traffic from this MAC address and not another one.\n+\ttapHardAddr := vethLinkAttrs.HardwareAddr\n+\tnetPair.TAPIface.HardAddr = vethLinkAttrs.HardwareAddr.String()\n+\n+\tif err := netHandle.LinkSetMTU(tapLink, vethLinkAttrs.MTU); err != nil {\n+\t\treturn fmt.Errorf(\"Could not set TAP MTU %d: %s\", vethLinkAttrs.MTU, err)\n+\t}\n+\n+\thardAddr, err := net.ParseMAC(netPair.VirtIface.HardAddr)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\tif err := netHandle.LinkSetHardwareAddr(vethLink, hardAddr); err != nil {\n+\t\treturn fmt.Errorf(\"Could not set MAC address %s for veth interface %s: %s\",\n+\t\t\tnetPair.VirtIface.HardAddr, netPair.VirtIface.Name, err)\n+\t}\n+\n+\tif err := netHandle.LinkSetHardwareAddr(tapLink, tapHardAddr); err != nil {\n+\t\treturn fmt.Errorf(\"Could not set MAC address %s for veth interface %s: %s\",\n+\t\t\tnetPair.VirtIface.HardAddr, netPair.VirtIface.Name, err)\n+\t}\n+\n+\tif err := netHandle.LinkSetUp(tapLink); err != nil {\n+\t\treturn fmt.Errorf(\"Could not enable TAP %s: %s\", netPair.TAPIface.Name, err)\n+\t}\n+\n+\tif err := netHandle.LinkSetUp(vethLink); err != nil {\n+\t\treturn fmt.Errorf(\"Could not enable veth %s: %s\", netPair.VirtIface.Name, err)\n+\t}\n+","path":"network.go","position":299,"original_position":278,"commit_id":"385f4dfc0c7b705e73416d81defd448ddf26f3a1","original_commit_id":"f38cf2a2571e2a81fb2527110e3247a952cda936","user":{"login":"sboeuf","id":22890413,"avatar_url":"https://avatars3.githubusercontent.com/u/22890413?v=4","gravatar_id":"","url":"https://api.github.com/users/sboeuf","html_url":"https://github.com/sboeuf","followers_url":"https://api.github.com/users/sboeuf/followers","following_url":"https://api.github.com/users/sboeuf/following{/other_user}","gists_url":"https://api.github.com/users/sboeuf/gists{/gist_id}","starred_url":"https://api.github.com/users/sboeuf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sboeuf/subscriptions","organizations_url":"https://api.github.com/users/sboeuf/orgs","repos_url":"https://api.github.com/users/sboeuf/repos","events_url":"https://api.github.com/users/sboeuf/events{/privacy}","received_events_url":"https://api.github.com/users/sboeuf/received_events","type":"User","site_admin":false},"body":"Don't you think we could try to factorize most of the code in this function `tapNetworkPair()` since a lot is identical with `bridgeNetworkPair()`","created_at":"2017-10-12T06:23:41Z","updated_at":"2017-10-12T06:51:16Z","html_url":"https://github.com/containers/virtcontainers/pull/393#discussion_r144202764","pull_request_url":"https://api.github.com/repos/containers/virtcontainers/pulls/393","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/containers/virtcontainers/pulls/comments/144202764"},"html":{"href":"https://github.com/containers/virtcontainers/pull/393#discussion_r144202764"},"pull_request":{"href":"https://api.github.com/repos/containers/virtcontainers/pulls/393"}}},"pull_request":{"url":"https://api.github.com/repos/containers/virtcontainers/pulls/393","id":144471933,"html_url":"https://github.com/containers/virtcontainers/pull/393","diff_url":"https://github.com/containers/virtcontainers/pull/393.diff","patch_url":"https://github.com/containers/virtcontainers/pull/393.patch","issue_url":"https://api.github.com/repos/containers/virtcontainers/issues/393","number":393,"state":"open","locked":false,"title":"WIP: Use macvlan to connect the VM to the container network","user":{"login":"mcastelino","id":7387737,"avatar_url":"https://avatars2.githubusercontent.com/u/7387737?v=4","gravatar_id":"","url":"https://api.github.com/users/mcastelino","html_url":"https://github.com/mcastelino","followers_url":"https://api.github.com/users/mcastelino/followers","following_url":"https://api.github.com/users/mcastelino/following{/other_user}","gists_url":"https://api.github.com/users/mcastelino/gists{/gist_id}","starred_url":"https://api.github.com/users/mcastelino/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mcastelino/subscriptions","organizations_url":"https://api.github.com/users/mcastelino/orgs","repos_url":"https://api.github.com/users/mcastelino/repos","events_url":"https://api.github.com/users/mcastelino/events{/privacy}","received_events_url":"https://api.github.com/users/mcastelino/received_events","type":"User","site_admin":false},"body":"Networking: Add support for multi-queue mactap\r\n\r\nProvide multiple methods to connect the Virtual machine\r\nto the container network. The current implementation allows\r\nthis to be chosen at a node level. In the future we can\r\nenhance this to be dynamic, where the container interface\r\ntype is used to determine the optimal interconnection method.\r\n\r\nAdd support for multi-queue macvtap as an alternate means to\r\nconnect the container network interface to the virtual machine.\r\n\r\nDepends on: https://github.com/ciao-project/ciao/pull/1510\r\nDepends on: https://github.com/containers/virtcontainers/issues/410\r\n\r\nSigned-off-by: Manohar Castelino <manohar.r.castelino@intel.com>","created_at":"2017-10-03T16:42:41Z","updated_at":"2017-10-12T06:51:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"518d8e49e8d7fc1d84fedc10e7f7f01dd138660b","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/containers/virtcontainers/pulls/393/commits","review_comments_url":"https://api.github.com/repos/containers/virtcontainers/pulls/393/comments","review_comment_url":"https://api.github.com/repos/containers/virtcontainers/pulls/comments{/number}","comments_url":"https://api.github.com/repos/containers/virtcontainers/issues/393/comments","statuses_url":"https://api.github.com/repos/containers/virtcontainers/statuses/385f4dfc0c7b705e73416d81defd448ddf26f3a1","head":{"label":"mcastelino:topic/macvtap","ref":"topic/macvtap","sha":"385f4dfc0c7b705e73416d81defd448ddf26f3a1","user":{"login":"mcastelino","id":7387737,"avatar_url":"https://avatars2.githubusercontent.com/u/7387737?v=4","gravatar_id":"","url":"https://api.github.com/users/mcastelino","html_url":"https://github.com/mcastelino","followers_url":"https://api.github.com/users/mcastelino/followers","following_url":"https://api.github.com/users/mcastelino/following{/other_user}","gists_url":"https://api.github.com/users/mcastelino/gists{/gist_id}","starred_url":"https://api.github.com/users/mcastelino/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mcastelino/subscriptions","organizations_url":"https://api.github.com/users/mcastelino/orgs","repos_url":"https://api.github.com/users/mcastelino/repos","events_url":"https://api.github.com/users/mcastelino/events{/privacy}","received_events_url":"https://api.github.com/users/mcastelino/received_events","type":"User","site_admin":false},"repo":{"id":82324113,"name":"virtcontainers","full_name":"mcastelino/virtcontainers","owner":{"login":"mcastelino","id":7387737,"avatar_url":"https://avatars2.githubusercontent.com/u/7387737?v=4","gravatar_id":"","url":"https://api.github.com/users/mcastelino","html_url":"https://github.com/mcastelino","followers_url":"https://api.github.com/users/mcastelino/followers","following_url":"https://api.github.com/users/mcastelino/following{/other_user}","gists_url":"https://api.github.com/users/mcastelino/gists{/gist_id}","starred_url":"https://api.github.com/users/mcastelino/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mcastelino/subscriptions","organizations_url":"https://api.github.com/users/mcastelino/orgs","repos_url":"https://api.github.com/users/mcastelino/repos","events_url":"https://api.github.com/users/mcastelino/events{/privacy}","received_events_url":"https://api.github.com/users/mcastelino/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mcastelino/virtcontainers","description":"A Go package for building hardware virtualized container runtimes","fork":true,"url":"https://api.github.com/repos/mcastelino/virtcontainers","forks_url":"https://api.github.com/repos/mcastelino/virtcontainers/forks","keys_url":"https://api.github.com/repos/mcastelino/virtcontainers/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mcastelino/virtcontainers/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mcastelino/virtcontainers/teams","hooks_url":"https://api.github.com/repos/mcastelino/virtcontainers/hooks","issue_events_url":"https://api.github.com/repos/mcastelino/virtcontainers/issues/events{/number}","events_url":"https://api.github.com/repos/mcastelino/virtcontainers/events","assignees_url":"https://api.github.com/repos/mcastelino/virtcontainers/assignees{/user}","branches_url":"https://api.github.com/repos/mcastelino/virtcontainers/branches{/branch}","tags_url":"https://api.github.com/repos/mcastelino/virtcontainers/tags","blobs_url":"https://api.github.com/repos/mcastelino/virtcontainers/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mcastelino/virtcontainers/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mcastelino/virtcontainers/git/refs{/sha}","trees_url":"https://api.github.com/repos/mcastelino/virtcontainers/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mcastelino/virtcontainers/statuses/{sha}","languages_url":"https://api.github.com/repos/mcastelino/virtcontainers/languages","stargazers_url":"https://api.github.com/repos/mcastelino/virtcontainers/stargazers","contributors_url":"https://api.github.com/repos/mcastelino/virtcontainers/contributors","subscribers_url":"https://api.github.com/repos/mcastelino/virtcontainers/subscribers","subscription_url":"https://api.github.com/repos/mcastelino/virtcontainers/subscription","commits_url":"https://api.github.com/repos/mcastelino/virtcontainers/commits{/sha}","git_commits_url":"https://api.github.com/repos/mcastelino/virtcontainers/git/commits{/sha}","comments_url":"https://api.github.com/repos/mcastelino/virtcontainers/comments{/number}","issue_comment_url":"https://api.github.com/repos/mcastelino/virtcontainers/issues/comments{/number}","contents_url":"https://api.github.com/repos/mcastelino/virtcontainers/contents/{+path}","compare_url":"https://api.github.com/repos/mcastelino/virtcontainers/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mcastelino/virtcontainers/merges","archive_url":"https://api.github.com/repos/mcastelino/virtcontainers/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mcastelino/virtcontainers/downloads","issues_url":"https://api.github.com/repos/mcastelino/virtcontainers/issues{/number}","pulls_url":"https://api.github.com/repos/mcastelino/virtcontainers/pulls{/number}","milestones_url":"https://api.github.com/repos/mcastelino/virtcontainers/milestones{/number}","notifications_url":"https://api.github.com/repos/mcastelino/virtcontainers/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mcastelino/virtcontainers/labels{/name}","releases_url":"https://api.github.com/repos/mcastelino/virtcontainers/releases{/id}","deployments_url":"https://api.github.com/repos/mcastelino/virtcontainers/deployments","created_at":"2017-02-17T18:01:58Z","updated_at":"2017-02-17T18:01:59Z","pushed_at":"2017-10-12T01:08:45Z","git_url":"git://github.com/mcastelino/virtcontainers.git","ssh_url":"git@github.com:mcastelino/virtcontainers.git","clone_url":"https://github.com/mcastelino/virtcontainers.git","svn_url":"https://github.com/mcastelino/virtcontainers","homepage":null,"size":7334,"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":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"containers:master","ref":"master","sha":"8776aa26767ad804738b7032951aa82e07c8286b","user":{"login":"containers","id":5874934,"avatar_url":"https://avatars3.githubusercontent.com/u/5874934?v=4","gravatar_id":"","url":"https://api.github.com/users/containers","html_url":"https://github.com/containers","followers_url":"https://api.github.com/users/containers/followers","following_url":"https://api.github.com/users/containers/following{/other_user}","gists_url":"https://api.github.com/users/containers/gists{/gist_id}","starred_url":"https://api.github.com/users/containers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/containers/subscriptions","organizations_url":"https://api.github.com/users/containers/orgs","repos_url":"https://api.github.com/users/containers/repos","events_url":"https://api.github.com/users/containers/events{/privacy}","received_events_url":"https://api.github.com/users/containers/received_events","type":"Organization","site_admin":false},"repo":{"id":71125072,"name":"virtcontainers","full_name":"containers/virtcontainers","owner":{"login":"containers","id":5874934,"avatar_url":"https://avatars3.githubusercontent.com/u/5874934?v=4","gravatar_id":"","url":"https://api.github.com/users/containers","html_url":"https://github.com/containers","followers_url":"https://api.github.com/users/containers/followers","following_url":"https://api.github.com/users/containers/following{/other_user}","gists_url":"https://api.github.com/users/containers/gists{/gist_id}","starred_url":"https://api.github.com/users/containers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/containers/subscriptions","organizations_url":"https://api.github.com/users/containers/orgs","repos_url":"https://api.github.com/users/containers/repos","events_url":"https://api.github.com/users/containers/events{/privacy}","received_events_url":"https://api.github.com/users/containers/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/containers/virtcontainers","description":"A Go package for building hardware virtualized container runtimes","fork":false,"url":"https://api.github.com/repos/containers/virtcontainers","forks_url":"https://api.github.com/repos/containers/virtcontainers/forks","keys_url":"https://api.github.com/repos/containers/virtcontainers/keys{/key_id}","collaborators_url":"https://api.github.com/repos/containers/virtcontainers/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/containers/virtcontainers/teams","hooks_url":"https://api.github.com/repos/containers/virtcontainers/hooks","issue_events_url":"https://api.github.com/repos/containers/virtcontainers/issues/events{/number}","events_url":"https://api.github.com/repos/containers/virtcontainers/events","assignees_url":"https://api.github.com/repos/containers/virtcontainers/assignees{/user}","branches_url":"https://api.github.com/repos/containers/virtcontainers/branches{/branch}","tags_url":"https://api.github.com/repos/containers/virtcontainers/tags","blobs_url":"https://api.github.com/repos/containers/virtcontainers/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/containers/virtcontainers/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/containers/virtcontainers/git/refs{/sha}","trees_url":"https://api.github.com/repos/containers/virtcontainers/git/trees{/sha}","statuses_url":"https://api.github.com/repos/containers/virtcontainers/statuses/{sha}","languages_url":"https://api.github.com/repos/containers/virtcontainers/languages","stargazers_url":"https://api.github.com/repos/containers/virtcontainers/stargazers","contributors_url":"https://api.github.com/repos/containers/virtcontainers/contributors","subscribers_url":"https://api.github.com/repos/containers/virtcontainers/subscribers","subscription_url":"https://api.github.com/repos/containers/virtcontainers/subscription","commits_url":"https://api.github.com/repos/containers/virtcontainers/commits{/sha}","git_commits_url":"https://api.github.com/repos/containers/virtcontainers/git/commits{/sha}","comments_url":"https://api.github.com/repos/containers/virtcontainers/comments{/number}","issue_comment_url":"https://api.github.com/repos/containers/virtcontainers/issues/comments{/number}","contents_url":"https://api.github.com/repos/containers/virtcontainers/contents/{+path}","compare_url":"https://api.github.com/repos/containers/virtcontainers/compare/{base}...{head}","merges_url":"https://api.github.com/repos/containers/virtcontainers/merges","archive_url":"https://api.github.com/repos/containers/virtcontainers/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/containers/virtcontainers/downloads","issues_url":"https://api.github.com/repos/containers/virtcontainers/issues{/number}","pulls_url":"https://api.github.com/repos/containers/virtcontainers/pulls{/number}","milestones_url":"https://api.github.com/repos/containers/virtcontainers/milestones{/number}","notifications_url":"https://api.github.com/repos/containers/virtcontainers/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/containers/virtcontainers/labels{/name}","releases_url":"https://api.github.com/repos/containers/virtcontainers/releases{/id}","deployments_url":"https://api.github.com/repos/containers/virtcontainers/deployments","created_at":"2016-10-17T10:08:28Z","updated_at":"2017-10-10T19:06:20Z","pushed_at":"2017-10-12T01:08:47Z","git_url":"git://github.com/containers/virtcontainers.git","ssh_url":"git@github.com:containers/virtcontainers.git","clone_url":"https://github.com/containers/virtcontainers.git","svn_url":"https://github.com/containers/virtcontainers","homepage":null,"size":7352,"stargazers_count":44,"watchers_count":44,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"open_issues_count":44,"forks":18,"open_issues":44,"watchers":44,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/containers/virtcontainers/pulls/393"},"html":{"href":"https://github.com/containers/virtcontainers/pull/393"},"issue":{"href":"https://api.github.com/repos/containers/virtcontainers/issues/393"},"comments":{"href":"https://api.github.com/repos/containers/virtcontainers/issues/393/comments"},"review_comments":{"href":"https://api.github.com/repos/containers/virtcontainers/pulls/393/comments"},"review_comment":{"href":"https://api.github.com/repos/containers/virtcontainers/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/containers/virtcontainers/pulls/393/commits"},"statuses":{"href":"https://api.github.com/repos/containers/virtcontainers/statuses/385f4dfc0c7b705e73416d81defd448ddf26f3a1"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"sboeuf"}}