{"action":"created","comment":{"url":"https://api.github.com/repos/autotest/autotest-docker/pulls/comments/52775653","id":52775653,"diff_hunk":"@@ -3,493 +3,123 @@\n ---------\n \n This test checks function of `docker run -e VARIABLE=VALUE ...`.\n-Also verifies the rm --link operation with ICC.\n \n Operational Summary\n ----------------------\n \n-#. Setup client & server containers w/ exposed port and env. vars.\n-#. Run code in containers to verify communication and env. vars\n+#. Run container with -e options\n #. Check results match expectations\n \n-Operational Detail\n-----------------------\n-\n-The port test\n-~~~~~~~~~~~~~~~\n-#.  Starts server with custom -e ENV_VARIABLE=$RANDOM_STRING and opened port\n-#.  Starts client linked to server with another ENV_VARIABLE\n-#.  Booth prints the env as {}\n-#.  Client sends data to server (addr from env SERVER_PORT_$PORT_TCP_ADDR)\n-#.  Server prints data with prefix and resends them back with another one.\n-#.  Client prints the received data and finishes.\n-#.  Checks if env and all data were printed correctly.\n-\n-The rm_link test\n-~~~~~~~~~~~~~~~~~\n-#.  Same as port (above), however after container is started, the\n-    rm --link command is issued to remove the connecting link.\n-#.  Verify communication between containers was prevented\n-#.  Also conclude with same checks as in port (above)\n \n-Prerequisites\n----------------\n+Operational Detail\n+-------------------\n \n-Docker daemon and host-networking setup to allow ICC between containers.\n-If iptables is involved, and bridge-networking is in use, verify these\n-sysctl's are set to ``1``:\n+* \"spam\" sub-subtest:  Execute docker run command with hundreds of -e options.\n+  verify all are present inside container.\n \n-    * net.bridge.bridge-nf-call-arptables\n-    * net.bridge.bridge-nf-call-ip6tables\n-    * net.bridge.bridge-nf-call-iptables\n \"\"\"\n-import ast\n+import os\n import os.path\n-import random\n-import re\n-\n-from autotest.client import utils\n-from dockertest import config\n-from dockertest import docker_daemon\n-from dockertest.containers import DockerContainers\n+import shutil\n+from dockertest.subtest import SubSubtestCaller\n+from dockertest.subtest import SubSubtest\n from dockertest.dockercmd import DockerCmd\n-from dockertest.dockercmd import AsyncDockerCmd\n+from dockertest.images import DockerImages\n from dockertest.output import mustpass\n-from dockertest.config import get_as_list\n-from dockertest.images import DockerImage\n-from dockertest.subtest import SubSubtestCaller, SubSubtest\n-from dockertest.output import wait_for_output\n-\n-\n-class InteractiveAsyncDockerCmd(AsyncDockerCmd):\n-\n-    \"\"\"\n-    Execute docker command as asynchronous background process on ``execute()``\n-    with PIPE as stdin and allows use of stdin(data) to interact with process.\n-    \"\"\"\n-\n-    stdin_by_lines = True\n-    guarantee_newlines = True\n-\n-    def __init__(self, subtest, subcmd, subargs=None, timeout=None,\n-                 verbose=True):\n-        super(InteractiveAsyncDockerCmd, self).__init__(subtest, subcmd,\n-                                                        subargs, timeout,\n-                                                        verbose)\n-        self._stdin = None\n-\n-    def execute(self, stdin=None):\n-        \"\"\"\n-        Start execution of asynchronous docker command\n-        \"\"\"\n-        ps_stdin, self._stdin = os.pipe()\n-        ret = super(InteractiveAsyncDockerCmd, self).execute(ps_stdin)\n-        os.close(ps_stdin)\n-        self.stdin = stdin\n-        return ret\n-\n-    @property\n-    def stdin(self):\n-        \"\"\"\n-        Return open file instance connected to processes stdin\n-        \"\"\"\n-        return self._stdin\n-\n-    @stdin.setter\n-    def stdin(self, data):\n-        \"\"\"\n-        Sends data to stdin (partial send is possible!)\n-        :param data: Data to be send\n-        :return: Number of written data\n-        \"\"\"\n-        if data:\n-            if self.stdin_by_lines:\n-                for line in str(data).splitlines(True):  # Preserve '\\n'\n-                    if self.guarantee_newlines:\n-                        # Make sure every (or only) line ends with '\\n'\n-                        if line[-1] != '\\n':\n-                            line += '\\n'\n-                    os.write(self._stdin, line)\n-            else:\n-                os.write(self._stdin, data)\n-\n-    def close(self):\n-        \"\"\"\n-        Close the pipes (when opened)\n-        \"\"\"\n-        if self._stdin:\n-            os.close(self._stdin)\n-            self._stdin = None\n \n \n class run_env(SubSubtestCaller):\n-\n-    \"\"\" Subtest caller \"\"\"\n-\n-\n-class run_env_base(SubSubtest):\n-\n-    \"\"\" Base class \"\"\"\n-\n-    # Note: requires: container, port, data\n-    python_client = (\n-        \"\"\"import sys\\n\"\"\"\n-        \"\"\"import socket\\n\"\"\"\n-        \"\"\"import os\\n\"\"\"\n-        \"\"\"# run_env_base.get_env() depends on this behavior\\n\"\"\"\n-        \"\"\"\\n\"\"\"\n-        \"\"\"print \"ENVIRON = \" + str(os.environ)\\n\"\"\"\n-        \"\"\"addr = os.environ['%(container)s_PORT_%(port)s_TCP_ADDR']\\n\"\"\"\n-        \"\"\"sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\\n\"\"\"\n-        \"\"\"# port.run_once() depends on this output, not statement\\n\"\"\"\n-        \"\"\"\\n\"\"\"\n-        \"\"\"print \"Client\", \"Connecting\"\\n\"\"\"\n-        \"\"\"sock.connect((addr, %(port)s))\\n\"\"\"\n-        \"\"\"sock.send(\"%(data)s\")\\n\"\"\"\n-        \"\"\"print sock.recv(1024)\\n\"\"\"\n-        \"\"\"sock.close()\\n\"\"\"\n-        \"\"\"\\n\"\"\"\n-        \"\"\"sys.exit(0)\\n\"\"\"\n-    )\n-\n-    # Note: requires: port\n-    python_server = (\n-        \"\"\"import sys\\n\"\"\"\n-        \"\"\"import socket\\n\"\"\"\n-        \"\"\"import os\\n\"\"\"\n-        \"\"\"# run_env_base.get_env() depends on this behavior\\n\"\"\"\n-        \"\"\"\\n\"\"\"\n-        \"\"\"print \"ENVIRON = \" + str(os.environ)\\n\"\"\"\n-        \"\"\"sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\\n\"\"\"\n-        \"\"\"sock.bind((\"\", %(port)s))\\n\"\"\"\n-        \"\"\"sock.listen(True)\\n\"\"\"\n-        \"\"\"# port.run_once() depends on this output, not statement\\n\"\"\"\n-        \"\"\"\\n\"\"\"\n-        \"\"\"print \"Server\", \"Listening\"\\n\"\"\"\n-        \"\"\"conn, addr = sock.accept()\\n\"\"\"\n-        \"\"\"print \"Connected by\", addr\\n\"\"\"\n-        \"\"\"data = conn.recv(1024)\\n\"\"\"\n-        \"\"\"print \"RECEIVED: \" + data\\n\"\"\"\n-        \"\"\"conn.send(\"RESENDING: \" + data)\\n\"\"\"\n-        \"\"\"\\n\"\"\"\n-        \"\"\"conn.close()\\n\"\"\"\n-        \"\"\"\\n\"\"\"\n-        \"\"\"sys.exit(0)\\n\"\"\"\n-    )\n-\n-    def record_iptables(self, label):\n-        name = ('%s_iptables_%s.txt'\n-                % (self.__class__.__name__, label))\n-        output = open(os.path.join(self.parent_subtest.resultsdir, name), 'w+')\n-        output.write(utils.run('iptables -t filter -L -n -v').stdout)\n-        output.write('\\n\\n')\n-        output.write(utils.run('iptables -t nat -L -n -v').stdout)\n-\n-    def get_env(self, output):\n-        \"\"\"\n-        Check output for token, return value as if parsed in python\n-        \"\"\"\n-        for line in output.splitlines():\n-            if line.startswith('ENVIRON = {'):\n-                return ast.literal_eval(line[10:])\n-        self.failif(True, \"Fail to get env from output\\n%s\" % output)\n-\n-    def check_env(self, exp, variable, env, container, appendix):\n-        \"\"\"\n-        Check that variable's value matches the exp regexp. Fails the test\n-        when it's not.\n-        :param exp: Expected value (string)\n-        :param variable: Name of the env variable (string)\n-        :param env: Environment (dictionary)\n-        :param container: Name of the container (string)\n-        :param appendix: Rest of the error string\n-        \"\"\"\n-        self.failif(not re.match(exp, env.get(variable)), \"%s=%s not found in\"\n-                    \" %s env:\\n%s%s\" % (variable, exp, container, env,\n-                                        appendix))\n-\n-    def init_container(self, prefix, subargs, cmd):\n-        \"\"\"\n-        Prepares dkrcmd and stores the name in self.sub_stuff['containers']\n-        :return: tuple(dkrcmd, name)\n-        \"\"\"\n-        name = self.sub_stuff['dc'].get_unique_name(prefix)\n-        subargs.append(\"--name\")\n-        subargs.append(name)\n-        self.logdebug(\"Queuing container %s for removal\", name)\n-        self.sub_stuff['containers'].append(name)\n-        fin = DockerImage.full_name_from_defaults(self.config)\n-        subargs.append(fin)\n-        subargs.append(cmd)\n-        dkrcmd = InteractiveAsyncDockerCmd(self, 'run', subargs)\n-        dkrcmd.verbose = True\n-        dkrcmd.quiet = False\n-        return dkrcmd, name\n-\n-    def initialize(self):\n-        super(run_env_base, self).initialize()\n-        # Prepare a container\n-        config.none_if_empty(self.config)\n-        self.sub_stuff['dc'] = DockerContainers(self)\n-        self.sub_stuff['containers'] = []\n-\n-    def cleanup(self):\n-        super(run_env_base, self).cleanup()\n-        if self.config['remove_after_test']:\n-            dc = DockerContainers(self)\n-            dc.clean_all(self.sub_stuff.get(\"containers\", []))\n-\n-\n-class port_base(run_env_base):\n-\n-    \"\"\"\n-    Base class for port test.\n-    \"\"\"\n+    pass\n+\n+\n+class spam(SubSubtest):\n+\n+    # Allows quickly rejecting container env. supplied vars\n+    KEYPFX = '_x'\n+    VALPFX = 'x_'\n+\n+    @classmethod\n+    def make_test_dict(cls, howmany, keyiter=None, valiter=None):\n+        xcept = ValueError(\"Must specify neither or both \"\n+                           \"keyiter and valiter\")\n+        if ((keyiter is not None and valiter is None) or\n+                (keyiter is None and valiter is not None)):\n+            raise xcept\n+        keyfmt = \"%s%%x\" % cls.KEYPFX\n+        valfmt = \"%s%%x\" % cls.VALPFX\n+        # Because of above, only need to check one\n+        if keyiter is None:\n+            keyiter = (keyfmt % x for x in xrange(0, howmany))\n+            valiter = (valfmt % x for x in xrange(howmany, 0, -1))\n+        return dict(zip(keyiter, valiter))\n+\n+    def save_testdata(self):\n+        self.sub_stuff['output'] = os.path.join(self.tmpdir, 'env.output')\n+        resultdir = self.parent_subtest.resultsdir\n+        inputcopy = os.path.join(resultdir, \"env.input\")\n+        with open(inputcopy, 'wb') as inpf:\n+            for key, value in self.sub_stuff['envd'].iteritems():\n+                inpf.write(\"%s=%s\\n\" % (key, value))\n+\n+    def initialize_cmdline(self):\n+        subargs = ['--rm', '-v', '%s:/x:Z' % self.tmpdir]\n+        for key, value in self.sub_stuff['envd'].iteritems():\n+            subargs.append(\"-e\")\n+            subargs.append(\"%s=%s\" % (key, value))\n+        subargs.append(DockerImages(self).default_image)\n+        subargs.append(\"bash -c 'env > /x/env.output'\")\n+        _ = DockerCmd(self, 'run', subargs, verbose=False)\n+        _.quiet = True\n+        self.sub_stuff['dkrcmd'] = _\n+\n+    def retrieve_testdata(self):\n+        self.failif(not os.path.isfile(self.sub_stuff['output']),\n+                    \"Could not find %s\" % self.sub_stuff['output'])\n+        resultdir = self.parent_subtest.resultsdir\n+        outputcopy = os.path.join(resultdir,\n+                                  os.path.basename(self.sub_stuff['output']))\n+        shutil.copyfile(self.sub_stuff['output'], outputcopy)\n+        output = {}\n+        with open(self.sub_stuff['output'], \"r\") as outf:\n+            for line in outf:\n+                key, value = line.split('=', 2)\n+                key = key.strip()\n+                value = value.strip()\n+                if (not key.startswith(self.KEYPFX) or\n+                        not value.startswith(self.VALPFX)):\n+                    self.logdebug(\"Ignoring %s\", line)\n+                    # These are not the droids we're looking for\n+                    continue\n+\n+                output[key] = value\n+        return output\n+\n+    def validate_testdata(self, expected, actual):\n+        # More helpful to debugging if done this way\n+        for key, value in actual.iteritems():","path":"subtests/docker_cli/run_env/run_env.py","position":323,"original_position":323,"commit_id":"853300115d0b704673a4fe6db87dbb8f4bd3a9e9","original_commit_id":"853300115d0b704673a4fe6db87dbb8f4bd3a9e9","user":{"login":"edsantiago","id":265639,"avatar_url":"https://avatars.githubusercontent.com/u/265639?v=3","gravatar_id":"","url":"https://api.github.com/users/edsantiago","html_url":"https://github.com/edsantiago","followers_url":"https://api.github.com/users/edsantiago/followers","following_url":"https://api.github.com/users/edsantiago/following{/other_user}","gists_url":"https://api.github.com/users/edsantiago/gists{/gist_id}","starred_url":"https://api.github.com/users/edsantiago/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edsantiago/subscriptions","organizations_url":"https://api.github.com/users/edsantiago/orgs","repos_url":"https://api.github.com/users/edsantiago/repos","events_url":"https://api.github.com/users/edsantiago/events{/privacy}","received_events_url":"https://api.github.com/users/edsantiago/received_events","type":"User","site_admin":false},"body":"I really like this level of consideration for the person running the test. Nice work. But is 'actual' the best loop to run? This would catch envariables in the docker container that match the KEYPFX/VALPFX requirement but were not assigned via -e. Is that likely? My gut feel is that the error we're trying to catch is \"command line specified -e FOO=BAR but FOO didn't get passed to the container\". That would suggest looping over expected, not actual. But of course perhaps I've missed something.","created_at":"2016-02-12T18:04:21Z","updated_at":"2016-02-12T18:04:21Z","html_url":"https://github.com/autotest/autotest-docker/pull/560#discussion_r52775653","pull_request_url":"https://api.github.com/repos/autotest/autotest-docker/pulls/560","_links":{"self":{"href":"https://api.github.com/repos/autotest/autotest-docker/pulls/comments/52775653"},"html":{"href":"https://github.com/autotest/autotest-docker/pull/560#discussion_r52775653"},"pull_request":{"href":"https://api.github.com/repos/autotest/autotest-docker/pulls/560"}}},"pull_request":{"url":"https://api.github.com/repos/autotest/autotest-docker/pulls/560","id":59102857,"html_url":"https://github.com/autotest/autotest-docker/pull/560","diff_url":"https://github.com/autotest/autotest-docker/pull/560.diff","patch_url":"https://github.com/autotest/autotest-docker/pull/560.patch","issue_url":"https://api.github.com/repos/autotest/autotest-docker/issues/560","number":560,"state":"open","locked":false,"title":"Fantasticly simplify/hone run_env subtest","user":{"login":"cevich","id":1183438,"avatar_url":"https://avatars.githubusercontent.com/u/1183438?v=3","gravatar_id":"","url":"https://api.github.com/users/cevich","html_url":"https://github.com/cevich","followers_url":"https://api.github.com/users/cevich/followers","following_url":"https://api.github.com/users/cevich/following{/other_user}","gists_url":"https://api.github.com/users/cevich/gists{/gist_id}","starred_url":"https://api.github.com/users/cevich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cevich/subscriptions","organizations_url":"https://api.github.com/users/cevich/orgs","repos_url":"https://api.github.com/users/cevich/repos","events_url":"https://api.github.com/users/cevich/events{/privacy}","received_events_url":"https://api.github.com/users/cevich/received_events","type":"User","site_admin":false},"body":"Simple for now but w/ room for future expansion\r\n\r\nSigned-off-by: Chris Evich <cevich@redhat.com>","created_at":"2016-02-11T22:17:00Z","updated_at":"2016-02-12T18:04:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"54bb80a4ef038bafa73d7bd1096d4017b5c87bc6","assignee":null,"milestone":{"url":"https://api.github.com/repos/autotest/autotest-docker/milestones/21","html_url":"https://github.com/autotest/autotest-docker/milestones/Docker%20Autotest%20Version%200.8.5%20(NO%20API%20Changes)","labels_url":"https://api.github.com/repos/autotest/autotest-docker/milestones/21/labels","id":1079148,"number":21,"title":"Docker Autotest Version 0.8.5 (NO API Changes)","description":"","creator":{"login":"cevich","id":1183438,"avatar_url":"https://avatars.githubusercontent.com/u/1183438?v=3","gravatar_id":"","url":"https://api.github.com/users/cevich","html_url":"https://github.com/cevich","followers_url":"https://api.github.com/users/cevich/followers","following_url":"https://api.github.com/users/cevich/following{/other_user}","gists_url":"https://api.github.com/users/cevich/gists{/gist_id}","starred_url":"https://api.github.com/users/cevich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cevich/subscriptions","organizations_url":"https://api.github.com/users/cevich/orgs","repos_url":"https://api.github.com/users/cevich/repos","events_url":"https://api.github.com/users/cevich/events{/privacy}","received_events_url":"https://api.github.com/users/cevich/received_events","type":"User","site_admin":false},"open_issues":39,"closed_issues":29,"state":"open","created_at":"2015-04-22T15:55:31Z","updated_at":"2016-02-11T22:17:00Z","due_on":"2015-08-25T04:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/autotest/autotest-docker/pulls/560/commits","review_comments_url":"https://api.github.com/repos/autotest/autotest-docker/pulls/560/comments","review_comment_url":"https://api.github.com/repos/autotest/autotest-docker/pulls/comments{/number}","comments_url":"https://api.github.com/repos/autotest/autotest-docker/issues/560/comments","statuses_url":"https://api.github.com/repos/autotest/autotest-docker/statuses/853300115d0b704673a4fe6db87dbb8f4bd3a9e9","head":{"label":"cevich:fix_run_env","ref":"fix_run_env","sha":"853300115d0b704673a4fe6db87dbb8f4bd3a9e9","user":{"login":"cevich","id":1183438,"avatar_url":"https://avatars.githubusercontent.com/u/1183438?v=3","gravatar_id":"","url":"https://api.github.com/users/cevich","html_url":"https://github.com/cevich","followers_url":"https://api.github.com/users/cevich/followers","following_url":"https://api.github.com/users/cevich/following{/other_user}","gists_url":"https://api.github.com/users/cevich/gists{/gist_id}","starred_url":"https://api.github.com/users/cevich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cevich/subscriptions","organizations_url":"https://api.github.com/users/cevich/orgs","repos_url":"https://api.github.com/users/cevich/repos","events_url":"https://api.github.com/users/cevich/events{/privacy}","received_events_url":"https://api.github.com/users/cevich/received_events","type":"User","site_admin":false},"repo":{"id":17871726,"name":"autotest-docker","full_name":"cevich/autotest-docker","owner":{"login":"cevich","id":1183438,"avatar_url":"https://avatars.githubusercontent.com/u/1183438?v=3","gravatar_id":"","url":"https://api.github.com/users/cevich","html_url":"https://github.com/cevich","followers_url":"https://api.github.com/users/cevich/followers","following_url":"https://api.github.com/users/cevich/following{/other_user}","gists_url":"https://api.github.com/users/cevich/gists{/gist_id}","starred_url":"https://api.github.com/users/cevich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cevich/subscriptions","organizations_url":"https://api.github.com/users/cevich/orgs","repos_url":"https://api.github.com/users/cevich/repos","events_url":"https://api.github.com/users/cevich/events{/privacy}","received_events_url":"https://api.github.com/users/cevich/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/cevich/autotest-docker","description":"Autotest client test containing functional & integration subtests for the Docker project","fork":true,"url":"https://api.github.com/repos/cevich/autotest-docker","forks_url":"https://api.github.com/repos/cevich/autotest-docker/forks","keys_url":"https://api.github.com/repos/cevich/autotest-docker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cevich/autotest-docker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cevich/autotest-docker/teams","hooks_url":"https://api.github.com/repos/cevich/autotest-docker/hooks","issue_events_url":"https://api.github.com/repos/cevich/autotest-docker/issues/events{/number}","events_url":"https://api.github.com/repos/cevich/autotest-docker/events","assignees_url":"https://api.github.com/repos/cevich/autotest-docker/assignees{/user}","branches_url":"https://api.github.com/repos/cevich/autotest-docker/branches{/branch}","tags_url":"https://api.github.com/repos/cevich/autotest-docker/tags","blobs_url":"https://api.github.com/repos/cevich/autotest-docker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cevich/autotest-docker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cevich/autotest-docker/git/refs{/sha}","trees_url":"https://api.github.com/repos/cevich/autotest-docker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cevich/autotest-docker/statuses/{sha}","languages_url":"https://api.github.com/repos/cevich/autotest-docker/languages","stargazers_url":"https://api.github.com/repos/cevich/autotest-docker/stargazers","contributors_url":"https://api.github.com/repos/cevich/autotest-docker/contributors","subscribers_url":"https://api.github.com/repos/cevich/autotest-docker/subscribers","subscription_url":"https://api.github.com/repos/cevich/autotest-docker/subscription","commits_url":"https://api.github.com/repos/cevich/autotest-docker/commits{/sha}","git_commits_url":"https://api.github.com/repos/cevich/autotest-docker/git/commits{/sha}","comments_url":"https://api.github.com/repos/cevich/autotest-docker/comments{/number}","issue_comment_url":"https://api.github.com/repos/cevich/autotest-docker/issues/comments{/number}","contents_url":"https://api.github.com/repos/cevich/autotest-docker/contents/{+path}","compare_url":"https://api.github.com/repos/cevich/autotest-docker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cevich/autotest-docker/merges","archive_url":"https://api.github.com/repos/cevich/autotest-docker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cevich/autotest-docker/downloads","issues_url":"https://api.github.com/repos/cevich/autotest-docker/issues{/number}","pulls_url":"https://api.github.com/repos/cevich/autotest-docker/pulls{/number}","milestones_url":"https://api.github.com/repos/cevich/autotest-docker/milestones{/number}","notifications_url":"https://api.github.com/repos/cevich/autotest-docker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cevich/autotest-docker/labels{/name}","releases_url":"https://api.github.com/repos/cevich/autotest-docker/releases{/id}","deployments_url":"https://api.github.com/repos/cevich/autotest-docker/deployments","created_at":"2014-03-18T15:48:28Z","updated_at":"2016-01-26T16:08:42Z","pushed_at":"2016-02-11T22:22:23Z","git_url":"git://github.com/cevich/autotest-docker.git","ssh_url":"git@github.com:cevich/autotest-docker.git","clone_url":"https://github.com/cevich/autotest-docker.git","svn_url":"https://github.com/cevich/autotest-docker","homepage":null,"size":1993,"stargazers_count":2,"watchers_count":2,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":2,"default_branch":"master"}},"base":{"label":"autotest:master","ref":"master","sha":"3666c20f0e2d21894ce537bcf1f66ae889cb4db2","user":{"login":"autotest","id":472856,"avatar_url":"https://avatars.githubusercontent.com/u/472856?v=3","gravatar_id":"","url":"https://api.github.com/users/autotest","html_url":"https://github.com/autotest","followers_url":"https://api.github.com/users/autotest/followers","following_url":"https://api.github.com/users/autotest/following{/other_user}","gists_url":"https://api.github.com/users/autotest/gists{/gist_id}","starred_url":"https://api.github.com/users/autotest/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/autotest/subscriptions","organizations_url":"https://api.github.com/users/autotest/orgs","repos_url":"https://api.github.com/users/autotest/repos","events_url":"https://api.github.com/users/autotest/events{/privacy}","received_events_url":"https://api.github.com/users/autotest/received_events","type":"Organization","site_admin":false},"repo":{"id":17869790,"name":"autotest-docker","full_name":"autotest/autotest-docker","owner":{"login":"autotest","id":472856,"avatar_url":"https://avatars.githubusercontent.com/u/472856?v=3","gravatar_id":"","url":"https://api.github.com/users/autotest","html_url":"https://github.com/autotest","followers_url":"https://api.github.com/users/autotest/followers","following_url":"https://api.github.com/users/autotest/following{/other_user}","gists_url":"https://api.github.com/users/autotest/gists{/gist_id}","starred_url":"https://api.github.com/users/autotest/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/autotest/subscriptions","organizations_url":"https://api.github.com/users/autotest/orgs","repos_url":"https://api.github.com/users/autotest/repos","events_url":"https://api.github.com/users/autotest/events{/privacy}","received_events_url":"https://api.github.com/users/autotest/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/autotest/autotest-docker","description":"Autotest client test containing functional & integration subtests for the Docker project","fork":false,"url":"https://api.github.com/repos/autotest/autotest-docker","forks_url":"https://api.github.com/repos/autotest/autotest-docker/forks","keys_url":"https://api.github.com/repos/autotest/autotest-docker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/autotest/autotest-docker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/autotest/autotest-docker/teams","hooks_url":"https://api.github.com/repos/autotest/autotest-docker/hooks","issue_events_url":"https://api.github.com/repos/autotest/autotest-docker/issues/events{/number}","events_url":"https://api.github.com/repos/autotest/autotest-docker/events","assignees_url":"https://api.github.com/repos/autotest/autotest-docker/assignees{/user}","branches_url":"https://api.github.com/repos/autotest/autotest-docker/branches{/branch}","tags_url":"https://api.github.com/repos/autotest/autotest-docker/tags","blobs_url":"https://api.github.com/repos/autotest/autotest-docker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/autotest/autotest-docker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/autotest/autotest-docker/git/refs{/sha}","trees_url":"https://api.github.com/repos/autotest/autotest-docker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/autotest/autotest-docker/statuses/{sha}","languages_url":"https://api.github.com/repos/autotest/autotest-docker/languages","stargazers_url":"https://api.github.com/repos/autotest/autotest-docker/stargazers","contributors_url":"https://api.github.com/repos/autotest/autotest-docker/contributors","subscribers_url":"https://api.github.com/repos/autotest/autotest-docker/subscribers","subscription_url":"https://api.github.com/repos/autotest/autotest-docker/subscription","commits_url":"https://api.github.com/repos/autotest/autotest-docker/commits{/sha}","git_commits_url":"https://api.github.com/repos/autotest/autotest-docker/git/commits{/sha}","comments_url":"https://api.github.com/repos/autotest/autotest-docker/comments{/number}","issue_comment_url":"https://api.github.com/repos/autotest/autotest-docker/issues/comments{/number}","contents_url":"https://api.github.com/repos/autotest/autotest-docker/contents/{+path}","compare_url":"https://api.github.com/repos/autotest/autotest-docker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/autotest/autotest-docker/merges","archive_url":"https://api.github.com/repos/autotest/autotest-docker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/autotest/autotest-docker/downloads","issues_url":"https://api.github.com/repos/autotest/autotest-docker/issues{/number}","pulls_url":"https://api.github.com/repos/autotest/autotest-docker/pulls{/number}","milestones_url":"https://api.github.com/repos/autotest/autotest-docker/milestones{/number}","notifications_url":"https://api.github.com/repos/autotest/autotest-docker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/autotest/autotest-docker/labels{/name}","releases_url":"https://api.github.com/repos/autotest/autotest-docker/releases{/id}","deployments_url":"https://api.github.com/repos/autotest/autotest-docker/deployments","created_at":"2014-03-18T14:53:27Z","updated_at":"2016-01-21T21:48:31Z","pushed_at":"2016-02-11T22:22:23Z","git_url":"git://github.com/autotest/autotest-docker.git","ssh_url":"git@github.com:autotest/autotest-docker.git","clone_url":"https://github.com/autotest/autotest-docker.git","svn_url":"https://github.com/autotest/autotest-docker","homepage":null,"size":2415,"stargazers_count":10,"watchers_count":10,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":20,"mirror_url":null,"open_issues_count":50,"forks":20,"open_issues":50,"watchers":10,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/autotest/autotest-docker/pulls/560"},"html":{"href":"https://github.com/autotest/autotest-docker/pull/560"},"issue":{"href":"https://api.github.com/repos/autotest/autotest-docker/issues/560"},"comments":{"href":"https://api.github.com/repos/autotest/autotest-docker/issues/560/comments"},"review_comments":{"href":"https://api.github.com/repos/autotest/autotest-docker/pulls/560/comments"},"review_comment":{"href":"https://api.github.com/repos/autotest/autotest-docker/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/autotest/autotest-docker/pulls/560/commits"},"statuses":{"href":"https://api.github.com/repos/autotest/autotest-docker/statuses/853300115d0b704673a4fe6db87dbb8f4bd3a9e9"}}}}