{"action":"created","comment":{"url":"https://api.github.com/repos/kata-containers/runtime/pulls/comments/215636701","pull_request_review_id":152881974,"id":215636701,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNTYzNjcwMQ==","diff_hunk":"@@ -0,0 +1,613 @@\n+// Copyright (c) 2018 Intel Corporation\n+//\n+// SPDX-License-Identifier: Apache-2.0\n+//\n+\n+package main\n+\n+import (\n+\t\"encoding/json\"\n+\t\"flag\"\n+\t\"fmt\"\n+\t\"io/ioutil\"\n+\t\"log/syslog\"\n+\t\"net\"\n+\t\"os\"\n+\t\"os/exec\"\n+\t\"path/filepath\"\n+\t\"strings\"\n+\t\"time\"\n+\n+\t\"github.com/sirupsen/logrus\"\n+\tlSyslog \"github.com/sirupsen/logrus/hooks/syslog\"\n+\t\"github.com/vishvananda/netlink\"\n+\t\"golang.org/x/sys/unix\"\n+)\n+\n+// The following types and structures have to be kept in sync with the\n+// description of the agent protocol. Those definitions need to be in their\n+// own separate package so that they can be imported directly from this code.\n+// The reason for not importing them now, is because importing the whole agent\n+// protocol adds up too much overhead because of the grpc protocol involved.\n+\n+// IPFamily define the IP address family type.\n+type IPFamily int32\n+\n+// IPAddress describes the IP address format expected by Kata API.\n+type IPAddress struct {\n+\tFamily  IPFamily `json:\"family,omitempty\"`\n+\tAddress string   `json:\"address,omitempty\"`\n+\tMask    string   `json:\"mask,omitempty\"`\n+}\n+\n+// Interface describes the network interface format expected by Kata API.\n+type Interface struct {\n+\tDevice      string       `json:\"device,omitempty\"`\n+\tName        string       `json:\"name,omitempty\"`\n+\tIPAddresses []*IPAddress `json:\"IPAddresses,omitempty\"`\n+\tMtu         uint64       `json:\"mtu,omitempty\"`\n+\tHwAddr      string       `json:\"hwAddr,omitempty\"`\n+\tPciAddr     string       `json:\"pciAddr,omitempty\"`\n+}\n+\n+// Route describes the network route format expected by Kata API.\n+type Route struct {\n+\tDest    string `json:\"dest,omitempty\"`\n+\tGateway string `json:\"gateway,omitempty\"`\n+\tDevice  string `json:\"device,omitempty\"`\n+\tSource  string `json:\"source,omitempty\"`\n+\tScope   uint32 `json:\"scope,omitempty\"`\n+}\n+\n+const (\n+\tnetmonName = \"kata-netmon\"\n+\n+\tkataCmd              = \"kata-network\"\n+\tkataCLIAddIfaceCmd   = \"add-iface\"\n+\tkataCLIDelIfaceCmd   = \"del-iface\"\n+\tkataCLIUpdtRoutesCmd = \"update-routes\"\n+\n+\tkataSuffix = \"kata\"\n+\n+\t// For simplicity the code will only focus on IPv4 addresses for now.\n+\tnetlinkFamily = netlink.FAMILY_V4\n+\n+\tstorageParentPath = \"/var/run/kata-containers/netmon/sbs\"\n+\tstorageDirPerm    = 0750\n+\n+\t// sharedFile is the name of the file that will be used to share\n+\t// the data between this process and the kata-runtime process\n+\t// responsible for updating the network.\n+\tsharedFile      = \"shared.json\"\n+\tstorageFilePerm = 0640\n+)\n+\n+// version is the netmon version. This variable is populated at build time.\n+var version = \"unknown\"\n+\n+type netmonParams struct {\n+\tsandboxID   string\n+\truntimePath string\n+\tdebug       bool\n+\tlogLevel    string\n+}\n+\n+type netmon struct {\n+\tnetmonParams\n+\n+\tstoragePath string\n+\tsharedFile  string\n+\n+\tnetIfaces map[int]Interface\n+\n+\tlinkUpdateCh chan netlink.LinkUpdate\n+\tlinkDoneCh   chan struct{}\n+\n+\trtUpdateCh chan netlink.RouteUpdate\n+\trtDoneCh   chan struct{}\n+\n+\tnetHandler *netlink.Handle\n+}\n+\n+var netmonLog = logrus.New()\n+\n+func printVersion() {\n+\tfmt.Printf(\"%s version %s\\n\", netmonName, version)\n+}\n+\n+func parseOptions() netmonParams {\n+\tvar version bool\n+\n+\tparams := netmonParams{}\n+\n+\tflag.BoolVar(&params.debug, \"d\", false, \"enable debug mode\")\n+\tflag.BoolVar(&version, \"v\", false, \"display program version and exit\")\n+\tflag.StringVar(&params.sandboxID, \"s\", \"\", \"sandbox id (required)\")\n+\tflag.StringVar(&params.runtimePath, \"r\", \"\", \"runtime path (required)\")\n+\tflag.StringVar(&params.logLevel, \"log\", \"warn\",\n+\t\t\"log messages above specified level: debug, warn, error, fatal or panic\")\n+\n+\tflag.Parse()\n+\n+\tif version {\n+\t\tprintVersion()\n+\t\tos.Exit(0)\n+\t}\n+\n+\tif params.sandboxID == \"\" {\n+\t\tfmt.Fprintf(os.Stderr, \"Error: sandbox id is empty, one must be provided\\n\")\n+\t\tflag.PrintDefaults()\n+\t\tos.Exit(1)\n+\t}\n+\n+\tif params.runtimePath == \"\" {\n+\t\tfmt.Fprintf(os.Stderr, \"Error: runtime path is empty, one must be provided\\n\")\n+\t\tflag.PrintDefaults()\n+\t\tos.Exit(1)\n+\t}\n+\n+\treturn params\n+}\n+\n+func newNetmon(params netmonParams) (*netmon, error) {\n+\thandler, err := netlink.NewHandle(netlinkFamily)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\tn := &netmon{\n+\t\tnetmonParams: params,\n+\t\tstoragePath:  filepath.Join(storageParentPath, params.sandboxID),\n+\t\tsharedFile:   filepath.Join(storageParentPath, params.sandboxID, sharedFile),\n+\t\tnetIfaces:    make(map[int]Interface),\n+\t\tlinkUpdateCh: make(chan netlink.LinkUpdate),\n+\t\tlinkDoneCh:   make(chan struct{}),\n+\t\trtUpdateCh:   make(chan netlink.RouteUpdate),\n+\t\trtDoneCh:     make(chan struct{}),\n+\t\tnetHandler:   handler,\n+\t}\n+\n+\tif err := os.MkdirAll(n.storagePath, storageDirPerm); err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\treturn n, nil\n+}\n+\n+func (n *netmon) cleanup() {\n+\tos.RemoveAll(n.storagePath)\n+\tn.netHandler.Delete()\n+\tclose(n.linkDoneCh)\n+\tclose(n.rtDoneCh)\n+}\n+\n+func (n *netmon) logger() *logrus.Entry {\n+\tfields := logrus.Fields{\n+\t\t\"name\":   netmonName,\n+\t\t\"pid\":    os.Getpid(),\n+\t\t\"source\": \"netmon\",\n+\t}\n+\n+\tif n.sandboxID != \"\" {\n+\t\tfields[\"sandbox\"] = n.sandboxID\n+\t}\n+\n+\treturn netmonLog.WithFields(fields)\n+}\n+\n+func (n *netmon) setupLogger() error {\n+\tlevel, err := logrus.ParseLevel(n.logLevel)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\tnetmonLog.SetLevel(level)\n+\n+\tnetmonLog.Formatter = &logrus.TextFormatter{TimestampFormat: time.RFC3339Nano}\n+\n+\thook, err := lSyslog.NewSyslogHook(\"\", \"\", syslog.LOG_INFO|syslog.LOG_USER, netmonName)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\tnetmonLog.AddHook(hook)\n+\n+\tannounceFields := logrus.Fields{\n+\t\t\"runtime-path\": n.runtimePath,\n+\t\t\"debug\":        n.debug,\n+\t\t\"log-level\":    n.logLevel,\n+\t}\n+\n+\tn.logger().WithFields(announceFields).Info(\"announce\")\n+\n+\treturn nil\n+}\n+\n+func (n *netmon) listenNetlinkEvents() error {\n+\tif err := netlink.LinkSubscribe(n.linkUpdateCh, n.linkDoneCh); err != nil {\n+\t\treturn err\n+\t}\n+\n+\treturn netlink.RouteSubscribe(n.rtUpdateCh, n.rtDoneCh)\n+}\n+\n+func convertInterface(linkAttrs *netlink.LinkAttrs, addrs []netlink.Addr) Interface {","path":"netmon/netmon.go","position":234,"original_position":234,"commit_id":"2a6513282fbdd6728b14e006d5f4e1551d9337e9","original_commit_id":"2a6513282fbdd6728b14e006d5f4e1551d9337e9","user":{"login":"jodh-intel","id":20315601,"node_id":"MDQ6VXNlcjIwMzE1NjAx","avatar_url":"https://avatars1.githubusercontent.com/u/20315601?v=4","gravatar_id":"","url":"https://api.github.com/users/jodh-intel","html_url":"https://github.com/jodh-intel","followers_url":"https://api.github.com/users/jodh-intel/followers","following_url":"https://api.github.com/users/jodh-intel/following{/other_user}","gists_url":"https://api.github.com/users/jodh-intel/gists{/gist_id}","starred_url":"https://api.github.com/users/jodh-intel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jodh-intel/subscriptions","organizations_url":"https://api.github.com/users/jodh-intel/orgs","repos_url":"https://api.github.com/users/jodh-intel/repos","events_url":"https://api.github.com/users/jodh-intel/events{/privacy}","received_events_url":"https://api.github.com/users/jodh-intel/received_events","type":"User","site_admin":false},"body":"- Could you put a brief comment here explaining how the interface is being converted? Same comment for other functions like `scanNetwork()`, `convertRoutes()`).\r\n\r\n- Also, functions like this can be unit-tested I think?","created_at":"2018-09-06T14:01:02Z","updated_at":"2018-09-06T14:22:12Z","html_url":"https://github.com/kata-containers/runtime/pull/534#discussion_r215636701","pull_request_url":"https://api.github.com/repos/kata-containers/runtime/pulls/534","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/kata-containers/runtime/pulls/comments/215636701"},"html":{"href":"https://github.com/kata-containers/runtime/pull/534#discussion_r215636701"},"pull_request":{"href":"https://api.github.com/repos/kata-containers/runtime/pulls/534"}}},"pull_request":{"url":"https://api.github.com/repos/kata-containers/runtime/pulls/534","id":204890294,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA0ODkwMjk0","html_url":"https://github.com/kata-containers/runtime/pull/534","diff_url":"https://github.com/kata-containers/runtime/pull/534.diff","patch_url":"https://github.com/kata-containers/runtime/pull/534.patch","issue_url":"https://api.github.com/repos/kata-containers/runtime/issues/534","number":534,"state":"open","locked":false,"title":"virtcontainers: netmon: Monitor network changes","user":{"login":"sboeuf","id":22890413,"node_id":"MDQ6VXNlcjIyODkwNDEz","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":"This commit introduces a new watcher dedicated to the monitoring\r\nof a specific network namespace in order to detect any change that\r\ncould happen to the network.\r\n\r\nAs a result of such a detection, the watcher should call into the\r\nappropriate runtime path with the correct arguments to modify the\r\npod network accordingly.\r\n\r\nFixes #170\r\n\r\nSigned-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>","created_at":"2018-07-30T18:27:25Z","updated_at":"2018-09-06T14:22:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a4c3d3cde3b550d893a8fe22e1a12301d2928b35","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/kata-containers/runtime/pulls/534/commits","review_comments_url":"https://api.github.com/repos/kata-containers/runtime/pulls/534/comments","review_comment_url":"https://api.github.com/repos/kata-containers/runtime/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kata-containers/runtime/issues/534/comments","statuses_url":"https://api.github.com/repos/kata-containers/runtime/statuses/2a6513282fbdd6728b14e006d5f4e1551d9337e9","head":{"label":"sboeuf:monitor_network_golang","ref":"monitor_network_golang","sha":"2a6513282fbdd6728b14e006d5f4e1551d9337e9","user":{"login":"sboeuf","id":22890413,"node_id":"MDQ6VXNlcjIyODkwNDEz","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},"repo":{"id":125155717,"node_id":"MDEwOlJlcG9zaXRvcnkxMjUxNTU3MTc=","name":"runtime-1","full_name":"sboeuf/runtime-1","owner":{"login":"sboeuf","id":22890413,"node_id":"MDQ6VXNlcjIyODkwNDEz","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},"private":false,"html_url":"https://github.com/sboeuf/runtime-1","description":"Kata Containers runtimes","fork":true,"url":"https://api.github.com/repos/sboeuf/runtime-1","forks_url":"https://api.github.com/repos/sboeuf/runtime-1/forks","keys_url":"https://api.github.com/repos/sboeuf/runtime-1/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sboeuf/runtime-1/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sboeuf/runtime-1/teams","hooks_url":"https://api.github.com/repos/sboeuf/runtime-1/hooks","issue_events_url":"https://api.github.com/repos/sboeuf/runtime-1/issues/events{/number}","events_url":"https://api.github.com/repos/sboeuf/runtime-1/events","assignees_url":"https://api.github.com/repos/sboeuf/runtime-1/assignees{/user}","branches_url":"https://api.github.com/repos/sboeuf/runtime-1/branches{/branch}","tags_url":"https://api.github.com/repos/sboeuf/runtime-1/tags","blobs_url":"https://api.github.com/repos/sboeuf/runtime-1/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sboeuf/runtime-1/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sboeuf/runtime-1/git/refs{/sha}","trees_url":"https://api.github.com/repos/sboeuf/runtime-1/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sboeuf/runtime-1/statuses/{sha}","languages_url":"https://api.github.com/repos/sboeuf/runtime-1/languages","stargazers_url":"https://api.github.com/repos/sboeuf/runtime-1/stargazers","contributors_url":"https://api.github.com/repos/sboeuf/runtime-1/contributors","subscribers_url":"https://api.github.com/repos/sboeuf/runtime-1/subscribers","subscription_url":"https://api.github.com/repos/sboeuf/runtime-1/subscription","commits_url":"https://api.github.com/repos/sboeuf/runtime-1/commits{/sha}","git_commits_url":"https://api.github.com/repos/sboeuf/runtime-1/git/commits{/sha}","comments_url":"https://api.github.com/repos/sboeuf/runtime-1/comments{/number}","issue_comment_url":"https://api.github.com/repos/sboeuf/runtime-1/issues/comments{/number}","contents_url":"https://api.github.com/repos/sboeuf/runtime-1/contents/{+path}","compare_url":"https://api.github.com/repos/sboeuf/runtime-1/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sboeuf/runtime-1/merges","archive_url":"https://api.github.com/repos/sboeuf/runtime-1/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sboeuf/runtime-1/downloads","issues_url":"https://api.github.com/repos/sboeuf/runtime-1/issues{/number}","pulls_url":"https://api.github.com/repos/sboeuf/runtime-1/pulls{/number}","milestones_url":"https://api.github.com/repos/sboeuf/runtime-1/milestones{/number}","notifications_url":"https://api.github.com/repos/sboeuf/runtime-1/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sboeuf/runtime-1/labels{/name}","releases_url":"https://api.github.com/repos/sboeuf/runtime-1/releases{/id}","deployments_url":"https://api.github.com/repos/sboeuf/runtime-1/deployments","created_at":"2018-03-14T04:36:55Z","updated_at":"2018-03-14T04:36:57Z","pushed_at":"2018-09-05T21:24:30Z","git_url":"git://github.com/sboeuf/runtime-1.git","ssh_url":"git@github.com:sboeuf/runtime-1.git","clone_url":"https://github.com/sboeuf/runtime-1.git","svn_url":"https://github.com/sboeuf/runtime-1","homepage":"","size":5103,"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,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kata-containers:master","ref":"master","sha":"56ba8adc3ac30ba3d30d420773512a6f5ae4d521","user":{"login":"kata-containers","id":33289952,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMzMjg5OTUy","avatar_url":"https://avatars3.githubusercontent.com/u/33289952?v=4","gravatar_id":"","url":"https://api.github.com/users/kata-containers","html_url":"https://github.com/kata-containers","followers_url":"https://api.github.com/users/kata-containers/followers","following_url":"https://api.github.com/users/kata-containers/following{/other_user}","gists_url":"https://api.github.com/users/kata-containers/gists{/gist_id}","starred_url":"https://api.github.com/users/kata-containers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kata-containers/subscriptions","organizations_url":"https://api.github.com/users/kata-containers/orgs","repos_url":"https://api.github.com/users/kata-containers/repos","events_url":"https://api.github.com/users/kata-containers/events{/privacy}","received_events_url":"https://api.github.com/users/kata-containers/received_events","type":"Organization","site_admin":false},"repo":{"id":110539997,"node_id":"MDEwOlJlcG9zaXRvcnkxMTA1Mzk5OTc=","name":"runtime","full_name":"kata-containers/runtime","owner":{"login":"kata-containers","id":33289952,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMzMjg5OTUy","avatar_url":"https://avatars3.githubusercontent.com/u/33289952?v=4","gravatar_id":"","url":"https://api.github.com/users/kata-containers","html_url":"https://github.com/kata-containers","followers_url":"https://api.github.com/users/kata-containers/followers","following_url":"https://api.github.com/users/kata-containers/following{/other_user}","gists_url":"https://api.github.com/users/kata-containers/gists{/gist_id}","starred_url":"https://api.github.com/users/kata-containers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kata-containers/subscriptions","organizations_url":"https://api.github.com/users/kata-containers/orgs","repos_url":"https://api.github.com/users/kata-containers/repos","events_url":"https://api.github.com/users/kata-containers/events{/privacy}","received_events_url":"https://api.github.com/users/kata-containers/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kata-containers/runtime","description":"Kata Containers runtime","fork":false,"url":"https://api.github.com/repos/kata-containers/runtime","forks_url":"https://api.github.com/repos/kata-containers/runtime/forks","keys_url":"https://api.github.com/repos/kata-containers/runtime/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kata-containers/runtime/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kata-containers/runtime/teams","hooks_url":"https://api.github.com/repos/kata-containers/runtime/hooks","issue_events_url":"https://api.github.com/repos/kata-containers/runtime/issues/events{/number}","events_url":"https://api.github.com/repos/kata-containers/runtime/events","assignees_url":"https://api.github.com/repos/kata-containers/runtime/assignees{/user}","branches_url":"https://api.github.com/repos/kata-containers/runtime/branches{/branch}","tags_url":"https://api.github.com/repos/kata-containers/runtime/tags","blobs_url":"https://api.github.com/repos/kata-containers/runtime/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kata-containers/runtime/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kata-containers/runtime/git/refs{/sha}","trees_url":"https://api.github.com/repos/kata-containers/runtime/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kata-containers/runtime/statuses/{sha}","languages_url":"https://api.github.com/repos/kata-containers/runtime/languages","stargazers_url":"https://api.github.com/repos/kata-containers/runtime/stargazers","contributors_url":"https://api.github.com/repos/kata-containers/runtime/contributors","subscribers_url":"https://api.github.com/repos/kata-containers/runtime/subscribers","subscription_url":"https://api.github.com/repos/kata-containers/runtime/subscription","commits_url":"https://api.github.com/repos/kata-containers/runtime/commits{/sha}","git_commits_url":"https://api.github.com/repos/kata-containers/runtime/git/commits{/sha}","comments_url":"https://api.github.com/repos/kata-containers/runtime/comments{/number}","issue_comment_url":"https://api.github.com/repos/kata-containers/runtime/issues/comments{/number}","contents_url":"https://api.github.com/repos/kata-containers/runtime/contents/{+path}","compare_url":"https://api.github.com/repos/kata-containers/runtime/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kata-containers/runtime/merges","archive_url":"https://api.github.com/repos/kata-containers/runtime/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kata-containers/runtime/downloads","issues_url":"https://api.github.com/repos/kata-containers/runtime/issues{/number}","pulls_url":"https://api.github.com/repos/kata-containers/runtime/pulls{/number}","milestones_url":"https://api.github.com/repos/kata-containers/runtime/milestones{/number}","notifications_url":"https://api.github.com/repos/kata-containers/runtime/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kata-containers/runtime/labels{/name}","releases_url":"https://api.github.com/repos/kata-containers/runtime/releases{/id}","deployments_url":"https://api.github.com/repos/kata-containers/runtime/deployments","created_at":"2017-11-13T11:29:03Z","updated_at":"2018-09-06T13:43:43Z","pushed_at":"2018-09-06T13:43:33Z","git_url":"git://github.com/kata-containers/runtime.git","ssh_url":"git@github.com:kata-containers/runtime.git","clone_url":"https://github.com/kata-containers/runtime.git","svn_url":"https://github.com/kata-containers/runtime","homepage":"","size":4995,"stargazers_count":480,"watchers_count":480,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":106,"mirror_url":null,"archived":false,"open_issues_count":174,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":106,"open_issues":174,"watchers":480,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kata-containers/runtime/pulls/534"},"html":{"href":"https://github.com/kata-containers/runtime/pull/534"},"issue":{"href":"https://api.github.com/repos/kata-containers/runtime/issues/534"},"comments":{"href":"https://api.github.com/repos/kata-containers/runtime/issues/534/comments"},"review_comments":{"href":"https://api.github.com/repos/kata-containers/runtime/pulls/534/comments"},"review_comment":{"href":"https://api.github.com/repos/kata-containers/runtime/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kata-containers/runtime/pulls/534/commits"},"statuses":{"href":"https://api.github.com/repos/kata-containers/runtime/statuses/2a6513282fbdd6728b14e006d5f4e1551d9337e9"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jodh-intel"}}