{"action":"created","comment":{"url":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/comments/60138894","id":60138894,"diff_hunk":"@@ -0,0 +1,558 @@\n+#include <string>\n+#include <vector>\n+#include <unordered_map>\n+\n+#include \"syncd.h\"\n+\n+sai_uint32_t saiGetPortCount()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    sai_attribute_t attr;\n+\n+    attr.id = SAI_SWITCH_ATTR_PORT_NUMBER;\n+\n+    sai_status_t status = sai_switch_api->get_switch_attribute(1, &attr);\n+\n+    if (status != SAI_STATUS_SUCCESS)\n+    {\n+        SWSS_LOG_ERROR(\"failed to get port number: %d\", status);\n+\n+        exit(EXIT_FAILURE);\n+    }\n+\n+    SWSS_LOG_DEBUG(\"port count is %u\", attr.value.u32);\n+\n+    return attr.value.u32;\n+}\n+\n+sai_object_id_t saiGetCpuId()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    sai_attribute_t attr;\n+\n+    attr.id = SAI_SWITCH_ATTR_CPU_PORT;\n+\n+    sai_status_t status = sai_switch_api->get_switch_attribute(1, &attr);\n+\n+    if (status != SAI_STATUS_SUCCESS)\n+    {\n+        SWSS_LOG_ERROR(\"failed to get cpu port: %d\", status);\n+\n+        exit(EXIT_FAILURE);\n+    }\n+\n+    SWSS_LOG_DEBUG(\"cpu port RID %llx\", attr.value.oid);\n+\n+    return attr.value.oid;\n+}\n+\n+std::vector<sai_object_id_t> saiGetPortList()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    uint32_t portCount = saiGetPortCount();\n+\n+    std::vector<sai_object_id_t> portList;\n+\n+    portList.resize(portCount);\n+\n+    sai_attribute_t attr;\n+\n+    attr.id = SAI_SWITCH_ATTR_PORT_LIST;\n+    attr.value.objlist.count = portCount;\n+    attr.value.objlist.list = portList.data();\n+\n+    sai_status_t status = sai_switch_api->get_switch_attribute(1, &attr);\n+\n+    if (status != SAI_STATUS_SUCCESS)\n+    {\n+        SWSS_LOG_ERROR(\"failed to get port list: %d\", status);\n+\n+        exit(EXIT_FAILURE);\n+    }\n+\n+    return portList;\n+}\n+\n+std::unordered_map<sai_uint32_t, sai_object_id_t> saiGetHardwareLaneMap()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    std::unordered_map<sai_uint32_t, sai_object_id_t> map;\n+\n+    const std::vector<sai_object_id_t> portList = saiGetPortList();\n+\n+    // NOTE: currently we don't support port breakout\n+    // this will need to be addressed in future\n+    const int lanesPerPort = 4;\n+\n+    for (size_t i = 0; i < portList.size(); i++)\n+    {\n+        sai_uint32_t lanes[lanesPerPort];\n+\n+        sai_attribute_t attr;\n+\n+        attr.id = SAI_PORT_ATTR_HW_LANE_LIST;\n+        attr.value.u32list.count = lanesPerPort;\n+        attr.value.u32list.list = lanes;\n+\n+        sai_status_t status = sai_port_api->get_port_attribute(portList[i], 1, &attr);\n+\n+        if (status != SAI_STATUS_SUCCESS)\n+        {\n+            SWSS_LOG_ERROR(\"failed to get hardware lane list pid: %lx: %d\", portList[i], status);\n+\n+            exit(EXIT_FAILURE);\n+        }\n+\n+        for (int j = 0; j < lanesPerPort; j++)\n+        {\n+            map[lanes[j]] = portList[i];\n+        }\n+    }\n+\n+    return map;\n+}\n+\n+sai_object_id_t saiGetDefaultVirtualRouter()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    sai_attribute_t attr;\n+\n+    attr.id = SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID;\n+\n+    sai_status_t status = sai_switch_api->get_switch_attribute(1, &attr);\n+\n+    if (status != SAI_STATUS_SUCCESS)\n+    {\n+         SWSS_LOG_ERROR(\"failed to get switch virtual router id %d\", status);\n+\n+         exit(EXIT_FAILURE);\n+    }\n+\n+    return attr.value.oid;\n+}\n+\n+void redisClearLaneMap()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    g_redisClient->del(LANES);\n+}\n+\n+std::unordered_map<sai_uint32_t, sai_object_id_t> redisGetLaneMap()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    auto hash = g_redisClient->hgetall(LANES);\n+\n+    SWSS_LOG_DEBUG(\"previous lanes: %lu\", hash.size());\n+\n+    std::unordered_map<sai_uint32_t, sai_object_id_t> map;\n+\n+    for (auto &kv: hash)\n+    {\n+        const std::string &str_key = kv.first;\n+        const std::string &str_value = kv.second;\n+\n+        sai_uint32_t lane;\n+        sai_object_id_t portId;\n+\n+        int index = 0;\n+\n+        sai_deserialize_primitive(str_key, index, lane);\n+\n+        index = 0;\n+\n+        sai_deserialize_primitive(str_value, index, portId);\n+\n+        map[lane] = portId;\n+    }\n+\n+    return map;\n+}\n+\n+void redisSaveLaneMap(const std::unordered_map<sai_uint32_t, sai_object_id_t> &map)\n+{\n+    SWSS_LOG_ENTER();\n+\n+    redisClearLaneMap();\n+\n+    for (auto const &it: map)\n+    {\n+        sai_uint32_t lane = it.first;\n+        sai_object_id_t portId = it.second;\n+\n+        std::string strLane;\n+        std::string strPortId;\n+\n+        sai_serialize_primitive(lane, strLane);\n+        sai_serialize_primitive(portId, strPortId);\n+\n+        // TODO use multi or hmset\n+        g_redisClient->hset(LANES, strLane, strPortId);\n+    }\n+}\n+\n+std::vector<std::string> redisGetAsicStateKeys()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    return g_redisClient->keys(\"ASIC_STATE:*\");\n+}\n+\n+void redisClearVidToRidMap()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    g_redisClient->del(VIDTORID);\n+}\n+\n+void redisClearRidToVidMap()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    g_redisClient->del(RIDTOVID);\n+}\n+\n+std::unordered_map<sai_object_id_t, sai_object_id_t> redisGetObjectMap(std::string key)\n+{\n+    SWSS_LOG_ENTER();\n+\n+    auto hash = g_redisClient->hgetall(key);\n+\n+    std::unordered_map<sai_object_id_t, sai_object_id_t> map;\n+\n+    for (auto &kv: hash)\n+    {\n+        const std::string &str_key = kv.first;\n+        const std::string &str_value = kv.second;\n+\n+        sai_object_id_t objectIdKey;\n+        sai_object_id_t objectIdValue;\n+\n+        int index = 0;\n+\n+        sai_deserialize_primitive(str_key, index, objectIdKey);\n+\n+        index = 0;\n+\n+        sai_deserialize_primitive(str_value, index, objectIdValue);\n+\n+        map[objectIdKey] = objectIdValue;\n+    }\n+\n+    return map;\n+}\n+\n+std::unordered_map<sai_object_id_t, sai_object_id_t> redisGetVidToRidMap()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    return redisGetObjectMap(VIDTORID);\n+}\n+\n+std::unordered_map<sai_object_id_t, sai_object_id_t> redisGetRidToVidMap()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    return redisGetObjectMap(RIDTOVID);\n+}\n+\n+void helperCheckLaneMap()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    auto redisLaneMap = redisGetLaneMap();\n+\n+    auto laneMap = saiGetHardwareLaneMap();\n+\n+    if (redisLaneMap.size() == 0)\n+    {\n+        SWSS_LOG_INFO(\"no lanes defined in redis, seems like it is first syncd start\");\n+\n+        // TODO put ports to db ?\n+        redisSaveLaneMap(laneMap);\n+\n+        redisLaneMap = laneMap; // copy\n+    }\n+\n+    if (laneMap.size() != redisLaneMap.size())\n+    {\n+        SWSS_LOG_ERROR(\"lanes map size differ: %lu vs %lu\", laneMap.size(), redisLaneMap.size());\n+\n+        exit(EXIT_FAILURE);\n+    }\n+\n+    for (auto kv: laneMap)\n+    {\n+        sai_uint32_t lane = kv.first;\n+        sai_object_id_t portId = kv.second;\n+\n+        if (redisLaneMap.find(lane) == redisLaneMap.end())\n+        {\n+            SWSS_LOG_ERROR(\"lane %u not found in redis\", lane);\n+\n+            exit(EXIT_FAILURE);\n+        }\n+\n+        if (redisLaneMap[lane] != portId)\n+        {\n+            // if this happens, we need to remap VIDTORID and RIDTOVID\n+            SWSS_LOG_ERROR(\"FIXME: lane port id differs: %llx vs %llx, port ids must be remapped\", portId, redisLaneMap[lane]);\n+\n+            exit(EXIT_FAILURE);\n+        }\n+    }\n+}\n+\n+sai_object_id_t redisGetDefaultVirtualRouterId()\n+{\n+    SWSS_LOG_ENTER();\n+\n+    auto redisVrId = g_redisClient->hget(HIDDEN, DEFAULT_VIRTUAL_ROUTER_ID);","path":"syncd/syncd_reinit.cpp","position":316,"original_position":316,"commit_id":"1a6b05bf874ebaf1b1794503c220b004267235eb","original_commit_id":"1a6b05bf874ebaf1b1794503c220b004267235eb","user":{"login":"kcudnik","id":17052279,"avatar_url":"https://avatars.githubusercontent.com/u/17052279?v=3","gravatar_id":"","url":"https://api.github.com/users/kcudnik","html_url":"https://github.com/kcudnik","followers_url":"https://api.github.com/users/kcudnik/followers","following_url":"https://api.github.com/users/kcudnik/following{/other_user}","gists_url":"https://api.github.com/users/kcudnik/gists{/gist_id}","starred_url":"https://api.github.com/users/kcudnik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kcudnik/subscriptions","organizations_url":"https://api.github.com/users/kcudnik/orgs","repos_url":"https://api.github.com/users/kcudnik/repos","events_url":"https://api.github.com/users/kcudnik/events{/privacy}","received_events_url":"https://api.github.com/users/kcudnik/received_events","type":"User","site_admin":false},"body":"yes, thats the point, that those objcts are created inside sai implementation and are \"hidden\"","created_at":"2016-04-18T21:37:56Z","updated_at":"2016-04-18T21:37:56Z","html_url":"https://github.com/Azure/sonic-sairedis/pull/5#discussion_r60138894","pull_request_url":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/5","_links":{"self":{"href":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/comments/60138894"},"html":{"href":"https://github.com/Azure/sonic-sairedis/pull/5#discussion_r60138894"},"pull_request":{"href":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/5"}}},"pull_request":{"url":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/5","id":66572757,"html_url":"https://github.com/Azure/sonic-sairedis/pull/5","diff_url":"https://github.com/Azure/sonic-sairedis/pull/5.diff","patch_url":"https://github.com/Azure/sonic-sairedis/pull/5.patch","issue_url":"https://api.github.com/repos/Azure/sonic-sairedis/issues/5","number":5,"state":"open","locked":false,"title":"Reinit","user":{"login":"kcudnik","id":17052279,"avatar_url":"https://avatars.githubusercontent.com/u/17052279?v=3","gravatar_id":"","url":"https://api.github.com/users/kcudnik","html_url":"https://github.com/kcudnik","followers_url":"https://api.github.com/users/kcudnik/followers","following_url":"https://api.github.com/users/kcudnik/following{/other_user}","gists_url":"https://api.github.com/users/kcudnik/gists{/gist_id}","starred_url":"https://api.github.com/users/kcudnik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kcudnik/subscriptions","organizations_url":"https://api.github.com/users/kcudnik/orgs","repos_url":"https://api.github.com/users/kcudnik/repos","events_url":"https://api.github.com/users/kcudnik/events{/privacy}","received_events_url":"https://api.github.com/users/kcudnik/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-04-15T00:01:19Z","updated_at":"2016-04-18T21:37:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d2d1c77d140c30a615b1983cdc96e6d4ac6d2995","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/5/commits","review_comments_url":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/5/comments","review_comment_url":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Azure/sonic-sairedis/issues/5/comments","statuses_url":"https://api.github.com/repos/Azure/sonic-sairedis/statuses/1a6b05bf874ebaf1b1794503c220b004267235eb","head":{"label":"kcudnik:reinit","ref":"reinit","sha":"1a6b05bf874ebaf1b1794503c220b004267235eb","user":{"login":"kcudnik","id":17052279,"avatar_url":"https://avatars.githubusercontent.com/u/17052279?v=3","gravatar_id":"","url":"https://api.github.com/users/kcudnik","html_url":"https://github.com/kcudnik","followers_url":"https://api.github.com/users/kcudnik/followers","following_url":"https://api.github.com/users/kcudnik/following{/other_user}","gists_url":"https://api.github.com/users/kcudnik/gists{/gist_id}","starred_url":"https://api.github.com/users/kcudnik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kcudnik/subscriptions","organizations_url":"https://api.github.com/users/kcudnik/orgs","repos_url":"https://api.github.com/users/kcudnik/repos","events_url":"https://api.github.com/users/kcudnik/events{/privacy}","received_events_url":"https://api.github.com/users/kcudnik/received_events","type":"User","site_admin":false},"repo":{"id":55009028,"name":"sonic-sairedis","full_name":"kcudnik/sonic-sairedis","owner":{"login":"kcudnik","id":17052279,"avatar_url":"https://avatars.githubusercontent.com/u/17052279?v=3","gravatar_id":"","url":"https://api.github.com/users/kcudnik","html_url":"https://github.com/kcudnik","followers_url":"https://api.github.com/users/kcudnik/followers","following_url":"https://api.github.com/users/kcudnik/following{/other_user}","gists_url":"https://api.github.com/users/kcudnik/gists{/gist_id}","starred_url":"https://api.github.com/users/kcudnik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kcudnik/subscriptions","organizations_url":"https://api.github.com/users/kcudnik/orgs","repos_url":"https://api.github.com/users/kcudnik/repos","events_url":"https://api.github.com/users/kcudnik/events{/privacy}","received_events_url":"https://api.github.com/users/kcudnik/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kcudnik/sonic-sairedis","description":"SAI object interface to Redis database, as used in the SONiC project","fork":true,"url":"https://api.github.com/repos/kcudnik/sonic-sairedis","forks_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/forks","keys_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/teams","hooks_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/hooks","issue_events_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/issues/events{/number}","events_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/events","assignees_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/assignees{/user}","branches_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/branches{/branch}","tags_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/tags","blobs_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/git/refs{/sha}","trees_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/statuses/{sha}","languages_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/languages","stargazers_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/stargazers","contributors_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/contributors","subscribers_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/subscribers","subscription_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/subscription","commits_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/commits{/sha}","git_commits_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/git/commits{/sha}","comments_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/comments{/number}","issue_comment_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/issues/comments{/number}","contents_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/contents/{+path}","compare_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/merges","archive_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/downloads","issues_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/issues{/number}","pulls_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/pulls{/number}","milestones_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/milestones{/number}","notifications_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/labels{/name}","releases_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/releases{/id}","deployments_url":"https://api.github.com/repos/kcudnik/sonic-sairedis/deployments","created_at":"2016-03-29T20:40:19Z","updated_at":"2016-03-29T20:40:20Z","pushed_at":"2016-04-15T19:08:27Z","git_url":"git://github.com/kcudnik/sonic-sairedis.git","ssh_url":"git@github.com:kcudnik/sonic-sairedis.git","clone_url":"https://github.com/kcudnik/sonic-sairedis.git","svn_url":"https://github.com/kcudnik/sonic-sairedis","homepage":null,"size":97,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"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":"Azure:master","ref":"master","sha":"81779246d8b807e53c62bd10359b8ca2d565e4c1","user":{"login":"Azure","id":6844498,"avatar_url":"https://avatars.githubusercontent.com/u/6844498?v=3","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":53451335,"name":"sonic-sairedis","full_name":"Azure/sonic-sairedis","owner":{"login":"Azure","id":6844498,"avatar_url":"https://avatars.githubusercontent.com/u/6844498?v=3","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},"private":false,"html_url":"https://github.com/Azure/sonic-sairedis","description":"SAI object interface to Redis database, as used in the SONiC project","fork":false,"url":"https://api.github.com/repos/Azure/sonic-sairedis","forks_url":"https://api.github.com/repos/Azure/sonic-sairedis/forks","keys_url":"https://api.github.com/repos/Azure/sonic-sairedis/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Azure/sonic-sairedis/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Azure/sonic-sairedis/teams","hooks_url":"https://api.github.com/repos/Azure/sonic-sairedis/hooks","issue_events_url":"https://api.github.com/repos/Azure/sonic-sairedis/issues/events{/number}","events_url":"https://api.github.com/repos/Azure/sonic-sairedis/events","assignees_url":"https://api.github.com/repos/Azure/sonic-sairedis/assignees{/user}","branches_url":"https://api.github.com/repos/Azure/sonic-sairedis/branches{/branch}","tags_url":"https://api.github.com/repos/Azure/sonic-sairedis/tags","blobs_url":"https://api.github.com/repos/Azure/sonic-sairedis/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Azure/sonic-sairedis/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Azure/sonic-sairedis/git/refs{/sha}","trees_url":"https://api.github.com/repos/Azure/sonic-sairedis/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Azure/sonic-sairedis/statuses/{sha}","languages_url":"https://api.github.com/repos/Azure/sonic-sairedis/languages","stargazers_url":"https://api.github.com/repos/Azure/sonic-sairedis/stargazers","contributors_url":"https://api.github.com/repos/Azure/sonic-sairedis/contributors","subscribers_url":"https://api.github.com/repos/Azure/sonic-sairedis/subscribers","subscription_url":"https://api.github.com/repos/Azure/sonic-sairedis/subscription","commits_url":"https://api.github.com/repos/Azure/sonic-sairedis/commits{/sha}","git_commits_url":"https://api.github.com/repos/Azure/sonic-sairedis/git/commits{/sha}","comments_url":"https://api.github.com/repos/Azure/sonic-sairedis/comments{/number}","issue_comment_url":"https://api.github.com/repos/Azure/sonic-sairedis/issues/comments{/number}","contents_url":"https://api.github.com/repos/Azure/sonic-sairedis/contents/{+path}","compare_url":"https://api.github.com/repos/Azure/sonic-sairedis/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Azure/sonic-sairedis/merges","archive_url":"https://api.github.com/repos/Azure/sonic-sairedis/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Azure/sonic-sairedis/downloads","issues_url":"https://api.github.com/repos/Azure/sonic-sairedis/issues{/number}","pulls_url":"https://api.github.com/repos/Azure/sonic-sairedis/pulls{/number}","milestones_url":"https://api.github.com/repos/Azure/sonic-sairedis/milestones{/number}","notifications_url":"https://api.github.com/repos/Azure/sonic-sairedis/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Azure/sonic-sairedis/labels{/name}","releases_url":"https://api.github.com/repos/Azure/sonic-sairedis/releases{/id}","deployments_url":"https://api.github.com/repos/Azure/sonic-sairedis/deployments","created_at":"2016-03-08T22:58:27Z","updated_at":"2016-03-29T22:27:18Z","pushed_at":"2016-04-16T00:07:48Z","git_url":"git://github.com/Azure/sonic-sairedis.git","ssh_url":"git@github.com:Azure/sonic-sairedis.git","clone_url":"https://github.com/Azure/sonic-sairedis.git","svn_url":"https://github.com/Azure/sonic-sairedis","homepage":null,"size":100,"stargazers_count":5,"watchers_count":5,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":1,"forks":3,"open_issues":1,"watchers":5,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/5"},"html":{"href":"https://github.com/Azure/sonic-sairedis/pull/5"},"issue":{"href":"https://api.github.com/repos/Azure/sonic-sairedis/issues/5"},"comments":{"href":"https://api.github.com/repos/Azure/sonic-sairedis/issues/5/comments"},"review_comments":{"href":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/5/comments"},"review_comment":{"href":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Azure/sonic-sairedis/pulls/5/commits"},"statuses":{"href":"https://api.github.com/repos/Azure/sonic-sairedis/statuses/1a6b05bf874ebaf1b1794503c220b004267235eb"}}}}