{"action":"created","comment":{"url":"https://api.github.com/repos/kata-containers/runtime/pulls/comments/182429584","pull_request_review_id":113213055,"id":182429584,"diff_hunk":"@@ -0,0 +1,1251 @@\n+/*\n+ * This file is part of kata-runtime.\n+ *\n+ * Copyright (C) 2018 Intel Corporation\n+ *\n+ * This program is free software; you can redistribute it and/or\n+ * modify it under the terms of the GNU General Public License\n+ * as published by the Free Software Foundation; either version 2\n+ * of the License, or (at your option) any later version.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU General Public License\n+ * along with this program; if not, write to the Free Software\n+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n+ */\n+\n+#define _GNU_SOURCE\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <stdbool.h>\n+#include <string.h>\n+#include <unistd.h>\n+#include <errno.h>\n+#include <sys/types.h>\n+#include <sys/stat.h>\n+#include <sys/wait.h>\n+#include <fcntl.h>\n+#include <sched.h>\n+#include <asm/types.h>\n+#include <sys/socket.h>\n+#include <net/if.h>\n+#include <netinet/in.h>\n+#include <linux/netlink.h>\n+#include <linux/rtnetlink.h>\n+#include <arpa/inet.h>\n+#include <ifaddrs.h>\n+#include <netdb.h>\n+#include <sys/ioctl.h>\n+#include <syslog.h>\n+#include <getopt.h>\n+\n+#define PROGRAM_NAME \"netns-watcher\"\n+\n+#define MAX_IFACES  50\n+#define INIT_IF_IDX -1\n+\n+bool debug = false;\n+\n+struct watcher_params {\n+\tchar *pod_id;\n+\tchar *runtime_path;\n+\tchar *netns_path;\n+};\n+\n+struct ip_addr {\n+\tunsigned char  family;\n+\tchar           *addr;\n+\tstruct ip_addr *next;\n+};\n+\n+struct iface {\n+\tint            idx;\n+\tchar           *hw_addr;\n+\tchar           *name;\n+\tchar           *mtu;\n+\tstruct ip_addr *ip_addrs;\n+};\n+\n+struct route {\n+\tchar *src;\n+\tchar *dst;\n+\tchar *gw;\n+\tchar *dev;\n+};\n+\n+/* \n+ * Global interface list used to keep track of the interfaces and their\n+ * parameters.\n+ */\n+struct iface iface_list[MAX_IFACES];\n+\n+/*\n+ * Print full list of interfaces.\n+ */\n+void print_iface_list() {\n+\tint i;\n+\n+\tfor (i = 0; i < MAX_IFACES; i++) {\n+\t\tif (iface_list[i].idx == INIT_IF_IDX) {\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tprintf(\"IFACE %d\\n\", i);\n+\t\tprintf(\"\\tidx     = %d\\n\", iface_list[i].idx);\n+\t\tprintf(\"\\thw_addr = %s\\n\", iface_list[i].hw_addr);\n+\t\tprintf(\"\\tname    = %s\\n\", iface_list[i].name);\n+\t\tprintf(\"\\tmtu     = %s\\n\", iface_list[i].mtu);\n+\n+\t\tstruct ip_addr *ipa = iface_list[i].ip_addrs;\n+\t\tif (!ipa) {\n+\t\t\tprintf(\"\\n\");\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tprintf(\"\\tip_addrs\\n\");\n+\t\tprintf(\"\\t    |---- ip_addr = %s, family = %d\\n\",\n+\t\t\t\tipa->addr, ipa->family);\n+\t\twhile (ipa->next) {\n+\t\t\tprintf(\"\\t    |---- ip_addr = %s, family = %d\\n\",\n+\t\t\t\t\tipa->next->addr, ipa->next->family);\n+\t\t\tipa = ipa->next;\n+\t\t} \n+\n+\t\tprintf(\"\\n\");\n+\t}\n+}\n+\n+/*\n+ * Print program usage.\n+ */\n+void print_usage(void)\n+{\n+\tprintf(\"Usage: %s [options]\\n\\n\", PROGRAM_NAME);\n+\tprintf(\" -d, --debug        Enable debug output\\n\");\n+\tprintf(\" -h, --help         Display usage\\n\");\n+\tprintf(\" -n, --netns-path   Network namespace path (required)\\n\");\n+\tprintf(\" -p, --pod-id       Pod ID (required)\\n\");\n+\tprintf(\" -r, --runtime-path Runtime path (required)\\n\");\n+\tprintf(\" -v, --version      Show version\\n\");\n+\tprintf(\"\\n\");\n+}\n+\n+/*\n+ * Print version information.\n+ */\n+void print_version(void)\n+{\n+\tprintf(\"%s v0.1\\n\", PROGRAM_NAME);\n+}\n+\n+/*\n+ * Free internal fields of the watcher_params structure.\n+ */\n+void free_watcher_params(struct watcher_params *params)\n+{\n+\tif (!params) {\n+\t\treturn;\n+\t}\n+\n+\tfree(params->netns_path);\n+\tparams->netns_path = NULL;\n+\n+\tfree(params->pod_id);\n+\tparams->pod_id = NULL;\n+\n+\tfree(params->runtime_path);\n+\tparams->runtime_path = NULL;\n+}\n+\n+/*\n+ * Free internal fields of the ip_addr structure.\n+ */\n+void free_ip_addr(struct ip_addr *ipa) {\n+\tstruct ip_addr *ipa_next, *ipa_curr;\n+\n+\tif (!ipa) {\n+\t\treturn;\n+\t}\n+\n+\tfree(ipa->addr);\n+\tipa->addr = NULL;\n+\n+\tfor (ipa_curr = ipa->next; ipa_curr; ipa_curr = ipa_next) {\n+\t\tipa_next = ipa_curr->next;\n+\n+\t\tfree(ipa_curr->addr);\n+\t\tipa_curr->addr = NULL;\n+\n+\t\tfree(ipa_curr);\n+\t\tipa_curr = NULL;\n+\t}\n+}\n+\n+/*\n+ * Free internal fields of the iface structure.\n+ */\n+void free_iface(struct iface *nif) {\n+\tint i;\n+\n+\tif (!nif) {\n+\t\treturn;\n+\t}\n+\n+\tfree(nif->hw_addr);\n+\tnif->hw_addr = NULL;\n+\n+\tfree(nif->name);\n+\tnif->name = NULL;\n+\n+\tfree(nif->mtu);\n+\tnif->mtu = NULL;\n+\n+\tif (nif->ip_addrs) {\n+\t\tfree_ip_addr(nif->ip_addrs);\n+\t}\n+\tfree(nif->ip_addrs);\n+\tnif->ip_addrs = NULL;\n+}\n+\n+/*\n+ * Free internal fields of the route structure.\n+ */\n+void free_route(struct route *rt) {\n+\tfree(rt->src);\n+\trt->src = NULL;\n+\n+\tfree(rt->dst);\n+\trt->dst = NULL;\n+\n+\tfree(rt->gw);\n+\trt->gw = NULL;\n+\n+\tfree(rt->dev);\n+\trt->dev = NULL;\n+}\n+\n+/*\n+ * Modify the global list of interfaces by inserting a new ip_addr structure\n+ * into the linked list of the specified interface.\n+ */\n+void insert_ip_addr(int idx, char addr[], unsigned char family)\n+{\n+\tstruct ip_addr *ipa = (struct ip_addr *)\n+\t\tmalloc(sizeof(struct ip_addr));\n+\n+\tipa->addr = strdup(addr);\n+\tipa->family = family;\n+\tipa->next = NULL;\n+\n+\tif (!iface_list[idx].ip_addrs) {\n+\t\tiface_list[idx].ip_addrs = ipa;\n+\t\treturn;\n+\t}\n+\n+\tstruct ip_addr *tmp = iface_list[idx].ip_addrs;\n+\twhile (tmp->next) {\n+\t\ttmp = tmp->next;\n+\t}\n+\n+\ttmp->next = ipa;\n+}\n+\n+/*\n+ * Modify the global list of interfaces by removing an existing ip_addr\n+ * structure from the linked list of the specified interface.\n+ */\n+void delete_ip_addr(int idx, char addr[])\n+{\n+\tbool found = false;\n+\n+\tif (!iface_list[idx].ip_addrs) {\n+\t\treturn;\n+\t}\n+\n+\tstruct ip_addr *tmp = iface_list[idx].ip_addrs;\n+\tif (tmp->addr && !strcmp(tmp->addr, addr)) {\n+\t\tiface_list[idx].ip_addrs = iface_list[idx].ip_addrs->next;\n+\t\tgoto free_node;\n+\t}\n+\n+\tstruct ip_addr *prev = tmp;\n+\twhile (tmp->next) {\n+\t\tprev = tmp;\n+\t\ttmp = tmp->next;\n+\n+\t\tif (tmp->addr && !strcmp(tmp->addr, addr)) {\n+\t\t\tfound = true;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tif (!found) {\n+\t\tprintf(\"No IP address matching %s for interface %s\",\n+\t\t\t\taddr, iface_list[idx].name);\n+\t\treturn;\n+\t}\n+\n+\tprev->next = tmp->next;\n+\n+free_node:\n+\tfree(tmp->addr);\n+\tfree(tmp);\n+}\n+\n+/* \n+ * Validate the parameters and fill the appropriate structure.\n+ *\n+ * pod-id: Pod identifier related to the network namespace this watcher\n+ * has to listen to.\n+ * runtime-path: Runtime path is needed to call into it whenever a\n+ * change in the network namespace is detected.\n+ * netns-path: Network namespace path that needs to be monitored.\n+ *\n+ * It returns 0 if the parameters are valid, with a watcher_params structure\n+ * properly filled. Otherwise, it returns -1 with a null watcher_params\n+ * structure.\n+ */\n+int valid_params(int argc, const char **argv, struct watcher_params *params)\n+{\n+\tstruct option prog_opts[] = {\n+\t\t{\"debug\", no_argument, 0, 'd'},\n+\t\t{\"help\", no_argument, 0, 'h'},\n+\t\t{\"netns-path\", required_argument, 0, 'n'},\n+\t\t{\"pod-id\", required_argument, 0, 'p'},\n+\t\t{\"runtime-path\", required_argument, 0, 'r'},\n+\t\t{\"version\", no_argument, 0, 'v'},\n+\t\t{ 0, 0, 0, 0},\n+\t};\n+\n+\tint c;\n+\twhile ((c = getopt_long(argc, (char **)argv, \"dhn:p:r:v\",\n+\t\t\t\t\tprog_opts, NULL)) != -1) {\n+\t\tswitch (c) {\n+\t\tcase 'd':\n+\t\t\tdebug = true;\n+\t\t\tbreak;\n+\t\tcase 'h':\n+\t\t\tprint_usage();\n+\t\t\texit(EXIT_SUCCESS);\n+\t\tcase 'n':\n+\t\t\tparams->netns_path = strdup(optarg);\n+\t\t\tbreak;\n+\t\tcase 'p':\n+\t\t\tparams->pod_id = strdup(optarg);\n+\t\t\tbreak;\n+\t\tcase 'r':\n+\t\t\tparams->runtime_path = strdup(optarg);\n+\t\t\tbreak;\n+\t\tcase 'v':\n+\t\t\tprint_version();\n+\t\t\texit(EXIT_SUCCESS);\n+\t\tdefault:\n+\t\t\tprint_usage();\n+\t\t\texit(EXIT_FAILURE);\n+\t\t}\n+\t}\n+\n+\tif (!params->netns_path) {\n+\t\tprintf(\"Missing network namespace path\\n\");\n+\t\tgoto err;\n+\n+\t}\n+\n+\tif (!params->pod_id) {\n+\t\tprintf(\"Missing pod ID\\n\");\n+\t\tgoto err;\n+\t}\n+\n+\tif (!params->runtime_path) {\n+\t\tprintf(\"Missing runtime path\\n\");\n+\t\tgoto err;\n+\t}\n+\n+\treturn 0;\n+\n+err:\n+\tfree_watcher_params(params);\n+\treturn -1;\n+}\n+\n+/* \n+ * Enter the network namespace.\n+ *\n+ * Entering the provided network namespace since the point of this binary is\n+ * to monitor any network change happening inside a specific network namespace.\n+ */\n+int enter_netns(const char *netns_path)\n+{\n+\tint fd;\n+\n+\tfd = open(netns_path, O_RDONLY);\n+\tif (fd == -1) {\n+\t\tprintf(\"Failed opening network ns %s: %s\\n\",\n+\t\t\t\tnetns_path, strerror(errno));\n+\t\treturn -1;\n+\t}\n+\n+\tif (setns(fd, 0) == -1) {\n+\t\tprintf(\"Failed to join network ns %s: %s\\n\",\n+\t\t\t\tnetns_path, strerror(errno));\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/*\n+ * Open the netlink socket with appropriate parameters, and return the file\n+ * descriptor. It will listen for any message related to a network interface\n+ * change (add/delete/update), an IP address (IPv4) change (add/delete/update)\n+ * or a route (IPv4) change (add/delete/update).\n+ */\n+int open_netlink()\n+{\n+\tint sock;\n+\tstruct sockaddr_nl sa;\n+\n+\tmemset(&sa, 0, sizeof(sa));\n+\n+\tsa.nl_family = AF_NETLINK;\n+\tsa.nl_pid = getpid();\n+\tsa.nl_groups = RTMGRP_LINK |\n+\t\tRTMGRP_IPV4_IFADDR |\n+\t\tRTMGRP_IPV4_ROUTE;\n+\n+\tsock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);\n+\tif (sock == -1) {\n+\t\tprintf(\"Failed creating netlink socket: %s\\n\",\n+\t\t\t\tstrerror(errno));\n+\t\treturn -1;\n+\t}\n+\n+\tif (bind(sock, (struct sockaddr *) &sa, sizeof(sa)) == -1) {\n+\t\tprintf(\"Failed binding netlink socket: %s\\n\",\n+\t\t\t\tstrerror(errno));\n+\t\treturn -1;\n+\t}\n+\n+\treturn sock;\n+}\n+\n+/*\n+ * Execute the runtime call from a child process.\n+ */\n+int fork_runtime_call(char *params[])\n+{\n+\tint ret;","path":"virtcontainers/netns_watcher/netns_watcher.c","position":441,"original_position":441,"commit_id":"f008bffd1bde57d7e8dfd6ec84fb47113ec5afcb","original_commit_id":"f008bffd1bde57d7e8dfd6ec84fb47113ec5afcb","user":{"login":"jodh-intel","id":20315601,"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":"Unused.","created_at":"2018-04-18T13:40:26Z","updated_at":"2018-04-18T13:43:35Z","html_url":"https://github.com/kata-containers/runtime/pull/194#discussion_r182429584","pull_request_url":"https://api.github.com/repos/kata-containers/runtime/pulls/194","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/kata-containers/runtime/pulls/comments/182429584"},"html":{"href":"https://github.com/kata-containers/runtime/pull/194#discussion_r182429584"},"pull_request":{"href":"https://api.github.com/repos/kata-containers/runtime/pulls/194"}}},"pull_request":{"url":"https://api.github.com/repos/kata-containers/runtime/pulls/194","id":180080326,"html_url":"https://github.com/kata-containers/runtime/pull/194","diff_url":"https://github.com/kata-containers/runtime/pull/194.diff","patch_url":"https://github.com/kata-containers/runtime/pull/194.patch","issue_url":"https://api.github.com/repos/kata-containers/runtime/issues/194","number":194,"state":"open","locked":false,"title":"[WIP] virtcontainers: netns_watcher: Monitor network changes","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":"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 proper 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-04-07T00:39:05Z","updated_at":"2018-04-18T13:43:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d605bcd8c89fbb7acbba74fc94f45f1a47863215","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":764364660,"url":"https://api.github.com/repos/kata-containers/runtime/labels/wip","name":"wip","color":"b60205","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kata-containers/runtime/pulls/194/commits","review_comments_url":"https://api.github.com/repos/kata-containers/runtime/pulls/194/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/194/comments","statuses_url":"https://api.github.com/repos/kata-containers/runtime/statuses/f008bffd1bde57d7e8dfd6ec84fb47113ec5afcb","head":{"label":"sboeuf:netns_watcher","ref":"netns_watcher","sha":"f008bffd1bde57d7e8dfd6ec84fb47113ec5afcb","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},"repo":{"id":125155717,"name":"runtime-1","full_name":"sboeuf/runtime-1","owner":{"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},"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-04-16T17:38:09Z","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":3793,"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"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kata-containers:master","ref":"master","sha":"f74f61e8d1817a2775d5f8a70e4e2ad443e70821","user":{"login":"kata-containers","id":33289952,"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,"name":"runtime","full_name":"kata-containers/runtime","owner":{"login":"kata-containers","id":33289952,"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 runtimes","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-04-18T08:18:22Z","pushed_at":"2018-04-18T13:32:27Z","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":3797,"stargazers_count":133,"watchers_count":133,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":38,"mirror_url":null,"archived":false,"open_issues_count":84,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":38,"open_issues":84,"watchers":133,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kata-containers/runtime/pulls/194"},"html":{"href":"https://github.com/kata-containers/runtime/pull/194"},"issue":{"href":"https://api.github.com/repos/kata-containers/runtime/issues/194"},"comments":{"href":"https://api.github.com/repos/kata-containers/runtime/issues/194/comments"},"review_comments":{"href":"https://api.github.com/repos/kata-containers/runtime/pulls/194/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/194/commits"},"statuses":{"href":"https://api.github.com/repos/kata-containers/runtime/statuses/f008bffd1bde57d7e8dfd6ec84fb47113ec5afcb"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jodh-intel"}}