{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments/33315322","id":33315322,"diff_hunk":"@@ -708,3 +731,137 @@ def SetupProxy(self):\n \n     if commands:\n       self.RemoteCommand(\";\".join(commands))\n+\n+\n+class ContainerizedDebianMixin(DebianMixin):\n+  \"\"\"Class representing a Containerized Virtual Machine.\n+\n+  A Containerized Virtual Machine is a VM that runs remote commands\n+  within a Docker Container running Ubuntu.\n+  Any call to RemoteCommand() will be run within the container\n+  whereas any call to RemoteHostCommand() will be run in the VM itself.\n+  \"\"\"\n+\n+  def PrepareVMEnvironment(self):\n+    \"\"\"Initializes docker before proceeding with preparation.\"\"\"\n+    self.RemoteHostCommand('mkdir -p %s' % vm_util.VM_TMP_DIR)\n+    self.Install('docker')\n+    self.InitDocker()\n+    super(ContainerizedDebianMixin, self).PrepareVMEnvironment()\n+\n+  def InitDocker(self):\n+    \"\"\"Initializes the docker container daemon.\"\"\"\n+    init_docker_cmd = ['sudo docker run -d '\n+                       '--net=host '\n+                       '--workdir=%s '\n+                       '-v %s:%s ' % (CONTAINER_WORK_DIR,\n+                                      vm_util.VM_TMP_DIR,\n+                                      CONTAINER_MOUNT_DIR)]\n+    for sd in self.scratch_disks:\n+      init_docker_cmd.append('-v %s:%s ' % (sd.mount_point, sd.mount_point))\n+    init_docker_cmd.append('%s sleep infinity ' % UBUNTU_DOCKER_IMAGE)\n+    init_docker_cmd = ''.join(init_docker_cmd)\n+\n+    resp, _ = self.RemoteHostCommand(init_docker_cmd)\n+    self.docker_id = resp[:-1]\n+    return self.docker_id\n+\n+  def RemoteCommand(self, command,\n+                    should_log=False, retries=SSH_RETRIES,\n+                    ignore_failure=False, login_shell=False,\n+                    suppress_warning=False):\n+    \"\"\"Runs a command inside the container.\n+\n+    Args:\n+      command: A valid bash command.\n+      should_log: A boolean indicating whether the command result should be\n+          logged at the info level. Even if it is false, the results will\n+          still be logged at the debug level.\n+      retries: The maximum number of times RemoteCommand should retry SSHing\n+          when it receives a 255 return code.\n+      ignore_failure: Ignore any failure if set to true.\n+      login_shell: Run command in a login shell.\n+      suppress_warning: Suppress the result logging from IssueCommand when the\n+          return code is non-zero.\n+\n+    Returns:\n+      A tuple of stdout and stderr from running the command.\n+    \"\"\"\n+    # Escapes bash sequences\n+    command = command.replace(\"\\'\", \"\\'\\\\\\'\\'\")\n+\n+    logging.info('Docker running: %s' % command)\n+    command = \"sudo docker exec %s bash -c '%s'\" % (self.docker_id, command)\n+    return self.RemoteHostCommand(command, should_log, retries,\n+                                  ignore_failure, login_shell, suppress_warning)\n+\n+  def ContainerCopy(self, file_name, container_path='', copy_to=True):\n+    \"\"\"Copies a file to and from container_path to the host's vm_util.VM_TMP_DIR.\n+\n+    Args:\n+      file_name: Name of the file in the host's vm_util.VM_TMP_DIR.\n+      container_path: Optional path of where to copy file on container.\n+      copy_to: True to copy to container, False to copy from container.\n+    Raises:\n+      RemoteExceptionError: If the source container_path is blank.\n+    \"\"\"\n+    if copy_to:\n+      if container_path == '':\n+        container_path = CONTAINER_WORK_DIR\n+\n+      # Everything in vm_util.VM_TMP_DIR is directly accessible\n+      # both in the host and in the container\n+      source_path = os.path.join(CONTAINER_MOUNT_DIR, file_name)","path":"perfkitbenchmarker/linux_virtual_machine.py","position":235,"original_position":235,"commit_id":"8c274ee789d9bbf0a29cf8d81a3dfbe7c61b9946","original_commit_id":"8c274ee789d9bbf0a29cf8d81a3dfbe7c61b9946","user":{"login":"gablg1","id":5253695,"avatar_url":"https://avatars.githubusercontent.com/u/5253695?v=3","gravatar_id":"","url":"https://api.github.com/users/gablg1","html_url":"https://github.com/gablg1","followers_url":"https://api.github.com/users/gablg1/followers","following_url":"https://api.github.com/users/gablg1/following{/other_user}","gists_url":"https://api.github.com/users/gablg1/gists{/gist_id}","starred_url":"https://api.github.com/users/gablg1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gablg1/subscriptions","organizations_url":"https://api.github.com/users/gablg1/orgs","repos_url":"https://api.github.com/users/gablg1/repos","events_url":"https://api.github.com/users/gablg1/events{/privacy}","received_events_url":"https://api.github.com/users/gablg1/received_events","type":"User","site_admin":false},"body":"I believe we have a bigger problem here. Many benchmarks use os.path, so ContainerizedVM running on a Windows machine would break for those benchmarks for the same reason, right?","created_at":"2015-06-25T23:15:05Z","updated_at":"2015-06-25T23:15:05Z","html_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/333#discussion_r33315322","pull_request_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/333","_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments/33315322"},"html":{"href":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/333#discussion_r33315322"},"pull_request":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/333"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/333","id":38289947,"html_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/333","diff_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/333.diff","patch_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/333.patch","issue_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/333","number":333,"state":"open","locked":false,"title":"Adding support to ContainerizedVM","user":{"login":"gablg1","id":5253695,"avatar_url":"https://avatars.githubusercontent.com/u/5253695?v=3","gravatar_id":"","url":"https://api.github.com/users/gablg1","html_url":"https://github.com/gablg1","followers_url":"https://api.github.com/users/gablg1/followers","following_url":"https://api.github.com/users/gablg1/following{/other_user}","gists_url":"https://api.github.com/users/gablg1/gists{/gist_id}","starred_url":"https://api.github.com/users/gablg1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gablg1/subscriptions","organizations_url":"https://api.github.com/users/gablg1/orgs","repos_url":"https://api.github.com/users/gablg1/repos","events_url":"https://api.github.com/users/gablg1/events{/privacy}","received_events_url":"https://api.github.com/users/gablg1/received_events","type":"User","site_admin":false},"body":"This PR adds the ContainerizedDebian class, which allows anyone to run benchmarks within a Ubuntu docker container. Every call to RemoteCommand runs within the Docker container via docker exec, whereas any call to RemoteHostCommand is guaranteed to run the command in the VM, outside the container.\r\n\r\nThis was only tested in GCE so far.","created_at":"2015-06-23T00:10:42Z","updated_at":"2015-06-25T23:15:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6ad59aefb479d13cd6a6563a18d0a526759f32cc","assignee":{"login":"ehankland","id":8193699,"avatar_url":"https://avatars.githubusercontent.com/u/8193699?v=3","gravatar_id":"","url":"https://api.github.com/users/ehankland","html_url":"https://github.com/ehankland","followers_url":"https://api.github.com/users/ehankland/followers","following_url":"https://api.github.com/users/ehankland/following{/other_user}","gists_url":"https://api.github.com/users/ehankland/gists{/gist_id}","starred_url":"https://api.github.com/users/ehankland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ehankland/subscriptions","organizations_url":"https://api.github.com/users/ehankland/orgs","repos_url":"https://api.github.com/users/ehankland/repos","events_url":"https://api.github.com/users/ehankland/events{/privacy}","received_events_url":"https://api.github.com/users/ehankland/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/333/commits","review_comments_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/333/comments","review_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments{/number}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/333/comments","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/statuses/8c274ee789d9bbf0a29cf8d81a3dfbe7c61b9946","head":{"label":"gablg1:containerized","ref":"containerized","sha":"8c274ee789d9bbf0a29cf8d81a3dfbe7c61b9946","user":{"login":"gablg1","id":5253695,"avatar_url":"https://avatars.githubusercontent.com/u/5253695?v=3","gravatar_id":"","url":"https://api.github.com/users/gablg1","html_url":"https://github.com/gablg1","followers_url":"https://api.github.com/users/gablg1/followers","following_url":"https://api.github.com/users/gablg1/following{/other_user}","gists_url":"https://api.github.com/users/gablg1/gists{/gist_id}","starred_url":"https://api.github.com/users/gablg1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gablg1/subscriptions","organizations_url":"https://api.github.com/users/gablg1/orgs","repos_url":"https://api.github.com/users/gablg1/repos","events_url":"https://api.github.com/users/gablg1/events{/privacy}","received_events_url":"https://api.github.com/users/gablg1/received_events","type":"User","site_admin":false},"repo":{"id":37878529,"name":"PerfKitBenchmarker","full_name":"gablg1/PerfKitBenchmarker","owner":{"login":"gablg1","id":5253695,"avatar_url":"https://avatars.githubusercontent.com/u/5253695?v=3","gravatar_id":"","url":"https://api.github.com/users/gablg1","html_url":"https://github.com/gablg1","followers_url":"https://api.github.com/users/gablg1/followers","following_url":"https://api.github.com/users/gablg1/following{/other_user}","gists_url":"https://api.github.com/users/gablg1/gists{/gist_id}","starred_url":"https://api.github.com/users/gablg1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gablg1/subscriptions","organizations_url":"https://api.github.com/users/gablg1/orgs","repos_url":"https://api.github.com/users/gablg1/repos","events_url":"https://api.github.com/users/gablg1/events{/privacy}","received_events_url":"https://api.github.com/users/gablg1/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/gablg1/PerfKitBenchmarker","description":"Perfkit Benchmarker contains set of benchmarks to measure and compare cloud offerings. The benchmarks are not tuned (i.e. use defaults) to reflect what most users will see. PerfKit Benchmarker is licensed under the Apache 2 license terms. Please make sure to read, understand and agree to the terms of the LICENSE and CONTRIBUTING files before proceeding.","fork":true,"url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker","forks_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/forks","keys_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/teams","hooks_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/hooks","issue_events_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/issues/events{/number}","events_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/events","assignees_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/assignees{/user}","branches_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/branches{/branch}","tags_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/tags","blobs_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/git/refs{/sha}","trees_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/statuses/{sha}","languages_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/languages","stargazers_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/stargazers","contributors_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/contributors","subscribers_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/subscribers","subscription_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/subscription","commits_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/commits{/sha}","git_commits_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/git/commits{/sha}","comments_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/comments{/number}","issue_comment_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/issues/comments{/number}","contents_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/contents/{+path}","compare_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/merges","archive_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/downloads","issues_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/issues{/number}","pulls_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/pulls{/number}","milestones_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/milestones{/number}","notifications_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/labels{/name}","releases_url":"https://api.github.com/repos/gablg1/PerfKitBenchmarker/releases{/id}","created_at":"2015-06-22T20:19:15Z","updated_at":"2015-06-22T20:19:16Z","pushed_at":"2015-06-25T21:56:31Z","git_url":"git://github.com/gablg1/PerfKitBenchmarker.git","ssh_url":"git@github.com:gablg1/PerfKitBenchmarker.git","clone_url":"https://github.com/gablg1/PerfKitBenchmarker.git","svn_url":"https://github.com/gablg1/PerfKitBenchmarker","homepage":"","size":2262,"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":"GoogleCloudPlatform:dev","ref":"dev","sha":"c1ba9179880850c455a7118e1fb8bf6cfe1b891d","user":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"repo":{"id":21950910,"name":"PerfKitBenchmarker","full_name":"GoogleCloudPlatform/PerfKitBenchmarker","owner":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker","description":"Perfkit Benchmarker contains set of benchmarks to measure and compare cloud offerings. The benchmarks are not tuned (i.e. use defaults) to reflect what most users will see. PerfKit Benchmarker is licensed under the Apache 2 license terms. Please make sure to read, understand and agree to the terms of the LICENSE and CONTRIBUTING files before proceeding.","fork":false,"url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker","forks_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/forks","keys_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/teams","hooks_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/hooks","issue_events_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/events","assignees_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/tags","blobs_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/languages","stargazers_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/stargazers","contributors_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/contributors","subscribers_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/subscribers","subscription_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/subscription","commits_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/comments{/number}","contents_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/merges","archive_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/downloads","issues_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/labels{/name}","releases_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/releases{/id}","created_at":"2014-07-17T17:23:26Z","updated_at":"2015-06-24T15:12:19Z","pushed_at":"2015-06-25T23:13:36Z","git_url":"git://github.com/GoogleCloudPlatform/PerfKitBenchmarker.git","ssh_url":"git@github.com:GoogleCloudPlatform/PerfKitBenchmarker.git","clone_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker.git","svn_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker","homepage":"","size":151013,"stargazers_count":455,"watchers_count":455,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":55,"mirror_url":null,"open_issues_count":79,"forks":55,"open_issues":79,"watchers":455,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/333"},"html":{"href":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/333"},"issue":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/333"},"comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/333/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/333/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/333/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/statuses/8c274ee789d9bbf0a29cf8d81a3dfbe7c61b9946"}}}}