{"action":"created","comment":{"url":"https://api.github.com/repos/codenvy/codenvy/pulls/comments/89614284","pull_request_review_id":10158843,"id":89614284,"diff_hunk":"@@ -0,0 +1,286 @@\n+/*\n+ *  [2012] - [2016] Codenvy, S.A.\n+ *  All Rights Reserved.\n+ *\n+ * NOTICE:  All information contained herein is, and remains\n+ * the property of Codenvy S.A. and its suppliers,\n+ * if any.  The intellectual and technical concepts contained\n+ * herein are proprietary to Codenvy S.A.\n+ * and its suppliers and may be covered by U.S. and Foreign Patents,\n+ * patents in process, and are protected by trade secret or copyright law.\n+ * Dissemination of this information or reproduction of this material\n+ * is strictly forbidden unless prior written permission is obtained\n+ * from Codenvy S.A..\n+ */\n+package com.codenvy.organization.api.resource;\n+\n+import com.codenvy.organization.api.OrganizationManager;\n+import com.codenvy.organization.shared.model.Organization;\n+import com.codenvy.organization.shared.model.OrganizationResourcesLimit;\n+import com.codenvy.organization.spi.OrganizationResourcesLimitDao;\n+import com.codenvy.organization.spi.impl.OrganizationResourcesLimitImpl;\n+import com.codenvy.resource.api.ResourceAggregator;\n+import com.codenvy.resource.api.exception.NoEnoughResourcesException;\n+import com.codenvy.resource.api.usage.ResourceUsageManager;\n+import com.codenvy.resource.api.usage.ResourcesLocks;\n+import com.codenvy.resource.model.Resource;\n+import com.google.common.annotations.VisibleForTesting;\n+\n+import org.eclipse.che.api.core.ConflictException;\n+import org.eclipse.che.api.core.NotFoundException;\n+import org.eclipse.che.api.core.Page;\n+import org.eclipse.che.api.core.ServerException;\n+import org.eclipse.che.api.workspace.server.StripedLocks;\n+\n+import javax.inject.Inject;\n+import javax.inject.Singleton;\n+import java.util.ArrayList;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.function.Function;\n+import java.util.stream.Collectors;\n+\n+import static java.util.Collections.emptyList;\n+import static java.util.Objects.requireNonNull;\n+\n+/**\n+ * Facade for organization resources redistribution related operations.\n+ *\n+ * @author Sergii Leschenko\n+ */\n+@Singleton\n+public class OrganizationResourcesLimitManager {\n+    private final OrganizationResourcesLimitDao organizationResourcesLimitDao;\n+    private final ResourcesLocks                resourcesLocks;\n+    private final ResourceUsageManager          usageManager;\n+    private final ResourceAggregator            resourceAggregator;\n+    private final OrganizationManager           organizationManager;\n+\n+    @Inject\n+    public OrganizationResourcesLimitManager(OrganizationResourcesLimitDao organizationResourcesLimitDao,\n+                                             ResourcesLocks resourcesLocks,\n+                                             ResourceUsageManager usageManager,\n+                                             ResourceAggregator resourceAggregator,\n+                                             OrganizationManager organizationManager) {\n+        this.organizationResourcesLimitDao = organizationResourcesLimitDao;\n+        this.resourcesLocks = resourcesLocks;\n+        this.usageManager = usageManager;\n+        this.resourceAggregator = resourceAggregator;\n+        this.organizationManager = organizationManager;\n+    }\n+\n+    /**\n+     * Set resources limit for suborganization on parent's resources usage.\n+     *\n+     * @param resourcesLimit\n+     *         resources limit to store\n+     * @throws NullPointerException\n+     *         when either {@code resourcesLimit} is null\n+     * @throws NotFoundException\n+     *         when organization with {@code resourcesLimit.getId()} was not found\n+     * @throws ConflictException\n+     *         when parent organization doesn't have enough resources to increase limit\n+     * @throws ConflictException\n+     *         when limit can't be changed because suborganization is using existed resources\n+     *         or when they are redistributed to next organizations level\n+     * @throws ServerException\n+     *         when any other error occurs\n+     */\n+    public void setResourcesLimit(OrganizationResourcesLimit resourcesLimit) throws NotFoundException,\n+                                                                                    ConflictException,\n+                                                                                    ServerException {\n+        requireNonNull(resourcesLimit, \"Required non-null limit\");\n+        final String suborganizationId = resourcesLimit.getOrganizationId();\n+\n+        // locking resources by suborganization should lock resources whole organization tree\n+        // so we can check resource availability for suborganization and parent organization\n+        // TODO Rework it to using resourcesLocks.acquiresLock(suborganizationId, parentOrganizationId) when it will be implemented\n+        try (StripedLocks.WriteLock lock = resourcesLocks.acquiresLock(suborganizationId)) {\n+            checkResourcesAvailability(suborganizationId, resourcesLimit.getResources(), getExistedResources(suborganizationId));\n+            organizationResourcesLimitDao.store(new OrganizationResourcesLimitImpl(resourcesLimit));\n+        }\n+    }\n+\n+    /**\n+     * Return resources limit for given organization\n+     *\n+     * @param organizationId\n+     *         organization id\n+     * @return resources limit for given organization\n+     * @throws NotFoundException\n+     *         when organization with specified id doesn't have resources limit\n+     * @throws ServerException\n+     *         when any other error occurs\n+     */\n+    public OrganizationResourcesLimit get(String organizationId) throws NotFoundException, ServerException {\n+        requireNonNull(organizationId, \"Required non-null organization id\");\n+        return organizationResourcesLimitDao.get(organizationId);\n+    }\n+\n+    /**\n+     * Returns resources limits for suborganizations of given parent organization\n+     *\n+     * @param organizationId\n+     *         organization id\n+     * @return resources limits for suborganizations of given parent organization\n+     * @throws NullPointerException\n+     *         when either {@code organizationId} is null\n+     * @throws ServerException\n+     *         when any other error occurs\n+     */\n+    public Page<? extends OrganizationResourcesLimit> getResourcesLimits(String organizationId,\n+                                                                         int maxItems,\n+                                                                         long skipCount) throws ServerException {\n+        requireNonNull(organizationId, \"Required non-null organization id\");\n+\n+        return organizationResourcesLimitDao.getByParent(organizationId, maxItems, skipCount);\n+    }\n+\n+    /**\n+     * Remove organization resources limit.\n+     *\n+     * <p>After removing limit given organization won't be able to use parent resources.\n+     *\n+     * @param organizationId\n+     *         organization id\n+     * @throws NullPointerException\n+     *         when either {@code organizationId} is null\n+     * @throws NotFoundException\n+     *         when organization with specified id was not found\n+     * @throws ConflictException\n+     *         when limit can't be changed because suborganization is using existed resources\n+     *         or when they are redistributed to next organizations level\n+     * @throws ServerException\n+     *         when any other error occurs\n+     */\n+    public void remove(String organizationId) throws ServerException,\n+                                                     ConflictException,\n+                                                     NotFoundException {\n+        requireNonNull(organizationId, \"Required non-null organization id\");\n+\n+        try (StripedLocks.WriteLock lock = resourcesLocks.acquiresLock(organizationId)) {\n+            checkResourcesAvailability(organizationId, emptyList(), getExistedResources(organizationId));\n+            organizationResourcesLimitDao.remove(organizationId);\n+        }\n+    }\n+\n+    /**\n+     * Checks resources availability of resources in accordance to resources limit changes.\n+     *\n+     * @param suborganizationId\n+     *         identifier of organization which gives new limit\n+     * @param newResources\n+     *         resources that are defined in new limit\n+     * @param existedResources\n+     *         resources that are defined in new limit\n+     * @throws ConflictException\n+     *         when parent organization doesn't have enough resources to increase limit\n+     * @throws ConflictException\n+     *         when limit can't be changed because suborganization is using existed resources\n+     *         or when they are redistributed to next organizations level\n+     * @throws ServerException\n+     *         when any other error occurs\n+     */\n+    @VisibleForTesting\n+    void checkResourcesAvailability(String suborganizationId,","path":"wsmaster/codenvy-hosted-api-organization/src/main/java/com/codenvy/organization/api/resource/OrganizationResourcesLimitManager.java","position":185,"original_position":185,"commit_id":"391de92cecf97528dfd43971ef53199f1d49d109","original_commit_id":"391de92cecf97528dfd43971ef53199f1d49d109","user":{"login":"evoevodin","id":4053805,"avatar_url":"https://avatars.githubusercontent.com/u/4053805?v=3","gravatar_id":"","url":"https://api.github.com/users/evoevodin","html_url":"https://github.com/evoevodin","followers_url":"https://api.github.com/users/evoevodin/followers","following_url":"https://api.github.com/users/evoevodin/following{/other_user}","gists_url":"https://api.github.com/users/evoevodin/gists{/gist_id}","starred_url":"https://api.github.com/users/evoevodin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/evoevodin/subscriptions","organizations_url":"https://api.github.com/users/evoevodin/orgs","repos_url":"https://api.github.com/users/evoevodin/repos","events_url":"https://api.github.com/users/evoevodin/events{/privacy}","received_events_url":"https://api.github.com/users/evoevodin/received_events","type":"User","site_admin":false},"body":"What if we change this method to `isAvailable(...)` which doesn't throw any exceptions but returns boolean value instead, along with that we can provide another method similar to existing one, let's say it's `checkAvailable` which will throw the exception? BTW `ForbiddenException` may be good candidate when there is resources context.\r\nThe profit that i see, is that if method returns boolean there is a change to write some custom logic around it without \r\nusage of `try {} catch (ConflictException x) {}`.\r\nAnyway `OrganizationResourcesLimitManager.checkResourcesAvailablity` looks to verbose to me.","created_at":"2016-11-25T12:59:05Z","updated_at":"2016-11-25T12:59:06Z","html_url":"https://github.com/codenvy/codenvy/pull/1141#discussion_r89614284","pull_request_url":"https://api.github.com/repos/codenvy/codenvy/pulls/1141","_links":{"self":{"href":"https://api.github.com/repos/codenvy/codenvy/pulls/comments/89614284"},"html":{"href":"https://github.com/codenvy/codenvy/pull/1141#discussion_r89614284"},"pull_request":{"href":"https://api.github.com/repos/codenvy/codenvy/pulls/1141"}}},"pull_request":{"url":"https://api.github.com/repos/codenvy/codenvy/pulls/1141","id":93546461,"html_url":"https://github.com/codenvy/codenvy/pull/1141","diff_url":"https://github.com/codenvy/codenvy/pull/1141.diff","patch_url":"https://github.com/codenvy/codenvy/pull/1141.patch","issue_url":"https://api.github.com/repos/codenvy/codenvy/issues/1141","number":1141,"state":"open","locked":false,"title":"[WIP] CODENVY-957 Implement resources redistribution between suborganizations","user":{"login":"sleshchenko","id":5887312,"avatar_url":"https://avatars.githubusercontent.com/u/5887312?v=3","gravatar_id":"","url":"https://api.github.com/users/sleshchenko","html_url":"https://github.com/sleshchenko","followers_url":"https://api.github.com/users/sleshchenko/followers","following_url":"https://api.github.com/users/sleshchenko/following{/other_user}","gists_url":"https://api.github.com/users/sleshchenko/gists{/gist_id}","starred_url":"https://api.github.com/users/sleshchenko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sleshchenko/subscriptions","organizations_url":"https://api.github.com/users/sleshchenko/orgs","repos_url":"https://api.github.com/users/sleshchenko/repos","events_url":"https://api.github.com/users/sleshchenko/events{/privacy}","received_events_url":"https://api.github.com/users/sleshchenko/received_events","type":"User","site_admin":false},"body":"### What does this PR do?\r\nAdded ability to redistribute resources between suborganizations.\r\n\r\nIntroduced new state for account's resources, it's called `reserved resources`. It means that account's license has resources but it can't use it for consumtion by workpace starting, creation etc.\r\n\r\nImplemented new organization resources API that allows to define resources that should be provided for usage by suborganization from its parent organization. Only users who have `manageResources` permissions can grant suborganization to use parent organization's resources. Resources become unavailable for his parent organization when user allows suborganization to use them, so they become reserved resources. By default all suborganizations don't have any resources limit and it means that they are not able to use resources of their parent organizations.\r\n\r\n### What issues does this PR fix or reference?\r\nhttps://github.com/codenvy/codenvy/issues/957\r\n\r\n### New Behavior\r\nOrganization can provide own resources to usage by their suborganizations.\r\n\r\n### Tests written?\r\nYes\r\n\r\n### Docs requirements?\r\nInclude the content for all the docs changes required. \r\n1.  API changes  \r\n2.  User docs changes  \r\n","created_at":"2016-11-14T11:03:04Z","updated_at":"2016-11-25T12:59:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f496432e4d9f57dffa9e1ad0e27269d2972d5340","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/codenvy/codenvy/pulls/1141/commits","review_comments_url":"https://api.github.com/repos/codenvy/codenvy/pulls/1141/comments","review_comment_url":"https://api.github.com/repos/codenvy/codenvy/pulls/comments{/number}","comments_url":"https://api.github.com/repos/codenvy/codenvy/issues/1141/comments","statuses_url":"https://api.github.com/repos/codenvy/codenvy/statuses/391de92cecf97528dfd43971ef53199f1d49d109","head":{"label":"sleshchenko:CODENVY-957","ref":"CODENVY-957","sha":"391de92cecf97528dfd43971ef53199f1d49d109","user":{"login":"sleshchenko","id":5887312,"avatar_url":"https://avatars.githubusercontent.com/u/5887312?v=3","gravatar_id":"","url":"https://api.github.com/users/sleshchenko","html_url":"https://github.com/sleshchenko","followers_url":"https://api.github.com/users/sleshchenko/followers","following_url":"https://api.github.com/users/sleshchenko/following{/other_user}","gists_url":"https://api.github.com/users/sleshchenko/gists{/gist_id}","starred_url":"https://api.github.com/users/sleshchenko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sleshchenko/subscriptions","organizations_url":"https://api.github.com/users/sleshchenko/orgs","repos_url":"https://api.github.com/users/sleshchenko/repos","events_url":"https://api.github.com/users/sleshchenko/events{/privacy}","received_events_url":"https://api.github.com/users/sleshchenko/received_events","type":"User","site_admin":false},"repo":{"id":55216227,"name":"codenvy","full_name":"sleshchenko/codenvy","owner":{"login":"sleshchenko","id":5887312,"avatar_url":"https://avatars.githubusercontent.com/u/5887312?v=3","gravatar_id":"","url":"https://api.github.com/users/sleshchenko","html_url":"https://github.com/sleshchenko","followers_url":"https://api.github.com/users/sleshchenko/followers","following_url":"https://api.github.com/users/sleshchenko/following{/other_user}","gists_url":"https://api.github.com/users/sleshchenko/gists{/gist_id}","starred_url":"https://api.github.com/users/sleshchenko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sleshchenko/subscriptions","organizations_url":"https://api.github.com/users/sleshchenko/orgs","repos_url":"https://api.github.com/users/sleshchenko/repos","events_url":"https://api.github.com/users/sleshchenko/events{/privacy}","received_events_url":"https://api.github.com/users/sleshchenko/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sleshchenko/codenvy","description":"Codenvy","fork":true,"url":"https://api.github.com/repos/sleshchenko/codenvy","forks_url":"https://api.github.com/repos/sleshchenko/codenvy/forks","keys_url":"https://api.github.com/repos/sleshchenko/codenvy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sleshchenko/codenvy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sleshchenko/codenvy/teams","hooks_url":"https://api.github.com/repos/sleshchenko/codenvy/hooks","issue_events_url":"https://api.github.com/repos/sleshchenko/codenvy/issues/events{/number}","events_url":"https://api.github.com/repos/sleshchenko/codenvy/events","assignees_url":"https://api.github.com/repos/sleshchenko/codenvy/assignees{/user}","branches_url":"https://api.github.com/repos/sleshchenko/codenvy/branches{/branch}","tags_url":"https://api.github.com/repos/sleshchenko/codenvy/tags","blobs_url":"https://api.github.com/repos/sleshchenko/codenvy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sleshchenko/codenvy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sleshchenko/codenvy/git/refs{/sha}","trees_url":"https://api.github.com/repos/sleshchenko/codenvy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sleshchenko/codenvy/statuses/{sha}","languages_url":"https://api.github.com/repos/sleshchenko/codenvy/languages","stargazers_url":"https://api.github.com/repos/sleshchenko/codenvy/stargazers","contributors_url":"https://api.github.com/repos/sleshchenko/codenvy/contributors","subscribers_url":"https://api.github.com/repos/sleshchenko/codenvy/subscribers","subscription_url":"https://api.github.com/repos/sleshchenko/codenvy/subscription","commits_url":"https://api.github.com/repos/sleshchenko/codenvy/commits{/sha}","git_commits_url":"https://api.github.com/repos/sleshchenko/codenvy/git/commits{/sha}","comments_url":"https://api.github.com/repos/sleshchenko/codenvy/comments{/number}","issue_comment_url":"https://api.github.com/repos/sleshchenko/codenvy/issues/comments{/number}","contents_url":"https://api.github.com/repos/sleshchenko/codenvy/contents/{+path}","compare_url":"https://api.github.com/repos/sleshchenko/codenvy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sleshchenko/codenvy/merges","archive_url":"https://api.github.com/repos/sleshchenko/codenvy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sleshchenko/codenvy/downloads","issues_url":"https://api.github.com/repos/sleshchenko/codenvy/issues{/number}","pulls_url":"https://api.github.com/repos/sleshchenko/codenvy/pulls{/number}","milestones_url":"https://api.github.com/repos/sleshchenko/codenvy/milestones{/number}","notifications_url":"https://api.github.com/repos/sleshchenko/codenvy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sleshchenko/codenvy/labels{/name}","releases_url":"https://api.github.com/repos/sleshchenko/codenvy/releases{/id}","deployments_url":"https://api.github.com/repos/sleshchenko/codenvy/deployments","created_at":"2016-04-01T08:29:46Z","updated_at":"2016-04-01T08:29:53Z","pushed_at":"2016-11-25T12:57:03Z","git_url":"git://github.com/sleshchenko/codenvy.git","ssh_url":"git@github.com:sleshchenko/codenvy.git","clone_url":"https://github.com/sleshchenko/codenvy.git","svn_url":"https://github.com/sleshchenko/codenvy","homepage":null,"size":72524,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"codenvy:master","ref":"master","sha":"968f7367229b170ea9c9ace1c2604c2e4cbc5c91","user":{"login":"codenvy","id":2736247,"avatar_url":"https://avatars.githubusercontent.com/u/2736247?v=3","gravatar_id":"","url":"https://api.github.com/users/codenvy","html_url":"https://github.com/codenvy","followers_url":"https://api.github.com/users/codenvy/followers","following_url":"https://api.github.com/users/codenvy/following{/other_user}","gists_url":"https://api.github.com/users/codenvy/gists{/gist_id}","starred_url":"https://api.github.com/users/codenvy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codenvy/subscriptions","organizations_url":"https://api.github.com/users/codenvy/orgs","repos_url":"https://api.github.com/users/codenvy/repos","events_url":"https://api.github.com/users/codenvy/events{/privacy}","received_events_url":"https://api.github.com/users/codenvy/received_events","type":"Organization","site_admin":false},"repo":{"id":54102761,"name":"codenvy","full_name":"codenvy/codenvy","owner":{"login":"codenvy","id":2736247,"avatar_url":"https://avatars.githubusercontent.com/u/2736247?v=3","gravatar_id":"","url":"https://api.github.com/users/codenvy","html_url":"https://github.com/codenvy","followers_url":"https://api.github.com/users/codenvy/followers","following_url":"https://api.github.com/users/codenvy/following{/other_user}","gists_url":"https://api.github.com/users/codenvy/gists{/gist_id}","starred_url":"https://api.github.com/users/codenvy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codenvy/subscriptions","organizations_url":"https://api.github.com/users/codenvy/orgs","repos_url":"https://api.github.com/users/codenvy/repos","events_url":"https://api.github.com/users/codenvy/events{/privacy}","received_events_url":"https://api.github.com/users/codenvy/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/codenvy/codenvy","description":"Codenvy","fork":false,"url":"https://api.github.com/repos/codenvy/codenvy","forks_url":"https://api.github.com/repos/codenvy/codenvy/forks","keys_url":"https://api.github.com/repos/codenvy/codenvy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/codenvy/codenvy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/codenvy/codenvy/teams","hooks_url":"https://api.github.com/repos/codenvy/codenvy/hooks","issue_events_url":"https://api.github.com/repos/codenvy/codenvy/issues/events{/number}","events_url":"https://api.github.com/repos/codenvy/codenvy/events","assignees_url":"https://api.github.com/repos/codenvy/codenvy/assignees{/user}","branches_url":"https://api.github.com/repos/codenvy/codenvy/branches{/branch}","tags_url":"https://api.github.com/repos/codenvy/codenvy/tags","blobs_url":"https://api.github.com/repos/codenvy/codenvy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/codenvy/codenvy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/codenvy/codenvy/git/refs{/sha}","trees_url":"https://api.github.com/repos/codenvy/codenvy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/codenvy/codenvy/statuses/{sha}","languages_url":"https://api.github.com/repos/codenvy/codenvy/languages","stargazers_url":"https://api.github.com/repos/codenvy/codenvy/stargazers","contributors_url":"https://api.github.com/repos/codenvy/codenvy/contributors","subscribers_url":"https://api.github.com/repos/codenvy/codenvy/subscribers","subscription_url":"https://api.github.com/repos/codenvy/codenvy/subscription","commits_url":"https://api.github.com/repos/codenvy/codenvy/commits{/sha}","git_commits_url":"https://api.github.com/repos/codenvy/codenvy/git/commits{/sha}","comments_url":"https://api.github.com/repos/codenvy/codenvy/comments{/number}","issue_comment_url":"https://api.github.com/repos/codenvy/codenvy/issues/comments{/number}","contents_url":"https://api.github.com/repos/codenvy/codenvy/contents/{+path}","compare_url":"https://api.github.com/repos/codenvy/codenvy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/codenvy/codenvy/merges","archive_url":"https://api.github.com/repos/codenvy/codenvy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/codenvy/codenvy/downloads","issues_url":"https://api.github.com/repos/codenvy/codenvy/issues{/number}","pulls_url":"https://api.github.com/repos/codenvy/codenvy/pulls{/number}","milestones_url":"https://api.github.com/repos/codenvy/codenvy/milestones{/number}","notifications_url":"https://api.github.com/repos/codenvy/codenvy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/codenvy/codenvy/labels{/name}","releases_url":"https://api.github.com/repos/codenvy/codenvy/releases{/id}","deployments_url":"https://api.github.com/repos/codenvy/codenvy/deployments","created_at":"2016-03-17T08:51:27Z","updated_at":"2016-11-22T20:15:56Z","pushed_at":"2016-11-25T12:44:26Z","git_url":"git://github.com/codenvy/codenvy.git","ssh_url":"git@github.com:codenvy/codenvy.git","clone_url":"https://github.com/codenvy/codenvy.git","svn_url":"https://github.com/codenvy/codenvy","homepage":null,"size":79543,"stargazers_count":38,"watchers_count":38,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":31,"mirror_url":null,"open_issues_count":142,"forks":31,"open_issues":142,"watchers":38,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/codenvy/codenvy/pulls/1141"},"html":{"href":"https://github.com/codenvy/codenvy/pull/1141"},"issue":{"href":"https://api.github.com/repos/codenvy/codenvy/issues/1141"},"comments":{"href":"https://api.github.com/repos/codenvy/codenvy/issues/1141/comments"},"review_comments":{"href":"https://api.github.com/repos/codenvy/codenvy/pulls/1141/comments"},"review_comment":{"href":"https://api.github.com/repos/codenvy/codenvy/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/codenvy/codenvy/pulls/1141/commits"},"statuses":{"href":"https://api.github.com/repos/codenvy/codenvy/statuses/391de92cecf97528dfd43971ef53199f1d49d109"}}}}
{"actor":{"display_login":"evoevodin"}}