{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments/48061408","id":48061408,"diff_hunk":"@@ -24,96 +24,198 @@\n \n FLAGS = flags.FLAGS\n \n+ROOT = 'root'\n+LOCAL = 'local'\n+VOLUME = 'volume'\n \n-class OpenStackDisk(disk.BaseDisk):\n+DISK_TYPE = {disk.STANDARD: VOLUME, disk.REMOTE_SSD: VOLUME, disk.LOCAL: LOCAL}\n+\n+DISK_METADATA = {\n+    VOLUME: {\n+        disk.LEGACY_DISK_TYPE: disk.STANDARD,\n+        disk.REPLICATION: disk.REGION\n+    },\n+    ROOT: {\n+        disk.REPLICATION: None\n+    },\n+    LOCAL: {\n+        disk.LEGACY_DISK_TYPE: disk.LOCAL\n+    }\n+}\n+\n+OPENSTACK = 'OpenStack'\n+disk.RegisterDiskTypeMap(OPENSTACK, DISK_TYPE)\n \n-    def __init__(self, disk_spec, name, zone, image=None):\n-        super(OpenStackDisk, self).__init__(disk_spec)\n-        self.__nclient = os_utils.NovaClient()\n-        self.attached_vm_name = None\n-        self.attached_vm_id = -1\n-        self.image = image\n-        self.name = name\n-        self.zone = zone\n-        self.device = \"\"\n-        self._disk = None\n-\n-    def _Create(self):\n-        self._disk = self.__nclient.volumes.create(self.disk_size,\n-                                                   display_name=self.name,\n-                                                   availability_zone=self.zone,\n-                                                   imageRef=self.image,\n-                                                   )\n-\n-        is_unavailable = True\n-        while is_unavailable:\n-            time.sleep(1)\n-            volume = self.__nclient.volumes.get(self._disk.id)\n-            if volume:\n-                is_unavailable = not (volume.status == \"available\")\n-                self._disk = volume\n-\n-    @retry_authorization(max_retries=4)\n-    def _Delete(self):\n-        from novaclient.exceptions import NotFound\n-\n-        if self._disk is None:\n-            logging.info('Volume %s was not created. Skipping deletion.'\n-                         % self.name)\n-            return\n-\n-        sleep = 1\n-        sleep_count = 0\n-        try:\n-            self.__nclient.volumes.delete(self._disk)\n-            is_deleted = False\n-            while not is_deleted:\n-                volume = self.__nclient.volumes.get(self._disk.id)\n-                is_deleted = volume is None\n-                time.sleep(sleep)\n-                sleep_count += 1\n-                if sleep_count == 10:\n-                    sleep = 5\n-        except NotFound:\n-            logging.info('Volume %s not found, might have been already deleted'\n-                         % self._disk.id)\n-\n-    def _Exists(self):\n-        from novaclient.exceptions import NotFound\n-        try:\n-            volume = self.__nclient.volumes.get(self._disk.id)\n-            return volume and volume.status in ('available', 'in-use',\n-                                                'deleting',)\n-        except NotFound:\n-            return False\n-\n-    def Attach(self, vm):\n-        self.attached_vm_name = vm.name\n-        self.attached_vm_id = vm.id\n-\n-        result = self.__nclient.volumes.create_server_volume(vm.id,\n-                                                             self._disk.id,)\n-        self.attach_id = result.id\n-\n-        volume = None\n-        is_unattached = True\n-        while is_unattached:\n-            time.sleep(1)\n-            volume = self.__nclient.volumes.get(result.id)\n-            if volume:\n-                is_unattached = not(volume.status == \"in-use\"\n-                                    and volume.attachments)\n-\n-        for attachment in volume.attachments:\n-            if self.attach_id == attachment.get('volume_id'):\n-                self.device = attachment.get('device')\n-                return\n-\n-        raise errors.Error(\"Couldn't not attach volume to %s\" % vm.name)\n-\n-    def GetDevicePath(self):\n-        return self.device\n-\n-    def Detach(self):\n-        self.__nclient.volumes.delete_server_volume(self.attached_vm_id,\n-                                                    self.attach_id)\n+\n+class OpenStackDisk(disk.BaseDisk):\n+  \"\"\"\n+  Base class for OpenStack disks.\n+  \"\"\"\n+  def __init__(self, disk_spec, name):\n+    super(OpenStackDisk, self).__init__(disk_spec)\n+    self.name = name\n+\n+  def _Create(self):\n+    pass\n+\n+  def _Delete(self):\n+    pass\n+\n+  def Attach(self, vm):\n+    pass\n+\n+  def Detach(self):\n+    pass\n+\n+\n+class OpenStackBlockStorageDisk(OpenStackDisk):","path":"perfkitbenchmarker/providers/openstack/os_disk.py","position":139,"original_position":139,"commit_id":"f57322d72cdd7bf1be07bedd3e74e2ae03231215","original_commit_id":"f57322d72cdd7bf1be07bedd3e74e2ae03231215","user":{"login":"noahl","id":16882,"avatar_url":"https://avatars.githubusercontent.com/u/16882?v=3","gravatar_id":"","url":"https://api.github.com/users/noahl","html_url":"https://github.com/noahl","followers_url":"https://api.github.com/users/noahl/followers","following_url":"https://api.github.com/users/noahl/following{/other_user}","gists_url":"https://api.github.com/users/noahl/gists{/gist_id}","starred_url":"https://api.github.com/users/noahl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/noahl/subscriptions","organizations_url":"https://api.github.com/users/noahl/orgs","repos_url":"https://api.github.com/users/noahl/repos","events_url":"https://api.github.com/users/noahl/events{/privacy}","received_events_url":"https://api.github.com/users/noahl/received_events","type":"User","site_admin":false},"body":"Consider naming this `OpenStackRemoteBlockStorageDisk` instead, because otherwise it sounds like it could represent a local drive as well as a remote one.","created_at":"2015-12-18T19:38:31Z","updated_at":"2015-12-18T19:38:31Z","html_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/759#discussion_r48061408","pull_request_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/759","_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments/48061408"},"html":{"href":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/759#discussion_r48061408"},"pull_request":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/759"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/759","id":54069779,"html_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/759","diff_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/759.diff","patch_url":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/759.patch","issue_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/759","number":759,"state":"open","locked":false,"title":"openstack: Add support for using Root and Local disks as data disks","user":{"login":"meteorfox","id":232300,"avatar_url":"https://avatars.githubusercontent.com/u/232300?v=3","gravatar_id":"","url":"https://api.github.com/users/meteorfox","html_url":"https://github.com/meteorfox","followers_url":"https://api.github.com/users/meteorfox/followers","following_url":"https://api.github.com/users/meteorfox/following{/other_user}","gists_url":"https://api.github.com/users/meteorfox/gists{/gist_id}","starred_url":"https://api.github.com/users/meteorfox/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meteorfox/subscriptions","organizations_url":"https://api.github.com/users/meteorfox/orgs","repos_url":"https://api.github.com/users/meteorfox/repos","events_url":"https://api.github.com/users/meteorfox/events{/privacy}","received_events_url":"https://api.github.com/users/meteorfox/received_events","type":"User","site_admin":false},"body":"This PR adds the ability to use local disks that come with a machine type or flavor, and allows a user to use an empty directory path in the root disk ('/') to be used as the \"scratch disk\".\r\n\r\nUsing `ROOT` disks for benchmarks that either need more than 1 data disk per VM, or that try to access the device path of the disk will trigger an exception notifying the user that such usage is not allowed.\r\n\r\nThe 3 data disk type supported as of this PR:\r\n- `VOLUME` (default) -> OpenStack Block Storage Volumes\r\n- `LOCAL`                  -> Ephemeral data disks included with the flavor\r\n- `ROOT`                   -> Empty directory under `/`   e.g. `/scratch`\r\n\r\nI didn't make a distinction regarding the media type of the disks since this can change between OpenStack deployments. A possible solution for this problem is to include an OpenStack specific flag, to specify which media type is desired when using VOLUME.\r\n\r\nHere's an example on how to run using the root disk executing the `fio` benchmark.\r\n\r\n```bash\r\n./pkb.py --cloud=OpenStack --machine_type=m1.medium --image='Ubuntu 14.04' \\\r\n         --openstack_public_network=public --openstack_private_network=service \\\r\n         --benchmarks=fio \\\r\n         --data_disk_type=root --data_disk_size=5 --num_striped_disks=1\r\n```\r\n\r\n","created_at":"2015-12-18T06:39:06Z","updated_at":"2015-12-18T19:38:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"30bbafa26f3219629b8951d7eff2ab3532f299b6","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/759/commits","review_comments_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/759/comments","review_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments{/number}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/759/comments","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/statuses/f57322d72cdd7bf1be07bedd3e74e2ae03231215","head":{"label":"meteorfox:openstack-local-disks","ref":"openstack-local-disks","sha":"f57322d72cdd7bf1be07bedd3e74e2ae03231215","user":{"login":"meteorfox","id":232300,"avatar_url":"https://avatars.githubusercontent.com/u/232300?v=3","gravatar_id":"","url":"https://api.github.com/users/meteorfox","html_url":"https://github.com/meteorfox","followers_url":"https://api.github.com/users/meteorfox/followers","following_url":"https://api.github.com/users/meteorfox/following{/other_user}","gists_url":"https://api.github.com/users/meteorfox/gists{/gist_id}","starred_url":"https://api.github.com/users/meteorfox/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meteorfox/subscriptions","organizations_url":"https://api.github.com/users/meteorfox/orgs","repos_url":"https://api.github.com/users/meteorfox/repos","events_url":"https://api.github.com/users/meteorfox/events{/privacy}","received_events_url":"https://api.github.com/users/meteorfox/received_events","type":"User","site_admin":false},"repo":{"id":31044872,"name":"PerfKitBenchmarker","full_name":"meteorfox/PerfKitBenchmarker","owner":{"login":"meteorfox","id":232300,"avatar_url":"https://avatars.githubusercontent.com/u/232300?v=3","gravatar_id":"","url":"https://api.github.com/users/meteorfox","html_url":"https://github.com/meteorfox","followers_url":"https://api.github.com/users/meteorfox/followers","following_url":"https://api.github.com/users/meteorfox/following{/other_user}","gists_url":"https://api.github.com/users/meteorfox/gists{/gist_id}","starred_url":"https://api.github.com/users/meteorfox/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meteorfox/subscriptions","organizations_url":"https://api.github.com/users/meteorfox/orgs","repos_url":"https://api.github.com/users/meteorfox/repos","events_url":"https://api.github.com/users/meteorfox/events{/privacy}","received_events_url":"https://api.github.com/users/meteorfox/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/meteorfox/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/meteorfox/PerfKitBenchmarker","forks_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/forks","keys_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/teams","hooks_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/hooks","issue_events_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/issues/events{/number}","events_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/events","assignees_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/assignees{/user}","branches_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/branches{/branch}","tags_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/tags","blobs_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/git/refs{/sha}","trees_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/statuses/{sha}","languages_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/languages","stargazers_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/stargazers","contributors_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/contributors","subscribers_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/subscribers","subscription_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/subscription","commits_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/commits{/sha}","git_commits_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/git/commits{/sha}","comments_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/comments{/number}","issue_comment_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/issues/comments{/number}","contents_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/contents/{+path}","compare_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/merges","archive_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/downloads","issues_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/issues{/number}","pulls_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/pulls{/number}","milestones_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/milestones{/number}","notifications_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/labels{/name}","releases_url":"https://api.github.com/repos/meteorfox/PerfKitBenchmarker/releases{/id}","created_at":"2015-02-20T00:39:49Z","updated_at":"2015-04-29T18:50:46Z","pushed_at":"2015-12-18T06:50:45Z","git_url":"git://github.com/meteorfox/PerfKitBenchmarker.git","ssh_url":"git@github.com:meteorfox/PerfKitBenchmarker.git","clone_url":"https://github.com/meteorfox/PerfKitBenchmarker.git","svn_url":"https://github.com/meteorfox/PerfKitBenchmarker","homepage":"","size":3818,"stargazers_count":0,"watchers_count":0,"language":"Python","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":"GoogleCloudPlatform:master","ref":"master","sha":"53d9b8f13a22eb6ee350377c3f38766d9b84229d","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-12-18T02:28:59Z","pushed_at":"2015-12-18T18:13:54Z","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":84668,"stargazers_count":537,"watchers_count":537,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":103,"mirror_url":null,"open_issues_count":86,"forks":103,"open_issues":86,"watchers":537,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/759"},"html":{"href":"https://github.com/GoogleCloudPlatform/PerfKitBenchmarker/pull/759"},"issue":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/759"},"comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/issues/759/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/759/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/pulls/759/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleCloudPlatform/PerfKitBenchmarker/statuses/f57322d72cdd7bf1be07bedd3e74e2ae03231215"}}}}