{"action":"created","comment":{"url":"https://api.github.com/repos/Azure/SONiC/pulls/comments/219038975","pull_request_review_id":157112651,"id":219038975,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxOTAzODk3NQ==","diff_hunk":"@@ -0,0 +1,412 @@\n+SONiC VRF support design spec draft\n+\n+Table of Contents\n+\n+Document History\n+================\n+\n+| Version | Date       | Author       | Description                                      |\n+|---------|------------|--------------|--------------------------------------------------|\n+| v.01    | 06/07/2018 | Shine/Andrew | Initial version                                  |\n+| v.02    | 06/08/2018 | Shine        | Revised per Guohan/prince(MSFT) opinion |\n+|         |            |              |                                                  |\n+\n+Abbreviations\n+=============\n+\n+| **Term** | **Definition**                                                                                                                                  |\n+|----------|-------------------------------------------------------------------------------------------------------------------------------------------------|\n+| VRF      | Virtual routing forwarding                                                                                                                      |\n+| FRR      | FRRouting is an IP routing protocol suite for Linux and Unix platforms which includes protocol daemons for BGP, IS-IS, LDP, OSPF, PIM, and RIP. |\n+| Quagga   | Open IP routing protocol suite                                                                                                                  |\n+| RIB      | Routing Information Base                                                                                                                        |\n+\n+1.  References\n+\n+2.  VRF feature Requirement\n+\n+>   SONiC VRF will support the followings:\n+\n+1.  Add or Delete VRF instance\n+\n+2.  Bind VRF to a L3 interface.\n+\n+3.  Static IP route with VRF\n+\n+4.  Enable eBGP/OSPF VRF aware in SONiC\n+\n+5.  Support fall through lookup\n+\n+6.  TBD: VRF route leaking between VRFs.\n+\n+Note: linux kernel use VRF master device to support VRF and it support admin\n+up/down on VRF maser dev. But we don't plan to support it on SONIC.\n+\n+Dependencies\n+============\n+\n+>   VRF feature needs the following software package/upgrade\n+\n+1.  Linux kernel 4.9\n+\n+>   Linux Kernel 4.9 support generic IP VRF with L3 master net device. Every L3\n+>   master net device has its own FIB. The name of the master device is the\n+>   VRF’s name. Real network interface can join the VRF by becoming the slave of\n+>   the master net device.\n+\n+>   Application can get creation of deletion of VRF master device via RTNETLINK,\n+>   as well as information about slave net device joining a VRF.\n+\n+>   Linux kernel supports VRF forwarding using PBR scheme. It will fall to main\n+>   routing table to check IP lookup. VRF also can have its own default network\n+>   instruction in case VRF lookup fails.\n+\n+1.  FRRouting is needed to support BGP/OSPF VRF aware routing.\n+\n+2.  IProute2 version should be ss161212 or later to support iproute2 CLIs to\n+    configure the switch.\n+\n+>   Example of using iprout2:\n+\n+>   VRF name: vrf-blue，fib-table-id: 10\n+\n+>   \\$ ip link add name vrf-blue type vrf table 10\n+\n+>   //enable VRF\n+\n+>   \\$ ip link set dev vrf-blue up\n+\n+>   // disable global VRF lookup\n+\n+>   \\$ ip [-6] route add table 10 unreachable default\n+\n+>   //binding sw1p3 device to vrf-blue\n+\n+>   \\$ ip link set dev sw1p3 master vrf-blue\n+\n+>   // descend local table pref\n+\n+>   ip [-6] rule add pref 32765 table local && ip [-6] rule del pref 0\n+\n+1.  SAI VRF support\n+\n+>   SAI right now does not seem having VRF concept, it does have VR.\n+\n+>   We propose to implement VR as “virtual router” and VRF as “virtual router\n+>   forwarding”\n+\n+>   VR is defined as an logical routing system. VRF is defined as forwarding\n+>   domain within a VR.\n+\n+>   As this stage, we assume one VR per system. Only implement VRFs within this\n+>   VR.\n+\n+>   Accordingly, we need to add vrf_id to sai_Route_entry and add vrf attribute\n+>   to sai_routeInterface object.\n+\n+>   An alternative method is using VR as VRF. But it is needed to add two\n+>   attribution to VR object.\n+\n+>   /\\*\\*\n+\n+>   \\* \\@brief if it is global vrf\n+\n+>   \\*\n+\n+>   \\* \\@type bool\n+\n+>   \\* \\@flags CREATE_AND_SET\n+\n+>   \\* \\@default true\n+\n+>   \\*/\n+\n+>   SAI_VIRTUAL_ROUTER_ATTR_GLOBAL\n+\n+>   /\\*\\*\n+\n+>   \\* \\@brief continue to do global fib lookup while current vrf fib lookup\n+>   missed\n+\n+>   \\*\n+\n+>   \\* \\@type bool\n+\n+>   \\* \\@flags CREATE_AND_SET\n+\n+>   \\* \\@default false\n+\n+>   \\*/\n+\n+>   SAI_VIRTUAL_ROUTER_ATTR_FALL_THROUGH\n+\n+SONiC system diagram for VRF\n+============================\n+\n+The following is high level diagram of modules with VRF support.\n+\n+1.  Changes in SONiC\n+\n+    1.  The schema changes\n+\n+2.  **Adding VRF related configuration in config_db.json**\n+\n+\"VRF\":{\n+\n+\"VRF-blue\":{\n+\n+\"fall_through\":\"1\" //enable global fib lookup while vrf fib lookup missed\n+\n+},\n+\n+\"VRF-red\":{\n+\n+\"fall_through\": \"1\"\n+\n+},\n+\n+\"VRF-yellow\":{\n+\n+\"fall_through\":\"0\" //disable global fib lookup while vrf fib lookup missed\n+\n+}\n+\n+},\n+\n+\"INTERFACE\": {\n+\n+“Ethernet0”:{\n+\n+“mtu”:”1500”\n+\n+“vrf”:”vrf-blue”}\n+\n+“Ethernet1”:{\n+\n+“mtu”:”1500”\n+\n+“vrf”:”vrf-red”}\n+\n+\"Ethernet0\\|11.11.11.1/24\": {},\n+\n+\"Ethernet1\\|12.12.12.1/24\": {},\n+\n+\"Ethernet2\\|13.13.13.1/24\": {},\n+\n+\"Ethernet3\\|14.14.14.1/24\": {},\n+\n+},\n+\n+\"VLAN_INTERFACE\": {\n+\n+“Vlan100”:{\n+\n+“mtu”:”1500”\n+\n+“vrf”:”vrf-blue”}\n+\n+\"Vlan100\\|15.15.15.1/24\": {},\n+\n+}\n+\n+1.  **Adding a app-VRF-table**\n+\n+;defines virtual routing forward table\n+\n+;\n+\n+;Status: stable\n+\n+key = VRF_TABLE:VRF_NAME ;\n+\n+fall_through = “1”/”0”\n+\n+1.  **Breaking up app-intf-table into app-intf-table and app-intf-prefix-table**\n+\n+app-intf-table is defined as the following:\n+\n+;defines logical network interfaces, an attachment to a PORT name\n+\n+;\n+\n+;Status: stable\n+\n+key = INTF_TABLE:ifname\n+\n+if_mtu = 1\\*4DIGIT ; MTU for the interface\n+\n+VRF_NAME = 1\\*64VCHAR ;\n+\n+app-intf-prefix-table is defined as the following:\n+\n+;defines logical network interfaces with IP-prefix, an attachment to a PORT and\n+list of 0 or more ip prefixes;\n+\n+;Status: stable\n+\n+key = INTF_TABLE:ifname:IPprefix ; an instance of this key will be repeated for\n+each prefix\n+\n+IPprefix = IPv4prefix / IPv6prefix ; an instance of this key/value pair will be\n+repeated for each prefix\n+\n+scope = \"global\" / \"local\" ; local is an interface visible on this localhost\n+only\n+\n+if_mtu = 1\\*4DIGIT ; MTU for the interface （move to INTF_TABLE:ifname table）\n+\n+family = \"IPv4\" / \"IPv6\" ; address family\n+\n+1.  **Adding VRF key to app-route-table key list**\n+\n+;Stores a list of routes\n+\n+;Status: Mandatory\n+\n+key = ROUTE_TABLE:VRF_NAME:prefix ;\n+\n+nexthop = \\*prefix, ;IP addresses separated “,” (empty indicates no gateway)\n+\n+intf = ifindex? PORT_TABLE.key ; zero or more separated by “,” (zero indicates\n+no interface)\n+\n+blackhole = BIT ; Set to 1 if this route is a blackhole (or null0)\n+\n+Since global vrf name is null, global vrf key will becomes ROUTE_TABLE:prefix.\n+\n+ VrfMgrd \n+---------\n+\n+>   Listening VRF related configuration in config_db such as VRF\n+>   creation/deletion, VRF binding to any interface. Once detected, update\n+>   kernel using iproute2 CLIs and write VRF information to app-VRF-table and\n+>   app-intf-table.\n+\n+>   VrfMgrd process will be placed in swss docker. In case of “swss restart”,\n+>   VRF device will be still retained in kernel. When VrfMgrd starts up it\n+>   querys all master device from kernel and clean up all vrf related device and\n+>   restore vrf device per configdb.\n+\n+>   VRFOrch has three member routerCnt , neighCnt and rifCnt which record VRF\n+>   related route number , neigh number and rif number.VRFOrch is added to\n+>   RouteOrch , NeighOrch and intfsOrch member to update routeCnt , neighCnt and\n+>   rifCnt.\n+\n+>   When  VRFOrch receives vrf-delete event VRF object won’t  be deleted until\n+>   routerCnt  ,neighCnt and rifCnt  is decreased to zero.\n+\n+>   When device binds to specified VRF, the ip address of slave device will be\n+>   removed and kernel will delete all neigh associated slave device.\n+\n+ fpmsyncd changes\n+-----------------\n+\n+with added VRF ID, fpmsyncd can use rtnl_route_get_table to acquire tableid.\n+Hence can send VRF routes further down. The messages from FRR has nh(next hop)\n+information which contain further information about (nexthop_ipaddress and\n+interface index)，tableid can be derived from the interface index.\n+\n+Fpmsyncd can build \\<tableid, vrf_name\\> pairs using rtnetlink api.\n+\n+ adding vrforch \n+----------------\n+\n+>   Monitorying app-VRF-table，Using sai_create_virtual_router_fn or\n+\n+>   sai_remove_virtual_router_fn defined in saivirtualrouter.h to track\n+>   (VR，VRF) creation/deletion.and save (vrf_name, vrf-vid) pairs.\n+\n+intfsorch changes\n+-----------------\n+\n+>   Adding following logics:\n+\n+-   adding vrforch as one member to intfsorch\n+\n+-   intfsorch monitors both app-intf-table和app-intf-prefix-table，when\n+    app-intf-table has changes，handle updating vrf attribute on\n+    routerintf，request vrforch for tableid/vrf-id .\n+\n+    1.  routeorch changes\n+\n+Adding the following logics:\n+\n+-   Adding vrforch member to routesorch\n+\n+-   Once app-route-table has new udpate，get tableid from vrforch for route\n+    add/delete.\n+\n+>   When query nexthop，keys now are (tableid, ipaddress)，tableid of nexthop\n+>   can be acquired using nexthop interface.\n+\n+neighorch changes\n+-----------------\n+\n+Adding the following logic:\n+\n+-   the Key of NextHop now is changed from only ipaddress to a pair of\n+    (ipaddress, interface_name)","path":"doc/sonic-vrf-hld-v0.2.md","position":292,"original_position":348,"commit_id":"934a4fe035964ec2d2aea08eaff973ccde1db40f","original_commit_id":"db5b9d11431cee87afd387d0551ae0f82792eb27","user":{"login":"prsunny","id":17460631,"node_id":"MDQ6VXNlcjE3NDYwNjMx","avatar_url":"https://avatars0.githubusercontent.com/u/17460631?v=4","gravatar_id":"","url":"https://api.github.com/users/prsunny","html_url":"https://github.com/prsunny","followers_url":"https://api.github.com/users/prsunny/followers","following_url":"https://api.github.com/users/prsunny/following{/other_user}","gists_url":"https://api.github.com/users/prsunny/gists{/gist_id}","starred_url":"https://api.github.com/users/prsunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prsunny/subscriptions","organizations_url":"https://api.github.com/users/prsunny/orgs","repos_url":"https://api.github.com/users/prsunny/repos","events_url":"https://api.github.com/users/prsunny/events{/privacy}","received_events_url":"https://api.github.com/users/prsunny/received_events","type":"User","site_admin":false},"body":"@nikos-github , yes it is possible but the format in APP_DB is same for route since every route has a nexthop IP with the interface name. Currently orchagent doesn't look for the interface which requires a fix. ","created_at":"2018-09-20T05:35:30Z","updated_at":"2018-09-20T05:35:31Z","html_url":"https://github.com/Azure/SONiC/pull/242#discussion_r219038975","pull_request_url":"https://api.github.com/repos/Azure/SONiC/pulls/242","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/Azure/SONiC/pulls/comments/219038975"},"html":{"href":"https://github.com/Azure/SONiC/pull/242#discussion_r219038975"},"pull_request":{"href":"https://api.github.com/repos/Azure/SONiC/pulls/242"}},"in_reply_to_id":218223286},"pull_request":{"url":"https://api.github.com/repos/Azure/SONiC/pulls/242","id":212885450,"node_id":"MDExOlB1bGxSZXF1ZXN0MjEyODg1NDUw","html_url":"https://github.com/Azure/SONiC/pull/242","diff_url":"https://github.com/Azure/SONiC/pull/242.diff","patch_url":"https://github.com/Azure/SONiC/pull/242.patch","issue_url":"https://api.github.com/repos/Azure/SONiC/issues/242","number":242,"state":"open","locked":false,"title":"VRF-HLD document","user":{"login":"shine4chen","id":37530989,"node_id":"MDQ6VXNlcjM3NTMwOTg5","avatar_url":"https://avatars1.githubusercontent.com/u/37530989?v=4","gravatar_id":"","url":"https://api.github.com/users/shine4chen","html_url":"https://github.com/shine4chen","followers_url":"https://api.github.com/users/shine4chen/followers","following_url":"https://api.github.com/users/shine4chen/following{/other_user}","gists_url":"https://api.github.com/users/shine4chen/gists{/gist_id}","starred_url":"https://api.github.com/users/shine4chen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shine4chen/subscriptions","organizations_url":"https://api.github.com/users/shine4chen/orgs","repos_url":"https://api.github.com/users/shine4chen/repos","events_url":"https://api.github.com/users/shine4chen/events{/privacy}","received_events_url":"https://api.github.com/users/shine4chen/received_events","type":"User","site_admin":false},"body":"VRF high level design for SONIC","created_at":"2018-09-04T07:54:08Z","updated_at":"2018-09-20T05:35:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"875ab382c1ce2868ba1d5e139cd8abdf832938d0","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Azure/SONiC/pulls/242/commits","review_comments_url":"https://api.github.com/repos/Azure/SONiC/pulls/242/comments","review_comment_url":"https://api.github.com/repos/Azure/SONiC/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Azure/SONiC/issues/242/comments","statuses_url":"https://api.github.com/repos/Azure/SONiC/statuses/934a4fe035964ec2d2aea08eaff973ccde1db40f","head":{"label":"shine4chen:gh-pages","ref":"gh-pages","sha":"934a4fe035964ec2d2aea08eaff973ccde1db40f","user":{"login":"shine4chen","id":37530989,"node_id":"MDQ6VXNlcjM3NTMwOTg5","avatar_url":"https://avatars1.githubusercontent.com/u/37530989?v=4","gravatar_id":"","url":"https://api.github.com/users/shine4chen","html_url":"https://github.com/shine4chen","followers_url":"https://api.github.com/users/shine4chen/followers","following_url":"https://api.github.com/users/shine4chen/following{/other_user}","gists_url":"https://api.github.com/users/shine4chen/gists{/gist_id}","starred_url":"https://api.github.com/users/shine4chen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shine4chen/subscriptions","organizations_url":"https://api.github.com/users/shine4chen/orgs","repos_url":"https://api.github.com/users/shine4chen/repos","events_url":"https://api.github.com/users/shine4chen/events{/privacy}","received_events_url":"https://api.github.com/users/shine4chen/received_events","type":"User","site_admin":false},"repo":{"id":125817631,"node_id":"MDEwOlJlcG9zaXRvcnkxMjU4MTc2MzE=","name":"SONiC","full_name":"shine4chen/SONiC","private":false,"owner":{"login":"shine4chen","id":37530989,"node_id":"MDQ6VXNlcjM3NTMwOTg5","avatar_url":"https://avatars1.githubusercontent.com/u/37530989?v=4","gravatar_id":"","url":"https://api.github.com/users/shine4chen","html_url":"https://github.com/shine4chen","followers_url":"https://api.github.com/users/shine4chen/followers","following_url":"https://api.github.com/users/shine4chen/following{/other_user}","gists_url":"https://api.github.com/users/shine4chen/gists{/gist_id}","starred_url":"https://api.github.com/users/shine4chen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shine4chen/subscriptions","organizations_url":"https://api.github.com/users/shine4chen/orgs","repos_url":"https://api.github.com/users/shine4chen/repos","events_url":"https://api.github.com/users/shine4chen/events{/privacy}","received_events_url":"https://api.github.com/users/shine4chen/received_events","type":"User","site_admin":false},"html_url":"https://github.com/shine4chen/SONiC","description":"Landing page for Software for Open Networking in the Cloud (SONiC) - http://azure.github.io/SONiC/","fork":true,"url":"https://api.github.com/repos/shine4chen/SONiC","forks_url":"https://api.github.com/repos/shine4chen/SONiC/forks","keys_url":"https://api.github.com/repos/shine4chen/SONiC/keys{/key_id}","collaborators_url":"https://api.github.com/repos/shine4chen/SONiC/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/shine4chen/SONiC/teams","hooks_url":"https://api.github.com/repos/shine4chen/SONiC/hooks","issue_events_url":"https://api.github.com/repos/shine4chen/SONiC/issues/events{/number}","events_url":"https://api.github.com/repos/shine4chen/SONiC/events","assignees_url":"https://api.github.com/repos/shine4chen/SONiC/assignees{/user}","branches_url":"https://api.github.com/repos/shine4chen/SONiC/branches{/branch}","tags_url":"https://api.github.com/repos/shine4chen/SONiC/tags","blobs_url":"https://api.github.com/repos/shine4chen/SONiC/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/shine4chen/SONiC/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/shine4chen/SONiC/git/refs{/sha}","trees_url":"https://api.github.com/repos/shine4chen/SONiC/git/trees{/sha}","statuses_url":"https://api.github.com/repos/shine4chen/SONiC/statuses/{sha}","languages_url":"https://api.github.com/repos/shine4chen/SONiC/languages","stargazers_url":"https://api.github.com/repos/shine4chen/SONiC/stargazers","contributors_url":"https://api.github.com/repos/shine4chen/SONiC/contributors","subscribers_url":"https://api.github.com/repos/shine4chen/SONiC/subscribers","subscription_url":"https://api.github.com/repos/shine4chen/SONiC/subscription","commits_url":"https://api.github.com/repos/shine4chen/SONiC/commits{/sha}","git_commits_url":"https://api.github.com/repos/shine4chen/SONiC/git/commits{/sha}","comments_url":"https://api.github.com/repos/shine4chen/SONiC/comments{/number}","issue_comment_url":"https://api.github.com/repos/shine4chen/SONiC/issues/comments{/number}","contents_url":"https://api.github.com/repos/shine4chen/SONiC/contents/{+path}","compare_url":"https://api.github.com/repos/shine4chen/SONiC/compare/{base}...{head}","merges_url":"https://api.github.com/repos/shine4chen/SONiC/merges","archive_url":"https://api.github.com/repos/shine4chen/SONiC/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/shine4chen/SONiC/downloads","issues_url":"https://api.github.com/repos/shine4chen/SONiC/issues{/number}","pulls_url":"https://api.github.com/repos/shine4chen/SONiC/pulls{/number}","milestones_url":"https://api.github.com/repos/shine4chen/SONiC/milestones{/number}","notifications_url":"https://api.github.com/repos/shine4chen/SONiC/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/shine4chen/SONiC/labels{/name}","releases_url":"https://api.github.com/repos/shine4chen/SONiC/releases{/id}","deployments_url":"https://api.github.com/repos/shine4chen/SONiC/deployments","created_at":"2018-03-19T07:24:28Z","updated_at":"2018-09-19T05:39:50Z","pushed_at":"2018-09-19T05:39:48Z","git_url":"git://github.com/shine4chen/SONiC.git","ssh_url":"git@github.com:shine4chen/SONiC.git","clone_url":"https://github.com/shine4chen/SONiC.git","svn_url":"https://github.com/shine4chen/SONiC","homepage":"","size":8575,"stargazers_count":0,"watchers_count":0,"language":"CSS","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"gh-pages"}},"base":{"label":"Azure:gh-pages","ref":"gh-pages","sha":"8eb4fa67c5af4ef5a10ee87f2aacce3e62d544bb","user":{"login":"Azure","id":6844498,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4NDQ0OTg=","avatar_url":"https://avatars0.githubusercontent.com/u/6844498?v=4","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"repo":{"id":51108542,"node_id":"MDEwOlJlcG9zaXRvcnk1MTEwODU0Mg==","name":"SONiC","full_name":"Azure/SONiC","private":false,"owner":{"login":"Azure","id":6844498,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4NDQ0OTg=","avatar_url":"https://avatars0.githubusercontent.com/u/6844498?v=4","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/Azure/SONiC","description":"Landing page for Software for Open Networking in the Cloud (SONiC) - http://azure.github.io/SONiC/","fork":false,"url":"https://api.github.com/repos/Azure/SONiC","forks_url":"https://api.github.com/repos/Azure/SONiC/forks","keys_url":"https://api.github.com/repos/Azure/SONiC/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Azure/SONiC/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Azure/SONiC/teams","hooks_url":"https://api.github.com/repos/Azure/SONiC/hooks","issue_events_url":"https://api.github.com/repos/Azure/SONiC/issues/events{/number}","events_url":"https://api.github.com/repos/Azure/SONiC/events","assignees_url":"https://api.github.com/repos/Azure/SONiC/assignees{/user}","branches_url":"https://api.github.com/repos/Azure/SONiC/branches{/branch}","tags_url":"https://api.github.com/repos/Azure/SONiC/tags","blobs_url":"https://api.github.com/repos/Azure/SONiC/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Azure/SONiC/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Azure/SONiC/git/refs{/sha}","trees_url":"https://api.github.com/repos/Azure/SONiC/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Azure/SONiC/statuses/{sha}","languages_url":"https://api.github.com/repos/Azure/SONiC/languages","stargazers_url":"https://api.github.com/repos/Azure/SONiC/stargazers","contributors_url":"https://api.github.com/repos/Azure/SONiC/contributors","subscribers_url":"https://api.github.com/repos/Azure/SONiC/subscribers","subscription_url":"https://api.github.com/repos/Azure/SONiC/subscription","commits_url":"https://api.github.com/repos/Azure/SONiC/commits{/sha}","git_commits_url":"https://api.github.com/repos/Azure/SONiC/git/commits{/sha}","comments_url":"https://api.github.com/repos/Azure/SONiC/comments{/number}","issue_comment_url":"https://api.github.com/repos/Azure/SONiC/issues/comments{/number}","contents_url":"https://api.github.com/repos/Azure/SONiC/contents/{+path}","compare_url":"https://api.github.com/repos/Azure/SONiC/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Azure/SONiC/merges","archive_url":"https://api.github.com/repos/Azure/SONiC/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Azure/SONiC/downloads","issues_url":"https://api.github.com/repos/Azure/SONiC/issues{/number}","pulls_url":"https://api.github.com/repos/Azure/SONiC/pulls{/number}","milestones_url":"https://api.github.com/repos/Azure/SONiC/milestones{/number}","notifications_url":"https://api.github.com/repos/Azure/SONiC/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Azure/SONiC/labels{/name}","releases_url":"https://api.github.com/repos/Azure/SONiC/releases{/id}","deployments_url":"https://api.github.com/repos/Azure/SONiC/deployments","created_at":"2016-02-04T21:55:32Z","updated_at":"2018-09-17T06:38:07Z","pushed_at":"2018-09-19T17:39:11Z","git_url":"git://github.com/Azure/SONiC.git","ssh_url":"git@github.com:Azure/SONiC.git","clone_url":"https://github.com/Azure/SONiC.git","svn_url":"https://github.com/Azure/SONiC","homepage":"","size":22821,"stargazers_count":491,"watchers_count":491,"language":"CSS","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":156,"mirror_url":null,"archived":false,"open_issues_count":121,"license":null,"forks":156,"open_issues":121,"watchers":491,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Azure/SONiC/pulls/242"},"html":{"href":"https://github.com/Azure/SONiC/pull/242"},"issue":{"href":"https://api.github.com/repos/Azure/SONiC/issues/242"},"comments":{"href":"https://api.github.com/repos/Azure/SONiC/issues/242/comments"},"review_comments":{"href":"https://api.github.com/repos/Azure/SONiC/pulls/242/comments"},"review_comment":{"href":"https://api.github.com/repos/Azure/SONiC/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Azure/SONiC/pulls/242/commits"},"statuses":{"href":"https://api.github.com/repos/Azure/SONiC/statuses/934a4fe035964ec2d2aea08eaff973ccde1db40f"}},"author_association":"NONE"}}
{"actor":{"display_login":"prsunny"}}