{"action":"created","comment":{"url":"https://api.github.com/repos/apache/cloudstack/pulls/comments/184939883","pull_request_review_id":116230544,"id":184939883,"diff_hunk":"@@ -1508,19 +1519,33 @@ public boolean restartVpc(final long vpcId, final boolean cleanUp, final boolean\n \n                 // Change the VPC in order to get it updated after the end of\n                 // the restart procedure.\n-                _vpcDao.update(vpc.getId(), entity);\n+                if (_vpcDao.update(vpc.getId(), entity)) {\n+                    vpc = entity;\n+                }\n \n                 // If the offering and redundant column are changing, force the\n                 // clean up.\n                 forceCleanup = true;\n             }\n \n             if (forceCleanup) {","path":"server/src/com/cloud/network/vpc/VpcManagerImpl.java","position":110,"original_position":99,"commit_id":"fc54d831e46fc453b545c194e7ce2ba31c0c2220","original_commit_id":"89d5e285219ca1a8f25eb4a54b24dedaf4b73220","user":{"login":"rhtyd","id":95203,"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},"body":"The body of IF is rather small already?","created_at":"2018-04-30T09:10:10Z","updated_at":"2018-04-30T09:10:10Z","html_url":"https://github.com/apache/cloudstack/pull/2508#discussion_r184939883","pull_request_url":"https://api.github.com/repos/apache/cloudstack/pulls/2508","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/comments/184939883"},"html":{"href":"https://github.com/apache/cloudstack/pull/2508#discussion_r184939883"},"pull_request":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/2508"}},"in_reply_to_id":178032576},"pull_request":{"url":"https://api.github.com/repos/apache/cloudstack/pulls/2508","id":177065876,"html_url":"https://github.com/apache/cloudstack/pull/2508","diff_url":"https://github.com/apache/cloudstack/pull/2508.diff","patch_url":"https://github.com/apache/cloudstack/pull/2508.patch","issue_url":"https://api.github.com/repos/apache/cloudstack/issues/2508","number":2508,"state":"open","locked":false,"title":"CLOUDSTACK-9114: Reduce VR downtime during network restart","user":{"login":"rhtyd","id":95203,"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},"body":"## Description\r\n<!--- Describe your changes in detail -->\r\n\r\nEvery time there is a major CloudStack version that requires a new systemvmtemplate, admins need to restart VRs which can take few (sometimes several) minutes. The aim is to make it easier to perform a rolling restart (or blue-green deployment) of the network with acceptable downtime. In this strategy, a new VR is provisioned before the old VR is destroyed/cleaned for non-redundant isolated VRs. For redundant networks, a rolling replacement of routers is performed.\r\n\r\nThe network downtime is usually the short-time (less than 10s) after the new VR starts (nics are up) and old VR is destroyed. The downtime may be affected by several factors as the new VR has a different mac address, stale ARP cache may take upto 30seconds (default `gc_timeout` on Linux) to renew in guests making egress traffic downtime slightly higher than ingress traffic (ingress, i.e. public network requesting access to VR's public ip). As an illustration, ingress traffic such as a http request or ssh request to the VR's public IP that port-forwards to guest VM may face lower downtime than egress traffic (say a ping or curl from guest VM to public Internet). Among several environment factors, the following interval/timeouts affect how the old VR's ip-mac address is cached:\r\n\r\n    /proc/sys/net/ipv4/neigh/default/gc_interval\r\n    /proc/sys/net/ipv4/neigh/default/gc_stale_time\r\n    /proc/sys/net/ipv4/route/gc_interval\r\n    /proc/sys/net/ipv4/route/gc_timeout\r\n\r\nTo make things faster, a gratituous ARP notification is sent by the new VR (again) after the old VR is successfully destroyed.\r\n\r\nProject Goals:\r\n- [x] Reduce systemvmtemplate size, see #2506. Smaller the image size, faster it will be to copy template to primary storage to provision new VR.\r\n- [x] Rolling reboot/deployment of VRs for isolated network with non-rVRs\r\n- [x] Rolling reboot/deployment of VRs for isolated network with rVRs\r\n- [x] Rolling reboot/deployment of VRs for VPCs with non-rVRs and rVRs\r\n\r\nFuture:\r\n- Speed up iptables rules application \r\n- Move away from iptables, move to nftables\r\n- Move away from Python2 codebase to Python3 or something else like Go? TBD\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## 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- [ ] New feature (non-breaking change which adds functionality)\r\n- [ ] Bug fix (non-breaking change which fixes an issue)\r\n- [x] Enhancement (improves an existing feature and functionality)\r\n- [x] Cleanup (Code refactoring and cleanup, that may add test cases)\r\n\r\n## Screenshots (if appropriate):\r\n\r\n### Non-Redundant Isolated Network VRs\r\n\r\nRolling restart in action, a new VR is deployed lifing the VR as a redundant VR:\r\n![screenshot from 2018-03-23 22-36-27](https://user-images.githubusercontent.com/95203/37843526-2e16f08a-2eeb-11e8-9b7e-e20cb6069b0d.png)\r\n\r\nThe old VR is stopped and destroyed:\r\n![screenshot from 2018-03-23 22-36-53](https://user-images.githubusercontent.com/95203/37843528-2e5aaf82-2eeb-11e8-9078-1fe89e921458.png)\r\n\r\nThe new VR's redundancy is removed and is reprogrammed:\r\n![screenshot from 2018-03-23 22-37-02](https://user-images.githubusercontent.com/95203/37843529-2e9e1a92-2eeb-11e8-89d8-ea5badeb7e83.png)\r\n\r\nMeanwhile, the following screenshot shows ping drops from a guest VM, in a non-redundant isolated network: (usually 2-10 ping drops observed)\r\n![screenshot from 2018-03-23 17-53-46](https://user-images.githubusercontent.com/95203/37830985-f4022b92-2ec9-11e8-94e4-9b972a592861.png)\r\n\r\n### Redundant Isolated Network VR\r\n\r\nRolling restart starts by stopping old backup VR:\r\n![screenshot from 2018-03-23 22-54-56](https://user-images.githubusercontent.com/95203/37844439-cafbce96-2eed-11e8-9e12-8915f7786c66.png)\r\n\r\nNew backup VR deployed:\r\n![screenshot from 2018-03-23 22-55-10](https://user-images.githubusercontent.com/95203/37844440-cc4708ce-2eed-11e8-819a-66b61507e80b.png)\r\n\r\nOld master stopped, new backup becomes new master:\r\n![screenshot from 2018-03-23 22-55-56](https://user-images.githubusercontent.com/95203/37844441-cd87dc5e-2eed-11e8-8cc6-848c0562d854.png)\r\n\r\nOld master destroyed and another backup VR deployed:\r\n![screenshot from 2018-03-23 22-56-07](https://user-images.githubusercontent.com/95203/37844442-ce935740-2eed-11e8-99e3-a490dcf75014.png)\r\n\r\nRedundant VRs after rollling reboot:\r\n![screenshot from 2018-03-23 22-57-11](https://user-images.githubusercontent.com/95203/37844444-cf5ede60-2eed-11e8-9d93-7360ac6f9647.png)\r\n\r\nIn the meanwhile, usually 0-4 ping drops observed in guest VM:\r\n![screenshot from 2018-03-23 22-57-40](https://user-images.githubusercontent.com/95203/37844446-d0977e72-2eed-11e8-95c6-757ddd4465c8.png)\r\n\r\n## How Has This Been Tested?\r\n\r\nTested with following, benchmarks show rounded off avg/max downtime seconds for restarting non-redundant isolated VRs when `cleanup=true`:\r\n\r\nEnv | This PR | 4.11.0.0 | 4.9.3.0\r\n--- | --- | --- | ---\r\nKVM CentOS7        | 8s   | 50s | 70s\r\nKVM CentOS6        | 10s   | 60s | 80s\r\nXenServer 71          | 8s   | 70s | NA\r\nXenServer 65sp1    | 20s | 70s | 100s\r\nVMware 65              | 10s | 120s | NA\r\nVMware 55u3          | 20s | 160s | 250s\r\n\r\n** The downtime seconds may be higher in real-world environment under heavy load. Redundant routers show a downtime of 0-4 seconds.\r\n*** All used a CentOS7 based management server, tested in environments deployed by [Trillian](https://github.com/shapeblue/Trillian)\r\n\r\nIngress traffic was tested using ssh and http services hosted on the guest VM. Example, sshping like utility I wrote for calculating ingress traffic downtime: (number of fail count = downtime seconds)\r\n\r\n```\r\nsshping() {                                                                                                                                              \r\n  ip=$1                                                                            \r\n  total_count=0                                                                    \r\n  fail_count=0                                                                     \r\n  while true; do                                                                   \r\n    start_time=$(date +%s)                                                         \r\n    timeout 1.5 sshpass -p 'password' ssh -o StrictHostKeyChecking=no root@$1 \"uptime\" > /dev/null 2>&1\r\n    if [[ $? -gt 0 ]]; then                                                        \r\n        fail_count=$((fail_count+1))                                               \r\n    fi                                                                             \r\n    end_time=$(date +%s)                                                           \r\n    diff=$(($end_time - $start_time))                                              \r\n    if [[ $diff -eq 0 ]]; then                                                     \r\n        sleep 1                                                                    \r\n    fi                                                                             \r\n                                                                                   \r\n    total_count=$((total_count+1))                                                 \r\n    echo \"Fail/Total = $fail_count/$total_count\"                                   \r\n  done                                                                             \r\n}  \r\n\r\n```\r\n\r\n## Checklist:\r\n<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->\r\n<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->\r\n- [x] I have read the [CONTRIBUTING](https://github.com/apache/cloudstack/blob/master/CONTRIBUTING.md) document.\r\n- [x] My code follows the code style of this project.\r\n- [x] My change requires a change to the documentation.\r\n- [ ] I have updated the documentation accordingly.\r\n- [ ] I have added tests to cover my changes.\r\n- [x] All new and existing tests passed.\r\n\r\n<!-- The following will kick a packaging job, remove if as applicable -->\r\n@blueorangutan package\r\n","created_at":"2018-03-23T13:13:35Z","updated_at":"2018-04-30T09:10:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ca64c6e9b5c52a105b810b124125b3f8db48da79","assignee":{"login":"rhtyd","id":95203,"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},"assignees":[{"login":"rhtyd","id":95203,"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}],"requested_reviewers":[{"login":"resmo","id":23809,"avatar_url":"https://avatars1.githubusercontent.com/u/23809?v=4","gravatar_id":"","url":"https://api.github.com/users/resmo","html_url":"https://github.com/resmo","followers_url":"https://api.github.com/users/resmo/followers","following_url":"https://api.github.com/users/resmo/following{/other_user}","gists_url":"https://api.github.com/users/resmo/gists{/gist_id}","starred_url":"https://api.github.com/users/resmo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/resmo/subscriptions","organizations_url":"https://api.github.com/users/resmo/orgs","repos_url":"https://api.github.com/users/resmo/repos","events_url":"https://api.github.com/users/resmo/events{/privacy}","received_events_url":"https://api.github.com/users/resmo/received_events","type":"User","site_admin":false},{"login":"wido","id":326786,"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":"PaulAngus","id":4810220,"avatar_url":"https://avatars0.githubusercontent.com/u/4810220?v=4","gravatar_id":"","url":"https://api.github.com/users/PaulAngus","html_url":"https://github.com/PaulAngus","followers_url":"https://api.github.com/users/PaulAngus/followers","following_url":"https://api.github.com/users/PaulAngus/following{/other_user}","gists_url":"https://api.github.com/users/PaulAngus/gists{/gist_id}","starred_url":"https://api.github.com/users/PaulAngus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PaulAngus/subscriptions","organizations_url":"https://api.github.com/users/PaulAngus/orgs","repos_url":"https://api.github.com/users/PaulAngus/repos","events_url":"https://api.github.com/users/PaulAngus/events{/privacy}","received_events_url":"https://api.github.com/users/PaulAngus/received_events","type":"User","site_admin":false},{"login":"nvazquez","id":5295080,"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}],"requested_teams":[],"labels":[{"id":589162089,"url":"https://api.github.com/repos/apache/cloudstack/labels/Work-in-Progress","name":"Work-in-Progress","color":"bfd4f2","default":false},{"id":605209139,"url":"https://api.github.com/repos/apache/cloudstack/labels/systemvm-template-change","name":"systemvm-template-change","color":"c5def5","default":false},{"id":814277974,"url":"https://api.github.com/repos/apache/cloudstack/labels/upgrade","name":"upgrade","color":"720bc1","default":false},{"id":584073391,"url":"https://api.github.com/repos/apache/cloudstack/labels/virtual-router","name":"virtual-router","color":"fef2c0","default":false}],"milestone":{"url":"https://api.github.com/repos/apache/cloudstack/milestones/5","html_url":"https://github.com/apache/cloudstack/milestone/5","labels_url":"https://api.github.com/repos/apache/cloudstack/milestones/5/labels","id":3033298,"number":5,"title":"4.11.1.0","description":"Milestone covering PRs for the next 4.11.1.0 release. All PRs using this milestone should send PR against the 4.11 branch.","creator":{"login":"DaanHoogland","id":2486961,"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},"open_issues":16,"closed_issues":73,"state":"open","created_at":"2018-01-13T20:06:17Z","updated_at":"2018-04-30T07:22:33Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/apache/cloudstack/pulls/2508/commits","review_comments_url":"https://api.github.com/repos/apache/cloudstack/pulls/2508/comments","review_comment_url":"https://api.github.com/repos/apache/cloudstack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/cloudstack/issues/2508/comments","statuses_url":"https://api.github.com/repos/apache/cloudstack/statuses/fc54d831e46fc453b545c194e7ce2ba31c0c2220","head":{"label":"shapeblue:vr-downtime","ref":"vr-downtime","sha":"fc54d831e46fc453b545c194e7ce2ba31c0c2220","user":{"login":"shapeblue","id":6001764,"avatar_url":"https://avatars1.githubusercontent.com/u/6001764?v=4","gravatar_id":"","url":"https://api.github.com/users/shapeblue","html_url":"https://github.com/shapeblue","followers_url":"https://api.github.com/users/shapeblue/followers","following_url":"https://api.github.com/users/shapeblue/following{/other_user}","gists_url":"https://api.github.com/users/shapeblue/gists{/gist_id}","starred_url":"https://api.github.com/users/shapeblue/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shapeblue/subscriptions","organizations_url":"https://api.github.com/users/shapeblue/orgs","repos_url":"https://api.github.com/users/shapeblue/repos","events_url":"https://api.github.com/users/shapeblue/events{/privacy}","received_events_url":"https://api.github.com/users/shapeblue/received_events","type":"Organization","site_admin":false},"repo":{"id":35481491,"name":"cloudstack","full_name":"shapeblue/cloudstack","owner":{"login":"shapeblue","id":6001764,"avatar_url":"https://avatars1.githubusercontent.com/u/6001764?v=4","gravatar_id":"","url":"https://api.github.com/users/shapeblue","html_url":"https://github.com/shapeblue","followers_url":"https://api.github.com/users/shapeblue/followers","following_url":"https://api.github.com/users/shapeblue/following{/other_user}","gists_url":"https://api.github.com/users/shapeblue/gists{/gist_id}","starred_url":"https://api.github.com/users/shapeblue/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shapeblue/subscriptions","organizations_url":"https://api.github.com/users/shapeblue/orgs","repos_url":"https://api.github.com/users/shapeblue/repos","events_url":"https://api.github.com/users/shapeblue/events{/privacy}","received_events_url":"https://api.github.com/users/shapeblue/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/shapeblue/cloudstack","description":"The upstream repository is at http://github.com/apache/cloudstack. This is ShapeBlue's support/patch branches and Apache CloudStack™ backup","fork":true,"url":"https://api.github.com/repos/shapeblue/cloudstack","forks_url":"https://api.github.com/repos/shapeblue/cloudstack/forks","keys_url":"https://api.github.com/repos/shapeblue/cloudstack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/shapeblue/cloudstack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/shapeblue/cloudstack/teams","hooks_url":"https://api.github.com/repos/shapeblue/cloudstack/hooks","issue_events_url":"https://api.github.com/repos/shapeblue/cloudstack/issues/events{/number}","events_url":"https://api.github.com/repos/shapeblue/cloudstack/events","assignees_url":"https://api.github.com/repos/shapeblue/cloudstack/assignees{/user}","branches_url":"https://api.github.com/repos/shapeblue/cloudstack/branches{/branch}","tags_url":"https://api.github.com/repos/shapeblue/cloudstack/tags","blobs_url":"https://api.github.com/repos/shapeblue/cloudstack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/shapeblue/cloudstack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/shapeblue/cloudstack/git/refs{/sha}","trees_url":"https://api.github.com/repos/shapeblue/cloudstack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/shapeblue/cloudstack/statuses/{sha}","languages_url":"https://api.github.com/repos/shapeblue/cloudstack/languages","stargazers_url":"https://api.github.com/repos/shapeblue/cloudstack/stargazers","contributors_url":"https://api.github.com/repos/shapeblue/cloudstack/contributors","subscribers_url":"https://api.github.com/repos/shapeblue/cloudstack/subscribers","subscription_url":"https://api.github.com/repos/shapeblue/cloudstack/subscription","commits_url":"https://api.github.com/repos/shapeblue/cloudstack/commits{/sha}","git_commits_url":"https://api.github.com/repos/shapeblue/cloudstack/git/commits{/sha}","comments_url":"https://api.github.com/repos/shapeblue/cloudstack/comments{/number}","issue_comment_url":"https://api.github.com/repos/shapeblue/cloudstack/issues/comments{/number}","contents_url":"https://api.github.com/repos/shapeblue/cloudstack/contents/{+path}","compare_url":"https://api.github.com/repos/shapeblue/cloudstack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/shapeblue/cloudstack/merges","archive_url":"https://api.github.com/repos/shapeblue/cloudstack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/shapeblue/cloudstack/downloads","issues_url":"https://api.github.com/repos/shapeblue/cloudstack/issues{/number}","pulls_url":"https://api.github.com/repos/shapeblue/cloudstack/pulls{/number}","milestones_url":"https://api.github.com/repos/shapeblue/cloudstack/milestones{/number}","notifications_url":"https://api.github.com/repos/shapeblue/cloudstack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/shapeblue/cloudstack/labels{/name}","releases_url":"https://api.github.com/repos/shapeblue/cloudstack/releases{/id}","deployments_url":"https://api.github.com/repos/shapeblue/cloudstack/deployments","created_at":"2015-05-12T10:22:21Z","updated_at":"2018-04-30T07:16:23Z","pushed_at":"2018-04-30T09:04:49Z","git_url":"git://github.com/shapeblue/cloudstack.git","ssh_url":"git@github.com:shapeblue/cloudstack.git","clone_url":"https://github.com/shapeblue/cloudstack.git","svn_url":"https://github.com/shapeblue/cloudstack","homepage":"http://shapeblue.com/packages","size":536983,"stargazers_count":3,"watchers_count":3,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":2,"open_issues":0,"watchers":3,"default_branch":"master"}},"base":{"label":"apache:4.11","ref":"4.11","sha":"464551208c879d64826d58d143d174876e4e11db","user":{"login":"apache","id":47359,"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,"name":"cloudstack","full_name":"apache/cloudstack","owner":{"login":"apache","id":47359,"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},"private":false,"html_url":"https://github.com/apache/cloudstack","description":"Mirror of 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-04-30T07:25:05Z","pushed_at":"2018-04-30T09:04:53Z","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":null,"size":523017,"stargazers_count":561,"watchers_count":561,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":635,"mirror_url":null,"archived":false,"open_issues_count":135,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":635,"open_issues":135,"watchers":561,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/2508"},"html":{"href":"https://github.com/apache/cloudstack/pull/2508"},"issue":{"href":"https://api.github.com/repos/apache/cloudstack/issues/2508"},"comments":{"href":"https://api.github.com/repos/apache/cloudstack/issues/2508/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/2508/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/cloudstack/pulls/2508/commits"},"statuses":{"href":"https://api.github.com/repos/apache/cloudstack/statuses/fc54d831e46fc453b545c194e7ce2ba31c0c2220"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"rhtyd"}}