)]}'
{"nova/api/openstack/compute/services.py":[{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"806a744999019acc1e0e93b2152fa59475db7a09","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                                                                  service.host)"},{"line_number":224,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":225,"context_line":"                # placement for this compute node"},{"line_number":226,"context_line":"                self.rc.delete_resource_provider(context, service.compute_node)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_aceeb7b1","line":226,"updated":"2018-03-21 15:32:50.000000000","message":"do we want \"cascade\u003dTrue\" here?","commit_id":"b0218c8d6c35911328701b05a7c2a14611bc5c23"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"cec2deb51173d53db69d65c8a3b50bde7364a495","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                                                                  service.host)"},{"line_number":224,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":225,"context_line":"                # placement for this compute node"},{"line_number":226,"context_line":"                self.rc.delete_resource_provider(context, service.compute_node)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_664afb55","line":226,"in_reply_to":"df7087c5_aceeb7b1","updated":"2018-03-21 16:51:19.000000000","message":"Yes, you are right. Will add this.","commit_id":"b0218c8d6c35911328701b05a7c2a14611bc5c23"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3a27c7fcac7ce31409b1912d978e66d964c339e5","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self.actions \u003d {\"enable\": self._enable,"},{"line_number":43,"context_line":"                        \"disable\": self._disable,"},{"line_number":44,"context_line":"                        \"disable-log-reason\": self._disable_log_reason}"},{"line_number":45,"context_line":"        self.client \u003d report.SchedulerReportClient()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _get_services(self, req):"},{"line_number":48,"context_line":"        # The API services are filtered out since they are not RPC services"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_d7136865","line":45,"range":{"start_line":45,"start_character":13,"end_line":45,"end_character":19},"updated":"2018-04-10 14:18:38.000000000","message":"Let\u0027s call this reportclient or placement or something a bit more obvious.","commit_id":"b9f6889ebd2639e8f8e0178252de8f0b93b72ca3"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"4b97c0464a8e1adf157dd5c15f994b3e38f8d5aa","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self.actions \u003d {\"enable\": self._enable,"},{"line_number":43,"context_line":"                        \"disable\": self._disable,"},{"line_number":44,"context_line":"                        \"disable-log-reason\": self._disable_log_reason}"},{"line_number":45,"context_line":"        self.client \u003d report.SchedulerReportClient()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _get_services(self, req):"},{"line_number":48,"context_line":"        # The API services are filtered out since they are not RPC services"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_9d1c3114","line":45,"range":{"start_line":45,"start_character":13,"end_line":45,"end_character":19},"in_reply_to":"bf659307_62165cf4","updated":"2018-04-10 14:58:18.000000000","message":"Done","commit_id":"b9f6889ebd2639e8f8e0178252de8f0b93b72ca3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e1c30f3bcb8da4852658defec34c6e5dccd059ad","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self.actions \u003d {\"enable\": self._enable,"},{"line_number":43,"context_line":"                        \"disable\": self._disable,"},{"line_number":44,"context_line":"                        \"disable-log-reason\": self._disable_log_reason}"},{"line_number":45,"context_line":"        self.client \u003d report.SchedulerReportClient()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _get_services(self, req):"},{"line_number":48,"context_line":"        # The API services are filtered out since they are not RPC services"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_62165cf4","line":45,"range":{"start_line":45,"start_character":13,"end_line":45,"end_character":19},"in_reply_to":"bf659307_d7136865","updated":"2018-04-10 14:28:59.000000000","message":"agreed. placementclient would be best, IMHO.","commit_id":"b9f6889ebd2639e8f8e0178252de8f0b93b72ca3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3a27c7fcac7ce31409b1912d978e66d964c339e5","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                    self.aggregate_api.remove_host_from_aggregate(context,"},{"line_number":221,"context_line":"                                                                  ag.id,"},{"line_number":222,"context_line":"                                                                  service.host)"},{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.client.delete_resource_provider(context,"},{"line_number":226,"context_line":"                                                     service.compute_node,"},{"line_number":227,"context_line":"                                                     cascade\u003dTrue)"},{"line_number":228,"context_line":"                # remove the host_mapping of this host."},{"line_number":229,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":230,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_625e5c13","line":227,"range":{"start_line":223,"start_character":16,"end_line":227,"end_character":66},"updated":"2018-04-10 14:18:38.000000000","message":"Something to be aware of, but this is our first thing in the nova-api service that requires [placement] to be configured in nova.conf for this specific service. If [placement] is not configured, I believe the @safe_connect decorator in the report client will handle this and we\u0027ll get a warning about it not being configured:\n\nhttps://github.com/openstack/nova/blob/6d4958b5c225a602d22069b920cbf1a37b652c58/nova/scheduler/client/report.py#L745\n\nAlthough the message itself will be a bit odd:\n\nhttps://github.com/openstack/nova/blob/6d4958b5c225a602d22069b920cbf1a37b652c58/nova/scheduler/client/report.py#L87\n\nBut we should have an accompanying release note with this change that has the \u0027upgrade\u0027 section filled in to point out that the nova-api service now requires [placement] to be configured in nova.conf if you\u0027re using a separate config file just for that service.","commit_id":"b9f6889ebd2639e8f8e0178252de8f0b93b72ca3"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"4b97c0464a8e1adf157dd5c15f994b3e38f8d5aa","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                    self.aggregate_api.remove_host_from_aggregate(context,"},{"line_number":221,"context_line":"                                                                  ag.id,"},{"line_number":222,"context_line":"                                                                  service.host)"},{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.client.delete_resource_provider(context,"},{"line_number":226,"context_line":"                                                     service.compute_node,"},{"line_number":227,"context_line":"                                                     cascade\u003dTrue)"},{"line_number":228,"context_line":"                # remove the host_mapping of this host."},{"line_number":229,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":230,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_3df085c9","line":227,"range":{"start_line":223,"start_character":16,"end_line":227,"end_character":66},"in_reply_to":"bf659307_625e5c13","updated":"2018-04-10 14:58:18.000000000","message":"I will add a upgrade reno then.","commit_id":"b9f6889ebd2639e8f8e0178252de8f0b93b72ca3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3a27c7fcac7ce31409b1912d978e66d964c339e5","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        except exception.ServiceNotUnique:"},{"line_number":237,"context_line":"            explanation \u003d _(\"Service id %s refers to multiple services.\") % id"},{"line_number":238,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexplanation)"},{"line_number":239,"context_line":"        except exception.HostMappingNotFound:"},{"line_number":240,"context_line":"            explanation \u003d _(\"No mapping was found for host %s\") % service.host"},{"line_number":241,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexplanation)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    @validation.query_schema(services.index_query_schema)"},{"line_number":244,"context_line":"    @wsgi.expected_errors(())"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_22870464","line":241,"range":{"start_line":239,"start_character":8,"end_line":241,"end_character":67},"updated":"2018-04-10 14:18:38.000000000","message":"If we want to delete the host mapping anyway but it wasn\u0027t found, we shouldn\u0027t make this an error, just handle it above and ignore it.","commit_id":"b9f6889ebd2639e8f8e0178252de8f0b93b72ca3"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"4b97c0464a8e1adf157dd5c15f994b3e38f8d5aa","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        except exception.ServiceNotUnique:"},{"line_number":237,"context_line":"            explanation \u003d _(\"Service id %s refers to multiple services.\") % id"},{"line_number":238,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexplanation)"},{"line_number":239,"context_line":"        except exception.HostMappingNotFound:"},{"line_number":240,"context_line":"            explanation \u003d _(\"No mapping was found for host %s\") % service.host"},{"line_number":241,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexplanation)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    @validation.query_schema(services.index_query_schema)"},{"line_number":244,"context_line":"    @wsgi.expected_errors(())"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_5d99b976","line":241,"range":{"start_line":239,"start_character":8,"end_line":241,"end_character":67},"in_reply_to":"bf659307_22870464","updated":"2018-04-10 14:58:18.000000000","message":"Done","commit_id":"b9f6889ebd2639e8f8e0178252de8f0b93b72ca3"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"a72b6e4e33c2a064eb8bfdeede9634a2c5626a82","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        except exception.ServiceNotUnique:"},{"line_number":237,"context_line":"            explanation \u003d _(\"Service id %s refers to multiple services.\") % id"},{"line_number":238,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexplanation)"},{"line_number":239,"context_line":"        except exception.HostMappingNotFound:"},{"line_number":240,"context_line":"            explanation \u003d _(\"No mapping was found for host %s\") % service.host"},{"line_number":241,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexplanation)"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    @validation.query_schema(services.index_query_schema)"},{"line_number":244,"context_line":"    @wsgi.expected_errors(())"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_5dc0d92a","line":241,"range":{"start_line":239,"start_character":8,"end_line":241,"end_character":67},"in_reply_to":"bf659307_5d99b976","updated":"2018-04-10 15:01:38.000000000","message":"I guess this is already internally handled inside host_mapping.get_by_host(). I just didn\u0027t see it.","commit_id":"b9f6889ebd2639e8f8e0178252de8f0b93b72ca3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"720bb4bf6411c25f23b0aa25f89b0ac8954c2535","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_a9c3db88","line":226,"updated":"2018-04-11 13:53:51.000000000","message":"I was going to -1 because I thought this doesn\u0027t work, but ... does cascade\u003dTrue delete all allocations for the provider, then inventory, and then the provider itself?\n\nIf so, then cool. However, I think we probably want a functional test with placement running and verify that it actually deleted stuff, right?","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ae444dcc67ac97eac4c85c8e1064e09531a5321a","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_c415ca3e","line":226,"range":{"start_line":226,"start_character":51,"end_line":226,"end_character":64},"updated":"2018-04-11 20:08:10.000000000","message":"Wait a minute, I just thought about this - if the compute node resource provider has instances with allocations against it in placement, won\u0027t we essentially mess up quota usage by deleting that compute service? The instance (project) will report that it\u0027s using quota but in fact it won\u0027t be. If the admin goes to move the instance to another host, what would happen? If the admin/user deletes the instance, the API would perform a \"local delete\" where the instance is deleted but nothing is cleaned up from the compute - which is fine because it should be stopped / gone.\n\nI realize we never cared about this before with deleting compute services, but I\u0027m thinking the Placement part of this makes things....wonky.","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bdbf458cfd6ca38beefb86f0d8f29f2437432e47","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_a41d36bf","line":226,"range":{"start_line":226,"start_character":51,"end_line":226,"end_character":64},"in_reply_to":"bf659307_04a0a28f","updated":"2018-04-11 20:30:56.000000000","message":"I\u0027m trying to think of what would happen pre-Placement if you stopped and deleted a compute service while it still had instances on it. The only move operation you can do is evacuate, and in the case of evacuate we don\u0027t care about the allocations on the source node, unless it comes back up - at which point we delete allocations for evacuated instances:\n\nhttps://github.com/openstack/nova/blob/2c5da2212c3fa3e589c4af171486a2097fd8c54e/nova/compute/manager.py#L695\n\nIf the admin doesn\u0027t evacuate the instances on this compute, then the only thing you can do is (1) delete the instances or (2) fix and bring back the compute and hope the allocations are still correct in placement since the compute service isn\u0027t going to heal them anymore. But I don\u0027t see why anything would change them while the service is down.","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"98d8aa0a8a76c37c7043e9037b834e02213a5690","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_b7db2deb","line":226,"in_reply_to":"bf659307_1429ba88","updated":"2018-04-11 16:56:52.000000000","message":"I can help by writing a separate patch before this in the series which does the service delete and asserts that the host mapping and RP aren\u0027t deleted, and then this patch can change that to assert they are deleted. It would also keep this patch smaller.","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"667fcbd94dc4ede3c57b095d4e9bceca72a8cac0","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_66e1659b","line":226,"in_reply_to":"bf659307_17ba196d","updated":"2018-04-11 20:02:57.000000000","message":"https://review.openstack.org/#/c/560626/","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"54faaf7366204c2682fb44da3de15b4a94dc11d7","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_04a0a28f","line":226,"range":{"start_line":226,"start_character":51,"end_line":226,"end_character":64},"in_reply_to":"bf659307_44b77af6","updated":"2018-04-11 20:26:19.000000000","message":"Because quota isn\u0027t based on placement.","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e1ba57fcd6025d04578a4e63079c872742378d6c","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_846832f5","line":226,"range":{"start_line":226,"start_character":51,"end_line":226,"end_character":64},"in_reply_to":"bf659307_84ccb235","updated":"2018-04-11 20:38:47.000000000","message":"Although, if we delete the compute node record and you restart the compute service, the resource tracker is going to create a new compute node record with a new UUID so you\u0027d have a new resource provider representing that host and the instances would all have allocations against a resource provider that actually no longer exists.","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"96e9ee115a9097b4f8732f210e051f0f73de715a","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_84ccb235","line":226,"range":{"start_line":226,"start_character":51,"end_line":226,"end_character":64},"in_reply_to":"bf659307_a41d36bf","updated":"2018-04-11 20:33:58.000000000","message":"\u003e or (2) fix and bring back the compute and hope the allocations are still correct in placement since the compute service isn\u0027t going to heal them anymore.\n\nHeh, well, if we do this change, the resource provider will be gone along with it\u0027s allocations, and the compute isn\u0027t going to heal them if we restart it, so yeah, kind of broken there.","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"62378c99b2d0a4a73e0e9ec097c46f160feaf76b","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_e901d36b","line":226,"in_reply_to":"bf659307_a9c3db88","updated":"2018-04-11 14:12:00.000000000","message":"\u003e I was going to -1 because I thought this doesn\u0027t work, but ... does\n \u003e cascade\u003dTrue delete all allocations for the provider, then\n \u003e inventory, and then the provider itself?\n\nYes.\n\n \u003e If so, then cool. However, I think we probably want a functional\n \u003e test with placement running and verify that it actually deleted\n \u003e stuff, right?\n\nThere is a unit test here - https://github.com/openstack/nova/blob/master/nova/tests/unit/scheduler/client/test_report.py#L3276 , I did not find any functional tests for delete resource providers, I will try to incorporate one specific to my context.","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"62f41c7987aaa37fcb3ab46e08f266cd59458f37","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_17ba196d","line":226,"in_reply_to":"bf659307_b7db2deb","updated":"2018-04-11 16:58:48.000000000","message":"Thanks a lot, that would help me focus more on the actual part of testing the allocations and inventories being deleted.","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d6a615b2c10f650711edce761e7f45c0efa116be","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_44b77af6","line":226,"range":{"start_line":226,"start_character":51,"end_line":226,"end_character":64},"in_reply_to":"bf659307_c415ca3e","updated":"2018-04-11 20:22:49.000000000","message":"\u003e Wait a minute, I just thought about this - if the compute node\n \u003e resource provider has instances with allocations against it in\n \u003e placement, won\u0027t we essentially mess up quota usage by deleting\n \u003e that compute service? The instance (project) will report that it\u0027s\n \u003e using quota but in fact it won\u0027t be.\n\nWhy would the project report that it\u0027s using quota if the records are deleted from the placement service?","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5babe79a900c6afbc707fdd9c6fc5a4e1485d749","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":224,"context_line":"                # placement for this compute node"},{"line_number":225,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":226,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":227,"context_line":"                # remove the host_mapping of this host."},{"line_number":228,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":229,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_1429ba88","line":226,"in_reply_to":"bf659307_e901d36b","updated":"2018-04-11 14:24:25.000000000","message":"Yeah, I want a functional test that shows that it actually works end-to-end. We might not have service delete functional tests right now, but I think if you look at something like functional/test_servers (which has some placement intersection) then I think you\u0027ll get the idea.","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ce373df4c427ed02ec5bd1a62521f5f95ac312e2","unresolved":false,"context_lines":[{"line_number":236,"context_line":"                # remove the corresponding resource provider record from"},{"line_number":237,"context_line":"                # placement for this compute node"},{"line_number":238,"context_line":"                self.placementclient.delete_resource_provider("},{"line_number":239,"context_line":"                    context, service.compute_node, cascade\u003dTrue)"},{"line_number":240,"context_line":"                # remove the host_mapping of this host."},{"line_number":241,"context_line":"                hm \u003d objects.HostMapping.get_by_host(context, service.host)"},{"line_number":242,"context_line":"                hm.destroy()"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_8d3cd593","line":239,"range":{"start_line":239,"start_character":51,"end_line":239,"end_character":63},"updated":"2018-04-11 22:34:15.000000000","message":"Per the functional test, this doesn\u0027t actually delete the resource provider because it doesn\u0027t delete the allocations when the instance is delete if the compute service is down, which is bug 1679750, but the instances are deleted so the query here returns an empty list:\n\nhttps://github.com/openstack/nova/blob/fe976dcc559d059589a9ccf953a28e855abf50fb/nova/scheduler/client/report.py#L1917","commit_id":"c72a5d5727a65f66a903de0be94b8c4f24fa8922"}],"nova/tests/functional/api/client.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0ef22a514a47615a84ea3b029755465d16006ab5","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.content \u003d response.content"},{"line_number":58,"context_line":"        # Only attempt to parse the response body if we have a successful"},{"line_number":59,"context_line":"        # response (status_code \u003c 400)."},{"line_number":60,"context_line":"        if response and self.content:"},{"line_number":61,"context_line":"            self.body \u003d jsonutils.loads(self.content)"},{"line_number":62,"context_line":"        self.headers \u003d response.headers"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9f6a8fd7_ee71100e","line":60,"updated":"2018-04-18 20:43:49.000000000","message":"I expect this is probably what\u0027s causing the failure, because the tests that are failing are expecting to read the response body for error messages.","commit_id":"890b1144875ebb45fc73347542d422c47c89b224"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"445e967256a89ce4a18daa316408b87dce939414","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.content \u003d response.content"},{"line_number":58,"context_line":"        # Only attempt to parse the response body if we have a successful"},{"line_number":59,"context_line":"        # response (status_code \u003c 400)."},{"line_number":60,"context_line":"        if response and self.content:"},{"line_number":61,"context_line":"            self.body \u003d jsonutils.loads(self.content)"},{"line_number":62,"context_line":"        self.headers \u003d response.headers"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9f6a8fd7_ffae98e5","line":60,"in_reply_to":"9f6a8fd7_ee71100e","updated":"2018-04-18 23:05:57.000000000","message":"Done","commit_id":"890b1144875ebb45fc73347542d422c47c89b224"}],"nova/tests/functional/api_sample_tests/test_services.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"44fe5c4b6d6458aaadf61ad66d21062eac0179e9","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            return 1"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        self.stub_out(\u0027nova.db.service_get_by_uuid\u0027, db_service_get_by_uuid)"},{"line_number":140,"context_line":"        self.stub_out(\u0027nova.db.compute_node_get_all_by_host\u0027,"},{"line_number":141,"context_line":"            fake_cn_get_all_by_host)"},{"line_number":142,"context_line":"        self.stub_out("},{"line_number":143,"context_line":"            \u0027nova.objects.host_mapping.HostMapping._get_by_host_from_db\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_a022bea1","line":140,"updated":"2018-04-13 21:31:52.000000000","message":"Why are these new stubs needed for this test but not the others? The change isn\u0027t microversion-specific.","commit_id":"f82c1f0873ab8198597b867fef1c69592d830589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"14ab64f62e76815c5a86b906b8a1f605353680f4","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            return 1"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        self.stub_out(\u0027nova.db.service_get_by_uuid\u0027, db_service_get_by_uuid)"},{"line_number":140,"context_line":"        self.stub_out(\u0027nova.db.compute_node_get_all_by_host\u0027,"},{"line_number":141,"context_line":"            fake_cn_get_all_by_host)"},{"line_number":142,"context_line":"        self.stub_out("},{"line_number":143,"context_line":"            \u0027nova.objects.host_mapping.HostMapping._get_by_host_from_db\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_800c5aec","line":140,"in_reply_to":"bf659307_a022bea1","updated":"2018-04-13 21:45:53.000000000","message":"If I remove these stubs then I get this:\n\nnova.tests.functional.api_sample_tests.test_services.ServicesV253JsonTest.test_service_delete(v2_53)\n----------------------------------------------------------------------------------------------------\n\nCaptured traceback:\n~~~~~~~~~~~~~~~~~~~\n    Traceback (most recent call last):\n      File \"nova/tests/functional/api_sample_tests/test_services.py\", line 151, in test_service_delete\n        self.assertEqual(204, response.status_code)\n      File \"/home/osboxes/git/nova/.tox/functional/local/lib/python2.7/site-packages/testtools/testcase.py\", line 411, in assertEqual\n        self.assertThat(observed, matcher, message)\n      File \"/home/osboxes/git/nova/.tox/functional/local/lib/python2.7/site-packages/testtools/testcase.py\", line 498, in assertThat\n        raise mismatch_error\n    testtools.matchers._impl.MismatchError: 204 !\u003d 500\n    \n\nCaptured pythonlogging:\n~~~~~~~~~~~~~~~~~~~~~~~\n    2018-04-13 17:39:16,701 INFO [nova.service] Starting conductor node (version 17.0.0)\n    2018-04-13 17:39:16,714 INFO [nova.service] Starting consoleauth node (version 17.0.0)\n    2018-04-13 17:39:16,728 INFO [nova.network.driver] Loading network driver \u0027nova.network.linux_net\u0027\n    2018-04-13 17:39:16,730 INFO [nova.service] Starting network node (version 17.0.0)\n    2018-04-13 17:39:16,774 INFO [nova.service] Starting scheduler node (version 17.0.0)\n    2018-04-13 17:39:16,806 INFO [nova.virt.driver] Loading compute driver \u0027fake.SmallFakeDriver\u0027\n    2018-04-13 17:39:16,806 INFO [nova.service] Starting compute node (version 17.0.0)\n    2018-04-13 17:39:16,839 WARNING [nova.compute.manager] No compute node record found for host compute. If this is the first time this service is starting on this host, then you can ignore this warning.\n    2018-04-13 17:39:16,840 WARNING [nova.compute.monitors] Excluding nova.compute.monitors.cpu monitor virt_driver. Not in the list of enabled monitors (CONF.compute_monitors).\n    2018-04-13 17:39:16,846 WARNING [nova.compute.resource_tracker] No compute node record for compute:fake-mini\n    2018-04-13 17:39:16,851 INFO [nova.compute.resource_tracker] Compute node record created for compute:fake-mini with uuid: 4dc05ada-8b89-448f-80aa-7d5110fa4717\n    2018-04-13 17:39:16,893 INFO [nova.api.openstack.placement.objects.resource_provider] Synced traits from os_traits into API DB: set([\u0027HW_NIC_OFFLOAD_LSO\u0027, \u0027HW_CPU_X86_AVX512DQ\u0027, \u0027HW_CPU_X86_3DNOW\u0027, \u0027HW_GPU_API_OPENCL_V2_0\u0027, \u0027HW_GPU_API_OPENCL_V2_1\u0027, \u0027HW_NIC_OFFLOAD_RXHASH\u0027, \u0027HW_CPU_X86_SVM\u0027, \u0027HW_NIC_OFFLOAD_RX\u0027, \u0027HW_GPU_RESOLUTION_W1280H1024\u0027, \u0027HW_GPU_API_CUDA_V1_3\u0027, \u0027HW_GPU_API_CUDA_V1_2\u0027, \u0027HW_GPU_API_CUDA_V1_1\u0027, \u0027HW_GPU_API_CUDA_V1_0\u0027, \u0027HW_CPU_X86_AVX2\u0027, \u0027HW_GPU_API_OPENCL_V1_1\u0027, \u0027HW_GPU_API_OPENCL_V1_0\u0027, \u0027HW_GPU_API_OPENCL_V1_2\u0027, \u0027HW_GPU_API_CUDA_V3_0\u0027, \u0027HW_GPU_API_CUDA_V3_2\u0027, \u0027HW_GPU_API_CUDA_V3_5\u0027, \u0027HW_NIC_MULTIQUEUE\u0027, \u0027HW_GPU_API_CUDA_V3_7\u0027, \u0027HW_GPU_API_OPENCL_V2_2\u0027, \u0027HW_NIC_OFFLOAD_L2CRC\u0027, \u0027HW_GPU_API_CUDA_V5_3\u0027, \u0027HW_GPU_API_CUDA_V5_2\u0027, \u0027HW_GPU_API_CUDA_V5_0\u0027, \u0027HW_NIC_OFFLOAD_VXLAN\u0027, \u0027HW_CPU_X86_FMA4\u0027, \u0027HW_CPU_X86_FMA3\u0027, \u0027HW_NIC_OFFLOAD_TSO\u0027, \u0027HW_GPU_API_CUDA_V6_1\u0027, \u0027HW_NIC_OFFLOAD_SG\u0027, \u0027HW_GPU_RESOLUTION_W1152H864\u0027, \u0027HW_GPU_API_DIRECT2D\u0027, \u0027HW_GPU_API_VULKAN\u0027, \u0027HW_NIC_DCB_QCN\u0027, \u0027HW_NIC_OFFLOAD_TCS\u0027, \u0027HW_NIC_OFFLOAD_TX\u0027, \u0027HW_CPU_X86_AVX512CD\u0027, \u0027HW_GPU_API_CUDA_V6_2\u0027, \u0027HW_NIC_OFFLOAD_TXVLAN\u0027, \u0027HW_GPU_API_DIRECT3D_V9_0C\u0027, \u0027HW_GPU_API_DIRECT3D_V9_0B\u0027, \u0027HW_GPU_RESOLUTION_W3840H2160\u0027, \u0027HW_NIC_ACCEL_RSA\u0027, \u0027HW_NIC_ACCEL_LZS\u0027, \u0027HW_CPU_X86_SGX\u0027, \u0027HW_NIC_DCB_ETS\u0027, \u0027HW_GPU_API_DIRECT3D_V9_0L\u0027, \u0027HW_GPU_RESOLUTION_W1360H768\u0027, \u0027HW_NIC_OFFLOAD_RXVLAN\u0027, \u0027HW_GPU_RESOLUTION_W1600H1200\u0027, \u0027HW_GPU_API_DIRECT3D_V11_0\u0027, \u0027HW_GPU_API_DIRECT3D_V11_1\u0027, \u0027HW_GPU_API_DIRECT3D_V11_2\u0027, \u0027HW_CPU_X86_SHA\u0027, \u0027HW_CPU_X86_CLMUL\u0027, \u0027STORAGE_DISK_SSD\u0027, \u0027HW_NIC_ACCEL_SSL\u0027, \u0027HW_NIC_ACCEL_TLS\u0027, \u0027HW_GPU_API_CUDA_V2_0\u0027, \u0027HW_GPU_API_CUDA_V2_1\u0027, \u0027HW_NIC_SRIOV_MULTIQUEUE\u0027, \u0027HW_GPU_API_DIRECTX_V12\u0027, \u0027HW_GPU_API_CUDA_V6_0\u0027, \u0027HW_GPU_RESOLUTION_W2560H1600\u0027, \u0027HW_GPU_API_DIRECTX_V11\u0027, \u0027HW_NIC_OFFLOAD_TXUDP\u0027, \u0027HW_NIC_SRIOV_QOS_TX\u0027, \u0027HW_CPU_X86_AVX512VL\u0027, \u0027HW_CPU_X86_AVX\u0027, \u0027HW_NIC_OFFLOAD_FDF\u0027, \u0027HW_NIC_OFFLOAD_LRO\u0027, \u0027HW_GPU_RESOLUTION_W1280H768\u0027, \u0027HW_GPU_API_DIRECT3D_V6_0\u0027, \u0027HW_NIC_DCB_PFC\u0027, \u0027HW_NIC_ACCEL_ECC\u0027, \u0027MISC_SHARES_VIA_AGGREGATE\u0027, \u0027HW_GPU_RESOLUTION_W1920H1200\u0027, \u0027HW_NIC_OFFLOAD_SWITCHDEV\u0027, \u0027HW_GPU_RESOLUTION_W1024H600\u0027, \u0027HW_CPU_X86_AESNI\u0027, \u0027HW_GPU_RESOLUTION_W1366H768\u0027, \u0027HW_GPU_API_DXVA\u0027, \u0027HW_NIC_OFFLOAD_UCS\u0027, \u0027HW_GPU_API_DIRECT3D_V12_0\u0027, \u0027HW_GPU_RESOLUTION_W640H480\u0027, \u0027HW_NIC_VMDQ\u0027, \u0027HW_GPU_API_DIRECT3D_V8_1\u0027, \u0027HW_GPU_API_DIRECT3D_V8_0\u0027, \u0027HW_GPU_API_DIRECT3D_V10_1\u0027, \u0027HW_GPU_API_DIRECT3D_V10_0\u0027, \u0027HW_GPU_RESOLUTION_W1680H1050\u0027, \u0027HW_CPU_X86_ASF\u0027, \u0027HW_NIC_OFFLOAD_GRO\u0027, \u0027HW_GPU_RESOLUTION_W320H240\u0027, \u0027HW_CPU_X86_SSE\u0027, \u0027HW_GPU_RESOLUTION_W1600H900\u0027, \u0027HW_NIC_OFFLOAD_GRE\u0027, \u0027HW_CPU_X86_ABM\u0027, \u0027HW_NIC_ACCEL_DEFLATE\u0027, \u0027HW_GPU_API_OPENGL_V1_1\u0027, \u0027HW_GPU_API_OPENGL_V1_3\u0027, \u0027HW_GPU_RESOLUTION_W1920H1080\u0027, \u0027HW_GPU_API_OPENGL_V1_5\u0027, \u0027HW_GPU_API_OPENGL_V1_4\u0027, \u0027HW_NIC_OFFLOAD_UFO\u0027, \u0027HW_CPU_X86_AVX512PF\u0027, \u0027HW_CPU_X86_MPX\u0027, \u0027HW_NIC_OFFLOAD_QINQ\u0027, \u0027HW_NIC_ACCEL_DIFFIEH\u0027, \u0027HW_GPU_API_DIRECT3D_V7_0\u0027, \u0027HW_NIC_SRIOV\u0027, \u0027HW_GPU_API_OPENGL_V3_3\u0027, \u0027HW_GPU_API_OPENGL_V3_2\u0027, \u0027HW_GPU_API_OPENGL_V3_1\u0027, \u0027HW_GPU_API_OPENGL_V3_0\u0027, \u0027HW_NIC_ACCEL_IPSEC\u0027, \u0027STORAGE_DISK_HDD\u0027, \u0027HW_CPU_X86_F16C\u0027, \u0027HW_NIC_OFFLOAD_GENEVE\u0027, \u0027HW_NIC_SRIOV_QOS_RX\u0027, \u0027HW_CPU_X86_VMX\u0027, \u0027HW_CPU_X86_XOP\u0027, \u0027HW_GPU_API_OPENGL_V1_2\u0027, \u0027HW_GPU_RESOLUTION_W1024H768\u0027, \u0027HW_GPU_API_CUDA_V7_1\u0027, \u0027HW_GPU_API_CUDA_V7_0\u0027, \u0027HW_CPU_X86_MMX\u0027, \u0027HW_CPU_X86_AVX512ER\u0027, \u0027HW_NIC_OFFLOAD_GSO\u0027, \u0027HW_CPU_X86_SSE3\u0027, \u0027HW_CPU_X86_SSE2\u0027, \u0027HW_CPU_X86_AVX512BW\u0027, \u0027HW_NIC_OFFLOAD_RDMA\u0027, \u0027HW_GPU_API_DIRECT3D_V9_0\u0027, \u0027HW_CPU_X86_SSE41\u0027, \u0027HW_CPU_X86_SSE42\u0027, \u0027HW_GPU_RESOLUTION_W7680H4320\u0027, \u0027HW_GPU_API_OPENGL_V4_4\u0027, \u0027HW_GPU_API_OPENGL_V4_5\u0027, \u0027HW_GPU_API_OPENGL_V4_0\u0027, \u0027HW_GPU_API_OPENGL_V4_1\u0027, \u0027HW_GPU_API_OPENGL_V4_2\u0027, \u0027HW_GPU_API_OPENGL_V4_3\u0027, \u0027HW_CPU_X86_BMI2\u0027, \u0027HW_GPU_RESOLUTION_W800H600\u0027, \u0027HW_NIC_OFFLOAD_SCS\u0027, \u0027HW_CPU_X86_AVX512F\u0027, \u0027HW_CPU_X86_SSSE3\u0027, \u0027HW_GPU_RESOLUTION_W1440H900\u0027, \u0027HW_NIC_PROGRAMMABLE_PIPELINE\u0027, \u0027HW_CPU_X86_BMI\u0027, \u0027HW_GPU_RESOLUTION_W1280H720\u0027, \u0027HW_GPU_API_OPENGL_V2_0\u0027, \u0027HW_GPU_API_OPENGL_V2_1\u0027, \u0027HW_GPU_RESOLUTION_W2560H1440\u0027, \u0027HW_GPU_API_DIRECT3D_V11_3\u0027, \u0027HW_GPU_RESOLUTION_W1280H800\u0027, \u0027HW_CPU_X86_TSX\u0027, \u0027HW_CPU_X86_SSE4A\u0027, \u0027HW_CPU_X86_TBM\u0027, \u0027HW_GPU_API_DIRECTX_V10\u0027])\n    2018-04-13 17:39:16,901 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers?in_tree\u003d4dc05ada-8b89-448f-80aa-7d5110fa4717\" status: 200 len: 26 microversion: 1.14\n    2018-04-13 17:39:16,913 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"POST /placement/resource_providers\" status: 200 len: 832 microversion: 1.20\n    2018-04-13 17:39:16,915 INFO [nova.scheduler.client.report] [req-1da4f562-a600-4a50-a30b-76275305da13] Created resource provider record via placement API for resource provider with UUID 4dc05ada-8b89-448f-80aa-7d5110fa4717 and name fake-mini.\n    2018-04-13 17:39:16,928 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/inventories\" status: 200 len: 54 microversion: 1.0\n    2018-04-13 17:39:16,942 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers?in_tree\u003d4dc05ada-8b89-448f-80aa-7d5110fa4717\" status: 200 len: 858 microversion: 1.14\n    2018-04-13 17:39:16,952 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/inventories\" status: 200 len: 54 microversion: 1.0\n    2018-04-13 17:39:16,961 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/aggregates\" status: 200 len: 18 microversion: 1.1\n    2018-04-13 17:39:16,972 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/traits\" status: 200 len: 49 microversion: 1.6\n    2018-04-13 17:39:16,981 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/inventories\" status: 200 len: 54 microversion: 1.0\n    2018-04-13 17:39:16,997 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"PUT /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/inventories\" status: 200 len: 399 microversion: 1.0\n    2018-04-13 17:39:17,029 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/allocations\" status: 200 len: 54 microversion: 1.0\n    2018-04-13 17:39:17,031 INFO [nova.compute.resource_tracker] Final resource view: name\u003dfake-mini phys_ram\u003d8192MB used_ram\u003d512MB phys_disk\u003d1028GB used_disk\u003d0GB total_vcpus\u003d2 used_vcpus\u003d0 pci_stats\u003d[]\n    2018-04-13 17:39:17,049 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers?in_tree\u003d4dc05ada-8b89-448f-80aa-7d5110fa4717\" status: 200 len: 858 microversion: 1.14\n    2018-04-13 17:39:17,057 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/inventories\" status: 200 len: 399 microversion: 1.0\n    2018-04-13 17:39:17,066 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/aggregates\" status: 200 len: 18 microversion: 1.1\n    2018-04-13 17:39:17,074 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/traits\" status: 200 len: 49 microversion: 1.6\n    2018-04-13 17:39:17,083 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/inventories\" status: 200 len: 399 microversion: 1.0\n    2018-04-13 17:39:17,094 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers?in_tree\u003d4dc05ada-8b89-448f-80aa-7d5110fa4717\" status: 200 len: 858 microversion: 1.14\n    2018-04-13 17:39:17,104 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/inventories\" status: 200 len: 399 microversion: 1.0\n    2018-04-13 17:39:17,112 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/aggregates\" status: 200 len: 18 microversion: 1.1\n    2018-04-13 17:39:17,120 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/traits\" status: 200 len: 49 microversion: 1.6\n    2018-04-13 17:39:17,130 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"GET /placement/resource_providers/4dc05ada-8b89-448f-80aa-7d5110fa4717/inventories\" status: 200 len: 399 microversion: 1.0\n    2018-04-13 17:39:18,228 INFO [nova.network.driver] Loading network driver \u0027nova.network.linux_net\u0027\n    2018-04-13 17:39:18,281 INFO [nova.api.openstack.requestlog] 127.0.0.1 \"GET /v2.1\" status: 204 len: 0 microversion: - time: 0.000389\n    2018-04-13 17:39:18,479 ERROR [nova.api.openstack.wsgi] Unexpected exception in API method\n    Traceback (most recent call last):\n      File \"nova/api/openstack/wsgi.py\", line 801, in wrapped\n        return f(*args, **kwargs)\n      File \"nova/api/openstack/compute/services.py\", line 241, in delete\n        context, service.compute_node, cascade\u003dTrue)\n      File \"/home/osboxes/git/nova/.tox/functional/local/lib/python2.7/site-packages/oslo_versionedobjects/base.py\", line 67, in getter\n        self.obj_load_attr(name)\n      File \"nova/objects/service.py\", line 285, in obj_load_attr\n        self._context, self.host)\n      File \"/home/osboxes/git/nova/.tox/functional/local/lib/python2.7/site-packages/oslo_versionedobjects/base.py\", line 184, in wrapper\n        result \u003d fn(cls, context, *args, **kwargs)\n      File \"nova/objects/compute_node.py\", line 437, in get_all_by_host\n        use_slave\u003duse_slave)\n      File \"nova/db/sqlalchemy/api.py\", line 210, in wrapper\n        return f(*args, **kwargs)\n      File \"nova/objects/compute_node.py\", line 432, in _db_compute_node_get_all_by_host\n        return db.compute_node_get_all_by_host(context, host)\n      File \"nova/db/api.py\", line 291, in compute_node_get_all_by_host\n        return IMPL.compute_node_get_all_by_host(context, host)\n      File \"nova/db/sqlalchemy/api.py\", line 255, in wrapped\n        return f(context, *args, **kwargs)\n      File \"nova/db/sqlalchemy/api.py\", line 657, in compute_node_get_all_by_host\n        raise exception.ComputeHostNotFound(host\u003dhost)\n    ComputeHostNotFound: Compute host host1 could not be found.\n    2018-04-13 17:39:18,481 INFO [nova.api.openstack.wsgi] HTTP exception thrown: Unexpected API Error. Please report this at http://bugs.launchpad.net/nova/ and attach the Nova API log if possible.\n    \u003cclass \u0027nova.exception.ComputeHostNotFound\u0027\u003e\n    2018-04-13 17:39:18,483 INFO [nova.api.openstack.requestlog] 127.0.0.1 \"DELETE /v2.1/6f70656e737461636b20342065766572/os-services/e81d66a4-ddd3-4aba-8a84-171d1cb4d339\" status: 500 len: 208 microversion: 2.53 time: 0.199421","commit_id":"f82c1f0873ab8198597b867fef1c69592d830589"}],"nova/tests/unit/compute/test_host_api.py":[{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"4a7b6d4d7dbe64a15367f7693d08b3ccf2a846dc","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        self.assertFalse(self.controller.placementclient._provider_tree.exists("},{"line_number":466,"context_line":"            uuids.compute_node))"},{"line_number":467,"context_line":"        self.assertNotIn(uuids.compute_node,"},{"line_number":468,"context_line":"            self.controller.placementclient.association_refresh_time)"},{"line_number":469,"context_line":"        mock_hm.assert_called_once()"},{"line_number":470,"context_line":"        self.assertEqual(1, mock_destroy.call_count)"},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bf659307_04c1a5e4","line":468,"range":{"start_line":468,"start_character":44,"end_line":468,"end_character":45},"updated":"2018-04-10 20:26:11.000000000","message":"I guess the underscore was added recently.","commit_id":"8fb7e89870ad06a9aab2019db4b9a9f76660a6ac"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b3ce87c2bf8264df1bcdbe88a4915f9b3029d119","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        self.assertFalse(self.controller.placementclient._provider_tree.exists("},{"line_number":466,"context_line":"            uuids.compute_node))"},{"line_number":467,"context_line":"        self.assertNotIn(uuids.compute_node,"},{"line_number":468,"context_line":"            self.controller.placementclient.association_refresh_time)"},{"line_number":469,"context_line":"        mock_hm.assert_called_once()"},{"line_number":470,"context_line":"        self.assertEqual(1, mock_destroy.call_count)"},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bf659307_7d7b4b27","line":468,"range":{"start_line":468,"start_character":44,"end_line":468,"end_character":45},"in_reply_to":"bf659307_04c1a5e4","updated":"2018-04-11 04:28:33.000000000","message":"https://review.openstack.org/#/c/531260/35/nova/scheduler/client/report.py","commit_id":"8fb7e89870ad06a9aab2019db4b9a9f76660a6ac"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b3ce87c2bf8264df1bcdbe88a4915f9b3029d119","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":48,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":49,"context_line":"        self.req \u003d fakes.HTTPRequest.blank(\u0027\u0027)"},{"line_number":50,"context_line":"        with test.nested("},{"line_number":51,"context_line":"                mock.patch(\u0027keystoneauth1.adapter.Adapter\u0027,"},{"line_number":52,"context_line":"                           return_value\u003dself.ks_adap_mock),"},{"line_number":53,"context_line":"                mock.patch(\u0027keystoneauth1.loading.load_auth_from_conf_options\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_5de76713","line":50,"range":{"start_line":50,"start_character":13,"end_line":50,"end_character":25},"updated":"2018-04-11 04:28:33.000000000","message":"this is no longer necessary","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"c9ab8dc29c0f52b49d3e7ffd72592278c8410822","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":48,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":49,"context_line":"        self.req \u003d fakes.HTTPRequest.blank(\u0027\u0027)"},{"line_number":50,"context_line":"        with test.nested("},{"line_number":51,"context_line":"                mock.patch(\u0027keystoneauth1.adapter.Adapter\u0027,"},{"line_number":52,"context_line":"                           return_value\u003dself.ks_adap_mock),"},{"line_number":53,"context_line":"                mock.patch(\u0027keystoneauth1.loading.load_auth_from_conf_options\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_c8e894b4","line":50,"range":{"start_line":50,"start_character":13,"end_line":50,"end_character":25},"in_reply_to":"bf659307_5de76713","updated":"2018-04-11 07:43:27.000000000","message":"Could you also please tell me why (just to learn), the reason why I added it was because during testing I kept getting this warning along the lines of connection to placement is not authenticated.","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"f5ac4709f19128c2a7c1c3115cc7cd948ac61047","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":48,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":49,"context_line":"        self.req \u003d fakes.HTTPRequest.blank(\u0027\u0027)"},{"line_number":50,"context_line":"        with test.nested("},{"line_number":51,"context_line":"                mock.patch(\u0027keystoneauth1.adapter.Adapter\u0027,"},{"line_number":52,"context_line":"                           return_value\u003dself.ks_adap_mock),"},{"line_number":53,"context_line":"                mock.patch(\u0027keystoneauth1.loading.load_auth_from_conf_options\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_e84c789f","line":50,"range":{"start_line":50,"start_character":13,"end_line":50,"end_character":25},"in_reply_to":"bf659307_c8e894b4","updated":"2018-04-11 08:01:38.000000000","message":"I think I was hitting this one : https://github.com/openstack/nova/blob/5b30526919db56deeed4fc024675207cd0f70f9b/nova/scheduler/client/report.py#L81\n\nNot sure if any recent changes have happened.","commit_id":"1dc4bfaf33e79ba69a50ffcd8a2beb457db313d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ce373df4c427ed02ec5bd1a62521f5f95ac312e2","unresolved":false,"context_lines":[{"line_number":436,"context_line":"    @mock.patch.object(objects.ComputeNodeList, \u0027get_all_by_host\u0027)"},{"line_number":437,"context_line":"    @mock.patch.object(objects.HostMapping, \u0027destroy\u0027)"},{"line_number":438,"context_line":"    @mock.patch.object(objects.HostMapping, \u0027get_by_host\u0027)"},{"line_number":439,"context_line":"    def test_service_delete_compute_with_hms_and_rps(self, mock_hm,"},{"line_number":440,"context_line":"                                                mock_destroy, mock_get_cn):"},{"line_number":441,"context_line":"        compute \u003d self.host_api.db.service_create(self.ctxt,"},{"line_number":442,"context_line":"            {\u0027host\u0027: \u0027fake-compute-host\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf659307_0dda0577","line":439,"updated":"2018-04-11 22:34:15.000000000","message":"I don\u0027t think we need the unit test since the functional test covers everything.","commit_id":"c72a5d5727a65f66a903de0be94b8c4f24fa8922"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"803a9f463e07fefe8e6081fda9471ea7caff2406","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        fake_notifier.stub_notifier(self)"},{"line_number":48,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":49,"context_line":"        self.req \u003d fakes.HTTPRequest.blank(\u0027\u0027)"},{"line_number":50,"context_line":"        with test.nested("},{"line_number":51,"context_line":"                mock.patch(\u0027keystoneauth1.adapter.Adapter\u0027,"},{"line_number":52,"context_line":"                           return_value\u003dself.ks_adap_mock),"},{"line_number":53,"context_line":"                mock.patch(\u0027keystoneauth1.loading.load_auth_from_conf_options\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_35610e06","line":50,"updated":"2018-04-13 21:28:07.000000000","message":"Couldn\u0027t we just mock out the call to delete_resource_provider where we need to?","commit_id":"f82c1f0873ab8198597b867fef1c69592d830589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"70f52655e249e69c2ded7dce8ee9165262cea03c","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":49,"context_line":"        self.req \u003d fakes.HTTPRequest.blank(\u0027\u0027)"},{"line_number":50,"context_line":"        with test.nested("},{"line_number":51,"context_line":"                mock.patch(\u0027keystoneauth1.adapter.Adapter\u0027,"},{"line_number":52,"context_line":"                           return_value\u003dself.ks_adap_mock),"},{"line_number":53,"context_line":"                mock.patch(\u0027keystoneauth1.loading.load_auth_from_conf_options\u0027)"},{"line_number":54,"context_line":"        ):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_5eac219e","line":51,"updated":"2018-04-12 01:43:27.000000000","message":"indent is too far here","commit_id":"f82c1f0873ab8198597b867fef1c69592d830589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"803a9f463e07fefe8e6081fda9471ea7caff2406","unresolved":false,"context_lines":[{"line_number":419,"context_line":"             \u0027binary\u0027: \u0027nova-compute\u0027,"},{"line_number":420,"context_line":"             \u0027topic\u0027: \u0027compute\u0027,"},{"line_number":421,"context_line":"             \u0027report_count\u0027: 0})"},{"line_number":422,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_compute-host\","},{"line_number":423,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":424,"context_line":"        mock_get_cn.return_value \u003d [cn]"},{"line_number":425,"context_line":"        aggregate \u003d self.aggregate_api.create_aggregate(self.ctxt,"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_953b3ae8","line":422,"range":{"start_line":422,"start_character":54,"end_line":422,"end_character":71},"updated":"2018-04-13 21:28:07.000000000","message":"Should match the service.host: fake-compute-host","commit_id":"f82c1f0873ab8198597b867fef1c69592d830589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"803a9f463e07fefe8e6081fda9471ea7caff2406","unresolved":false,"context_lines":[{"line_number":420,"context_line":"             \u0027topic\u0027: \u0027compute\u0027,"},{"line_number":421,"context_line":"             \u0027report_count\u0027: 0})"},{"line_number":422,"context_line":"        cn \u003d objects.ComputeNode(uuid\u003duuids.cn, host\u003d\"fake_compute-host\","},{"line_number":423,"context_line":"                hypervisor_hostname\u003d\"fake_hostname\", )"},{"line_number":424,"context_line":"        mock_get_cn.return_value \u003d [cn]"},{"line_number":425,"context_line":"        aggregate \u003d self.aggregate_api.create_aggregate(self.ctxt,"},{"line_number":426,"context_line":"                                                   \u0027aggregate\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_3526eecf","line":423,"range":{"start_line":423,"start_character":37,"end_line":423,"end_character":50},"updated":"2018-04-13 21:28:07.000000000","message":"Unless it\u0027s ironic, this could match the host.","commit_id":"f82c1f0873ab8198597b867fef1c69592d830589"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"70f52655e249e69c2ded7dce8ee9165262cea03c","unresolved":false,"context_lines":[{"line_number":436,"context_line":"    @mock.patch.object(objects.ComputeNodeList, \u0027get_all_by_host\u0027)"},{"line_number":437,"context_line":"    @mock.patch.object(objects.HostMapping, \u0027destroy\u0027)"},{"line_number":438,"context_line":"    @mock.patch.object(objects.HostMapping, \u0027get_by_host\u0027)"},{"line_number":439,"context_line":"    def test_service_delete_compute_with_hms_and_rps(self, mock_hm,"},{"line_number":440,"context_line":"                                                mock_destroy, mock_get_cn):"},{"line_number":441,"context_line":"        compute \u003d self.host_api.db.service_create(self.ctxt,"},{"line_number":442,"context_line":"            {\u0027host\u0027: \u0027fake-compute-host\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_de97d144","line":439,"updated":"2018-04-12 01:43:27.000000000","message":"As noted in the last patch set (which I rebased over), I don\u0027t think we need the unit test since the functional test is covering the same thing but in a more reliable way since it\u0027s using live services.","commit_id":"f82c1f0873ab8198597b867fef1c69592d830589"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1590f267e4318b902baff013007ae4727c170909","unresolved":false,"context_lines":[{"line_number":436,"context_line":"    @mock.patch.object(objects.ComputeNodeList, \u0027get_all_by_host\u0027)"},{"line_number":437,"context_line":"    @mock.patch.object(objects.HostMapping, \u0027destroy\u0027)"},{"line_number":438,"context_line":"    @mock.patch.object(objects.HostMapping, \u0027get_by_host\u0027)"},{"line_number":439,"context_line":"    def test_service_delete_compute_with_hms_and_rps(self, mock_hm,"},{"line_number":440,"context_line":"                                                mock_destroy, mock_get_cn):"},{"line_number":441,"context_line":"        compute \u003d self.host_api.db.service_create(self.ctxt,"},{"line_number":442,"context_line":"            {\u0027host\u0027: \u0027fake-compute-host\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf659307_b2a214ad","line":439,"in_reply_to":"bf659307_de97d144","updated":"2018-04-13 20:18:28.000000000","message":"+1, seems like this unit test isn\u0027t covering anything additional over the functional test unless I\u0027ve missed something.","commit_id":"f82c1f0873ab8198597b867fef1c69592d830589"}]}
