{"action":"created","comment":{"url":"https://api.github.com/repos/apache/cloudstack/pulls/comments/240175437","pull_request_review_id":183141840,"id":240175437,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MDE3NTQzNw==","diff_hunk":"@@ -420,55 +505,65 @@ protected void runInContext() {\n                 SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria();\n                 sc.addAnd(\"status\", SearchCriteria.Op.EQ, Status.Up.toString());\n                 sc.addAnd(\"resourceState\", SearchCriteria.Op.NIN, ResourceState.Maintenance, ResourceState.PrepareForMaintenance, ResourceState.ErrorInMaintenance);\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.Storage.toString());\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.ConsoleProxy.toString());\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.SecondaryStorage.toString());\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.LocalSecondaryStorage.toString());\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.TrafficMonitor.toString());\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.SecondaryStorageVM.toString());\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.ExternalFirewall.toString());\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.ExternalLoadBalancer.toString());\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.NetScalerControlCenter.toString());\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.L2Networking.toString());\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.BaremetalDhcp.toString());\n-                sc.addAnd(\"type\", SearchCriteria.Op.NEQ, Host.Type.BaremetalPxe.toString());\n+                sc.addAnd(\"type\", SearchCriteria.Op.EQ, Host.Type.Routing.toString());\n+\n                 ConcurrentHashMap<Long, HostStats> hostStats = new ConcurrentHashMap<Long, HostStats>();\n+                Map<Object, Object> metrics = new HashMap<>();\n                 List<HostVO> hosts = _hostDao.search(sc, null);\n+\n                 for (HostVO host : hosts) {\n-                    HostStatsEntry stats = (HostStatsEntry)_resourceMgr.getHostStatistics(host.getId());\n-                    if (stats != null) {\n-                        hostStats.put(host.getId(), stats);\n+                    HostStatsEntry hostStatsEntry = (HostStatsEntry)_resourceMgr.getHostStatistics(host.getId());\n+                    if (hostStatsEntry != null) {\n+                        hostStatsEntry.setHostVo(host);\n+                        metrics.put(hostStatsEntry.getHostId(), hostStatsEntry);\n+                        _hostStats.put(host.getId(), hostStatsEntry);\n                     } else {\n                         s_logger.warn(\"Received invalid host stats for host: \" + host.getId());\n                     }\n                 }\n-                _hostStats = hostStats;\n-                // Get a subset of hosts with GPU support from the list of \"hosts\"\n-                List<HostVO> gpuEnabledHosts = new ArrayList<HostVO>();\n-                if (hostIds != null) {\n-                    for (HostVO host : hosts) {\n-                        if (hostIds.contains(host.getId())) {\n-                            gpuEnabledHosts.add(host);\n-                        }\n-                    }\n-                } else {\n-                    // Check for all the hosts managed by CloudStack.\n-                    gpuEnabledHosts = hosts;\n-                }\n-                for (HostVO host : gpuEnabledHosts) {\n-                    HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = _resourceMgr.getGPUStatistics(host);\n-                    if (groupDetails != null) {\n-                        _resourceMgr.updateGPUDetails(host.getId(), groupDetails);\n-                    }\n+\n+                if (externalStatsType == ExternalStatsProtocol.INFLUXDB) {\n+                    sendMetricsToInfluxdb(metrics);\n                 }\n-                hostIds = _hostGpuGroupsDao.listHostIds();\n+\n+                updateGpuEnabledHostsDetails(hosts);\n             } catch (Throwable t) {\n                 s_logger.error(\"Error trying to retrieve host stats\", t);\n             }\n         }\n+\n+        /**\n+         * Updates GPU details on hosts supporting GPU.\n+         */\n+        private void updateGpuEnabledHostsDetails(List<HostVO> hosts) {","path":"server/src/main/java/com/cloud/server/StatsCollector.java","position":306,"original_position":294,"commit_id":"b6f6302f8998548d74c8f2669721a2a22b71487d","original_commit_id":"b463e06fd2cc74f4fcf338d9e474d2307d3a910c","user":{"login":"GabrielBrascher","id":5025148,"node_id":"MDQ6VXNlcjUwMjUxNDg=","avatar_url":"https://avatars0.githubusercontent.com/u/5025148?v=4","gravatar_id":"","url":"https://api.github.com/users/GabrielBrascher","html_url":"https://github.com/GabrielBrascher","followers_url":"https://api.github.com/users/GabrielBrascher/followers","following_url":"https://api.github.com/users/GabrielBrascher/following{/other_user}","gists_url":"https://api.github.com/users/GabrielBrascher/gists{/gist_id}","starred_url":"https://api.github.com/users/GabrielBrascher/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GabrielBrascher/subscriptions","organizations_url":"https://api.github.com/users/GabrielBrascher/orgs","repos_url":"https://api.github.com/users/GabrielBrascher/repos","events_url":"https://api.github.com/users/GabrielBrascher/events{/privacy}","received_events_url":"https://api.github.com/users/GabrielBrascher/received_events","type":"User","site_admin":false},"body":"Thanks, @rafaelweingartner. Updated!","created_at":"2018-12-10T11:31:41Z","updated_at":"2018-12-10T11:31:41Z","html_url":"https://github.com/apache/cloudstack/pull/3078#discussion_r240175437","pull_request_url":"https://api.github.com/repos/apache/cloudstack/pulls/3078","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/comments/240175437"},"html":{"href":"https://github.com/apache/cloudstack/pull/3078#discussion_r240175437"},"pull_request":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/3078"}},"in_reply_to_id":239605451},"pull_request":{"url":"https://api.github.com/repos/apache/cloudstack/pulls/3078","id":236002519,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM2MDAyNTE5","html_url":"https://github.com/apache/cloudstack/pull/3078","diff_url":"https://github.com/apache/cloudstack/pull/3078.diff","patch_url":"https://github.com/apache/cloudstack/pull/3078.patch","issue_url":"https://api.github.com/repos/apache/cloudstack/issues/3078","number":3078,"state":"open","locked":false,"title":"Add influxdb to statscollector","user":{"login":"GabrielBrascher","id":5025148,"node_id":"MDQ6VXNlcjUwMjUxNDg=","avatar_url":"https://avatars0.githubusercontent.com/u/5025148?v=4","gravatar_id":"","url":"https://api.github.com/users/GabrielBrascher","html_url":"https://github.com/GabrielBrascher","followers_url":"https://api.github.com/users/GabrielBrascher/followers","following_url":"https://api.github.com/users/GabrielBrascher/following{/other_user}","gists_url":"https://api.github.com/users/GabrielBrascher/gists{/gist_id}","starred_url":"https://api.github.com/users/GabrielBrascher/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GabrielBrascher/subscriptions","organizations_url":"https://api.github.com/users/GabrielBrascher/orgs","repos_url":"https://api.github.com/users/GabrielBrascher/repos","events_url":"https://api.github.com/users/GabrielBrascher/events{/privacy}","received_events_url":"https://api.github.com/users/GabrielBrascher/received_events","type":"User","site_admin":false},"body":"## Description\r\n<!--- Describe your changes in detail -->\r\nAdd Support for InfluxDB on StatsCollector.\r\n\r\nThe collector is defined on the URI scheme. The _Global Settings_ configuration with the name `stats.output.uri` is used to set the URI to send StatsCollector statistics to.\r\n\r\nExample: `graphite://graphite-hostaddress:port` or `influxdb://influxdb-hostaddress:port/dbname`. Note that the port is optional, if not added the default port for the respective collector (graphite or influxdb) will be used. Additionally, the database name `dbname` is also optional; default db name is `cloudstack`. Note that one must create and configure the database if using influxdb.\r\n\r\n- Host stats\r\nFor the host metrics it creates an InfluxDB point with the measure `host_stats` and containing the following tags and fields:\r\nTags:\r\n-- host_id\r\n-- uuid\r\n-- pod_id\r\n-- data_center_id\r\nFields:\r\n-- total_memory_kbs\r\n-- free_memory_kbs\r\n-- cpu_utilization\r\n-- cpus\r\n-- cpu_sockets\r\n-- network_read_kbs\r\n-- network_write_kbs\r\n\r\n- VM stats\r\nIt creates an InfluxDB point with the measure `vm_stats` and containing the following tags and fields:\r\nTags:\r\n-- vm_id\r\n-- uuid\r\n-- pod_id\r\n-- data_center_id\r\n-- host_id\r\nFields:\r\n-- total_memory_kbs\r\n-- free_memory_kbs\r\n-- memory_target_kbs\r\n-- cpu_utilization\r\n-- cpus\r\n-- network_read_kbs\r\n-- network_write_kbs\r\n-- disk_read_kbs\r\n-- disk_read_iops\r\n-- disk_write_kbs\r\n-- disk_write_iops\r\n\r\n**Note:** As the current stats collector supports only KVM, this extension supports only KVM. I am planning on enhance and refactor the StatsCollector architecture on the future. Due to the inner class structure, test case for some methods will not be implemented. On the future it will be necessary to refactor the whole StatsCOllector architecture and extract inner classes.\r\n\r\n<!-- For new features, provide link to FS, dev ML discussion etc. -->\r\n<!-- In case of bug fix, the expected and actual behaviours, steps to reproduce. -->\r\n\r\n<!-- When \"Fixes: #<id>\" is specified, the issue/PR will automatically be closed when this PR gets merged -->\r\n<!-- For addressing multiple issues/PRs, use multiple \"Fixes: #<id>\" -->\r\n<!-- Fixes: # -->\r\n\r\n## Types of changes\r\n<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->\r\n- [ ] Breaking change (fix or feature that would cause existing functionality to change)\r\n- [x] New feature (non-breaking change which adds functionality)\r\n- [ ] Bug fix (non-breaking change which fixes an issue)\r\n- [ ] Enhancement (improves an existing feature and functionality)\r\n- [ ] Cleanup (Code refactoring and cleanup, that may add test cases)\r\n\r\n## Screenshots (if appropriate):\r\n\r\n## How Has This Been Tested?\r\n<!-- Please describe in detail how you tested your changes. -->\r\n<!-- Include details of your testing environment, and the tests you ran to -->\r\n<!-- see how your change affects other areas of the code, etc. -->\r\nApart from the JUnit tests, the following tests have been manually done, asserting the expected behavior.\r\nTest 1: correct scheme and address, database \"cloudstack\" exists, default port 8086 is open and listening  (influxdb://172.16.0.10, influxdb://172.16.0.10/cloudstack, or influxdb://172.16.0.10:8086/cloudstack)\r\n- Result: CloudStack starts correctly, data are stored in the database cloudstack (the \"cloudstack\" is already configured on the influxdb before testing) and no error/warning logs.\r\n\r\nTest 2: `stats.output.uri` has wrong URI scheme (http://172.16.0.10 or influxd://172.16.0.10)\r\n - Result: Cannot store data on the InfluxDB host, logs the following Errors\r\n```\r\nERROR  [c.c.s.StatsCollector] (main:null) (logid:) influxd is not a valid protocol for external statistics. No statistics will be send.\r\n(...)\r\nERROR [c.c.s.StatsCollector] (main:null) (logid:) Failed to parse external statistics URI: Cannot define a port for the Stats Collector service. The configured URI in stats.output.uri is not supported. Please configure as the following examples: graphite://graphite-hostaddress:port, or influxdb://influxdb-hostaddress:port. Note that the port is optional, if not added the default port for the respective collector (graphite or influxdb) will be used.: influxd://172.16.0.10\r\n```\r\n\r\nTest 3: correct URI scheme but wrong address (influxdb://172.16.0.11)\r\n- Result: Cannot store data on the InfluxDB host, logs the following error\r\n```\r\nERROR [c.c.s.StatsCollector] (StatsCollector-6:ctx-bf6d551c) (logid:d5c92b19) Error trying to retrieve host stats\r\norg.influxdb.InfluxDBIOException: java.net.NoRouteToHostException: No route to host (Host unreachable)\r\n```\r\n\r\nTest 4: correct URI scheme and address, database does not exist (influxdb://172.16.0.10/nonexistingdb)\r\n- Result: Cannot store data on the InfluxDB host, logs the following Errors\r\n```\r\nERROR [c.c.s.StatsCollector] (StatsCollector-1:ctx-5921793c) (logid:d4bab167) Error trying to retrieve host stats\r\ncom.cloud.utils.exception.CloudRuntimeException: Database with name nonexistingdb does not exist in influxdb host 172.16.0.10:8086\r\n\r\n```\r\nTest 5: correct URI scheme and address, database exists, customized port is not correctily configured (influxdb://172.16.0.10:8888/)\r\n- Result: Cannot store data on the InfluxDB host, logs the following Errors\r\n```\r\nERROR [c.c.s.StatsCollector] (StatsCollector-1:ctx-b2371dde) (logid:209a4b10) Error trying to retrieve host stats\r\norg.influxdb.InfluxDBIOException: java.net.ConnectException: Failed to connect to /172.16.0.10:8888\r\n\r\n```\r\nTest 6: set stats.output.uri to null/empty\r\n- Result: it does not write in the external stats collector and does not log exceptions, as expected.\r\n\r\n<!-- Please read the [CONTRIBUTING](https://github.com/apache/cloudstack/blob/master/CONTRIBUTING.md) document -->\r\n","created_at":"2018-12-05T00:04:44Z","updated_at":"2018-12-10T11:31:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"028a9b548a3170f95f56d2de9b5a33ba1305a403","assignee":{"login":"GabrielBrascher","id":5025148,"node_id":"MDQ6VXNlcjUwMjUxNDg=","avatar_url":"https://avatars0.githubusercontent.com/u/5025148?v=4","gravatar_id":"","url":"https://api.github.com/users/GabrielBrascher","html_url":"https://github.com/GabrielBrascher","followers_url":"https://api.github.com/users/GabrielBrascher/followers","following_url":"https://api.github.com/users/GabrielBrascher/following{/other_user}","gists_url":"https://api.github.com/users/GabrielBrascher/gists{/gist_id}","starred_url":"https://api.github.com/users/GabrielBrascher/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GabrielBrascher/subscriptions","organizations_url":"https://api.github.com/users/GabrielBrascher/orgs","repos_url":"https://api.github.com/users/GabrielBrascher/repos","events_url":"https://api.github.com/users/GabrielBrascher/events{/privacy}","received_events_url":"https://api.github.com/users/GabrielBrascher/received_events","type":"User","site_admin":false},"assignees":[{"login":"GabrielBrascher","id":5025148,"node_id":"MDQ6VXNlcjUwMjUxNDg=","avatar_url":"https://avatars0.githubusercontent.com/u/5025148?v=4","gravatar_id":"","url":"https://api.github.com/users/GabrielBrascher","html_url":"https://github.com/GabrielBrascher","followers_url":"https://api.github.com/users/GabrielBrascher/followers","following_url":"https://api.github.com/users/GabrielBrascher/following{/other_user}","gists_url":"https://api.github.com/users/GabrielBrascher/gists{/gist_id}","starred_url":"https://api.github.com/users/GabrielBrascher/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GabrielBrascher/subscriptions","organizations_url":"https://api.github.com/users/GabrielBrascher/orgs","repos_url":"https://api.github.com/users/GabrielBrascher/repos","events_url":"https://api.github.com/users/GabrielBrascher/events{/privacy}","received_events_url":"https://api.github.com/users/GabrielBrascher/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"rhtyd","id":95203,"node_id":"MDQ6VXNlcjk1MjAz","avatar_url":"https://avatars0.githubusercontent.com/u/95203?v=4","gravatar_id":"","url":"https://api.github.com/users/rhtyd","html_url":"https://github.com/rhtyd","followers_url":"https://api.github.com/users/rhtyd/followers","following_url":"https://api.github.com/users/rhtyd/following{/other_user}","gists_url":"https://api.github.com/users/rhtyd/gists{/gist_id}","starred_url":"https://api.github.com/users/rhtyd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rhtyd/subscriptions","organizations_url":"https://api.github.com/users/rhtyd/orgs","repos_url":"https://api.github.com/users/rhtyd/repos","events_url":"https://api.github.com/users/rhtyd/events{/privacy}","received_events_url":"https://api.github.com/users/rhtyd/received_events","type":"User","site_admin":false},{"login":"wido","id":326786,"node_id":"MDQ6VXNlcjMyNjc4Ng==","avatar_url":"https://avatars2.githubusercontent.com/u/326786?v=4","gravatar_id":"","url":"https://api.github.com/users/wido","html_url":"https://github.com/wido","followers_url":"https://api.github.com/users/wido/followers","following_url":"https://api.github.com/users/wido/following{/other_user}","gists_url":"https://api.github.com/users/wido/gists{/gist_id}","starred_url":"https://api.github.com/users/wido/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wido/subscriptions","organizations_url":"https://api.github.com/users/wido/orgs","repos_url":"https://api.github.com/users/wido/repos","events_url":"https://api.github.com/users/wido/events{/privacy}","received_events_url":"https://api.github.com/users/wido/received_events","type":"User","site_admin":false},{"login":"DaanHoogland","id":2486961,"node_id":"MDQ6VXNlcjI0ODY5NjE=","avatar_url":"https://avatars1.githubusercontent.com/u/2486961?v=4","gravatar_id":"","url":"https://api.github.com/users/DaanHoogland","html_url":"https://github.com/DaanHoogland","followers_url":"https://api.github.com/users/DaanHoogland/followers","following_url":"https://api.github.com/users/DaanHoogland/following{/other_user}","gists_url":"https://api.github.com/users/DaanHoogland/gists{/gist_id}","starred_url":"https://api.github.com/users/DaanHoogland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DaanHoogland/subscriptions","organizations_url":"https://api.github.com/users/DaanHoogland/orgs","repos_url":"https://api.github.com/users/DaanHoogland/repos","events_url":"https://api.github.com/users/DaanHoogland/events{/privacy}","received_events_url":"https://api.github.com/users/DaanHoogland/received_events","type":"User","site_admin":false},{"login":"nvazquez","id":5295080,"node_id":"MDQ6VXNlcjUyOTUwODA=","avatar_url":"https://avatars2.githubusercontent.com/u/5295080?v=4","gravatar_id":"","url":"https://api.github.com/users/nvazquez","html_url":"https://github.com/nvazquez","followers_url":"https://api.github.com/users/nvazquez/followers","following_url":"https://api.github.com/users/nvazquez/following{/other_user}","gists_url":"https://api.github.com/users/nvazquez/gists{/gist_id}","starred_url":"https://api.github.com/users/nvazquez/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nvazquez/subscriptions","organizations_url":"https://api.github.com/users/nvazquez/orgs","repos_url":"https://api.github.com/users/nvazquez/repos","events_url":"https://api.github.com/users/nvazquez/events{/privacy}","received_events_url":"https://api.github.com/users/nvazquez/received_events","type":"User","site_admin":false},{"login":"kiwiflyer","id":17278194,"node_id":"MDQ6VXNlcjE3Mjc4MTk0","avatar_url":"https://avatars1.githubusercontent.com/u/17278194?v=4","gravatar_id":"","url":"https://api.github.com/users/kiwiflyer","html_url":"https://github.com/kiwiflyer","followers_url":"https://api.github.com/users/kiwiflyer/followers","following_url":"https://api.github.com/users/kiwiflyer/following{/other_user}","gists_url":"https://api.github.com/users/kiwiflyer/gists{/gist_id}","starred_url":"https://api.github.com/users/kiwiflyer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kiwiflyer/subscriptions","organizations_url":"https://api.github.com/users/kiwiflyer/orgs","repos_url":"https://api.github.com/users/kiwiflyer/repos","events_url":"https://api.github.com/users/kiwiflyer/events{/privacy}","received_events_url":"https://api.github.com/users/kiwiflyer/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":584072971,"node_id":"MDU6TGFiZWw1ODQwNzI5NzE=","url":"https://api.github.com/repos/apache/cloudstack/labels/kvm","name":"kvm","color":"006b75","default":false},{"id":1150675549,"node_id":"MDU6TGFiZWwxMTUwNjc1NTQ5","url":"https://api.github.com/repos/apache/cloudstack/labels/new-feature","name":"new-feature","color":"4471c4","default":false}],"milestone":{"url":"https://api.github.com/repos/apache/cloudstack/milestones/4","html_url":"https://github.com/apache/cloudstack/milestone/4","labels_url":"https://api.github.com/repos/apache/cloudstack/milestones/4/labels","id":3009550,"node_id":"MDk6TWlsZXN0b25lMzAwOTU1MA==","number":4,"title":"4.12.0.0","description":"Milestone for PRs targetted for the next major 4.12.0.0 release. PRs should be sent for master branch.","creator":{"login":"rhtyd","id":95203,"node_id":"MDQ6VXNlcjk1MjAz","avatar_url":"https://avatars0.githubusercontent.com/u/95203?v=4","gravatar_id":"","url":"https://api.github.com/users/rhtyd","html_url":"https://github.com/rhtyd","followers_url":"https://api.github.com/users/rhtyd/followers","following_url":"https://api.github.com/users/rhtyd/following{/other_user}","gists_url":"https://api.github.com/users/rhtyd/gists{/gist_id}","starred_url":"https://api.github.com/users/rhtyd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rhtyd/subscriptions","organizations_url":"https://api.github.com/users/rhtyd/orgs","repos_url":"https://api.github.com/users/rhtyd/repos","events_url":"https://api.github.com/users/rhtyd/events{/privacy}","received_events_url":"https://api.github.com/users/rhtyd/received_events","type":"User","site_admin":false},"open_issues":40,"closed_issues":161,"state":"open","created_at":"2018-01-03T08:46:42Z","updated_at":"2018-12-07T17:12:58Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/apache/cloudstack/pulls/3078/commits","review_comments_url":"https://api.github.com/repos/apache/cloudstack/pulls/3078/comments","review_comment_url":"https://api.github.com/repos/apache/cloudstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/cloudstack/issues/3078/comments","statuses_url":"https://api.github.com/repos/apache/cloudstack/statuses/b6f6302f8998548d74c8f2669721a2a22b71487d","head":{"label":"PCextreme:add-influxdb-to-statscollector","ref":"add-influxdb-to-statscollector","sha":"b6f6302f8998548d74c8f2669721a2a22b71487d","user":{"login":"PCextreme","id":5224940,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUyMjQ5NDA=","avatar_url":"https://avatars1.githubusercontent.com/u/5224940?v=4","gravatar_id":"","url":"https://api.github.com/users/PCextreme","html_url":"https://github.com/PCextreme","followers_url":"https://api.github.com/users/PCextreme/followers","following_url":"https://api.github.com/users/PCextreme/following{/other_user}","gists_url":"https://api.github.com/users/PCextreme/gists{/gist_id}","starred_url":"https://api.github.com/users/PCextreme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PCextreme/subscriptions","organizations_url":"https://api.github.com/users/PCextreme/orgs","repos_url":"https://api.github.com/users/PCextreme/repos","events_url":"https://api.github.com/users/PCextreme/events{/privacy}","received_events_url":"https://api.github.com/users/PCextreme/received_events","type":"Organization","site_admin":false},"repo":{"id":58744627,"node_id":"MDEwOlJlcG9zaXRvcnk1ODc0NDYyNw==","name":"cloudstack","full_name":"PCextreme/cloudstack","private":false,"owner":{"login":"PCextreme","id":5224940,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUyMjQ5NDA=","avatar_url":"https://avatars1.githubusercontent.com/u/5224940?v=4","gravatar_id":"","url":"https://api.github.com/users/PCextreme","html_url":"https://github.com/PCextreme","followers_url":"https://api.github.com/users/PCextreme/followers","following_url":"https://api.github.com/users/PCextreme/following{/other_user}","gists_url":"https://api.github.com/users/PCextreme/gists{/gist_id}","starred_url":"https://api.github.com/users/PCextreme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PCextreme/subscriptions","organizations_url":"https://api.github.com/users/PCextreme/orgs","repos_url":"https://api.github.com/users/PCextreme/repos","events_url":"https://api.github.com/users/PCextreme/events{/privacy}","received_events_url":"https://api.github.com/users/PCextreme/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/PCextreme/cloudstack","description":"Mirror of Apache Cloudstack","fork":true,"url":"https://api.github.com/repos/PCextreme/cloudstack","forks_url":"https://api.github.com/repos/PCextreme/cloudstack/forks","keys_url":"https://api.github.com/repos/PCextreme/cloudstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PCextreme/cloudstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PCextreme/cloudstack/teams","hooks_url":"https://api.github.com/repos/PCextreme/cloudstack/hooks","issue_events_url":"https://api.github.com/repos/PCextreme/cloudstack/issues/events{/number}","events_url":"https://api.github.com/repos/PCextreme/cloudstack/events","assignees_url":"https://api.github.com/repos/PCextreme/cloudstack/assignees{/user}","branches_url":"https://api.github.com/repos/PCextreme/cloudstack/branches{/branch}","tags_url":"https://api.github.com/repos/PCextreme/cloudstack/tags","blobs_url":"https://api.github.com/repos/PCextreme/cloudstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PCextreme/cloudstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PCextreme/cloudstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/PCextreme/cloudstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PCextreme/cloudstack/statuses/{sha}","languages_url":"https://api.github.com/repos/PCextreme/cloudstack/languages","stargazers_url":"https://api.github.com/repos/PCextreme/cloudstack/stargazers","contributors_url":"https://api.github.com/repos/PCextreme/cloudstack/contributors","subscribers_url":"https://api.github.com/repos/PCextreme/cloudstack/subscribers","subscription_url":"https://api.github.com/repos/PCextreme/cloudstack/subscription","commits_url":"https://api.github.com/repos/PCextreme/cloudstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/PCextreme/cloudstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/PCextreme/cloudstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/PCextreme/cloudstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/PCextreme/cloudstack/contents/{+path}","compare_url":"https://api.github.com/repos/PCextreme/cloudstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PCextreme/cloudstack/merges","archive_url":"https://api.github.com/repos/PCextreme/cloudstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PCextreme/cloudstack/downloads","issues_url":"https://api.github.com/repos/PCextreme/cloudstack/issues{/number}","pulls_url":"https://api.github.com/repos/PCextreme/cloudstack/pulls{/number}","milestones_url":"https://api.github.com/repos/PCextreme/cloudstack/milestones{/number}","notifications_url":"https://api.github.com/repos/PCextreme/cloudstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PCextreme/cloudstack/labels{/name}","releases_url":"https://api.github.com/repos/PCextreme/cloudstack/releases{/id}","deployments_url":"https://api.github.com/repos/PCextreme/cloudstack/deployments","created_at":"2016-05-13T13:54:10Z","updated_at":"2018-08-15T12:02:42Z","pushed_at":"2018-12-10T09:28:31Z","git_url":"git://github.com/PCextreme/cloudstack.git","ssh_url":"git@github.com:PCextreme/cloudstack.git","clone_url":"https://github.com/PCextreme/cloudstack.git","svn_url":"https://github.com/PCextreme/cloudstack","homepage":null,"size":527398,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"ecd2b95d492282d60107f5e132e39f0cd2d808c0","user":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":9759448,"node_id":"MDEwOlJlcG9zaXRvcnk5NzU5NDQ4","name":"cloudstack","full_name":"apache/cloudstack","private":false,"owner":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/apache/cloudstack","description":"Apache Cloudstack","fork":false,"url":"https://api.github.com/repos/apache/cloudstack","forks_url":"https://api.github.com/repos/apache/cloudstack/forks","keys_url":"https://api.github.com/repos/apache/cloudstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/cloudstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/cloudstack/teams","hooks_url":"https://api.github.com/repos/apache/cloudstack/hooks","issue_events_url":"https://api.github.com/repos/apache/cloudstack/issues/events{/number}","events_url":"https://api.github.com/repos/apache/cloudstack/events","assignees_url":"https://api.github.com/repos/apache/cloudstack/assignees{/user}","branches_url":"https://api.github.com/repos/apache/cloudstack/branches{/branch}","tags_url":"https://api.github.com/repos/apache/cloudstack/tags","blobs_url":"https://api.github.com/repos/apache/cloudstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/cloudstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/cloudstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/cloudstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/cloudstack/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/cloudstack/languages","stargazers_url":"https://api.github.com/repos/apache/cloudstack/stargazers","contributors_url":"https://api.github.com/repos/apache/cloudstack/contributors","subscribers_url":"https://api.github.com/repos/apache/cloudstack/subscribers","subscription_url":"https://api.github.com/repos/apache/cloudstack/subscription","commits_url":"https://api.github.com/repos/apache/cloudstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/cloudstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/cloudstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/cloudstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/cloudstack/contents/{+path}","compare_url":"https://api.github.com/repos/apache/cloudstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/cloudstack/merges","archive_url":"https://api.github.com/repos/apache/cloudstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/cloudstack/downloads","issues_url":"https://api.github.com/repos/apache/cloudstack/issues{/number}","pulls_url":"https://api.github.com/repos/apache/cloudstack/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/cloudstack/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/cloudstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/cloudstack/labels{/name}","releases_url":"https://api.github.com/repos/apache/cloudstack/releases{/id}","deployments_url":"https://api.github.com/repos/apache/cloudstack/deployments","created_at":"2013-04-29T22:27:12Z","updated_at":"2018-12-09T03:35:56Z","pushed_at":"2018-12-10T09:28:32Z","git_url":"git://github.com/apache/cloudstack.git","ssh_url":"git@github.com:apache/cloudstack.git","clone_url":"https://github.com/apache/cloudstack.git","svn_url":"https://github.com/apache/cloudstack","homepage":"","size":527578,"stargazers_count":651,"watchers_count":651,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":672,"mirror_url":null,"archived":false,"open_issues_count":187,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":672,"open_issues":187,"watchers":651,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/3078"},"html":{"href":"https://github.com/apache/cloudstack/pull/3078"},"issue":{"href":"https://api.github.com/repos/apache/cloudstack/issues/3078"},"comments":{"href":"https://api.github.com/repos/apache/cloudstack/issues/3078/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/3078/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/3078/commits"},"statuses":{"href":"https://api.github.com/repos/apache/cloudstack/statuses/b6f6302f8998548d74c8f2669721a2a22b71487d"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"GabrielBrascher"}}