{"action":"created","comment":{"url":"https://api.github.com/repos/apache/falcon/pulls/comments/52983305","id":52983305,"diff_hunk":"@@ -0,0 +1,278 @@\n+/**\n+ * Licensed to the Apache Software Foundation (ASF) under one\n+ * or more contributor license agreements.  See the NOTICE file\n+ * distributed with this work for additional information\n+ * regarding copyright ownership.  The ASF licenses this file\n+ * to you under the Apache License, Version 2.0 (the\n+ * \"License\"); you may not use this file except in compliance\n+ * with the License.  You may obtain a copy of the License at\n+ *\n+ *     http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+package org.apache.falcon.regression.SLA;\n+\n+import org.apache.falcon.entity.v0.EntityType;\n+import org.apache.falcon.entity.v0.Frequency;\n+import org.apache.falcon.regression.Entities.FeedMerlin;\n+import org.apache.falcon.regression.core.bundle.Bundle;\n+import org.apache.falcon.regression.core.helpers.ColoHelper;\n+import org.apache.falcon.regression.core.response.ServiceResponse;\n+import org.apache.falcon.regression.core.util.HadoopUtil;\n+import org.apache.falcon.regression.core.util.InstanceUtil;\n+import org.apache.falcon.regression.core.util.TimeUtil;\n+import org.apache.falcon.regression.core.util.AssertUtil;\n+import org.apache.falcon.regression.core.util.BundleUtil;\n+import org.apache.falcon.regression.testHelper.BaseTestClass;\n+import org.apache.falcon.resource.SchedulableEntityInstance;\n+import org.apache.falcon.resource.SchedulableEntityInstanceResult;\n+import org.apache.hadoop.fs.FileSystem;\n+import org.apache.log4j.Logger;\n+import org.joda.time.DateTime;\n+import org.testng.Assert;\n+import org.testng.annotations.AfterMethod;\n+import org.testng.annotations.BeforeMethod;\n+import org.testng.annotations.Test;\n+\n+import java.io.IOException;\n+import java.util.List;\n+import java.util.Arrays;\n+import java.util.Comparator;\n+import java.util.HashMap;\n+import java.util.Map;\n+import java.util.ArrayList;\n+import java.util.Collections;\n+\n+\n+/**\n+ * Feed SLA monitoring tests.\n+ * Test assumes following properties are set in startup.properties of server :\n+ *      *.feed.sla.statusCheck.frequency.seconds=60\n+ *      *.feed.sla.lookAheadWindow.millis=60000\n+ */\n+@Test(groups = \"distributed\")\n+public class FeedSLAMonitoringTest extends BaseTestClass {\n+\n+    private ColoHelper cluster = servers.get(0);\n+    private FileSystem clusterFS = serverFS.get(0);\n+    private String baseTestHDFSDir = cleanAndGetTestDir();\n+    private String feedInputPath = baseTestHDFSDir + \"/input\" + MINUTE_DATE_PATTERN;\n+    private List<String> slaFeedNames;\n+    private List<Frequency> slaFeedFrequencies;\n+    private String clusterName;\n+    private static final Logger LOGGER = Logger.getLogger(FeedSLAMonitoringTest.class);\n+\n+    private String startTime;\n+    private String endTime;\n+    private String slaStartTime;\n+    private String slaEndTime;\n+    private int noOfFeeds;\n+    private int statusCheckFrequency;\n+\n+    private static final Comparator<SchedulableEntityInstance> DEPENDENCY_COMPARATOR =\n+            new Comparator<SchedulableEntityInstance>() {\n+                @Override\n+                public int compare(SchedulableEntityInstance o1, SchedulableEntityInstance o2) {\n+                    int tagDiff = o1.getTags().compareTo(o2.getTags());\n+                    if (tagDiff != 0) {\n+                        return tagDiff;\n+                    }\n+                    int clusterDiff = o1.getCluster().compareTo(o2.getCluster());\n+                    if (clusterDiff != 0) {\n+                        return clusterDiff;\n+                    }\n+                    int typeDiff = o1.getEntityType().compareTo(o2.getEntityType());\n+                    if (typeDiff != 0) {\n+                        return typeDiff;\n+                    }\n+                    int nameDiff = o1.getEntityName().compareTo(o2.getEntityName());\n+                    if (nameDiff != 0) {\n+                        return nameDiff;\n+                    }\n+                    int dateDiff = o1.getInstanceTime().compareTo(o2.getInstanceTime());\n+                    if (dateDiff != 0) {\n+                        return dateDiff;\n+                    }\n+                    return 0;\n+                }\n+            };\n+\n+    /**\n+     * Submitting 3 feeds with different frequencies and sla values.\n+     * @throws Exception\n+     */\n+    @BeforeMethod(alwaysRun = true)\n+    public void setup() throws Exception {\n+\n+        bundles[0] = BundleUtil.readELBundle();\n+        bundles[0] = new Bundle(bundles[0], cluster);\n+        bundles[0].generateUniqueBundle(this);\n+        bundles[0].setInputFeedDataPath(feedInputPath);\n+        clusterName = bundles[0].getClusterNames().get(0);\n+        ServiceResponse response =\n+                prism.getClusterHelper().submitEntity(bundles[0].getClusters().get(0));\n+        AssertUtil.assertSucceeded(response);\n+\n+        startTime = TimeUtil.getTimeWrtSystemTime(-10);\n+        endTime = TimeUtil.addMinsToTime(startTime, 20);\n+        noOfFeeds=3;\n+\n+        LOGGER.info(\"Time range between : \" + startTime + \" and \" + endTime);\n+        final String oldFeedName = bundles[0].getInputFeedNameFromBundle();\n+        slaFeedFrequencies = Arrays.asList(new Frequency(\"1\", Frequency.TimeUnit.minutes),\n+                new Frequency(\"2\", Frequency.TimeUnit.minutes),\n+                new Frequency(\"4\", Frequency.TimeUnit.minutes));\n+\n+        slaFeedNames = Arrays.asList(oldFeedName + \"-1\", oldFeedName + \"-2\", oldFeedName + \"-3\");\n+\n+        //Submit 3 feeds with different frequencies and sla values.\n+        for (int bIndex = 0; bIndex < noOfFeeds; ++bIndex) {\n+            final FeedMerlin ipFeed = new FeedMerlin(bundles[0].getInputFeedFromBundle());\n+\n+            ipFeed.setValidity(startTime, endTime);\n+            ipFeed.setAvailabilityFlag(\"_SUCCESS\");\n+\n+            //set slaLow and slaHigh\n+            ipFeed.setSla(new Frequency(\"1\", Frequency.TimeUnit.minutes),\n+                    new Frequency(\"2\", Frequency.TimeUnit.minutes));\n+            ipFeed.setName(slaFeedNames.get(bIndex));\n+            ipFeed.setFrequency(slaFeedFrequencies.get(bIndex));\n+\n+            LOGGER.info(\"Feed is : \" + ipFeed.toString());\n+\n+            AssertUtil.assertSucceeded(prism.getFeedHelper().submitEntity(ipFeed.toString()));\n+        }\n+    }\n+\n+    @AfterMethod(alwaysRun = true)\n+    public void tearDown() throws IOException {\n+        cleanTestsDirs();\n+        removeTestClassEntities();\n+    }\n+\n+    /**\n+     * The following test submits 3 feeds, checks the slaAlert for a given time range and validates its output.\n+     * It also checks the sla status when feed is deleted , data created with/without _SUCCESS folder.\n+     * @throws Exception\n+     */\n+    @Test\n+    public void feedSLATest() throws Exception {\n+        /**TEST : Check sla response for a given time range\n+         */\n+\n+        statusCheckFrequency=1*60; // 60 seconds\n+\n+        // Map of instanceDate and corresponding list of SchedulableEntityInstance\n+        Map<String, List<SchedulableEntityInstance>> instanceEntityMap = new HashMap<>();\n+\n+        slaStartTime = startTime;\n+        slaEndTime = TimeUtil.addMinsToTime(slaStartTime, 10);\n+        DateTime slaStartDate = TimeUtil.oozieDateToDate(slaStartTime);\n+        DateTime slaEndDate = TimeUtil.oozieDateToDate(slaEndTime);\n+\n+        List<SchedulableEntityInstance> expectedInstances = new ArrayList<>();\n+        SchedulableEntityInstance expectedSchedulableEntityInstance;\n+\n+        for (int index = 0; index < noOfFeeds; ++index) {\n+\n+            DateTime dt = new DateTime(slaStartDate);\n+            while (!dt.isAfter(slaEndDate)) {\n+\n+                expectedSchedulableEntityInstance = new SchedulableEntityInstance(slaFeedNames.get(index),\n+                        clusterName, dt.toDate(), EntityType.FEED);\n+                expectedSchedulableEntityInstance.setTags(\"Missed SLA High\");\n+                expectedInstances.add(expectedSchedulableEntityInstance);\n+\n+                if (!instanceEntityMap.containsKey(dt.toString())) {\n+                    instanceEntityMap.put(dt.toString(), new ArrayList<SchedulableEntityInstance>());\n+                }\n+                instanceEntityMap.get(dt.toString()).add(expectedSchedulableEntityInstance);\n+                dt = dt.plusMinutes(slaFeedFrequencies.get(index).getFrequencyAsInt());\n+\n+            }\n+        }\n+\n+        TimeUtil.sleepSeconds(statusCheckFrequency);\n+\n+        SchedulableEntityInstanceResult response = prism.getFeedHelper().getSlaAlert(\n+                \"?start=\" + slaStartTime + \"&end=\" + slaEndTime).getSlaResult();\n+\n+        LOGGER.info(response.getMessage());\n+\n+        validateInstances(response, expectedInstances);\n+\n+        /**TEST : Create missing dependencies with _SUCCESS directory and check sla response\n+         */\n+\n+        String dateEntry = (String) instanceEntityMap.keySet().toArray()[1];\n+        System.out.println(dateEntry + \"/\" + instanceEntityMap.get(dateEntry));\n+        List<String> dataDates = InstanceUtil.getMinuteDatesToPath(dateEntry, dateEntry, 0);\n+\n+        HadoopUtil.createFolders(clusterFS, baseTestHDFSDir + \"/input/\", dataDates);\n+\n+        //sla response for feeds when _SUCCESS file is missing from dataPath\n+        response = prism.getFeedHelper().getSlaAlert(\"?start=\" + slaStartTime + \"&end=\" + slaEndTime).getSlaResult();\n+\n+        // Response does not change as it checks for _SUCCESS file\n+        validateInstances(response, expectedInstances);\n+\n+        //Create _SUCCESS file\n+        HadoopUtil.recreateDir(clusterFS, baseTestHDFSDir + \"/input/\" + dataDates.get(0) + \"/_SUCCESS\");\n+        for (SchedulableEntityInstance instance : instanceEntityMap.get(dateEntry)) {\n+            expectedInstances.remove(instance);\n+        }\n+        instanceEntityMap.remove(dateEntry);\n+\n+        TimeUtil.sleepSeconds(statusCheckFrequency);\n+\n+        //sla response for feeds when _SUCCESS file is available in dataPath\n+        response = prism.getFeedHelper().getSlaAlert(\"?start=\" + slaStartTime + \"&end=\" + slaEndTime).getSlaResult();\n+        validateInstances(response, expectedInstances);\n+\n+        /** TEST : Delete feed and check sla response\n+         */\n+        String deletedFeed = slaFeedNames.get(0);\n+        prism.getFeedHelper().deleteByName(deletedFeed, null);\n+\n+        for (Map.Entry<String, List<SchedulableEntityInstance>> entry : instanceEntityMap.entrySet())\n+        {\n+            System.out.println(entry.getKey() + \"/\" + entry.getValue());","path":"falcon-regression/merlin/src/test/java/org/apache/falcon/regression/SLA/FeedSLAMonitoringTest.java","position":245,"original_position":245,"commit_id":"f5b2888605223b1c15da588902d8f44c2a5b9d9c","original_commit_id":"f5b2888605223b1c15da588902d8f44c2a5b9d9c","user":{"login":"pisaychuk","id":5918477,"avatar_url":"https://avatars.githubusercontent.com/u/5918477?v=3","gravatar_id":"","url":"https://api.github.com/users/pisaychuk","html_url":"https://github.com/pisaychuk","followers_url":"https://api.github.com/users/pisaychuk/followers","following_url":"https://api.github.com/users/pisaychuk/following{/other_user}","gists_url":"https://api.github.com/users/pisaychuk/gists{/gist_id}","starred_url":"https://api.github.com/users/pisaychuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pisaychuk/subscriptions","organizations_url":"https://api.github.com/users/pisaychuk/orgs","repos_url":"https://api.github.com/users/pisaychuk/repos","events_url":"https://api.github.com/users/pisaychuk/events{/privacy}","received_events_url":"https://api.github.com/users/pisaychuk/received_events","type":"User","site_admin":false},"body":"System.out.println ?","created_at":"2016-02-16T09:03:48Z","updated_at":"2016-02-16T09:03:48Z","html_url":"https://github.com/apache/falcon/pull/44#discussion_r52983305","pull_request_url":"https://api.github.com/repos/apache/falcon/pulls/44","_links":{"self":{"href":"https://api.github.com/repos/apache/falcon/pulls/comments/52983305"},"html":{"href":"https://github.com/apache/falcon/pull/44#discussion_r52983305"},"pull_request":{"href":"https://api.github.com/repos/apache/falcon/pulls/44"}}},"pull_request":{"url":"https://api.github.com/repos/apache/falcon/pulls/44","id":59355040,"html_url":"https://github.com/apache/falcon/pull/44","diff_url":"https://github.com/apache/falcon/pull/44.diff","patch_url":"https://github.com/apache/falcon/pull/44.patch","issue_url":"https://api.github.com/repos/apache/falcon/issues/44","number":44,"state":"open","locked":false,"title":"FALCON-1566 Add test for SLA monitoring API","user":{"login":"pragya-mittal","id":14790857,"avatar_url":"https://avatars.githubusercontent.com/u/14790857?v=3","gravatar_id":"","url":"https://api.github.com/users/pragya-mittal","html_url":"https://github.com/pragya-mittal","followers_url":"https://api.github.com/users/pragya-mittal/followers","following_url":"https://api.github.com/users/pragya-mittal/following{/other_user}","gists_url":"https://api.github.com/users/pragya-mittal/gists{/gist_id}","starred_url":"https://api.github.com/users/pragya-mittal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pragya-mittal/subscriptions","organizations_url":"https://api.github.com/users/pragya-mittal/orgs","repos_url":"https://api.github.com/users/pragya-mittal/repos","events_url":"https://api.github.com/users/pragya-mittal/events{/privacy}","received_events_url":"https://api.github.com/users/pragya-mittal/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-02-15T12:03:34Z","updated_at":"2016-02-16T09:03:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"39a48e3f937c3c879dd9fbe36ad6ed25e5fea3ac","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/apache/falcon/pulls/44/commits","review_comments_url":"https://api.github.com/repos/apache/falcon/pulls/44/comments","review_comment_url":"https://api.github.com/repos/apache/falcon/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/falcon/issues/44/comments","statuses_url":"https://api.github.com/repos/apache/falcon/statuses/f5b2888605223b1c15da588902d8f44c2a5b9d9c","head":{"label":"pragya-mittal:feed-sla","ref":"feed-sla","sha":"f5b2888605223b1c15da588902d8f44c2a5b9d9c","user":{"login":"pragya-mittal","id":14790857,"avatar_url":"https://avatars.githubusercontent.com/u/14790857?v=3","gravatar_id":"","url":"https://api.github.com/users/pragya-mittal","html_url":"https://github.com/pragya-mittal","followers_url":"https://api.github.com/users/pragya-mittal/followers","following_url":"https://api.github.com/users/pragya-mittal/following{/other_user}","gists_url":"https://api.github.com/users/pragya-mittal/gists{/gist_id}","starred_url":"https://api.github.com/users/pragya-mittal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pragya-mittal/subscriptions","organizations_url":"https://api.github.com/users/pragya-mittal/orgs","repos_url":"https://api.github.com/users/pragya-mittal/repos","events_url":"https://api.github.com/users/pragya-mittal/events{/privacy}","received_events_url":"https://api.github.com/users/pragya-mittal/received_events","type":"User","site_admin":false},"repo":{"id":51439966,"name":"falcon","full_name":"pragya-mittal/falcon","owner":{"login":"pragya-mittal","id":14790857,"avatar_url":"https://avatars.githubusercontent.com/u/14790857?v=3","gravatar_id":"","url":"https://api.github.com/users/pragya-mittal","html_url":"https://github.com/pragya-mittal","followers_url":"https://api.github.com/users/pragya-mittal/followers","following_url":"https://api.github.com/users/pragya-mittal/following{/other_user}","gists_url":"https://api.github.com/users/pragya-mittal/gists{/gist_id}","starred_url":"https://api.github.com/users/pragya-mittal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pragya-mittal/subscriptions","organizations_url":"https://api.github.com/users/pragya-mittal/orgs","repos_url":"https://api.github.com/users/pragya-mittal/repos","events_url":"https://api.github.com/users/pragya-mittal/events{/privacy}","received_events_url":"https://api.github.com/users/pragya-mittal/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pragya-mittal/falcon","description":"Mirror of Apache Falcon","fork":true,"url":"https://api.github.com/repos/pragya-mittal/falcon","forks_url":"https://api.github.com/repos/pragya-mittal/falcon/forks","keys_url":"https://api.github.com/repos/pragya-mittal/falcon/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pragya-mittal/falcon/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pragya-mittal/falcon/teams","hooks_url":"https://api.github.com/repos/pragya-mittal/falcon/hooks","issue_events_url":"https://api.github.com/repos/pragya-mittal/falcon/issues/events{/number}","events_url":"https://api.github.com/repos/pragya-mittal/falcon/events","assignees_url":"https://api.github.com/repos/pragya-mittal/falcon/assignees{/user}","branches_url":"https://api.github.com/repos/pragya-mittal/falcon/branches{/branch}","tags_url":"https://api.github.com/repos/pragya-mittal/falcon/tags","blobs_url":"https://api.github.com/repos/pragya-mittal/falcon/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pragya-mittal/falcon/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pragya-mittal/falcon/git/refs{/sha}","trees_url":"https://api.github.com/repos/pragya-mittal/falcon/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pragya-mittal/falcon/statuses/{sha}","languages_url":"https://api.github.com/repos/pragya-mittal/falcon/languages","stargazers_url":"https://api.github.com/repos/pragya-mittal/falcon/stargazers","contributors_url":"https://api.github.com/repos/pragya-mittal/falcon/contributors","subscribers_url":"https://api.github.com/repos/pragya-mittal/falcon/subscribers","subscription_url":"https://api.github.com/repos/pragya-mittal/falcon/subscription","commits_url":"https://api.github.com/repos/pragya-mittal/falcon/commits{/sha}","git_commits_url":"https://api.github.com/repos/pragya-mittal/falcon/git/commits{/sha}","comments_url":"https://api.github.com/repos/pragya-mittal/falcon/comments{/number}","issue_comment_url":"https://api.github.com/repos/pragya-mittal/falcon/issues/comments{/number}","contents_url":"https://api.github.com/repos/pragya-mittal/falcon/contents/{+path}","compare_url":"https://api.github.com/repos/pragya-mittal/falcon/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pragya-mittal/falcon/merges","archive_url":"https://api.github.com/repos/pragya-mittal/falcon/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pragya-mittal/falcon/downloads","issues_url":"https://api.github.com/repos/pragya-mittal/falcon/issues{/number}","pulls_url":"https://api.github.com/repos/pragya-mittal/falcon/pulls{/number}","milestones_url":"https://api.github.com/repos/pragya-mittal/falcon/milestones{/number}","notifications_url":"https://api.github.com/repos/pragya-mittal/falcon/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pragya-mittal/falcon/labels{/name}","releases_url":"https://api.github.com/repos/pragya-mittal/falcon/releases{/id}","deployments_url":"https://api.github.com/repos/pragya-mittal/falcon/deployments","created_at":"2016-02-10T12:33:23Z","updated_at":"2016-02-10T12:33:27Z","pushed_at":"2016-02-15T12:02:42Z","git_url":"git://github.com/pragya-mittal/falcon.git","ssh_url":"git@github.com:pragya-mittal/falcon.git","clone_url":"https://github.com/pragya-mittal/falcon.git","svn_url":"https://github.com/pragya-mittal/falcon","homepage":null,"size":28602,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"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":"apache:master","ref":"master","sha":"67c29705a4db5399bd51c1476387d0b4320b1a44","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","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":11543457,"name":"falcon","full_name":"apache/falcon","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","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/falcon","description":"Mirror of Apache Falcon","fork":false,"url":"https://api.github.com/repos/apache/falcon","forks_url":"https://api.github.com/repos/apache/falcon/forks","keys_url":"https://api.github.com/repos/apache/falcon/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/falcon/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/falcon/teams","hooks_url":"https://api.github.com/repos/apache/falcon/hooks","issue_events_url":"https://api.github.com/repos/apache/falcon/issues/events{/number}","events_url":"https://api.github.com/repos/apache/falcon/events","assignees_url":"https://api.github.com/repos/apache/falcon/assignees{/user}","branches_url":"https://api.github.com/repos/apache/falcon/branches{/branch}","tags_url":"https://api.github.com/repos/apache/falcon/tags","blobs_url":"https://api.github.com/repos/apache/falcon/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/falcon/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/falcon/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/falcon/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/falcon/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/falcon/languages","stargazers_url":"https://api.github.com/repos/apache/falcon/stargazers","contributors_url":"https://api.github.com/repos/apache/falcon/contributors","subscribers_url":"https://api.github.com/repos/apache/falcon/subscribers","subscription_url":"https://api.github.com/repos/apache/falcon/subscription","commits_url":"https://api.github.com/repos/apache/falcon/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/falcon/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/falcon/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/falcon/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/falcon/contents/{+path}","compare_url":"https://api.github.com/repos/apache/falcon/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/falcon/merges","archive_url":"https://api.github.com/repos/apache/falcon/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/falcon/downloads","issues_url":"https://api.github.com/repos/apache/falcon/issues{/number}","pulls_url":"https://api.github.com/repos/apache/falcon/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/falcon/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/falcon/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/falcon/labels{/name}","releases_url":"https://api.github.com/repos/apache/falcon/releases{/id}","deployments_url":"https://api.github.com/repos/apache/falcon/deployments","created_at":"2013-07-20T07:00:14Z","updated_at":"2016-02-04T08:06:23Z","pushed_at":"2016-02-16T04:36:07Z","git_url":"git://github.com/apache/falcon.git","ssh_url":"git@github.com:apache/falcon.git","clone_url":"https://github.com/apache/falcon.git","svn_url":"https://github.com/apache/falcon","homepage":null,"size":29086,"stargazers_count":44,"watchers_count":44,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":74,"mirror_url":"git://git.apache.org/falcon.git","open_issues_count":17,"forks":74,"open_issues":17,"watchers":44,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/falcon/pulls/44"},"html":{"href":"https://github.com/apache/falcon/pull/44"},"issue":{"href":"https://api.github.com/repos/apache/falcon/issues/44"},"comments":{"href":"https://api.github.com/repos/apache/falcon/issues/44/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/falcon/pulls/44/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/falcon/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/falcon/pulls/44/commits"},"statuses":{"href":"https://api.github.com/repos/apache/falcon/statuses/f5b2888605223b1c15da588902d8f44c2a5b9d9c"}}}}