)]}'
{"api-ref/source/os-hypervisors.inc":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"077f4ec89f6328948668ad1c5ee396324b80e769","unresolved":false,"context_lines":[{"line_number":104,"context_line":"  - running_vms: running_vms"},{"line_number":105,"context_line":"  - service: hypervisor_service"},{"line_number":106,"context_line":"  - service.host: host_name_body"},{"line_number":107,"context_line":"  - service.id: service_id_body"},{"line_number":108,"context_line":"  - service.disable_reason: service_disable_reason"},{"line_number":109,"context_line":"  - vcpus: hypervisor_vcpus"},{"line_number":110,"context_line":"  - vcpus_used: hypervisor_vcpus_used"}],"source_content_type":"text/x-c++src","patch_set":7,"id":"7f231b9d_db8a8768","line":107,"range":{"start_line":107,"start_character":4,"end_line":107,"end_character":31},"updated":"2017-06-14 16:33:14.000000000","message":"This needs to become uuid in 2.49:\n\nhttps://github.com/openstack/nova/blob/b94b02b4503cf7eded3fafb84c436395d4beb6ec/nova/api/openstack/compute/hypervisors.py#L66","commit_id":"1af137ca24e0736c3cd1339177b40941d63c6f1c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4f2f5eb3cfbc4b03ac4034a20453181d20182a60","unresolved":false,"context_lines":[{"line_number":300,"context_line":""},{"line_number":301,"context_line":".. warning:: This API is deprecated starting with microversion 2.49. Use"},{"line_number":302,"context_line":"    `List Hypervisors`_ with the ``hypervisor_hostname_pattern`` query"},{"line_number":303,"context_line":"    parameter with microversion 2.49 and later."},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"Policy defaults enable only users with the administrative role to perform"},{"line_number":306,"context_line":"this operation. Cloud providers can change these permissions through"}],"source_content_type":"text/x-c++src","patch_set":24,"id":"1f1a1f67_e8df7266","line":303,"range":{"start_line":303,"start_character":34,"end_line":303,"end_character":36},"updated":"2017-07-18 19:58:54.000000000","message":"wrong version","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4f2f5eb3cfbc4b03ac4034a20453181d20182a60","unresolved":false,"context_lines":[{"line_number":344,"context_line":""},{"line_number":345,"context_line":".. warning:: This API is deprecated starting with microversion 2.49. Use"},{"line_number":346,"context_line":"    `List Hypervisors`_ with the ``hypervisor_hostname_pattern`` and"},{"line_number":347,"context_line":"    ``with_servers`` query parameters with microversion 2.49 and later."},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"Policy defaults enable only users with the administrative role to perform"},{"line_number":350,"context_line":"this operation. Cloud providers can change these permissions through"}],"source_content_type":"text/x-c++src","patch_set":24,"id":"1f1a1f67_a8e5fa39","line":347,"range":{"start_line":347,"start_character":58,"end_line":347,"end_character":60},"updated":"2017-07-18 19:58:54.000000000","message":"wrong version","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dfa76bcdbdeac618bd88ae548ed5a5a460c6ddb2","unresolved":false,"context_lines":[{"line_number":344,"context_line":""},{"line_number":345,"context_line":".. warning:: This API is deprecated starting with microversion 2.49. Use"},{"line_number":346,"context_line":"    `List Hypervisors`_ with the ``hypervisor_hostname_pattern`` and"},{"line_number":347,"context_line":"    ``with_servers`` query parameters with microversion 2.49 and later."},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"Policy defaults enable only users with the administrative role to perform"},{"line_number":350,"context_line":"this operation. Cloud providers can change these permissions through"}],"source_content_type":"text/x-c++src","patch_set":24,"id":"1f1a1f67_2340ed06","line":347,"range":{"start_line":347,"start_character":58,"end_line":347,"end_character":60},"in_reply_to":"1f1a1f67_a8e5fa39","updated":"2017-07-18 20:32:26.000000000","message":"Actually this is OK, it\u0027s saying this is deprecated starting in 2.49 and starting in 2.49 you need to use this other API.","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"}],"api-ref/source/parameters.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"91017e978818415cb854405eb0fa7f0f970b5abb","unresolved":false,"context_lines":[{"line_number":149,"context_line":"  in: path"},{"line_number":150,"context_line":"  required: true"},{"line_number":151,"context_line":"  type: integer"},{"line_number":152,"context_line":"  max_version: 2.48"},{"line_number":153,"context_line":"hypervisor_id_uuid:"},{"line_number":154,"context_line":"  description: |"},{"line_number":155,"context_line":"    The ID of the hypervisor as a UUID."}],"source_content_type":"text/x-yaml","patch_set":21,"id":"3f1d235d_52e2ee30","line":152,"range":{"start_line":152,"start_character":17,"end_line":152,"end_character":19},"updated":"2017-07-03 19:26:15.000000000","message":"This should be 2.49.","commit_id":"9ce7b6e6f133b756a6ff3f7df28cabe567eb4d01"}],"nova/api/openstack/compute/hypervisors.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"077f4ec89f6328948668ad1c5ee396324b80e769","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                hyp_dict[field] \u003d getattr(hypervisor, field)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"            hyp_dict[\u0027service\u0027] \u003d {"},{"line_number":72,"context_line":"                \u0027id\u0027: service.id,"},{"line_number":73,"context_line":"                \u0027host\u0027: hypervisor.host,"},{"line_number":74,"context_line":"                \u0027disabled_reason\u0027: service.disabled_reason,"},{"line_number":75,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f231b9d_9ba76f0c","line":72,"range":{"start_line":72,"start_character":16,"end_line":72,"end_character":33},"updated":"2017-06-14 16:33:14.000000000","message":"This is going to need to change to uuid also.","commit_id":"1af137ca24e0736c3cd1339177b40941d63c6f1c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5a35635de6150a4fa8fa5423ba424d967cff849a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    @wsgi.Controller.api_version(UUID_FOR_ID_MIN_VERSION)"},{"line_number":109,"context_line":"    # TODO(mriedem): if we define validation.query_schema on this method"},{"line_number":110,"context_line":"    # do we need to do it on the lower microversion methods too like in"},{"line_number":111,"context_line":"    # os-keypairs?"},{"line_number":112,"context_line":"    @validation.query_schema(hyper_schema.index_query_schema_v249,"},{"line_number":113,"context_line":"                             UUID_FOR_ID_MIN_VERSION)"},{"line_number":114,"context_line":"    @extensions.expected_errors((400, 404))"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f231b9d_2f9c800d","line":111,"updated":"2017-06-15 08:40:46.000000000","message":"I guess I add an empty schema for the keypairs API is just for have all the query parameters definition of all version APIs.\n\nAnd I think I almost forget this also https://github.com/openstack/nova/blob/master/nova/api/validation/__init__.py#L180, Maybe I should note at somewhere when we have best practice.\n\nWith an empty schema, and the decorator. The decorator will filter all the parameters out, that won\u0027t pass into the API method. That is for protect our servers API. In servers API we pass all the query parametesr to the db layer directly.\n\nBut it is also fine for hypervisor API. With the decorator or not, it works same.\n\nIf it is too boring to add the decorator to all the API versions, then let us skip the old version.","commit_id":"0dcabb0e47aaf997feb28421a7b56ce5bd664707"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"86eb200d8bd36028b2a7c0ad1b4a1997dda960fd","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    @wsgi.Controller.api_version(UUID_FOR_ID_MIN_VERSION)"},{"line_number":109,"context_line":"    # TODO(mriedem): if we define validation.query_schema on this method"},{"line_number":110,"context_line":"    # do we need to do it on the lower microversion methods too like in"},{"line_number":111,"context_line":"    # os-keypairs?"},{"line_number":112,"context_line":"    @validation.query_schema(hyper_schema.index_query_schema_v249,"},{"line_number":113,"context_line":"                             UUID_FOR_ID_MIN_VERSION)"},{"line_number":114,"context_line":"    @extensions.expected_errors((400, 404))"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f231b9d_1e7fb115","line":111,"in_reply_to":"7f231b9d_2f9c800d","updated":"2017-06-15 13:11:54.000000000","message":"OK, cool, yeah I don\u0027t want to add empty schemas and decorators for old versions. The 2.33 one could get the query params schema for paging, but I\u0027d rather not couple that with this larger change.","commit_id":"0dcabb0e47aaf997feb28421a7b56ce5bd664707"},{"author":{"_account_id":23882,"name":"Dan Peschman","email":"dpeschman@godaddy.com","username":"dtp"},"change_message_id":"570f1857bcd7d262949bb3ee1757629801153031","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        # TODO(mriedem): should we support with_servers query parameter when"},{"line_number":249,"context_line":"        # showing details for a specific hypervisor in 2.49+?"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        # TODO(mriedem): why isn\u0027t uptime just a boolean query parameter on"},{"line_number":252,"context_line":"        # show()? maybe because it\u0027s an rpc call to the compute service."}],"source_content_type":"text/x-python","patch_set":17,"id":"5f201791_04678e27","line":249,"updated":"2017-06-23 18:48:59.000000000","message":"If you\u0027re asking me - yes.","commit_id":"6f37e2a5f711f7e7ee4aa9b4396e94a639338ef0"},{"author":{"_account_id":23882,"name":"Dan Peschman","email":"dpeschman@godaddy.com","username":"dtp"},"change_message_id":"570f1857bcd7d262949bb3ee1757629801153031","unresolved":false,"context_lines":[{"line_number":273,"context_line":"            req, min_version\u003dUUID_FOR_ID_MIN_VERSION)"},{"line_number":274,"context_line":"        if expect_uuid and not uuidutils.is_uuid_like(id):"},{"line_number":275,"context_line":"            msg \u003d _(\u0027Invalid uuid %s\u0027) % id"},{"line_number":276,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        try:"},{"line_number":279,"context_line":"            hyp \u003d self.host_api.compute_node_get(context, id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f201791_04c2eee9","line":276,"updated":"2017-06-23 18:48:59.000000000","message":"Can this uuid validation be combined w/ the similar block in show()?","commit_id":"6f37e2a5f711f7e7ee4aa9b4396e94a639338ef0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"04ebc6af21d91e3da5c13ff0df9c64e13f03e073","unresolved":false,"context_lines":[{"line_number":273,"context_line":"            req, min_version\u003dUUID_FOR_ID_MIN_VERSION)"},{"line_number":274,"context_line":"        if expect_uuid and not uuidutils.is_uuid_like(id):"},{"line_number":275,"context_line":"            msg \u003d _(\u0027Invalid uuid %s\u0027) % id"},{"line_number":276,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        try:"},{"line_number":279,"context_line":"            hyp \u003d self.host_api.compute_node_get(context, id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f201791_f8caf617","line":276,"in_reply_to":"5f201791_04c2eee9","updated":"2017-06-23 19:00:13.000000000","message":"Anything is possible for those that dream....","commit_id":"6f37e2a5f711f7e7ee4aa9b4396e94a639338ef0"},{"author":{"_account_id":23882,"name":"Dan Peschman","email":"dpeschman@godaddy.com","username":"dtp"},"change_message_id":"6b6a3c2e975c0b40f5553a6d271cecb4c3170bb1","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        if expect_uuid and not uuidutils.is_uuid_like(hypervisor_id):"},{"line_number":248,"context_line":"            msg \u003d _(\u0027Invalid uuid %s\u0027) % id"},{"line_number":249,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @extensions.expected_errors(404)"},{"line_number":252,"context_line":"    def show(self, req, id):"},{"line_number":253,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f201791_4e6ec095","line":250,"updated":"2017-06-23 20:25:39.000000000","message":"Very nice :)","commit_id":"2ff0dfd2dee19857326dcfbb72d13186fcfd73d0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"17a25e1188fd96c1dc20d3951e6d59b0bc61fff0","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        if hypervisor_match is not None:"},{"line_number":134,"context_line":"            # Get all compute nodes with a hypervisor_hostname that matches"},{"line_number":135,"context_line":"            # the given pattern. If none are found then it\u0027s a 404 error."},{"line_number":136,"context_line":"            links \u003d False   # paging with hostname pattern isn\u0027t supported"},{"line_number":137,"context_line":"            compute_nodes \u003d self._get_compute_nodes_by_name_pattern("},{"line_number":138,"context_line":"                context, hypervisor_match)"},{"line_number":139,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_608ca2d6","line":136,"range":{"start_line":136,"start_character":29,"end_line":136,"end_character":74},"updated":"2017-07-06 06:01:45.000000000","message":"We should return 400 both when hypervisor_match and pagiing requested?","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f24c7f8f146edba77c939cbe2695aacf912bc66","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        if hypervisor_match is not None:"},{"line_number":134,"context_line":"            # Get all compute nodes with a hypervisor_hostname that matches"},{"line_number":135,"context_line":"            # the given pattern. If none are found then it\u0027s a 404 error."},{"line_number":136,"context_line":"            links \u003d False   # paging with hostname pattern isn\u0027t supported"},{"line_number":137,"context_line":"            compute_nodes \u003d self._get_compute_nodes_by_name_pattern("},{"line_number":138,"context_line":"                context, hypervisor_match)"},{"line_number":139,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_7ccc1b34","line":136,"range":{"start_line":136,"start_character":29,"end_line":136,"end_character":74},"in_reply_to":"3f1d235d_608ca2d6","updated":"2017-07-07 06:53:58.000000000","message":"We could, I guess that would be more explicit which is generally what we want from the API.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7d6290264b0e7383b3dd57c00671c3bf8a8664d3","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                    context, hyp.host)"},{"line_number":157,"context_line":"                hypervisors_list.append("},{"line_number":158,"context_line":"                    self._view_hypervisor("},{"line_number":159,"context_line":"                        hyp, service, detail, req, instances))"},{"line_number":160,"context_line":"            except (exception.ComputeHostNotFound,"},{"line_number":161,"context_line":"                    exception.HostMappingNotFound):"},{"line_number":162,"context_line":"                # The compute service could be deleted which doesn\u0027t delete"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_c93853a1","line":159,"range":{"start_line":159,"start_character":51,"end_line":159,"end_character":60},"updated":"2017-07-05 18:08:43.000000000","message":"This is the servers parameter to _view_hypervisor? If so, this should be passed by kwarg, especially since you\u0027re passing instances in for servers.\n\nAlso this method uses these as services (by doing serv[\u0027name\u0027] on them). That will work on an instance, but won\u0027t be right. Are you sure this is what you want?","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f24c7f8f146edba77c939cbe2695aacf912bc66","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                    context, hyp.host)"},{"line_number":157,"context_line":"                hypervisors_list.append("},{"line_number":158,"context_line":"                    self._view_hypervisor("},{"line_number":159,"context_line":"                        hyp, service, detail, req, instances))"},{"line_number":160,"context_line":"            except (exception.ComputeHostNotFound,"},{"line_number":161,"context_line":"                    exception.HostMappingNotFound):"},{"line_number":162,"context_line":"                # The compute service could be deleted which doesn\u0027t delete"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_7c9adb13","line":159,"range":{"start_line":159,"start_character":51,"end_line":159,"end_character":60},"in_reply_to":"3f1d235d_c93853a1","updated":"2017-07-07 06:53:58.000000000","message":"\u003e This is the servers parameter to _view_hypervisor? If so, this should be passed by kwarg, especially since you\u0027re passing instances in for servers.\n\nI can pass it in as servers\u003dinstances.\n\n\u003e Also this method uses these as services (by doing serv[\u0027name\u0027] on them). That will work on an instance, but won\u0027t be right. Are you sure this is what you want?\n\nI\u0027m not sure what you\u0027re saying here. This is the same functionality as what the old servers() method was doing before, which was basically the same thing as index() expect it would also include the hosted servers and query with a hostname pattern match - which is all collapsed in this same microversion.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b91c56eb8d13cf8bde2dc2ef569ad321ad5d1444","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                hyp_dict[\u0027cpu_info\u0027] \u003d hypervisor.cpu_info"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        if servers:"},{"line_number":90,"context_line":"            hyp_dict[\u0027servers\u0027] \u003d [dict(name\u003dserv[\u0027name\u0027], uuid\u003dserv[\u0027uuid\u0027])"},{"line_number":91,"context_line":"                                   for serv in servers]"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # Add any additional info"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f1d235d_5bc11e2e","line":90,"range":{"start_line":90,"start_character":45,"end_line":90,"end_character":57},"updated":"2017-07-10 19:17:03.000000000","message":"These are instances apparently, even though the parameter is called \"servers\", which is the confusing bit I pointed out earlier.","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8ac914cab5f0fa8d871645728c4bf51fcd87693c","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                hyp_dict[\u0027cpu_info\u0027] \u003d hypervisor.cpu_info"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        if servers:"},{"line_number":90,"context_line":"            hyp_dict[\u0027servers\u0027] \u003d [dict(name\u003dserv[\u0027name\u0027], uuid\u003dserv[\u0027uuid\u0027])"},{"line_number":91,"context_line":"                                   for serv in servers]"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # Add any additional info"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f1d235d_9b5b3653","line":90,"range":{"start_line":90,"start_character":45,"end_line":90,"end_character":57},"in_reply_to":"3f1d235d_3b2ae2e6","updated":"2017-07-10 19:26:21.000000000","message":"I realize this is existing, I just think it\u0027s confusing and we\u0027re adding more code that furthers this silliness. However, it\u0027s not any worse than what is here so I\u0027ll shut up and maybe we can address it afterwards.","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"32913d107e08ec4d8e602d6019539e2bb1477c85","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                hyp_dict[\u0027cpu_info\u0027] \u003d hypervisor.cpu_info"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        if servers:"},{"line_number":90,"context_line":"            hyp_dict[\u0027servers\u0027] \u003d [dict(name\u003dserv[\u0027name\u0027], uuid\u003dserv[\u0027uuid\u0027])"},{"line_number":91,"context_line":"                                   for serv in servers]"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # Add any additional info"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f1d235d_3b2ae2e6","line":90,"range":{"start_line":90,"start_character":45,"end_line":90,"end_character":57},"in_reply_to":"3f1d235d_5bc11e2e","updated":"2017-07-10 19:20:20.000000000","message":"So you want me to rename the parameter? I\u0027m not connecting what you want me to do here. I\u0027m just following what was already done in this code for the servers() method:\n\nhttps://review.openstack.org/#/c/471899/24/nova/api/openstack/compute/hypervisors.py@381","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b91c56eb8d13cf8bde2dc2ef569ad321ad5d1444","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                    context, hyp.host)"},{"line_number":170,"context_line":"                hypervisors_list.append("},{"line_number":171,"context_line":"                    self._view_hypervisor("},{"line_number":172,"context_line":"                        hyp, service, detail, req, servers\u003dinstances))"},{"line_number":173,"context_line":"            except (exception.ComputeHostNotFound,"},{"line_number":174,"context_line":"                    exception.HostMappingNotFound):"},{"line_number":175,"context_line":"                # The compute service could be deleted which doesn\u0027t delete"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f1d235d_3bdc2217","line":172,"range":{"start_line":172,"start_character":51,"end_line":172,"end_character":68},"updated":"2017-07-10 19:17:03.000000000","message":"This seems wrong to me. Passing a list of instances in a servers parameter.","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26dfbe6ce7a4972d39993ced5e5f7d472b1994ff","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        expect_uuid \u003d api_version_request.is_supported("},{"line_number":259,"context_line":"            req, min_version\u003dUUID_FOR_ID_MIN_VERSION)"},{"line_number":260,"context_line":"        if expect_uuid and not uuidutils.is_uuid_like(hypervisor_id):"},{"line_number":261,"context_line":"            msg \u003d _(\u0027Invalid uuid %s\u0027) % id"},{"line_number":262,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    @wsgi.Controller.api_version(UUID_FOR_ID_MIN_VERSION)"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f1a1f67_e3d31503","line":261,"range":{"start_line":261,"start_character":41,"end_line":261,"end_character":43},"updated":"2017-07-18 20:44:35.000000000","message":"This should be hypervisor_id. It doesn\u0027t blow up since id is a built-in.","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"996c1b68ed3551f0e272dff58676fea8f2f6b2cb","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        context.can(hv_policies.BASE_POLICY_NAME)"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        try:"},{"line_number":290,"context_line":"            hyp \u003d self.host_api.compute_node_get(context, id)"},{"line_number":291,"context_line":"            instances \u003d None"},{"line_number":292,"context_line":"            if with_servers:"},{"line_number":293,"context_line":"                instances \u003d self.host_api.instance_get_all_by_host("}],"source_content_type":"text/x-python","patch_set":24,"id":"3f1d235d_c81674a8","line":290,"range":{"start_line":290,"start_character":12,"end_line":290,"end_character":61},"updated":"2017-07-11 08:12:31.000000000","message":"this enable the uuid for the old version API","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5e99715edae3232311ee58c48fb49fa58e9c643c","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        context.can(hv_policies.BASE_POLICY_NAME)"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        try:"},{"line_number":290,"context_line":"            hyp \u003d self.host_api.compute_node_get(context, id)"},{"line_number":291,"context_line":"            instances \u003d None"},{"line_number":292,"context_line":"            if with_servers:"},{"line_number":293,"context_line":"                instances \u003d self.host_api.instance_get_all_by_host("}],"source_content_type":"text/x-python","patch_set":24,"id":"1f1a1f67_be71b078","line":290,"range":{"start_line":290,"start_character":12,"end_line":290,"end_character":61},"in_reply_to":"3f1d235d_c81674a8","updated":"2017-07-18 21:08:59.000000000","message":"Done","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"996c1b68ed3551f0e272dff58676fea8f2f6b2cb","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":307,"context_line":"        context.can(hv_policies.BASE_POLICY_NAME)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        self._validate_uuid(req, id)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        try:"},{"line_number":312,"context_line":"            hyp \u003d self.host_api.compute_node_get(context, id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f1d235d_4850245f","line":309,"updated":"2017-07-11 08:12:31.000000000","message":"this change the API behaviour","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5e99715edae3232311ee58c48fb49fa58e9c643c","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":307,"context_line":"        context.can(hv_policies.BASE_POLICY_NAME)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        self._validate_uuid(req, id)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        try:"},{"line_number":312,"context_line":"            hyp \u003d self.host_api.compute_node_get(context, id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f1a1f67_7e6798b8","line":309,"in_reply_to":"3f1d235d_247625da","updated":"2017-07-18 21:08:59.000000000","message":"Done","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6afd7d0418dab0e050c3e665726a269e4a8c38be","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":307,"context_line":"        context.can(hv_policies.BASE_POLICY_NAME)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        self._validate_uuid(req, id)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        try:"},{"line_number":312,"context_line":"            hyp \u003d self.host_api.compute_node_get(context, id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f1d235d_b8613c3c","line":309,"in_reply_to":"3f1d235d_4850245f","updated":"2017-07-11 12:56:20.000000000","message":"No, only if the microversion is \u003e\u003d 2.50 does it expect a uuid, and that\u0027s what we want. For all microversions \u003c 2.50 this is a noop.\n\nOr do you mean that if you pass a uuid at microversion 2.1 it won\u0027t fail?","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a34046f8da81d9738bf6037481235e4e8f8038e0","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":307,"context_line":"        context.can(hv_policies.BASE_POLICY_NAME)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        self._validate_uuid(req, id)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        try:"},{"line_number":312,"context_line":"            hyp \u003d self.host_api.compute_node_get(context, id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f1d235d_c9a66cac","line":309,"in_reply_to":"3f1d235d_b8613c3c","updated":"2017-07-11 14:06:31.000000000","message":"Maybe this should be handled like how it\u0027s being handled in the os-services change, e.g.:\n\nhttps://review.openstack.org/#/c/464280/21/nova/api/openstack/compute/services.py@199\n\nSo if it\u0027s microversion \u003e\u003d 2.50, then assert it\u0027s a uuid, else assert it\u0027s an integer, and if it\u0027s not return a 404.","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d18fa1f92e5d942d92d1b2584a301430509fff35","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":307,"context_line":"        context.can(hv_policies.BASE_POLICY_NAME)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        self._validate_uuid(req, id)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        try:"},{"line_number":312,"context_line":"            hyp \u003d self.host_api.compute_node_get(context, id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f1d235d_247625da","line":309,"in_reply_to":"3f1d235d_c9a66cac","updated":"2017-07-11 14:38:22.000000000","message":"yes, we should return 404 for the uuid in the old version. sorry, I didn\u0027t clear about that.","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"2ca54004e009e2c4028dede35dbe261fc3ec59ad","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                          \u0027running_vms\u0027, \u0027disk_available_least\u0027, \u0027host_ip\u0027):"},{"line_number":74,"context_line":"                hyp_dict[field] \u003d getattr(hypervisor, field)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"            service_id \u003d service.uuid if uuid_for_id else service.id"},{"line_number":77,"context_line":"            hyp_dict[\u0027service\u0027] \u003d {"},{"line_number":78,"context_line":"                \u0027id\u0027: service_id,"},{"line_number":79,"context_line":"                \u0027host\u0027: hypervisor.host,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1f1a1f67_9b526a12","line":76,"updated":"2017-07-19 13:41:14.000000000","message":"ack","commit_id":"622bfb2e951c09845994b306e396c921801a0317"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"2ca54004e009e2c4028dede35dbe261fc3ec59ad","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                raise webob.exc.HTTPBadRequest("},{"line_number":141,"context_line":"                    _(\u0027Paging over hypervisors with the \u0027"},{"line_number":142,"context_line":"                      \u0027hypervisor_hostname_pattern query parameter is not \u0027"},{"line_number":143,"context_line":"                      \u0027supported.\u0027))"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            # Explicitly do not try to generate links when querying with the"},{"line_number":146,"context_line":"            # hostname pattern since the request in the link would fail the"}],"source_content_type":"text/x-python","patch_set":25,"id":"1f1a1f67_3bb11648","line":143,"updated":"2017-07-19 13:41:14.000000000","message":"interesting limitation, as long as it\u0027s documented that\u0027s fine","commit_id":"622bfb2e951c09845994b306e396c921801a0317"}],"nova/api/openstack/compute/rest_api_version_history.rst":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"17a25e1188fd96c1dc20d3951e6d59b0bc61fff0","unresolved":false,"context_lines":[{"line_number":634,"context_line":""},{"line_number":635,"context_line":"    * ``GET /os-hypervisors``"},{"line_number":636,"context_line":"    * ``GET /os-hypervisors/detail``"},{"line_number":637,"context_line":"    * ``GET /os-hypervisors/{hypervisor_id}``"},{"line_number":638,"context_line":"    * ``GET /os-hypervisors/{hypervisor_id}/uptime``"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3f1d235d_5b16374b","line":637,"range":{"start_line":637,"start_character":29,"end_line":637,"end_character":42},"updated":"2017-07-06 06:01:45.000000000","message":"Maybe we should write as \u0027hypervisor_uuid\u0027","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f24c7f8f146edba77c939cbe2695aacf912bc66","unresolved":false,"context_lines":[{"line_number":634,"context_line":""},{"line_number":635,"context_line":"    * ``GET /os-hypervisors``"},{"line_number":636,"context_line":"    * ``GET /os-hypervisors/detail``"},{"line_number":637,"context_line":"    * ``GET /os-hypervisors/{hypervisor_id}``"},{"line_number":638,"context_line":"    * ``GET /os-hypervisors/{hypervisor_id}/uptime``"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3f1d235d_1c8be7c2","line":637,"range":{"start_line":637,"start_character":29,"end_line":637,"end_character":42},"in_reply_to":"3f1d235d_5b16374b","updated":"2017-07-07 06:53:58.000000000","message":"We could, but that\u0027s not the pattern we\u0027ve used anywhere else in the docs or API reference, e.g. server_id, service_id, etc. I\u0027d like to be consistent.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"}],"nova/api/openstack/compute/schemas/hypervisors.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"17a25e1188fd96c1dc20d3951e6d59b0bc61fff0","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        \u0027limit\u0027: parameter_types.single_param("},{"line_number":23,"context_line":"            parameter_types.non_negative_integer),"},{"line_number":24,"context_line":"        \u0027marker\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),"},{"line_number":25,"context_line":"        # The 2.49 microversion adds support for filtering by hostname pattern"},{"line_number":26,"context_line":"        # and requesting hosted servers in the GET /os-hypervisors and"},{"line_number":27,"context_line":"        # GET /os-hypervisors/detail response."},{"line_number":28,"context_line":"        \u0027hypervisor_hostname_pattern\u0027: parameter_types.single_param("}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_b5ce7a60","line":25,"range":{"start_line":25,"start_character":14,"end_line":25,"end_character":18},"updated":"2017-07-06 06:01:45.000000000","message":"s/2.49/2.50","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f24c7f8f146edba77c939cbe2695aacf912bc66","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        \u0027limit\u0027: parameter_types.single_param("},{"line_number":23,"context_line":"            parameter_types.non_negative_integer),"},{"line_number":24,"context_line":"        \u0027marker\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),"},{"line_number":25,"context_line":"        # The 2.49 microversion adds support for filtering by hostname pattern"},{"line_number":26,"context_line":"        # and requesting hosted servers in the GET /os-hypervisors and"},{"line_number":27,"context_line":"        # GET /os-hypervisors/detail response."},{"line_number":28,"context_line":"        \u0027hypervisor_hostname_pattern\u0027: parameter_types.single_param("}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_bc8bd3bd","line":25,"range":{"start_line":25,"start_character":14,"end_line":25,"end_character":18},"in_reply_to":"3f1d235d_b5ce7a60","updated":"2017-07-07 06:53:58.000000000","message":"Nice catch, rebase failure.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"}],"nova/api/openstack/compute/views/hypervisors.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f4c4ba4066b724f856e3f31427e85b1e58f9b0e4","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def get_links(self, request, hypervisors, detail\u003dFalse):"},{"line_number":26,"context_line":"        coll_name \u003d (self._collection_name + \u0027/detail\u0027 if detail else"},{"line_number":27,"context_line":"                     self._collection_name)"},{"line_number":28,"context_line":"        # The 2.49 microversion returns the compute node uuid rather than id."},{"line_number":29,"context_line":"        if api_version_request.is_supported("},{"line_number":30,"context_line":"                request, min_version\u003dUUID_FOR_ID_MIN_VERSION):"},{"line_number":31,"context_line":"            id_key \u003d \u0027uuid\u0027"},{"line_number":32,"context_line":"        else:"},{"line_number":33,"context_line":"            id_key \u003d \u0027id\u0027"},{"line_number":34,"context_line":"        return self._get_collection_links(request, hypervisors, coll_name,"},{"line_number":35,"context_line":"                                          id_key)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f231b9d_2654bb20","line":33,"range":{"start_line":28,"start_character":8,"end_line":33,"end_character":25},"updated":"2017-06-14 19:07:44.000000000","message":"This isn\u0027t correct. The hypervisors collection won\u0027t contain a uuid key. The id key will either be an integer id or a uuid, but that will have to be sorted out during paging, not when generating the links.","commit_id":"1af137ca24e0736c3cd1339177b40941d63c6f1c"}],"nova/tests/functional/api_sample_tests/test_hypervisors.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f166ed6321bbd880de1f82d94dc347ec961e5320","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        self._verify_response(\u0027hypervisors-detail-resp\u0027, subs, response, 200)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"class HypervisorsSampleJson250Tests(HypervisorsSampleJson228Tests):"},{"line_number":175,"context_line":"    microversion \u003d \u00272.50\u0027"},{"line_number":176,"context_line":"    scenarios \u003d [(\u0027v2_50\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_2979ab2e","line":174,"updated":"2017-07-07 21:34:53.000000000","message":"I should add a set of negative tests to make sure you can only specify one of each query parameter per request, so no limit\u003d1\u0026limit\u003d2, hypervisor_hostname_pattern\u003dfoo\u0026hypervisor_hostname_pattern\u003dbar, etc.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"17a25e1188fd96c1dc20d3951e6d59b0bc61fff0","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        subs \u003d {\u0027hypervisor_id\u0027: compute_node_2.uuid}"},{"line_number":199,"context_line":"        self._verify_response(\u0027hypervisors-list-resp\u0027, subs, response, 200)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def test_hypervisors_detail(self):"},{"line_number":202,"context_line":"        # Start another compute service to get a 2nd compute for paging tests."},{"line_number":203,"context_line":"        service_2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027).service_ref"},{"line_number":204,"context_line":"        compute_node_2 \u003d service_2.compute_node"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_1bd8bf78","line":201,"updated":"2017-07-06 06:01:45.000000000","message":"There is one more case: detail with servers","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f24c7f8f146edba77c939cbe2695aacf912bc66","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        subs \u003d {\u0027hypervisor_id\u0027: compute_node_2.uuid}"},{"line_number":199,"context_line":"        self._verify_response(\u0027hypervisors-list-resp\u0027, subs, response, 200)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def test_hypervisors_detail(self):"},{"line_number":202,"context_line":"        # Start another compute service to get a 2nd compute for paging tests."},{"line_number":203,"context_line":"        service_2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027).service_ref"},{"line_number":204,"context_line":"        compute_node_2 \u003d service_2.compute_node"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_dc57af25","line":201,"in_reply_to":"3f1d235d_1bd8bf78","updated":"2017-07-07 06:53:58.000000000","message":"Do we need another functional API samples test for that? test_hypervisors_with_servers handles the index case, which is how \u0027servers\u0027 used to work. If it\u0027s OK I can do a unit test for the detail+servers case, which I actually thought I had but now that I\u0027m looking again I\u0027m not seeing it.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fcfb82c9f246a42ee98975b73d159efacf0c285d","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        subs \u003d {\u0027hypervisor_id\u0027: compute_node_2.uuid}"},{"line_number":199,"context_line":"        self._verify_response(\u0027hypervisors-list-resp\u0027, subs, response, 200)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def test_hypervisors_detail(self):"},{"line_number":202,"context_line":"        # Start another compute service to get a 2nd compute for paging tests."},{"line_number":203,"context_line":"        service_2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027).service_ref"},{"line_number":204,"context_line":"        compute_node_2 \u003d service_2.compute_node"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_57825801","line":201,"in_reply_to":"3f1d235d_575818f8","updated":"2017-07-07 07:07:12.000000000","message":"OK I\u0027ll add it. It\u0027s not hard, but I won\u0027t work on adding a duplicate unit test then since we\u0027ll have the coverage with the functional test.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"b3d1bb55a7b522ddd0bdfd16d6f2b8f78daf60fa","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        subs \u003d {\u0027hypervisor_id\u0027: compute_node_2.uuid}"},{"line_number":199,"context_line":"        self._verify_response(\u0027hypervisors-list-resp\u0027, subs, response, 200)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def test_hypervisors_detail(self):"},{"line_number":202,"context_line":"        # Start another compute service to get a 2nd compute for paging tests."},{"line_number":203,"context_line":"        service_2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027).service_ref"},{"line_number":204,"context_line":"        compute_node_2 \u003d service_2.compute_node"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_575818f8","line":201,"in_reply_to":"3f1d235d_dc57af25","updated":"2017-07-07 07:04:48.000000000","message":"I\u0027m not sure we have strict rule at here. But I think it\u0027s good for have api sample test for each different response I guess.\n\nthe response of list_with_servers should be different with the response of detail_with_servers.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f5b9bd72e718fadacc1685f4ebb93fae2f332f81","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        response \u003d self._do_get("},{"line_number":219,"context_line":"            \u0027os-hypervisors?hypervisor_hostname_pattern\u003dfake\u0027)"},{"line_number":220,"context_line":"        subs \u003d {\u0027hypervisor_id\u0027: self.compute_node_1.uuid}"},{"line_number":221,"context_line":"        self._verify_response(\u0027hypervisors-search-resp\u0027, subs, response, 200)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    @mock.patch(\"nova.compute.api.HostAPI.instance_get_all_by_host\")"},{"line_number":224,"context_line":"    def test_hypervisors_with_servers(self, instance_get_all_by_host):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_72e906e4","line":221,"range":{"start_line":221,"start_character":31,"end_line":221,"end_character":54},"updated":"2017-07-06 12:04:17.000000000","message":"\u0027hypervisors-list-with-hypervisor-hostname-pattern\u0027","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"b3d1bb55a7b522ddd0bdfd16d6f2b8f78daf60fa","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        response \u003d self._do_get("},{"line_number":219,"context_line":"            \u0027os-hypervisors?hypervisor_hostname_pattern\u003dfake\u0027)"},{"line_number":220,"context_line":"        subs \u003d {\u0027hypervisor_id\u0027: self.compute_node_1.uuid}"},{"line_number":221,"context_line":"        self._verify_response(\u0027hypervisors-search-resp\u0027, subs, response, 200)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    @mock.patch(\"nova.compute.api.HostAPI.instance_get_all_by_host\")"},{"line_number":224,"context_line":"    def test_hypervisors_with_servers(self, instance_get_all_by_host):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_d7e4283e","line":221,"range":{"start_line":221,"start_character":31,"end_line":221,"end_character":54},"in_reply_to":"3f1d235d_1c2767cc","updated":"2017-07-07 07:04:48.000000000","message":"ok, we can do that in another patch. This patch is already huge","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f24c7f8f146edba77c939cbe2695aacf912bc66","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        response \u003d self._do_get("},{"line_number":219,"context_line":"            \u0027os-hypervisors?hypervisor_hostname_pattern\u003dfake\u0027)"},{"line_number":220,"context_line":"        subs \u003d {\u0027hypervisor_id\u0027: self.compute_node_1.uuid}"},{"line_number":221,"context_line":"        self._verify_response(\u0027hypervisors-search-resp\u0027, subs, response, 200)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    @mock.patch(\"nova.compute.api.HostAPI.instance_get_all_by_host\")"},{"line_number":224,"context_line":"    def test_hypervisors_with_servers(self, instance_get_all_by_host):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_1c2767cc","line":221,"range":{"start_line":221,"start_character":31,"end_line":221,"end_character":54},"in_reply_to":"3f1d235d_72e906e4","updated":"2017-07-07 06:53:58.000000000","message":"I can rename this, but was just re-using the same API sample name as the previous microversions. Do you still want me to change it?","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f5b9bd72e718fadacc1685f4ebb93fae2f332f81","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        instance_get_all_by_host.return_value \u003d instances"},{"line_number":238,"context_line":"        response \u003d self._do_get(\u0027os-hypervisors?with_servers\u003dtrue\u0027)"},{"line_number":239,"context_line":"        subs \u003d {\u0027hypervisor_id\u0027: self.compute_node_1.uuid}"},{"line_number":240,"context_line":"        self._verify_response(\u0027hypervisors-with-servers-resp\u0027, subs,"},{"line_number":241,"context_line":"                              response, 200)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def test_hypervisors_without_servers(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_f23076a1","line":240,"range":{"start_line":240,"start_character":31,"end_line":240,"end_character":60},"updated":"2017-07-06 12:04:17.000000000","message":"how about name as \u0027hypervisors-list-with-servers-resp\u0027, it is easy to know this is a list action from the name","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f24c7f8f146edba77c939cbe2695aacf912bc66","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        instance_get_all_by_host.return_value \u003d instances"},{"line_number":238,"context_line":"        response \u003d self._do_get(\u0027os-hypervisors?with_servers\u003dtrue\u0027)"},{"line_number":239,"context_line":"        subs \u003d {\u0027hypervisor_id\u0027: self.compute_node_1.uuid}"},{"line_number":240,"context_line":"        self._verify_response(\u0027hypervisors-with-servers-resp\u0027, subs,"},{"line_number":241,"context_line":"                              response, 200)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    def test_hypervisors_without_servers(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_bc2753c7","line":240,"range":{"start_line":240,"start_character":31,"end_line":240,"end_character":60},"in_reply_to":"3f1d235d_f23076a1","updated":"2017-07-07 06:53:58.000000000","message":"Same as above - I was being consistent with the existing test and sample names since this test class inherits from the others.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f5b9bd72e718fadacc1685f4ebb93fae2f332f81","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        subs \u003d {"},{"line_number":258,"context_line":"            \u0027hypervisor_id\u0027: hypervisor_id,"},{"line_number":259,"context_line":"        }"},{"line_number":260,"context_line":"        self._verify_response(\u0027hypervisors-uptime-resp\u0027, subs, response, 200)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    def test_hypervisors_show(self):"},{"line_number":263,"context_line":"        hypervisor_id \u003d self.compute_node_1.uuid"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_b2267e67","line":260,"range":{"start_line":260,"start_character":31,"end_line":260,"end_character":54},"updated":"2017-07-06 12:04:17.000000000","message":"hypervisors-list-uptime","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f24c7f8f146edba77c939cbe2695aacf912bc66","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        subs \u003d {"},{"line_number":258,"context_line":"            \u0027hypervisor_id\u0027: hypervisor_id,"},{"line_number":259,"context_line":"        }"},{"line_number":260,"context_line":"        self._verify_response(\u0027hypervisors-uptime-resp\u0027, subs, response, 200)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    def test_hypervisors_show(self):"},{"line_number":263,"context_line":"        hypervisor_id \u003d self.compute_node_1.uuid"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_5c44bf73","line":260,"range":{"start_line":260,"start_character":31,"end_line":260,"end_character":54},"in_reply_to":"3f1d235d_b2267e67","updated":"2017-07-07 06:53:58.000000000","message":"I used this sample name since it\u0027s the same as the previous microversions.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"}],"nova/tests/unit/api/openstack/compute/test_hypervisors.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f5b9bd72e718fadacc1685f4ebb93fae2f332f81","unresolved":false,"context_lines":[{"line_number":899,"context_line":"    api_version \u003d \u00272.49\u0027"},{"line_number":900,"context_line":""},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"class HypervisorsTestV250(HypervisorsTestV249):"},{"line_number":903,"context_line":"    api_version \u003d hypervisors_v21.UUID_FOR_ID_MIN_VERSION"},{"line_number":904,"context_line":"    expect_uuid_for_id \u003d True"},{"line_number":905,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_a73c02e1","line":902,"range":{"start_line":902,"start_character":26,"end_line":902,"end_character":45},"updated":"2017-07-06 12:04:17.000000000","message":"I remember we said we needn\u0027t inherit from the old version class, that wastes to run all tests on each version, maybe Sean remember the detail discussion. And in this case, if we start a new class, we can have better naming for all the tests.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"b3d1bb55a7b522ddd0bdfd16d6f2b8f78daf60fa","unresolved":false,"context_lines":[{"line_number":899,"context_line":"    api_version \u003d \u00272.49\u0027"},{"line_number":900,"context_line":""},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"class HypervisorsTestV250(HypervisorsTestV249):"},{"line_number":903,"context_line":"    api_version \u003d hypervisors_v21.UUID_FOR_ID_MIN_VERSION"},{"line_number":904,"context_line":"    expect_uuid_for_id \u003d True"},{"line_number":905,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_9730f0a0","line":902,"range":{"start_line":902,"start_character":26,"end_line":902,"end_character":45},"in_reply_to":"3f1d235d_370a3c1f","updated":"2017-07-07 07:04:48.000000000","message":"ok","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f24c7f8f146edba77c939cbe2695aacf912bc66","unresolved":false,"context_lines":[{"line_number":899,"context_line":"    api_version \u003d \u00272.49\u0027"},{"line_number":900,"context_line":""},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"class HypervisorsTestV250(HypervisorsTestV249):"},{"line_number":903,"context_line":"    api_version \u003d hypervisors_v21.UUID_FOR_ID_MIN_VERSION"},{"line_number":904,"context_line":"    expect_uuid_for_id \u003d True"},{"line_number":905,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_370a3c1f","line":902,"range":{"start_line":902,"start_character":26,"end_line":902,"end_character":45},"in_reply_to":"3f1d235d_a73c02e1","updated":"2017-07-07 06:53:58.000000000","message":"I actually prefer inheritance in this case so we don\u0027t miss things, and can assert we\u0027re covering anything that\u0027s deprecated. We seem to change our minds about the inheritance issue, because it\u0027s caused us problems in the past when not doing test inheritance and we have regressed or missed some things, i.e.:\n\nhttps://blueprints.launchpad.net/nova/+spec/nova-microversion-functional-tests\n\nSo if it\u0027s all the same I\u0027d rather leave the inheritance in here.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f5b9bd72e718fadacc1685f4ebb93fae2f332f81","unresolved":false,"context_lines":[{"line_number":940,"context_line":"            mock.call(req.environ[\u0027nova.context\u0027], TEST_HYPERS_OBJ[0].host),"},{"line_number":941,"context_line":"            mock.call(req.environ[\u0027nova.context\u0027], TEST_HYPERS_OBJ[1].host)))"},{"line_number":942,"context_line":""},{"line_number":943,"context_line":"    def test_servers_not_mapped(self):"},{"line_number":944,"context_line":"        \"\"\"Tests that instance_get_all_by_host fails with HostMappingNotFound."},{"line_number":945,"context_line":"        \"\"\""},{"line_number":946,"context_line":"        req \u003d self._get_request(use_admin_context\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_f23996a3","line":943,"updated":"2017-07-06 12:04:17.000000000","message":"This is the case we needn\u0027t test again in the new version?","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"b3d1bb55a7b522ddd0bdfd16d6f2b8f78daf60fa","unresolved":false,"context_lines":[{"line_number":940,"context_line":"            mock.call(req.environ[\u0027nova.context\u0027], TEST_HYPERS_OBJ[0].host),"},{"line_number":941,"context_line":"            mock.call(req.environ[\u0027nova.context\u0027], TEST_HYPERS_OBJ[1].host)))"},{"line_number":942,"context_line":""},{"line_number":943,"context_line":"    def test_servers_not_mapped(self):"},{"line_number":944,"context_line":"        \"\"\"Tests that instance_get_all_by_host fails with HostMappingNotFound."},{"line_number":945,"context_line":"        \"\"\""},{"line_number":946,"context_line":"        req \u003d self._get_request(use_admin_context\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_b7140cea","line":943,"in_reply_to":"3f1d235d_7752f414","updated":"2017-07-07 07:04:48.000000000","message":"ok, this comments is just based on doesn\u0027t inherit from the old version class.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fcfb82c9f246a42ee98975b73d159efacf0c285d","unresolved":false,"context_lines":[{"line_number":940,"context_line":"            mock.call(req.environ[\u0027nova.context\u0027], TEST_HYPERS_OBJ[0].host),"},{"line_number":941,"context_line":"            mock.call(req.environ[\u0027nova.context\u0027], TEST_HYPERS_OBJ[1].host)))"},{"line_number":942,"context_line":""},{"line_number":943,"context_line":"    def test_servers_not_mapped(self):"},{"line_number":944,"context_line":"        \"\"\"Tests that instance_get_all_by_host fails with HostMappingNotFound."},{"line_number":945,"context_line":"        \"\"\""},{"line_number":946,"context_line":"        req \u003d self._get_request(use_admin_context\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_f79f244d","line":943,"in_reply_to":"3f1d235d_b7140cea","updated":"2017-07-07 07:07:12.000000000","message":"Yes it does, see L658.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f24c7f8f146edba77c939cbe2695aacf912bc66","unresolved":false,"context_lines":[{"line_number":940,"context_line":"            mock.call(req.environ[\u0027nova.context\u0027], TEST_HYPERS_OBJ[0].host),"},{"line_number":941,"context_line":"            mock.call(req.environ[\u0027nova.context\u0027], TEST_HYPERS_OBJ[1].host)))"},{"line_number":942,"context_line":""},{"line_number":943,"context_line":"    def test_servers_not_mapped(self):"},{"line_number":944,"context_line":"        \"\"\"Tests that instance_get_all_by_host fails with HostMappingNotFound."},{"line_number":945,"context_line":"        \"\"\""},{"line_number":946,"context_line":"        req \u003d self._get_request(use_admin_context\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_7752f414","line":943,"in_reply_to":"3f1d235d_f23996a3","updated":"2017-07-07 06:53:58.000000000","message":"Same test, but different controller method - the old test was calling the servers() method, this is calling the index() method, because server() was basically index() with the servers in the response and using the hostname pattern match.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f5b9bd72e718fadacc1685f4ebb93fae2f332f81","unresolved":false,"context_lines":[{"line_number":951,"context_line":"            result \u003d self.controller.index(req)"},{"line_number":952,"context_line":"            self.assertEqual(dict(hypervisors\u003d[]), result)"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"    def test_with_servers(self):"},{"line_number":955,"context_line":"        \"\"\"Tests GET /os-hypervisors?with_servers\u003dTrue\"\"\""},{"line_number":956,"context_line":"        instances \u003d ["},{"line_number":957,"context_line":"            objects.InstanceList(objects\u003d[objects.Instance("}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_52484a2b","line":954,"range":{"start_line":954,"start_character":8,"end_line":954,"end_character":25},"updated":"2017-07-06 12:04:17.000000000","message":"a better name is like \u0027test_list_with_servers\u0027","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f24c7f8f146edba77c939cbe2695aacf912bc66","unresolved":false,"context_lines":[{"line_number":951,"context_line":"            result \u003d self.controller.index(req)"},{"line_number":952,"context_line":"            self.assertEqual(dict(hypervisors\u003d[]), result)"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"    def test_with_servers(self):"},{"line_number":955,"context_line":"        \"\"\"Tests GET /os-hypervisors?with_servers\u003dTrue\"\"\""},{"line_number":956,"context_line":"        instances \u003d ["},{"line_number":957,"context_line":"            objects.InstanceList(objects\u003d[objects.Instance("}],"source_content_type":"text/x-python","patch_set":22,"id":"3f1d235d_f73de4ba","line":954,"range":{"start_line":954,"start_character":8,"end_line":954,"end_character":25},"in_reply_to":"3f1d235d_52484a2b","updated":"2017-07-07 06:53:58.000000000","message":"OK I\u0027ll rename this one.","commit_id":"d292944d68aed32e78726442af596e2556ecb1c1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d18fa1f92e5d942d92d1b2584a301430509fff35","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"        self.assertNotIn(\u0027hypervisors_links\u0027, result)"},{"line_number":1080,"context_line":"        self.assertDictEqual(expected, result)"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"    def test_search_invalid_hostname_pattern_parameter(self):"},{"line_number":1083,"context_line":"        \"\"\"Tests passing an invalid hypervisor_hostname_pattern query"},{"line_number":1084,"context_line":"        parameter."},{"line_number":1085,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"3f1d235d_8e13e5b8","line":1082,"updated":"2017-07-11 14:38:22.000000000","message":"One more case for testing search with pagination parameters returned 400.","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff4b3469160ee1d0def2b063ba462add00e684df","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"        self.assertNotIn(\u0027hypervisors_links\u0027, result)"},{"line_number":1080,"context_line":"        self.assertDictEqual(expected, result)"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"    def test_search_invalid_hostname_pattern_parameter(self):"},{"line_number":1083,"context_line":"        \"\"\"Tests passing an invalid hypervisor_hostname_pattern query"},{"line_number":1084,"context_line":"        parameter."},{"line_number":1085,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"3f1d235d_ef27e111","line":1082,"in_reply_to":"3f1d235d_8e13e5b8","updated":"2017-07-11 18:23:14.000000000","message":"That\u0027s already covered in test_list_with_hostname_pattern_and_paging_parameters.","commit_id":"070923946515ddedeb0a74ab2bcdd96b1ceca7c1"}]}
