{"action":"created","comment":{"url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/comments/32527134","id":32527134,"diff_hunk":"@@ -1,149 +1,601 @@\n from dtest import Tester, debug, DISABLE_VNODES\n from assertions import assert_unavailable, assert_none\n-from tools import (create_c1c2_table, insert_c1c2, query_c1c2, insert_columns)\n+from tools import create_c1c2_table, insert_c1c2, query_c1c2, insert_columns, rows_to_list, require\n from cassandra import ConsistencyLevel\n from cassandra.query import SimpleStatement\n \n-class TestConsistency(Tester):\n+from collections import OrderedDict\n+from copy import deepcopy\n+from json import dumps\n+\n+import time, sys\n+import threading, Queue, traceback\n+\n+class TestHelper(Tester):\n+\n+    def __init__(self, *args, **kwargs):\n+        Tester.__init__(self, *args, **kwargs)\n+        self.lock = threading.Lock()\n+\n+    def log(self, message):\n+        with self.lock:\n+            debug(message)\n+\n+    def _name(self, cl):\n+        return {\n+            None : '-',\n+            ConsistencyLevel.ANY : 'ANY',\n+            ConsistencyLevel.ONE : 'ONE',\n+            ConsistencyLevel.TWO : 'TWO',\n+            ConsistencyLevel.THREE : 'THREE',\n+            ConsistencyLevel.QUORUM : 'QUORUM',\n+            ConsistencyLevel.ALL : 'ALL',\n+            ConsistencyLevel.LOCAL_QUORUM : 'LOCAL_QUORUM',\n+            ConsistencyLevel.EACH_QUORUM : 'EACH_QUORUM',\n+            ConsistencyLevel.SERIAL : 'SERIAL',\n+            ConsistencyLevel.LOCAL_SERIAL : 'LOCAL_SERIAL',\n+            ConsistencyLevel.LOCAL_ONE : 'LOCAL_ONE',\n+        }[cl]\n+\n+    def _is_local(self, cl):\n+        return cl == ConsistencyLevel.LOCAL_QUORUM or \\\n+               cl == ConsistencyLevel.LOCAL_ONE or \\\n+               cl == ConsistencyLevel.LOCAL_SERIAL\n+\n+    def _is_conditional(self, cl):\n+        return cl == ConsistencyLevel.SERIAL or \\\n+               cl == ConsistencyLevel.LOCAL_SERIAL\n+\n+    def _required_nodes(self, cl, rf_factors, dc):\n+        \"\"\"\n+        Return the number of nodes required by this consistency level\n+        in the current data center, specified by the dc parameter,\n+        given a list of replication factors, one per dc.\n+        \"\"\"\n+        return {\n+            ConsistencyLevel.ANY : 1,\n+            ConsistencyLevel.ONE : 1,\n+            ConsistencyLevel.TWO : 2,\n+            ConsistencyLevel.THREE : 3,\n+            ConsistencyLevel.QUORUM : sum(rf_factors) / 2 + 1,\n+            ConsistencyLevel.ALL : sum(rf_factors),\n+            ConsistencyLevel.LOCAL_QUORUM : rf_factors[dc] / 2 + 1,\n+            ConsistencyLevel.EACH_QUORUM : rf_factors[dc] / 2 + 1,\n+            ConsistencyLevel.SERIAL : sum(rf_factors) / 2 + 1,\n+            ConsistencyLevel.LOCAL_SERIAL : rf_factors[dc] / 2 + 1,\n+            ConsistencyLevel.LOCAL_ONE : 1,\n+        }[cl]\n+\n+    def _should_suceed(self, cl, rf_factors, num_nodes_alive, current):\n+        \"\"\"\n+        Return true if the read or write operation should succeed based on\n+        the consistency level requested, the replication factors and the\n+        number of nodes alive in each data center.\n+        \"\"\"\n+        if self._is_local(cl):\n+            return num_nodes_alive[current] >= self._required_nodes(cl, rf_factors, current)\n+        elif cl == ConsistencyLevel.EACH_QUORUM:\n+            for i in xrange(0, len(rf_factors)):\n+                if num_nodes_alive[i] < self._required_nodes(cl, rf_factors, i):\n+                    return False\n+                return True\n+        else:\n+            return sum(num_nodes_alive) >= self._required_nodes(cl, rf_factors, current)\n \n-    def cl_cl_prepare(self, write_cl, read_cl, tolerate_missing=False):\n+    def _start_cluster(self, save_sessions=False):\n         cluster = self.cluster\n+        nodes = self.nodes\n+        rf = self.rf\n \n-        cluster.populate(3).start()\n-        node1, node2, node3 = cluster.nodelist()\n-\n-        session = self.patient_cql_connection(node1)\n-        self.create_ks(session, 'ks', 3)\n-        create_c1c2_table(self, session)\n-\n-        session2 = self.patient_cql_connection(node2, 'ks')\n-\n-        # insert and get at CL.QUORUM\n-        for n in xrange(0, 100):\n-            insert_c1c2(session, n, write_cl)\n-            query_c1c2(session2, n, read_cl, tolerate_missing)\n-\n-        return session, session2\n-\n-    def quorum_quorum_test(self):\n-        session, session2 = self.cl_cl_prepare(ConsistencyLevel.QUORUM, ConsistencyLevel.QUORUM)\n-\n-        #Stop a node and retest\n-        self.cluster.nodelist()[2].stop()\n-        for n in xrange(0, 100):\n-            insert_c1c2(session, n, ConsistencyLevel.QUORUM)\n-            query_c1c2(session2, n, ConsistencyLevel.QUORUM)\n-\n-        self.cluster.nodelist()[1].stop()\n-        assert_unavailable(insert_c1c2, session, 100, ConsistencyLevel.QUORUM)\n-\n-    def all_all_test(self):\n-        session, session2 = self.cl_cl_prepare(ConsistencyLevel.ALL, ConsistencyLevel.ALL)\n-\n-        self.cluster.nodelist()[2].stop()\n-        assert_unavailable(insert_c1c2, session, 100, ConsistencyLevel.ALL)\n-\n-    def one_one_test(self):\n-        session, session2 = self.cl_cl_prepare(\n-            ConsistencyLevel.ONE, ConsistencyLevel.ONE, tolerate_missing=True)\n-\n-        #Stop a node and retest\n-        self.cluster.nodelist()[2].stop()\n-        for n in xrange(0, 100):\n-            insert_c1c2(session, n, ConsistencyLevel.ONE)\n-            query_c1c2(session2, n, ConsistencyLevel.ONE, tolerate_missing=True)\n-\n-\n-        #Stop a node and retest\n-        self.cluster.nodelist()[1].stop()\n-        for n in xrange(0, 100):\n-            insert_c1c2(session, n, ConsistencyLevel.ONE)\n-            query_c1c2(session2, n, ConsistencyLevel.ONE, tolerate_missing=False)\n-\n-    def one_all_test(self):\n-        session, session2 = self.cl_cl_prepare(ConsistencyLevel.ONE, ConsistencyLevel.ALL)\n+        cluster.set_configuration_options(values={'hinted_handoff_enabled' : False})\n+        cluster.populate(nodes).start(wait_for_binary_proto=True, wait_other_notice=True)\n \n-        #Stop a node and retest\n-        self.cluster.nodelist()[2].stop()\n-        for n in xrange(0, 100):\n-            insert_c1c2(session, n, ConsistencyLevel.ONE)\n-        assert_unavailable(query_c1c2, session2, 100, ConsistencyLevel.ALL)\n-\n-\n-        #Stop a node and retest\n-        self.cluster.nodelist()[1].stop()\n-        for n in xrange(0, 100):\n-            insert_c1c2(session, n, ConsistencyLevel.ONE)\n-        assert_unavailable(query_c1c2, session2, 100, ConsistencyLevel.ALL)\n-\n-    def all_one_test(self):\n-        session, session2 = self.cl_cl_prepare(ConsistencyLevel.ALL, ConsistencyLevel.ONE)\n-\n-        #Stop a node and retest\n-        self.cluster.nodelist()[2].stop()\n-        assert_unavailable(insert_c1c2, session, 100, ConsistencyLevel.ALL)\n-        for n in xrange(0, 100):\n-            query_c1c2(session2, n, ConsistencyLevel.ONE)\n-\n-        #Stop a node and retest\n-        self.cluster.nodelist()[1].stop()\n-        assert_unavailable(insert_c1c2, session, 100, ConsistencyLevel.ALL)\n-        for n in xrange(0, 100):\n-            query_c1c2(session2, n, ConsistencyLevel.ONE)\n-\n-    def quorum_two_test(self):\n-        session, session2 = self.cl_cl_prepare(ConsistencyLevel.QUORUM, ConsistencyLevel.TWO)\n-\n-        #Stop a node and retest\n-        self.cluster.nodelist()[2].stop()\n-        for n in xrange(0, 100):\n-            insert_c1c2(session, n, ConsistencyLevel.QUORUM)\n-            query_c1c2(session2, n, ConsistencyLevel.TWO)\n+        self.ksname = 'mytestks'\n+        session = self.patient_cql_connection(cluster.nodelist()[0])\n \n-        self.cluster.nodelist()[1].stop()\n-        assert_unavailable(insert_c1c2, session, 100, ConsistencyLevel.QUORUM)\n-        assert_unavailable(query_c1c2, session2, 100, ConsistencyLevel.TWO)\n+        self.create_ks(session, self.ksname, rf)\n+        self.create_tables(session)\n \n-    def quorum_three_test(self):\n-        session, session2 = self.cl_cl_prepare(ConsistencyLevel.QUORUM, ConsistencyLevel.THREE)\n+        if save_sessions:\n+            self.sessions = []\n+            self.sessions.append(session)\n+            for node in cluster.nodelist()[1:]:\n+                self.sessions.append(self.patient_cql_connection(node, self.ksname))\n \n-        #Stop a node and retest\n-        self.cluster.nodelist()[2].stop()\n-        for n in xrange(0, 100):\n-            insert_c1c2(session, n, ConsistencyLevel.QUORUM)\n-        assert_unavailable(query_c1c2, session2, 100, ConsistencyLevel.THREE)\n+    def _restart_cluster(self):\n+        cluster = self.cluster\n \n-        self.cluster.nodelist()[1].stop()\n-        assert_unavailable(insert_c1c2, session, 100, ConsistencyLevel.QUORUM)\n-        assert_unavailable(query_c1c2, session2, 100, ConsistencyLevel.THREE)\n+        cluster.start(wait_for_binary_proto=True, wait_other_notice=True)\n+\n+        session = self.patient_cql_connection(cluster.nodelist()[0], self.ksname)\n+        self.truncate_tables(session)\n+\n+    def create_tables(self, session):\n+        self.create_users_table(session)\n+        self.create_counters_table(session)\n+\n+    def truncate_tables(self, session):\n+        statement = SimpleStatement(\"TRUNCATE users\", ConsistencyLevel.ALL)\n+        session.execute(statement)\n+        statement = SimpleStatement(\"TRUNCATE counters\", ConsistencyLevel.ALL)\n+        session.execute(statement)\n+\n+    def create_users_table(self, session):\n+        session.execute(\"\"\"CREATE TABLE users (\n+                userid int PRIMARY KEY,\n+                firstname text,\n+                lastname text,\n+                age int\n+            ) WITH COMPACT STORAGE\"\"\")\n+\n+    def insert_user(self, session, userid, age, consistency, serial_consistency=None):\n+        text = \"INSERT INTO users (userid, firstname, lastname, age) VALUES (%d, 'first%d', 'last%d', %d) %s\" \\\n+            % (userid, userid, userid, age, \"IF NOT EXISTS\" if serial_consistency else \"\")","path":"consistency_test.py","position":238,"original_position":238,"commit_id":"bbd2cc1feb2cb1449ebb283a320a1fd1a0a5b623","original_commit_id":"bbd2cc1feb2cb1449ebb283a320a1fd1a0a5b623","user":{"login":"aboudreault","id":532356,"avatar_url":"https://avatars.githubusercontent.com/u/532356?v=3","gravatar_id":"","url":"https://api.github.com/users/aboudreault","html_url":"https://github.com/aboudreault","followers_url":"https://api.github.com/users/aboudreault/followers","following_url":"https://api.github.com/users/aboudreault/following{/other_user}","gists_url":"https://api.github.com/users/aboudreault/gists{/gist_id}","starred_url":"https://api.github.com/users/aboudreault/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aboudreault/subscriptions","organizations_url":"https://api.github.com/users/aboudreault/orgs","repos_url":"https://api.github.com/users/aboudreault/repos","events_url":"https://api.github.com/users/aboudreault/events{/privacy}","received_events_url":"https://api.github.com/users/aboudreault/received_events","type":"User","site_admin":false},"body":"***NO IMMEDIATE MODIFICATION REQUIRED***\r\n\r\nThis is comment for future PRs. Since Python 3 will eventually become default in future OS distributions, we try to use as many as possible Py3 habits in our new code, ie. the string formatting. The formatting use the \"\".format() function.\r\n\r\nhttps://docs.python.org/3.5/library/string.html#format-string-syntax\r\n\r\n***NO IMMEDIATE MODIFICATION REQUIRED***\r\n","created_at":"2015-06-16T14:37:50Z","updated_at":"2015-06-16T14:37:50Z","html_url":"https://github.com/riptano/cassandra-dtest/pull/328#discussion_r32527134","pull_request_url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/328","_links":{"self":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/comments/32527134"},"html":{"href":"https://github.com/riptano/cassandra-dtest/pull/328#discussion_r32527134"},"pull_request":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/328"}}},"pull_request":{"url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/328","id":37773481,"html_url":"https://github.com/riptano/cassandra-dtest/pull/328","diff_url":"https://github.com/riptano/cassandra-dtest/pull/328.diff","patch_url":"https://github.com/riptano/cassandra-dtest/pull/328.patch","issue_url":"https://api.github.com/repos/riptano/cassandra-dtest/issues/328","number":328,"state":"open","locked":false,"title":"New consistency tests introduced by CASSANDRA-9102","user":{"login":"stef1927","id":4769274,"avatar_url":"https://avatars.githubusercontent.com/u/4769274?v=3","gravatar_id":"","url":"https://api.github.com/users/stef1927","html_url":"https://github.com/stef1927","followers_url":"https://api.github.com/users/stef1927/followers","following_url":"https://api.github.com/users/stef1927/following{/other_user}","gists_url":"https://api.github.com/users/stef1927/gists{/gist_id}","starred_url":"https://api.github.com/users/stef1927/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stef1927/subscriptions","organizations_url":"https://api.github.com/users/stef1927/orgs","repos_url":"https://api.github.com/users/stef1927/repos","events_url":"https://api.github.com/users/stef1927/events{/privacy}","received_events_url":"https://api.github.com/users/stef1927/received_events","type":"User","site_admin":false},"body":"There are the tests for [CASSANDRA-9102] (https://issues.apache.org/jira/browse/CASSANDRA-9102) : Consistency levels such as non-local quorum need better tests.","created_at":"2015-06-16T09:06:31Z","updated_at":"2015-06-16T14:37:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ccdd8fda4606e60af639081c1d8a8f6920e27b9f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/328/commits","review_comments_url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/328/comments","review_comment_url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/comments{/number}","comments_url":"https://api.github.com/repos/riptano/cassandra-dtest/issues/328/comments","statuses_url":"https://api.github.com/repos/riptano/cassandra-dtest/statuses/bbd2cc1feb2cb1449ebb283a320a1fd1a0a5b623","head":{"label":"stef1927:9102","ref":"9102","sha":"bbd2cc1feb2cb1449ebb283a320a1fd1a0a5b623","user":{"login":"stef1927","id":4769274,"avatar_url":"https://avatars.githubusercontent.com/u/4769274?v=3","gravatar_id":"","url":"https://api.github.com/users/stef1927","html_url":"https://github.com/stef1927","followers_url":"https://api.github.com/users/stef1927/followers","following_url":"https://api.github.com/users/stef1927/following{/other_user}","gists_url":"https://api.github.com/users/stef1927/gists{/gist_id}","starred_url":"https://api.github.com/users/stef1927/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stef1927/subscriptions","organizations_url":"https://api.github.com/users/stef1927/orgs","repos_url":"https://api.github.com/users/stef1927/repos","events_url":"https://api.github.com/users/stef1927/events{/privacy}","received_events_url":"https://api.github.com/users/stef1927/received_events","type":"User","site_admin":false},"repo":{"id":27699783,"name":"cassandra-dtest","full_name":"stef1927/cassandra-dtest","owner":{"login":"stef1927","id":4769274,"avatar_url":"https://avatars.githubusercontent.com/u/4769274?v=3","gravatar_id":"","url":"https://api.github.com/users/stef1927","html_url":"https://github.com/stef1927","followers_url":"https://api.github.com/users/stef1927/followers","following_url":"https://api.github.com/users/stef1927/following{/other_user}","gists_url":"https://api.github.com/users/stef1927/gists{/gist_id}","starred_url":"https://api.github.com/users/stef1927/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stef1927/subscriptions","organizations_url":"https://api.github.com/users/stef1927/orgs","repos_url":"https://api.github.com/users/stef1927/repos","events_url":"https://api.github.com/users/stef1927/events{/privacy}","received_events_url":"https://api.github.com/users/stef1927/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/stef1927/cassandra-dtest","description":"Cassandra Distributed Tests","fork":true,"url":"https://api.github.com/repos/stef1927/cassandra-dtest","forks_url":"https://api.github.com/repos/stef1927/cassandra-dtest/forks","keys_url":"https://api.github.com/repos/stef1927/cassandra-dtest/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stef1927/cassandra-dtest/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stef1927/cassandra-dtest/teams","hooks_url":"https://api.github.com/repos/stef1927/cassandra-dtest/hooks","issue_events_url":"https://api.github.com/repos/stef1927/cassandra-dtest/issues/events{/number}","events_url":"https://api.github.com/repos/stef1927/cassandra-dtest/events","assignees_url":"https://api.github.com/repos/stef1927/cassandra-dtest/assignees{/user}","branches_url":"https://api.github.com/repos/stef1927/cassandra-dtest/branches{/branch}","tags_url":"https://api.github.com/repos/stef1927/cassandra-dtest/tags","blobs_url":"https://api.github.com/repos/stef1927/cassandra-dtest/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stef1927/cassandra-dtest/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stef1927/cassandra-dtest/git/refs{/sha}","trees_url":"https://api.github.com/repos/stef1927/cassandra-dtest/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stef1927/cassandra-dtest/statuses/{sha}","languages_url":"https://api.github.com/repos/stef1927/cassandra-dtest/languages","stargazers_url":"https://api.github.com/repos/stef1927/cassandra-dtest/stargazers","contributors_url":"https://api.github.com/repos/stef1927/cassandra-dtest/contributors","subscribers_url":"https://api.github.com/repos/stef1927/cassandra-dtest/subscribers","subscription_url":"https://api.github.com/repos/stef1927/cassandra-dtest/subscription","commits_url":"https://api.github.com/repos/stef1927/cassandra-dtest/commits{/sha}","git_commits_url":"https://api.github.com/repos/stef1927/cassandra-dtest/git/commits{/sha}","comments_url":"https://api.github.com/repos/stef1927/cassandra-dtest/comments{/number}","issue_comment_url":"https://api.github.com/repos/stef1927/cassandra-dtest/issues/comments{/number}","contents_url":"https://api.github.com/repos/stef1927/cassandra-dtest/contents/{+path}","compare_url":"https://api.github.com/repos/stef1927/cassandra-dtest/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stef1927/cassandra-dtest/merges","archive_url":"https://api.github.com/repos/stef1927/cassandra-dtest/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stef1927/cassandra-dtest/downloads","issues_url":"https://api.github.com/repos/stef1927/cassandra-dtest/issues{/number}","pulls_url":"https://api.github.com/repos/stef1927/cassandra-dtest/pulls{/number}","milestones_url":"https://api.github.com/repos/stef1927/cassandra-dtest/milestones{/number}","notifications_url":"https://api.github.com/repos/stef1927/cassandra-dtest/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stef1927/cassandra-dtest/labels{/name}","releases_url":"https://api.github.com/repos/stef1927/cassandra-dtest/releases{/id}","created_at":"2014-12-08T05:42:51Z","updated_at":"2015-05-08T00:31:17Z","pushed_at":"2015-06-16T08:54:41Z","git_url":"git://github.com/stef1927/cassandra-dtest.git","ssh_url":"git@github.com:stef1927/cassandra-dtest.git","clone_url":"https://github.com/stef1927/cassandra-dtest.git","svn_url":"https://github.com/stef1927/cassandra-dtest","homepage":"","size":11871,"stargazers_count":0,"watchers_count":0,"language":"Python","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":"riptano:master","ref":"master","sha":"86901b887fd6b450f0bfc53d293caa78ac1ae0d7","user":{"login":"riptano","id":275430,"avatar_url":"https://avatars.githubusercontent.com/u/275430?v=3","gravatar_id":"","url":"https://api.github.com/users/riptano","html_url":"https://github.com/riptano","followers_url":"https://api.github.com/users/riptano/followers","following_url":"https://api.github.com/users/riptano/following{/other_user}","gists_url":"https://api.github.com/users/riptano/gists{/gist_id}","starred_url":"https://api.github.com/users/riptano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/riptano/subscriptions","organizations_url":"https://api.github.com/users/riptano/orgs","repos_url":"https://api.github.com/users/riptano/repos","events_url":"https://api.github.com/users/riptano/events{/privacy}","received_events_url":"https://api.github.com/users/riptano/received_events","type":"Organization","site_admin":false},"repo":{"id":2674774,"name":"cassandra-dtest","full_name":"riptano/cassandra-dtest","owner":{"login":"riptano","id":275430,"avatar_url":"https://avatars.githubusercontent.com/u/275430?v=3","gravatar_id":"","url":"https://api.github.com/users/riptano","html_url":"https://github.com/riptano","followers_url":"https://api.github.com/users/riptano/followers","following_url":"https://api.github.com/users/riptano/following{/other_user}","gists_url":"https://api.github.com/users/riptano/gists{/gist_id}","starred_url":"https://api.github.com/users/riptano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/riptano/subscriptions","organizations_url":"https://api.github.com/users/riptano/orgs","repos_url":"https://api.github.com/users/riptano/repos","events_url":"https://api.github.com/users/riptano/events{/privacy}","received_events_url":"https://api.github.com/users/riptano/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/riptano/cassandra-dtest","description":"Cassandra Distributed Tests","fork":false,"url":"https://api.github.com/repos/riptano/cassandra-dtest","forks_url":"https://api.github.com/repos/riptano/cassandra-dtest/forks","keys_url":"https://api.github.com/repos/riptano/cassandra-dtest/keys{/key_id}","collaborators_url":"https://api.github.com/repos/riptano/cassandra-dtest/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/riptano/cassandra-dtest/teams","hooks_url":"https://api.github.com/repos/riptano/cassandra-dtest/hooks","issue_events_url":"https://api.github.com/repos/riptano/cassandra-dtest/issues/events{/number}","events_url":"https://api.github.com/repos/riptano/cassandra-dtest/events","assignees_url":"https://api.github.com/repos/riptano/cassandra-dtest/assignees{/user}","branches_url":"https://api.github.com/repos/riptano/cassandra-dtest/branches{/branch}","tags_url":"https://api.github.com/repos/riptano/cassandra-dtest/tags","blobs_url":"https://api.github.com/repos/riptano/cassandra-dtest/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/riptano/cassandra-dtest/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/riptano/cassandra-dtest/git/refs{/sha}","trees_url":"https://api.github.com/repos/riptano/cassandra-dtest/git/trees{/sha}","statuses_url":"https://api.github.com/repos/riptano/cassandra-dtest/statuses/{sha}","languages_url":"https://api.github.com/repos/riptano/cassandra-dtest/languages","stargazers_url":"https://api.github.com/repos/riptano/cassandra-dtest/stargazers","contributors_url":"https://api.github.com/repos/riptano/cassandra-dtest/contributors","subscribers_url":"https://api.github.com/repos/riptano/cassandra-dtest/subscribers","subscription_url":"https://api.github.com/repos/riptano/cassandra-dtest/subscription","commits_url":"https://api.github.com/repos/riptano/cassandra-dtest/commits{/sha}","git_commits_url":"https://api.github.com/repos/riptano/cassandra-dtest/git/commits{/sha}","comments_url":"https://api.github.com/repos/riptano/cassandra-dtest/comments{/number}","issue_comment_url":"https://api.github.com/repos/riptano/cassandra-dtest/issues/comments{/number}","contents_url":"https://api.github.com/repos/riptano/cassandra-dtest/contents/{+path}","compare_url":"https://api.github.com/repos/riptano/cassandra-dtest/compare/{base}...{head}","merges_url":"https://api.github.com/repos/riptano/cassandra-dtest/merges","archive_url":"https://api.github.com/repos/riptano/cassandra-dtest/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/riptano/cassandra-dtest/downloads","issues_url":"https://api.github.com/repos/riptano/cassandra-dtest/issues{/number}","pulls_url":"https://api.github.com/repos/riptano/cassandra-dtest/pulls{/number}","milestones_url":"https://api.github.com/repos/riptano/cassandra-dtest/milestones{/number}","notifications_url":"https://api.github.com/repos/riptano/cassandra-dtest/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/riptano/cassandra-dtest/labels{/name}","releases_url":"https://api.github.com/repos/riptano/cassandra-dtest/releases{/id}","created_at":"2011-10-30T11:15:44Z","updated_at":"2015-06-16T10:01:11Z","pushed_at":"2015-06-16T09:06:31Z","git_url":"git://github.com/riptano/cassandra-dtest.git","ssh_url":"git@github.com:riptano/cassandra-dtest.git","clone_url":"https://github.com/riptano/cassandra-dtest.git","svn_url":"https://github.com/riptano/cassandra-dtest","homepage":"","size":15879,"stargazers_count":58,"watchers_count":58,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":37,"mirror_url":null,"open_issues_count":33,"forks":37,"open_issues":33,"watchers":58,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/328"},"html":{"href":"https://github.com/riptano/cassandra-dtest/pull/328"},"issue":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/issues/328"},"comments":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/issues/328/comments"},"review_comments":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/328/comments"},"review_comment":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/pulls/328/commits"},"statuses":{"href":"https://api.github.com/repos/riptano/cassandra-dtest/statuses/bbd2cc1feb2cb1449ebb283a320a1fd1a0a5b623"}}}}