{"action":"created","comment":{"url":"https://api.github.com/repos/telstra/open-kilda/pulls/comments/229328498","pull_request_review_id":169802070,"id":229328498,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyOTMyODQ5OA==","diff_hunk":"@@ -277,36 +344,97 @@ class AutoRerouteSpec extends BaseSpecification {\n             islUtils.getIslInfo(islToFail).get().state == IslChangeType.DISCOVERED\n         }\n \n-        and: \"Flow is not rerouted and doesn't use more preferable path\"\n+        and: \"The flow is not rerouted and doesn't use more preferable path\"\n         TimeUnit.SECONDS.sleep(rerouteDelay + WAIT_OFFSET)\n-        def flowPathAfter = PathHelper.convert(northboundService.getFlowPath(flow.id))\n-        flowPath == flowPathAfter\n-        Wrappers.wait(WAIT_OFFSET) { northboundService.getFlowStatus(flow.id).status == FlowState.UP }\n+        northboundService.getFlowStatus(flow.id).status == FlowState.UP\n+        PathHelper.convert(northboundService.getFlowPath(flow.id)) == flowPath\n+\n+        and: \"Delete the flow\"\n+        northboundService.deleteFlow(flow.id)\n+    }\n+\n+    def \"Flow in 'Up' status is not rerouted when connecting a new switch and more preferable path is available\"() {\n+        given: \"A flow with one alternative path at least\"\n+        def (flow, allFlowPaths) = noIntermediateSwitchFlow(true, true)\n+        northboundService.addFlow(flow)\n+        assert Wrappers.wait(WAIT_OFFSET) { northboundService.getFlowStatus(flow.id).status == FlowState.UP }\n+        def flowPath = PathHelper.convert(northboundService.getFlowPath(flow.id))\n+\n+        and: \"Make the current flow path less preferable than others\"\n+        allFlowPaths.findAll { it != flowPath }.each { pathHelper.makePathMorePreferable(it, flowPath) }\n+\n+        when: \"Disconnect one of the switches not used by flow\"\n+        def involvedSwitches = pathHelper.getInvolvedSwitches(flowPath)\n+        def switchToDisconnect = topology.getActiveSwitches().find { !involvedSwitches.contains(it) }\n+        lockKeeperService.knockoutSwitch(switchToDisconnect.dpId)\n \n-        and: \"Delete created flow\"\n+        then: \"The switch is really disconnected from the controller\"\n+        Wrappers.wait(WAIT_OFFSET) { !(switchToDisconnect.dpId in northboundService.getActiveSwitches()*.switchId) }\n+\n+        when: \"Connect the switch back to the controller\"\n+        lockKeeperService.reviveSwitch(switchToDisconnect.dpId)\n+\n+        then: \"The switch is really connected to the controller\"\n+        Wrappers.wait(WAIT_OFFSET) { switchToDisconnect.dpId in northboundService.getActiveSwitches()*.switchId }\n+\n+        and: \"The flow is not rerouted and doesn't use more preferable path\"\n+        TimeUnit.SECONDS.sleep(rerouteDelay + WAIT_OFFSET)\n+        northboundService.getFlowStatus(flow.id).status == FlowState.UP\n+        PathHelper.convert(northboundService.getFlowPath(flow.id)) == flowPath\n+\n+        and: \"Delete the flow\"\n         northboundService.deleteFlow(flow.id)\n     }\n \n     def singleSwitchFlow() {\n         flowHelper.singleSwitchFlow(topology.getActiveSwitches().first())\n     }\n \n-    def withOutIntermediateSwitchFlow() {\n-        def isl = topology.getIslsForActiveSwitches().first()\n-        flowHelper.randomFlow(isl.srcSwitch, isl.dstSwitch)\n+    def noIntermediateSwitchFlow(boolean ensureAltPathsExist = false, boolean getAllPaths = false) {\n+        Isl isl\n+        List<List<PathNode>> allFlowPaths = []\n+        if (ensureAltPathsExist) {\n+            isl = topology.getIslsForActiveSwitches().find {\n+                allFlowPaths = db.getPaths(it.srcSwitch.dpId, it.dstSwitch.dpId)*.path.sort { it.size() }\n+                allFlowPaths.size() > 1\n+            } ?: assumeTrue(\"No suiting switches found\", false)\n+        } else {\n+            isl = topology.getIslsForActiveSwitches().first()\n+            if (getAllPaths) {\n+                allFlowPaths = db.getPaths(isl.srcSwitch.dpId, isl.dstSwitch.dpId)*.path.sort { it.size() }\n+            }\n+        }\n+\n+        def flow = flowHelper.randomFlow(isl.srcSwitch, isl.dstSwitch)\n+        getAllPaths ? [flow, allFlowPaths] : flow\n     }\n \n-    def withIntermediateSwitchFlow() {\n+    def intermediateSwitchFlow(boolean ensureAltPathsExist = false, boolean getAllPaths = false) {\n         def switches = topology.getActiveSwitches()\n         def links = northboundService.getAllLinks()\n-        def (Switch srcSwitch, Switch dstSwitch) = [switches, switches].combinations()\n-                .findAll { src, dst -> src != dst }.find { Switch src, Switch dst ->\n-            links.every { link ->\n+        def switchPairs = [switches, switches].combinations().findAll { Switch src, Switch dst ->\n+            src != dst && links.every { link ->\n                 def switchIds = link.path*.switchId\n                 !(switchIds.contains(src.dpId) && switchIds.contains(dst.dpId))\n             }\n         } ?: assumeTrue(\"No suiting switches found\", false)\n-        flowHelper.randomFlow(srcSwitch, dstSwitch)\n+\n+        Switch srcSwitch, dstSwitch\n+        List<List<PathNode>> allFlowPaths = []\n+        if (ensureAltPathsExist) {\n+            (srcSwitch, dstSwitch) = switchPairs.find { Switch src, Switch dst ->\n+                allFlowPaths = db.getPaths(src.dpId, dst.dpId)*.path.sort { it.size() }\n+                allFlowPaths.size() > 1\n+            } ?: assumeTrue(\"No suiting switches found\", false)\n+        } else {\n+            (srcSwitch, dstSwitch) = switchPairs.first()\n+            if (getAllPaths) {\n+                allFlowPaths = db.getPaths(srcSwitch.dpId, dstSwitch.dpId)*.path.sort { it.size() }\n+            }\n+        }\n+\n+        def flow = flowHelper.randomFlow(srcSwitch, dstSwitch)\n+        getAllPaths ? [flow, allFlowPaths] : flow","path":"services/src/functional-tests/src/test/groovy/org/openkilda/functionaltests/spec/northbound/flows/AutoRerouteSpec.groovy","position":515,"original_position":497,"commit_id":"ecddd1ac0f61286818acc3c8c7790913ed806d54","original_commit_id":"0a1821b490d2cce52c29191a576d266a65f4427c","user":{"login":"rtretyak","id":7931639,"node_id":"MDQ6VXNlcjc5MzE2Mzk=","avatar_url":"https://avatars0.githubusercontent.com/u/7931639?v=4","gravatar_id":"","url":"https://api.github.com/users/rtretyak","html_url":"https://github.com/rtretyak","followers_url":"https://api.github.com/users/rtretyak/followers","following_url":"https://api.github.com/users/rtretyak/following{/other_user}","gists_url":"https://api.github.com/users/rtretyak/gists{/gist_id}","starred_url":"https://api.github.com/users/rtretyak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rtretyak/subscriptions","organizations_url":"https://api.github.com/users/rtretyak/orgs","repos_url":"https://api.github.com/users/rtretyak/repos","events_url":"https://api.github.com/users/rtretyak/events{/privacy}","received_events_url":"https://api.github.com/users/rtretyak/received_events","type":"User","site_admin":false},"body":"The only difference between intermediateSwitchFlow and noIntermediateSwitchFlow is the amount of switches in the preferred path, which can become a method parameter.\r\n```\r\ndef getFlowWithPaths(int minAltPaths, int minSwitchesInPath, int maxSwitchesInPath) {\r\n   def switches = topology.getActiveSwitches()\r\n   def possibleFlowPaths\r\n   def switchPair = [switches, switches].combinations().findAll { src, dst -> src != dst }\r\n            .unique { it.sort() }\r\n            .find { src, dst ->\r\n               possibleFlowPaths = db.getPaths(src.dpId, dst.dpId)*.path\r\n               def preferredPath = possibleFlowPaths.min { it.size() }\r\n               possibleFlowPaths.size() > minAltPaths &&  preferredPath.size() <= maxSwitchesInPath\r\n && preferredPath.size() >= minSwitchesInPath\r\n    }\r\n    switchPair ?: assumeTrue(\"Such flow cannot be built\", false)\r\n    return [flowHelper.randomFlow(switchPair[0], switchPair[1]), possibleFlowPaths]\r\n}\r\n```\r\n\r\nNow your methods could be just\r\n```\r\ndef intermediateSwitchFlow(boolean ensureAltPathsExist = false, boolean getAllPaths = false) {\r\n    def flowWithPaths = getFlowWithPaths(ensureAltPathsExist ? 1 : 0, 3, Integer.MAX_VALUE)\r\n    return getAllPaths ? flowWithPaths : flowWithPaths[0]\r\n}\r\n\r\ndef noIntermediateSwitchFlow(boolean ensureAltPathsExist = false, boolean getAllPaths = false) {\r\n    def flowWithPaths = getFlowWithPaths(ensureAltPathsExist ? 1 : 0, 2, 2)\r\n    return getAllPaths ? flowWithPaths : flowWithPaths[0]\r\n}\r\n```","created_at":"2018-10-30T14:27:25Z","updated_at":"2018-10-30T14:37:59Z","html_url":"https://github.com/telstra/open-kilda/pull/1473#discussion_r229328498","pull_request_url":"https://api.github.com/repos/telstra/open-kilda/pulls/1473","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/telstra/open-kilda/pulls/comments/229328498"},"html":{"href":"https://github.com/telstra/open-kilda/pull/1473#discussion_r229328498"},"pull_request":{"href":"https://api.github.com/repos/telstra/open-kilda/pulls/1473"}},"in_reply_to_id":229284962},"pull_request":{"url":"https://api.github.com/repos/telstra/open-kilda/pulls/1473","id":224310437,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI0MzEwNDM3","html_url":"https://github.com/telstra/open-kilda/pull/1473","diff_url":"https://github.com/telstra/open-kilda/pull/1473.diff","patch_url":"https://github.com/telstra/open-kilda/pull/1473.patch","issue_url":"https://api.github.com/repos/telstra/open-kilda/issues/1473","number":1473,"state":"open","locked":false,"title":"Add tests to verify flow is rerouted when switch or ISL fails","user":{"login":"ylobankov","id":3645987,"node_id":"MDQ6VXNlcjM2NDU5ODc=","avatar_url":"https://avatars3.githubusercontent.com/u/3645987?v=4","gravatar_id":"","url":"https://api.github.com/users/ylobankov","html_url":"https://github.com/ylobankov","followers_url":"https://api.github.com/users/ylobankov/followers","following_url":"https://api.github.com/users/ylobankov/following{/other_user}","gists_url":"https://api.github.com/users/ylobankov/gists{/gist_id}","starred_url":"https://api.github.com/users/ylobankov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ylobankov/subscriptions","organizations_url":"https://api.github.com/users/ylobankov/orgs","repos_url":"https://api.github.com/users/ylobankov/repos","events_url":"https://api.github.com/users/ylobankov/events{/privacy}","received_events_url":"https://api.github.com/users/ylobankov/received_events","type":"User","site_admin":false},"body":"Closes #1467.","created_at":"2018-10-19T14:41:22Z","updated_at":"2018-10-30T14:37:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ff0440b851e998f1ea9539e4751fcbbc66cd4a74","assignee":null,"assignees":[],"requested_reviewers":[{"login":"npliashechnikov","id":1955925,"node_id":"MDQ6VXNlcjE5NTU5MjU=","avatar_url":"https://avatars2.githubusercontent.com/u/1955925?v=4","gravatar_id":"","url":"https://api.github.com/users/npliashechnikov","html_url":"https://github.com/npliashechnikov","followers_url":"https://api.github.com/users/npliashechnikov/followers","following_url":"https://api.github.com/users/npliashechnikov/following{/other_user}","gists_url":"https://api.github.com/users/npliashechnikov/gists{/gist_id}","starred_url":"https://api.github.com/users/npliashechnikov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/npliashechnikov/subscriptions","organizations_url":"https://api.github.com/users/npliashechnikov/orgs","repos_url":"https://api.github.com/users/npliashechnikov/repos","events_url":"https://api.github.com/users/npliashechnikov/events{/privacy}","received_events_url":"https://api.github.com/users/npliashechnikov/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":721004340,"node_id":"MDU6TGFiZWw3MjEwMDQzNDA=","url":"https://api.github.com/repos/telstra/open-kilda/labels/area/testing","name":"area/testing","color":"bfdadc","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/telstra/open-kilda/pulls/1473/commits","review_comments_url":"https://api.github.com/repos/telstra/open-kilda/pulls/1473/comments","review_comment_url":"https://api.github.com/repos/telstra/open-kilda/pulls/comments{/number}","comments_url":"https://api.github.com/repos/telstra/open-kilda/issues/1473/comments","statuses_url":"https://api.github.com/repos/telstra/open-kilda/statuses/ecddd1ac0f61286818acc3c8c7790913ed806d54","head":{"label":"telstra:func-tests/flow-is-rerouted-when-switch-or-isl-fails","ref":"func-tests/flow-is-rerouted-when-switch-or-isl-fails","sha":"ecddd1ac0f61286818acc3c8c7790913ed806d54","user":{"login":"telstra","id":3914896,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MTQ4OTY=","avatar_url":"https://avatars2.githubusercontent.com/u/3914896?v=4","gravatar_id":"","url":"https://api.github.com/users/telstra","html_url":"https://github.com/telstra","followers_url":"https://api.github.com/users/telstra/followers","following_url":"https://api.github.com/users/telstra/following{/other_user}","gists_url":"https://api.github.com/users/telstra/gists{/gist_id}","starred_url":"https://api.github.com/users/telstra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/telstra/subscriptions","organizations_url":"https://api.github.com/users/telstra/orgs","repos_url":"https://api.github.com/users/telstra/repos","events_url":"https://api.github.com/users/telstra/events{/privacy}","received_events_url":"https://api.github.com/users/telstra/received_events","type":"Organization","site_admin":false},"repo":{"id":104974693,"node_id":"MDEwOlJlcG9zaXRvcnkxMDQ5NzQ2OTM=","name":"open-kilda","full_name":"telstra/open-kilda","private":false,"owner":{"login":"telstra","id":3914896,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MTQ4OTY=","avatar_url":"https://avatars2.githubusercontent.com/u/3914896?v=4","gravatar_id":"","url":"https://api.github.com/users/telstra","html_url":"https://github.com/telstra","followers_url":"https://api.github.com/users/telstra/followers","following_url":"https://api.github.com/users/telstra/following{/other_user}","gists_url":"https://api.github.com/users/telstra/gists{/gist_id}","starred_url":"https://api.github.com/users/telstra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/telstra/subscriptions","organizations_url":"https://api.github.com/users/telstra/orgs","repos_url":"https://api.github.com/users/telstra/repos","events_url":"https://api.github.com/users/telstra/events{/privacy}","received_events_url":"https://api.github.com/users/telstra/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/telstra/open-kilda","description":"OpenKilda is an open-source OpenFlow controller initially designed for use in a global network with high control-plane latency and a heavy emphasis on latency-centric data path optimisation.","fork":false,"url":"https://api.github.com/repos/telstra/open-kilda","forks_url":"https://api.github.com/repos/telstra/open-kilda/forks","keys_url":"https://api.github.com/repos/telstra/open-kilda/keys{/key_id}","collaborators_url":"https://api.github.com/repos/telstra/open-kilda/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/telstra/open-kilda/teams","hooks_url":"https://api.github.com/repos/telstra/open-kilda/hooks","issue_events_url":"https://api.github.com/repos/telstra/open-kilda/issues/events{/number}","events_url":"https://api.github.com/repos/telstra/open-kilda/events","assignees_url":"https://api.github.com/repos/telstra/open-kilda/assignees{/user}","branches_url":"https://api.github.com/repos/telstra/open-kilda/branches{/branch}","tags_url":"https://api.github.com/repos/telstra/open-kilda/tags","blobs_url":"https://api.github.com/repos/telstra/open-kilda/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/telstra/open-kilda/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/telstra/open-kilda/git/refs{/sha}","trees_url":"https://api.github.com/repos/telstra/open-kilda/git/trees{/sha}","statuses_url":"https://api.github.com/repos/telstra/open-kilda/statuses/{sha}","languages_url":"https://api.github.com/repos/telstra/open-kilda/languages","stargazers_url":"https://api.github.com/repos/telstra/open-kilda/stargazers","contributors_url":"https://api.github.com/repos/telstra/open-kilda/contributors","subscribers_url":"https://api.github.com/repos/telstra/open-kilda/subscribers","subscription_url":"https://api.github.com/repos/telstra/open-kilda/subscription","commits_url":"https://api.github.com/repos/telstra/open-kilda/commits{/sha}","git_commits_url":"https://api.github.com/repos/telstra/open-kilda/git/commits{/sha}","comments_url":"https://api.github.com/repos/telstra/open-kilda/comments{/number}","issue_comment_url":"https://api.github.com/repos/telstra/open-kilda/issues/comments{/number}","contents_url":"https://api.github.com/repos/telstra/open-kilda/contents/{+path}","compare_url":"https://api.github.com/repos/telstra/open-kilda/compare/{base}...{head}","merges_url":"https://api.github.com/repos/telstra/open-kilda/merges","archive_url":"https://api.github.com/repos/telstra/open-kilda/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/telstra/open-kilda/downloads","issues_url":"https://api.github.com/repos/telstra/open-kilda/issues{/number}","pulls_url":"https://api.github.com/repos/telstra/open-kilda/pulls{/number}","milestones_url":"https://api.github.com/repos/telstra/open-kilda/milestones{/number}","notifications_url":"https://api.github.com/repos/telstra/open-kilda/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/telstra/open-kilda/labels{/name}","releases_url":"https://api.github.com/repos/telstra/open-kilda/releases{/id}","deployments_url":"https://api.github.com/repos/telstra/open-kilda/deployments","created_at":"2017-09-27T05:13:18Z","updated_at":"2018-10-29T14:30:46Z","pushed_at":"2018-10-30T14:35:30Z","git_url":"git://github.com/telstra/open-kilda.git","ssh_url":"git@github.com:telstra/open-kilda.git","clone_url":"https://github.com/telstra/open-kilda.git","svn_url":"https://github.com/telstra/open-kilda","homepage":"","size":210439,"stargazers_count":33,"watchers_count":33,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":32,"mirror_url":null,"archived":false,"open_issues_count":274,"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":32,"open_issues":274,"watchers":33,"default_branch":"develop"}},"base":{"label":"telstra:develop","ref":"develop","sha":"dc958d80764897636e51685e4480c414b2ab71b6","user":{"login":"telstra","id":3914896,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MTQ4OTY=","avatar_url":"https://avatars2.githubusercontent.com/u/3914896?v=4","gravatar_id":"","url":"https://api.github.com/users/telstra","html_url":"https://github.com/telstra","followers_url":"https://api.github.com/users/telstra/followers","following_url":"https://api.github.com/users/telstra/following{/other_user}","gists_url":"https://api.github.com/users/telstra/gists{/gist_id}","starred_url":"https://api.github.com/users/telstra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/telstra/subscriptions","organizations_url":"https://api.github.com/users/telstra/orgs","repos_url":"https://api.github.com/users/telstra/repos","events_url":"https://api.github.com/users/telstra/events{/privacy}","received_events_url":"https://api.github.com/users/telstra/received_events","type":"Organization","site_admin":false},"repo":{"id":104974693,"node_id":"MDEwOlJlcG9zaXRvcnkxMDQ5NzQ2OTM=","name":"open-kilda","full_name":"telstra/open-kilda","private":false,"owner":{"login":"telstra","id":3914896,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MTQ4OTY=","avatar_url":"https://avatars2.githubusercontent.com/u/3914896?v=4","gravatar_id":"","url":"https://api.github.com/users/telstra","html_url":"https://github.com/telstra","followers_url":"https://api.github.com/users/telstra/followers","following_url":"https://api.github.com/users/telstra/following{/other_user}","gists_url":"https://api.github.com/users/telstra/gists{/gist_id}","starred_url":"https://api.github.com/users/telstra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/telstra/subscriptions","organizations_url":"https://api.github.com/users/telstra/orgs","repos_url":"https://api.github.com/users/telstra/repos","events_url":"https://api.github.com/users/telstra/events{/privacy}","received_events_url":"https://api.github.com/users/telstra/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/telstra/open-kilda","description":"OpenKilda is an open-source OpenFlow controller initially designed for use in a global network with high control-plane latency and a heavy emphasis on latency-centric data path optimisation.","fork":false,"url":"https://api.github.com/repos/telstra/open-kilda","forks_url":"https://api.github.com/repos/telstra/open-kilda/forks","keys_url":"https://api.github.com/repos/telstra/open-kilda/keys{/key_id}","collaborators_url":"https://api.github.com/repos/telstra/open-kilda/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/telstra/open-kilda/teams","hooks_url":"https://api.github.com/repos/telstra/open-kilda/hooks","issue_events_url":"https://api.github.com/repos/telstra/open-kilda/issues/events{/number}","events_url":"https://api.github.com/repos/telstra/open-kilda/events","assignees_url":"https://api.github.com/repos/telstra/open-kilda/assignees{/user}","branches_url":"https://api.github.com/repos/telstra/open-kilda/branches{/branch}","tags_url":"https://api.github.com/repos/telstra/open-kilda/tags","blobs_url":"https://api.github.com/repos/telstra/open-kilda/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/telstra/open-kilda/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/telstra/open-kilda/git/refs{/sha}","trees_url":"https://api.github.com/repos/telstra/open-kilda/git/trees{/sha}","statuses_url":"https://api.github.com/repos/telstra/open-kilda/statuses/{sha}","languages_url":"https://api.github.com/repos/telstra/open-kilda/languages","stargazers_url":"https://api.github.com/repos/telstra/open-kilda/stargazers","contributors_url":"https://api.github.com/repos/telstra/open-kilda/contributors","subscribers_url":"https://api.github.com/repos/telstra/open-kilda/subscribers","subscription_url":"https://api.github.com/repos/telstra/open-kilda/subscription","commits_url":"https://api.github.com/repos/telstra/open-kilda/commits{/sha}","git_commits_url":"https://api.github.com/repos/telstra/open-kilda/git/commits{/sha}","comments_url":"https://api.github.com/repos/telstra/open-kilda/comments{/number}","issue_comment_url":"https://api.github.com/repos/telstra/open-kilda/issues/comments{/number}","contents_url":"https://api.github.com/repos/telstra/open-kilda/contents/{+path}","compare_url":"https://api.github.com/repos/telstra/open-kilda/compare/{base}...{head}","merges_url":"https://api.github.com/repos/telstra/open-kilda/merges","archive_url":"https://api.github.com/repos/telstra/open-kilda/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/telstra/open-kilda/downloads","issues_url":"https://api.github.com/repos/telstra/open-kilda/issues{/number}","pulls_url":"https://api.github.com/repos/telstra/open-kilda/pulls{/number}","milestones_url":"https://api.github.com/repos/telstra/open-kilda/milestones{/number}","notifications_url":"https://api.github.com/repos/telstra/open-kilda/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/telstra/open-kilda/labels{/name}","releases_url":"https://api.github.com/repos/telstra/open-kilda/releases{/id}","deployments_url":"https://api.github.com/repos/telstra/open-kilda/deployments","created_at":"2017-09-27T05:13:18Z","updated_at":"2018-10-29T14:30:46Z","pushed_at":"2018-10-30T14:35:30Z","git_url":"git://github.com/telstra/open-kilda.git","ssh_url":"git@github.com:telstra/open-kilda.git","clone_url":"https://github.com/telstra/open-kilda.git","svn_url":"https://github.com/telstra/open-kilda","homepage":"","size":210439,"stargazers_count":33,"watchers_count":33,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":32,"mirror_url":null,"archived":false,"open_issues_count":274,"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":32,"open_issues":274,"watchers":33,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/telstra/open-kilda/pulls/1473"},"html":{"href":"https://github.com/telstra/open-kilda/pull/1473"},"issue":{"href":"https://api.github.com/repos/telstra/open-kilda/issues/1473"},"comments":{"href":"https://api.github.com/repos/telstra/open-kilda/issues/1473/comments"},"review_comments":{"href":"https://api.github.com/repos/telstra/open-kilda/pulls/1473/comments"},"review_comment":{"href":"https://api.github.com/repos/telstra/open-kilda/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/telstra/open-kilda/pulls/1473/commits"},"statuses":{"href":"https://api.github.com/repos/telstra/open-kilda/statuses/ecddd1ac0f61286818acc3c8c7790913ed806d54"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"rtretyak"}}