{"action":"created","comment":{"url":"https://api.github.com/repos/outscale/butterfly/pulls/comments/90044821","pull_request_review_id":10568487,"id":90044821,"diff_hunk":"@@ -0,0 +1,462 @@\n+/* Copyright 2016 Outscale SAS\n+ *\n+ * This file is part of Butterfly.\n+ *\n+ * Butterfly is free software: you can redistribute it and/or modify\n+ * it under the terms of the GNU General Public License version 3 as published\n+ * by the Free Software Foundation.\n+ *\n+ * Butterfly 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 Butterfly.  If not, see <http://www.gnu.org/licenses/>.\n+ */\n+\n+#include \"api/client/client.h\"\n+\n+static int sub_nic_list(int argc, char **argv, const GlobalOptions &options) {\n+    string req = R\"( \\\n+        messages { \\\n+            revision: 0 \\\n+            message_0 { \\\n+                request { \\\n+                    nic_list: true \\\n+                } \\\n+            } \\\n+        })\";\n+\n+    proto::Messages res;\n+    if (request(req, &res, options, false) || check_request_result(res))\n+        return 1;\n+\n+    MessageV0_Response res_0 = res.messages(0).message_0().response();\n+    int size = res_0.nic_list_size();\n+    for (int i = 0; i < size; i++) {\n+        cout << res_0.nic_list(i) << endl;\n+    }\n+    return 0;\n+}\n+\n+static void sub_nic_stats_help(void) {\n+    cout << \"usage: butterfly stats NIC [options...]\" << endl;\n+    global_parameter_help();\n+}\n+\n+static int sub_nic_stats(int argc, char **argv, const GlobalOptions &options) {\n+    if (argc <= 3) {\n+        sub_nic_stats_help();\n+        return 1;\n+    }\n+    string nic = string(argv[3]);\n+    string req = R\"( \\\n+        messages { \\\n+            revision: 0 \\\n+            message_0 { \\\n+                request { \\\n+                    nic_stats: \\\"\" + nic + \"\\\" \\\n+                } \\\n+            } \\\n+        })\";\n+\n+    proto::Messages res;\n+    if (request(req, &res, options, false) || check_request_result(res))\n+        return 1;\n+\n+    MessageV0_Response res_0 = res.messages(0).message_0().response();\n+    if (!res_0.has_nic_stats()) {\n+        cerr << \"no nic stats received\" << endl;\n+        return 1;\n+    }\n+\n+    MessageV0_NicStats stats = res_0.nic_stats();\n+    cout << \"in: \" << to_string(stats.in()) << endl;\n+    cout << \"out: \" << to_string(stats.out()) << endl;\n+    return 0;\n+}\n+\n+static void sub_nic_details_help(void) {\n+    cout << \"usage: butterfly details NIC [options...]\" << endl;\n+    global_parameter_help();\n+}\n+\n+static int sub_nic_details(int argc, char **argv,\n+                           const GlobalOptions &options) {\n+    if (argc <= 3) {\n+        sub_nic_details_help();\n+        return 1;\n+    }\n+    string nic = string(argv[3]);\n+    string req = R\"(\\\n+        messages { \\\n+            revision: 0 \\\n+            message_0 { \\\n+                request { \\\n+                    nic_details: \\\"\" + nic + \"\\\" \\\n+                } \\\n+            } \\\n+        })\";\n+\n+    proto::Messages res;\n+    if (request(req, &res, options, false) || check_request_result(res))\n+        return 1;\n+\n+    MessageV0_Response res_0 = res.messages(0).message_0().response();\n+    if (res_0.nic_details_size() == 0) {\n+        cerr << \"no nic details received\" << endl;\n+        return 1;\n+    }\n+\n+    MessageV0_Nic details = res_0.nic_details(0);\n+    cout << \"id: \" << details.id() << endl;\n+    cout << \"mac: \" << details.mac() << endl;\n+    cout << \"vni: \" << to_string(details.vni()) << endl;\n+    for (int i = 0; i < details.ip_size(); i++)\n+        cout << \"ip: \" << details.ip(i) << endl;\n+    if (details.has_ip_anti_spoof())\n+        cout << \"antispoof: \" <<\n+            (details.ip_anti_spoof() ? \"true\" : \"false\") << endl;\n+    if (details.has_sniff_target_nic_id())\n+        cout << \"sniff target: \" << details.sniff_target_nic_id() << endl;\n+    return 0;\n+}\n+\n+static int sg_list(string nic, vector<string> *list,\n+                   const GlobalOptions &options) {\n+    string req = R\"(\\\n+        messages { \\\n+            revision: 0 \\\n+            message_0 { \\\n+                request { \\\n+                    nic_details: \\\"\" + nic + \"\\\" \\\n+                } \\\n+            } \\\n+        })\";\n+\n+    proto::Messages res;\n+    if (request(req, &res, options, false) || check_request_result(res))\n+        return 1;\n+\n+    MessageV0_Response res_0 = res.messages(0).message_0().response();\n+    if (res_0.nic_details_size() == 0) {\n+        cerr << \"no nic details received\" << endl;\n+        return 1;\n+    }\n+\n+    MessageV0_Nic details = res_0.nic_details(0);\n+    int size = details.security_group_size();\n+    for (int i = 0; i < size; i++)\n+        list->push_back(details.security_group(i));\n+    return 0;\n+}\n+\n+int sg_update(string nic, const vector<string> &list,\n+              const GlobalOptions &options) {\n+    string req = R\"(\\\n+        messages { \\\n+            revision: 0 \\\n+            message_0 { \\\n+                request { \\\n+                    nic_update: { \\\n+                        id: \\\")\" + nic + \"\\\"\";\n+    for (string sg : list)\n+        req += \"        security_group: \\\"\" + sg + \"\\\"\";\n+    req += R\"(\\\n+                    } \\\n+                } \\\n+            } \\\n+        })\";\n+\n+    proto::Messages res;\n+    return request(req, &res, options, false) || check_request_result(res);\n+}\n+\n+static void sub_nic_sg_list_help(void) {\n+    cout << \"usage: butterfly nic sg list NIC [options...]\" << endl;\n+    global_parameter_help();\n+}\n+\n+static int sub_nic_sg_list(int argc, char **argv,\n+                           const GlobalOptions &options) {\n+    if (argc <= 4) {\n+        sub_nic_sg_list_help();\n+        return 1;\n+    }\n+    string nic = string(argv[4]);\n+    vector<string> all_sg;\n+    if (sg_list(nic, &all_sg, options))\n+        return 1;\n+    for (string sg : all_sg)\n+        cout << sg << endl;\n+    return 0;\n+}\n+\n+static void sub_nic_sg_add_help(void) {\n+    cout << \"usage: butterfly nic sg add NIC SG [SG...] [options...]\" << endl;\n+    global_parameter_help();\n+}\n+\n+static int sub_nic_sg_add(int argc, char **argv,\n+                          const GlobalOptions &options) {\n+    if (argc <= 5) {\n+        sub_nic_sg_add_help();\n+        return 1;\n+    }\n+\n+    string nic = string(argv[4]);\n+    vector<string> to_add;\n+    for (int i = 5; i < argc; i++) {\n+        string a = string(argv[i]);\n+        if (a[0] == '-')\n+            break;\n+        to_add.push_back(a);\n+    }\n+    if (!to_add.size()) {\n+        sub_nic_sg_add_help();\n+        return 1;\n+    }\n+\n+    vector<string> all_sg;\n+    if (sg_list(nic, &all_sg, options))\n+        return 1;\n+\n+    // merge existing list with new list\n+    uint32_t old_size = all_sg.size();\n+    all_sg.insert(all_sg.end(), to_add.begin(), to_add.end());\n+    sort(all_sg.begin(), all_sg.end());\n+    auto last = unique(all_sg.begin(), all_sg.end());\n+    all_sg.erase(last, all_sg.end());\n+\n+    if (all_sg.size() == old_size) {\n+        return 0;\n+    }\n+\n+    return sg_update(nic, all_sg, options);\n+}\n+\n+static void sub_nic_sg_del_help(void) {\n+    cout << \"usage: butterfly nic sg del NIC SG [SG...] [options...]\" << endl;\n+    global_parameter_help();\n+}\n+\n+static int sub_nic_sg_del(int argc, char **argv,\n+                          const GlobalOptions &options) {\n+    if (argc <= 5) {\n+        sub_nic_sg_del_help();\n+        return 1;\n+    }\n+\n+    string nic = string(argv[4]);\n+    vector<string> to_del;\n+    for (int i = 5; i < argc; i++) {\n+        string a = string(argv[i]);\n+        if (a[0] == '-')\n+            break;\n+        to_del.push_back(a);\n+    }\n+    if (!to_del.size()) {\n+        sub_nic_sg_del_help();\n+        return 1;\n+    }\n+\n+    vector<string> all_sg;\n+    if (sg_list(nic, &all_sg, options))\n+        return 1;\n+\n+    vector<string> new_sg;\n+    for (string sg : all_sg) {\n+        auto r = find(to_del.begin(), to_del.end(), sg);\n+        if (r == to_del.end())\n+            new_sg.push_back(sg);\n+    }\n+\n+    if (new_sg.size() == all_sg.size()) {\n+        return 0;\n+    }\n+    return sg_update(nic, new_sg, options);\n+}\n+\n+static void sub_nic_sg_help(void) {\n+    cout <<\n+        \"butterfly nic sg subcommands:\" << endl <<\n+        \"    list  list security groups attached to a nic\" << endl <<\n+        \"    add   add one or more security group to a nic\" << endl <<\n+        \"    del   removes one or more security group of a nic\" << endl;\n+        global_parameter_help();\n+}\n+\n+static int sub_nic_sg(int argc, char **argv, const GlobalOptions &options) {\n+    if (argc <= 3) {\n+        sub_nic_sg_help();\n+        return 1;\n+    }\n+    string cmd = string(argv[3]);\n+    if (cmd == \"list\") {\n+        return sub_nic_sg_list(argc, argv, options);\n+    } else if (cmd == \"add\") {\n+        return sub_nic_sg_add(argc, argv, options);\n+    } else if (cmd == \"del\") {\n+        return sub_nic_sg_del(argc, argv, options);\n+    } else {\n+        cerr << \"invalid nic sg subcommand \" << cmd << endl;\n+        sub_nic_sg_help();","path":"api/client/nic.cc","position":304,"original_position":304,"commit_id":"5501c4d3cdec5751fd682f1bb41f42297e8ce08a","original_commit_id":"5501c4d3cdec5751fd682f1bb41f42297e8ce08a","user":{"login":"outscale-mgo","id":10047309,"avatar_url":"https://avatars.githubusercontent.com/u/10047309?v=3","gravatar_id":"","url":"https://api.github.com/users/outscale-mgo","html_url":"https://github.com/outscale-mgo","followers_url":"https://api.github.com/users/outscale-mgo/followers","following_url":"https://api.github.com/users/outscale-mgo/following{/other_user}","gists_url":"https://api.github.com/users/outscale-mgo/gists{/gist_id}","starred_url":"https://api.github.com/users/outscale-mgo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/outscale-mgo/subscriptions","organizations_url":"https://api.github.com/users/outscale-mgo/orgs","repos_url":"https://api.github.com/users/outscale-mgo/repos","events_url":"https://api.github.com/users/outscale-mgo/events{/privacy}","received_events_url":"https://api.github.com/users/outscale-mgo/received_events","type":"User","site_admin":false},"body":"and here","created_at":"2016-11-29T16:22:13Z","updated_at":"2016-11-29T16:22:13Z","html_url":"https://github.com/outscale/butterfly/pull/187#discussion_r90044821","pull_request_url":"https://api.github.com/repos/outscale/butterfly/pulls/187","_links":{"self":{"href":"https://api.github.com/repos/outscale/butterfly/pulls/comments/90044821"},"html":{"href":"https://github.com/outscale/butterfly/pull/187#discussion_r90044821"},"pull_request":{"href":"https://api.github.com/repos/outscale/butterfly/pulls/187"}}},"pull_request":{"url":"https://api.github.com/repos/outscale/butterfly/pulls/187","id":94980590,"html_url":"https://github.com/outscale/butterfly/pull/187","diff_url":"https://github.com/outscale/butterfly/pull/187.diff","patch_url":"https://github.com/outscale/butterfly/pull/187.patch","issue_url":"https://api.github.com/repos/outscale/butterfly/issues/187","number":187,"state":"open","locked":false,"title":"CLI","user":{"login":"outscale-jju","id":10711235,"avatar_url":"https://avatars.githubusercontent.com/u/10711235?v=3","gravatar_id":"","url":"https://api.github.com/users/outscale-jju","html_url":"https://github.com/outscale-jju","followers_url":"https://api.github.com/users/outscale-jju/followers","following_url":"https://api.github.com/users/outscale-jju/following{/other_user}","gists_url":"https://api.github.com/users/outscale-jju/gists{/gist_id}","starred_url":"https://api.github.com/users/outscale-jju/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/outscale-jju/subscriptions","organizations_url":"https://api.github.com/users/outscale-jju/orgs","repos_url":"https://api.github.com/users/outscale-jju/repos","events_url":"https://api.github.com/users/outscale-jju/events{/privacy}","received_events_url":"https://api.github.com/users/outscale-jju/received_events","type":"User","site_admin":false},"body":"api/client: complete rewrite providing a cli\r\n\r\n- closes #162\r\n- closes #174\r\n\r\nSigned-off-by: Jerome Jutteau <jerome.jutteau@outscale.com>","created_at":"2016-11-23T10:54:28Z","updated_at":"2016-11-29T16:45:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"43ce71d4828ced2d739beff1b7340b5b447a02b6","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/outscale/butterfly/pulls/187/commits","review_comments_url":"https://api.github.com/repos/outscale/butterfly/pulls/187/comments","review_comment_url":"https://api.github.com/repos/outscale/butterfly/pulls/comments{/number}","comments_url":"https://api.github.com/repos/outscale/butterfly/issues/187/comments","statuses_url":"https://api.github.com/repos/outscale/butterfly/statuses/5501c4d3cdec5751fd682f1bb41f42297e8ce08a","head":{"label":"outscale-jju:cli","ref":"cli","sha":"5501c4d3cdec5751fd682f1bb41f42297e8ce08a","user":{"login":"outscale-jju","id":10711235,"avatar_url":"https://avatars.githubusercontent.com/u/10711235?v=3","gravatar_id":"","url":"https://api.github.com/users/outscale-jju","html_url":"https://github.com/outscale-jju","followers_url":"https://api.github.com/users/outscale-jju/followers","following_url":"https://api.github.com/users/outscale-jju/following{/other_user}","gists_url":"https://api.github.com/users/outscale-jju/gists{/gist_id}","starred_url":"https://api.github.com/users/outscale-jju/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/outscale-jju/subscriptions","organizations_url":"https://api.github.com/users/outscale-jju/orgs","repos_url":"https://api.github.com/users/outscale-jju/repos","events_url":"https://api.github.com/users/outscale-jju/events{/privacy}","received_events_url":"https://api.github.com/users/outscale-jju/received_events","type":"User","site_admin":false},"repo":{"id":40182458,"name":"butterfly","full_name":"outscale-jju/butterfly","owner":{"login":"outscale-jju","id":10711235,"avatar_url":"https://avatars.githubusercontent.com/u/10711235?v=3","gravatar_id":"","url":"https://api.github.com/users/outscale-jju","html_url":"https://github.com/outscale-jju","followers_url":"https://api.github.com/users/outscale-jju/followers","following_url":"https://api.github.com/users/outscale-jju/following{/other_user}","gists_url":"https://api.github.com/users/outscale-jju/gists{/gist_id}","starred_url":"https://api.github.com/users/outscale-jju/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/outscale-jju/subscriptions","organizations_url":"https://api.github.com/users/outscale-jju/orgs","repos_url":"https://api.github.com/users/outscale-jju/repos","events_url":"https://api.github.com/users/outscale-jju/events{/privacy}","received_events_url":"https://api.github.com/users/outscale-jju/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/outscale-jju/butterfly","description":"Butterfly connects Virtual Machines and control their traffic flow","fork":true,"url":"https://api.github.com/repos/outscale-jju/butterfly","forks_url":"https://api.github.com/repos/outscale-jju/butterfly/forks","keys_url":"https://api.github.com/repos/outscale-jju/butterfly/keys{/key_id}","collaborators_url":"https://api.github.com/repos/outscale-jju/butterfly/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/outscale-jju/butterfly/teams","hooks_url":"https://api.github.com/repos/outscale-jju/butterfly/hooks","issue_events_url":"https://api.github.com/repos/outscale-jju/butterfly/issues/events{/number}","events_url":"https://api.github.com/repos/outscale-jju/butterfly/events","assignees_url":"https://api.github.com/repos/outscale-jju/butterfly/assignees{/user}","branches_url":"https://api.github.com/repos/outscale-jju/butterfly/branches{/branch}","tags_url":"https://api.github.com/repos/outscale-jju/butterfly/tags","blobs_url":"https://api.github.com/repos/outscale-jju/butterfly/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/outscale-jju/butterfly/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/outscale-jju/butterfly/git/refs{/sha}","trees_url":"https://api.github.com/repos/outscale-jju/butterfly/git/trees{/sha}","statuses_url":"https://api.github.com/repos/outscale-jju/butterfly/statuses/{sha}","languages_url":"https://api.github.com/repos/outscale-jju/butterfly/languages","stargazers_url":"https://api.github.com/repos/outscale-jju/butterfly/stargazers","contributors_url":"https://api.github.com/repos/outscale-jju/butterfly/contributors","subscribers_url":"https://api.github.com/repos/outscale-jju/butterfly/subscribers","subscription_url":"https://api.github.com/repos/outscale-jju/butterfly/subscription","commits_url":"https://api.github.com/repos/outscale-jju/butterfly/commits{/sha}","git_commits_url":"https://api.github.com/repos/outscale-jju/butterfly/git/commits{/sha}","comments_url":"https://api.github.com/repos/outscale-jju/butterfly/comments{/number}","issue_comment_url":"https://api.github.com/repos/outscale-jju/butterfly/issues/comments{/number}","contents_url":"https://api.github.com/repos/outscale-jju/butterfly/contents/{+path}","compare_url":"https://api.github.com/repos/outscale-jju/butterfly/compare/{base}...{head}","merges_url":"https://api.github.com/repos/outscale-jju/butterfly/merges","archive_url":"https://api.github.com/repos/outscale-jju/butterfly/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/outscale-jju/butterfly/downloads","issues_url":"https://api.github.com/repos/outscale-jju/butterfly/issues{/number}","pulls_url":"https://api.github.com/repos/outscale-jju/butterfly/pulls{/number}","milestones_url":"https://api.github.com/repos/outscale-jju/butterfly/milestones{/number}","notifications_url":"https://api.github.com/repos/outscale-jju/butterfly/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/outscale-jju/butterfly/labels{/name}","releases_url":"https://api.github.com/repos/outscale-jju/butterfly/releases{/id}","deployments_url":"https://api.github.com/repos/outscale-jju/butterfly/deployments","created_at":"2015-08-04T12:08:26Z","updated_at":"2016-10-31T14:52:00Z","pushed_at":"2016-11-29T14:10:36Z","git_url":"git://github.com/outscale-jju/butterfly.git","ssh_url":"git@github.com:outscale-jju/butterfly.git","clone_url":"https://github.com/outscale-jju/butterfly.git","svn_url":"https://github.com/outscale-jju/butterfly","homepage":"","size":1019,"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":"outscale:master","ref":"master","sha":"bfd3ffa6d389c67f71c956857f1fc4ff36f364d7","user":{"login":"outscale","id":8233735,"avatar_url":"https://avatars.githubusercontent.com/u/8233735?v=3","gravatar_id":"","url":"https://api.github.com/users/outscale","html_url":"https://github.com/outscale","followers_url":"https://api.github.com/users/outscale/followers","following_url":"https://api.github.com/users/outscale/following{/other_user}","gists_url":"https://api.github.com/users/outscale/gists{/gist_id}","starred_url":"https://api.github.com/users/outscale/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/outscale/subscriptions","organizations_url":"https://api.github.com/users/outscale/orgs","repos_url":"https://api.github.com/users/outscale/repos","events_url":"https://api.github.com/users/outscale/events{/privacy}","received_events_url":"https://api.github.com/users/outscale/received_events","type":"Organization","site_admin":false},"repo":{"id":35087520,"name":"butterfly","full_name":"outscale/butterfly","owner":{"login":"outscale","id":8233735,"avatar_url":"https://avatars.githubusercontent.com/u/8233735?v=3","gravatar_id":"","url":"https://api.github.com/users/outscale","html_url":"https://github.com/outscale","followers_url":"https://api.github.com/users/outscale/followers","following_url":"https://api.github.com/users/outscale/following{/other_user}","gists_url":"https://api.github.com/users/outscale/gists{/gist_id}","starred_url":"https://api.github.com/users/outscale/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/outscale/subscriptions","organizations_url":"https://api.github.com/users/outscale/orgs","repos_url":"https://api.github.com/users/outscale/repos","events_url":"https://api.github.com/users/outscale/events{/privacy}","received_events_url":"https://api.github.com/users/outscale/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/outscale/butterfly","description":"Butterfly connects Virtual Machines and control their traffic flow","fork":false,"url":"https://api.github.com/repos/outscale/butterfly","forks_url":"https://api.github.com/repos/outscale/butterfly/forks","keys_url":"https://api.github.com/repos/outscale/butterfly/keys{/key_id}","collaborators_url":"https://api.github.com/repos/outscale/butterfly/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/outscale/butterfly/teams","hooks_url":"https://api.github.com/repos/outscale/butterfly/hooks","issue_events_url":"https://api.github.com/repos/outscale/butterfly/issues/events{/number}","events_url":"https://api.github.com/repos/outscale/butterfly/events","assignees_url":"https://api.github.com/repos/outscale/butterfly/assignees{/user}","branches_url":"https://api.github.com/repos/outscale/butterfly/branches{/branch}","tags_url":"https://api.github.com/repos/outscale/butterfly/tags","blobs_url":"https://api.github.com/repos/outscale/butterfly/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/outscale/butterfly/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/outscale/butterfly/git/refs{/sha}","trees_url":"https://api.github.com/repos/outscale/butterfly/git/trees{/sha}","statuses_url":"https://api.github.com/repos/outscale/butterfly/statuses/{sha}","languages_url":"https://api.github.com/repos/outscale/butterfly/languages","stargazers_url":"https://api.github.com/repos/outscale/butterfly/stargazers","contributors_url":"https://api.github.com/repos/outscale/butterfly/contributors","subscribers_url":"https://api.github.com/repos/outscale/butterfly/subscribers","subscription_url":"https://api.github.com/repos/outscale/butterfly/subscription","commits_url":"https://api.github.com/repos/outscale/butterfly/commits{/sha}","git_commits_url":"https://api.github.com/repos/outscale/butterfly/git/commits{/sha}","comments_url":"https://api.github.com/repos/outscale/butterfly/comments{/number}","issue_comment_url":"https://api.github.com/repos/outscale/butterfly/issues/comments{/number}","contents_url":"https://api.github.com/repos/outscale/butterfly/contents/{+path}","compare_url":"https://api.github.com/repos/outscale/butterfly/compare/{base}...{head}","merges_url":"https://api.github.com/repos/outscale/butterfly/merges","archive_url":"https://api.github.com/repos/outscale/butterfly/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/outscale/butterfly/downloads","issues_url":"https://api.github.com/repos/outscale/butterfly/issues{/number}","pulls_url":"https://api.github.com/repos/outscale/butterfly/pulls{/number}","milestones_url":"https://api.github.com/repos/outscale/butterfly/milestones{/number}","notifications_url":"https://api.github.com/repos/outscale/butterfly/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/outscale/butterfly/labels{/name}","releases_url":"https://api.github.com/repos/outscale/butterfly/releases{/id}","deployments_url":"https://api.github.com/repos/outscale/butterfly/deployments","created_at":"2015-05-05T08:30:57Z","updated_at":"2016-11-25T12:25:38Z","pushed_at":"2016-11-29T14:10:36Z","git_url":"git://github.com/outscale/butterfly.git","ssh_url":"git@github.com:outscale/butterfly.git","clone_url":"https://github.com/outscale/butterfly.git","svn_url":"https://github.com/outscale/butterfly","homepage":"","size":1254,"stargazers_count":5,"watchers_count":5,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":37,"forks":8,"open_issues":37,"watchers":5,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/outscale/butterfly/pulls/187"},"html":{"href":"https://github.com/outscale/butterfly/pull/187"},"issue":{"href":"https://api.github.com/repos/outscale/butterfly/issues/187"},"comments":{"href":"https://api.github.com/repos/outscale/butterfly/issues/187/comments"},"review_comments":{"href":"https://api.github.com/repos/outscale/butterfly/pulls/187/comments"},"review_comment":{"href":"https://api.github.com/repos/outscale/butterfly/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/outscale/butterfly/pulls/187/commits"},"statuses":{"href":"https://api.github.com/repos/outscale/butterfly/statuses/5501c4d3cdec5751fd682f1bb41f42297e8ce08a"}}}}
{"actor":{"display_login":"outscale-mgo"}}