)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bdb6d6aa8bb6e8784f5c63bdc00cbade0ec8392f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"become very huge. Given we agreed to not support soft-deleting those"},{"line_number":12,"context_line":"records, let\u0027s just delete those when the instance destroy is called."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"To be clear, in case the instance destroy API is returning an error,"},{"line_number":15,"context_line":"that\u0027s fine to have the ReqSpec record being already deleted, given"},{"line_number":16,"context_line":"there is no reason to synchronously make sure that those two records"},{"line_number":17,"context_line":"would be deleted at the same time."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"3f4b6375_2f7c9b81","line":15,"range":{"start_line":14,"start_character":0,"end_line":15,"end_character":60},"updated":"2017-11-02 15:07:27.000000000","message":"I disagree, see PS9.","commit_id":"2b0383166b59da13d9403f95b42a3a9ee72ae96a"}],"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3c517d5a953db375d9de7d841e662935d7b31d08","unresolved":false,"context_lines":[{"line_number":1801,"context_line":"                     instance\u003dinstance)"},{"line_number":1802,"context_line":"            return"},{"line_number":1803,"context_line":""},{"line_number":1804,"context_line":"        self._delete_request_spec(context, instance)"},{"line_number":1805,"context_line":""},{"line_number":1806,"context_line":"        # If there is an instance.host the instance has been scheduled and"},{"line_number":1807,"context_line":"        # sent to a cell/compute which means it was pulled from the cell db."}],"source_content_type":"text/x-python","patch_set":2,"id":"3a1ff146_c3dde243","line":1804,"updated":"2017-03-15 13:56:32.000000000","message":"What if we\u0027re doing a soft-delete? In that case, I could soft delete my instance, and then restore it before the timer runs in the compute to hard delete it. But with this change, you\u0027ve deleted the original request spec, so any kind of move operation I want to perform on the instance now doesn\u0027t have the request spec anymore.","commit_id":"e541c03aa4809078a2ce43decf08c86a8491280a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ba85e4e835a25291bd8ca76067c82dc76447e011","unresolved":false,"context_lines":[{"line_number":1828,"context_line":"        # NOTE(sbauza): The migration script we provided in Newton should make"},{"line_number":1829,"context_line":"        # sure that all our instances are currently migrated to have an"},{"line_number":1830,"context_line":"        # attached RequestSpec object but let\u0027s consider that the operator only"},{"line_number":1831,"context_line":"        # half migrated all their instances in the meantime."},{"line_number":1832,"context_line":"        try:"},{"line_number":1833,"context_line":"            request_spec \u003d objects.RequestSpec.get_by_instance_uuid("},{"line_number":1834,"context_line":"                context, instance.uuid)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffe62b97_6a817d8f","line":1831,"updated":"2017-03-27 15:39:05.000000000","message":"...or a failed previous delete, or a concurrent delete, right?\n\nWhy not just put the lookup and delete inside a catch of NotFound and briefly mention that we can hit that if 1. not migrated, 2. re-delete, 3. concurrent delete?","commit_id":"d72c288f1ba959a0217e0ce64b5fc979ad65d949"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ba85e4e835a25291bd8ca76067c82dc76447e011","unresolved":false,"context_lines":[{"line_number":1835,"context_line":"        except exception.RequestSpecNotFound:"},{"line_number":1836,"context_line":"            # Some old instances can still have no RequestSpec object attached"},{"line_number":1837,"context_line":"            # to them, we need to support the old way"},{"line_number":1838,"context_line":"            request_spec \u003d None"},{"line_number":1839,"context_line":"        if request_spec:"},{"line_number":1840,"context_line":"            try:"},{"line_number":1841,"context_line":"                # NOTE(sbauza): The consensus we agreed is that it\u0027s fine to"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffe62b97_2a7a55f0","line":1838,"updated":"2017-03-27 15:39:05.000000000","message":"You can just return here and avoid indenting all the rest right?","commit_id":"d72c288f1ba959a0217e0ce64b5fc979ad65d949"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ba85e4e835a25291bd8ca76067c82dc76447e011","unresolved":false,"context_lines":[{"line_number":1845,"context_line":"                # as a defensive approach. In case the instance record deletion"},{"line_number":1846,"context_line":"                # is erroring, then it means the instance VM state will become"},{"line_number":1847,"context_line":"                # an error too which means the only user possibility is to ask"},{"line_number":1848,"context_line":"                # for an instance deletion again."},{"line_number":1849,"context_line":"                request_spec.destroy()"},{"line_number":1850,"context_line":"            except exception.RequestSpecNotFound:"},{"line_number":1851,"context_line":"                # NOTE(sbauza): It should be possible that two concurrent"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffe62b97_aa56655b","line":1848,"updated":"2017-03-27 15:39:05.000000000","message":"I think this is overly verbose for what you\u0027re describing here.","commit_id":"d72c288f1ba959a0217e0ce64b5fc979ad65d949"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ba85e4e835a25291bd8ca76067c82dc76447e011","unresolved":false,"context_lines":[{"line_number":1853,"context_line":"                # we prefer to leave a warning rather than returning a HTTP500"},{"line_number":1854,"context_line":"                # to the user."},{"line_number":1855,"context_line":"                LOG.warning(_LW(\"RequestSpec attached to instance %s\""},{"line_number":1856,"context_line":"                                \" already deleted.\"), instance.uuid)"},{"line_number":1857,"context_line":""},{"line_number":1858,"context_line":"    def _delete(self, context, instance, delete_type, cb, **instance_attrs):"},{"line_number":1859,"context_line":"        if instance.disable_terminate:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ffe62b97_2af1356c","line":1856,"updated":"2017-03-27 15:39:05.000000000","message":"Probably shouldn\u0027t log at warning for this, especially since the essay above says it\u0027s fine. Maybe debug at most?","commit_id":"d72c288f1ba959a0217e0ce64b5fc979ad65d949"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"54b089a5475176b5b1f449d0a89dfb10a2276af1","unresolved":false,"context_lines":[{"line_number":1839,"context_line":"            # prefer to not raise an exception and silently agree with that."},{"line_number":1840,"context_line":"            return"},{"line_number":1841,"context_line":"        try:"},{"line_number":1842,"context_line":"            request_spec.destroy()"},{"line_number":1843,"context_line":"        except exception.RequestSpecNotFound:"},{"line_number":1844,"context_line":"            # NOTE(sbauza): The instance could have been deleted after we"},{"line_number":1845,"context_line":"            # looked it up."}],"source_content_type":"text/x-python","patch_set":8,"id":"1f013ff3_c279c4fc","line":1842,"updated":"2017-05-16 15:05:32.000000000","message":"Do we need to split it in two try..except blocks?\nIs the case for the failing on destroy really different than the failing on get?","commit_id":"a15cc82d34af61a09329c14b4b5bea8afaafcc23"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b66e6db2ff2109673f0dc2ef0d8c3daa2a4cf0a5","unresolved":false,"context_lines":[{"line_number":1839,"context_line":"            # prefer to not raise an exception and silently agree with that."},{"line_number":1840,"context_line":"            return"},{"line_number":1841,"context_line":"        try:"},{"line_number":1842,"context_line":"            request_spec.destroy()"},{"line_number":1843,"context_line":"        except exception.RequestSpecNotFound:"},{"line_number":1844,"context_line":"            # NOTE(sbauza): The instance could have been deleted after we"},{"line_number":1845,"context_line":"            # looked it up."}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_0edcbb72","line":1842,"in_reply_to":"1f013ff3_c279c4fc","updated":"2017-05-17 13:11:52.000000000","message":"I tend to agree we could just combine them and not really worry about logging a debug statement. The thing is gone, and that\u0027s what we wanted, so we don\u0027t need to log something for it separately.","commit_id":"a15cc82d34af61a09329c14b4b5bea8afaafcc23"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b66e6db2ff2109673f0dc2ef0d8c3daa2a4cf0a5","unresolved":false,"context_lines":[{"line_number":1856,"context_line":"            # NOTE(sbauza): Deleted instances can be restored if soft-deletion"},{"line_number":1857,"context_line":"            # is configured thanks to reclaim_instance_interval configuration"},{"line_number":1858,"context_line":"            # option. In that case, we should not delete the RequestSpec record"},{"line_number":1859,"context_line":"            # here but rather delete it when the instance is really deleted."},{"line_number":1860,"context_line":"            self._delete_request_spec(context, instance)"},{"line_number":1861,"context_line":""},{"line_number":1862,"context_line":"        # If there is an instance.host (or the instance is shelved-offloaded),"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_8ea0cba7","line":1859,"range":{"start_line":1859,"start_character":19,"end_line":1859,"end_character":76},"updated":"2017-05-17 13:11:52.000000000","message":"This is confusing since it implies that the compute service would delete the RequestSpec, but it\u0027s not, and probably shouldn\u0027t since that\u0027s an up-call to the API DB. I\u0027d probably remove this line.\n\nIn earlier discussions we talked about providing a nova-manage CLI to cleanup orphaned records in the API DB (in a separate change).","commit_id":"a15cc82d34af61a09329c14b4b5bea8afaafcc23"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b86eaf64f9812d7eddb6fe2eb9fd16b8055be5aa","unresolved":false,"context_lines":[{"line_number":1853,"context_line":"            # here."},{"line_number":1854,"context_line":"            # TODO(sbauza): Provide a CLI or periodic task to cleanup orphaned"},{"line_number":1855,"context_line":"            # request spec records."},{"line_number":1856,"context_line":"            self._delete_request_spec(context, instance)"},{"line_number":1857,"context_line":""},{"line_number":1858,"context_line":"        # If there is an instance.host (or the instance is shelved-offloaded),"},{"line_number":1859,"context_line":"        # the instance has been scheduled and sent to a cell/compute which"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_bcd5b0e7","line":1856,"updated":"2017-05-19 20:24:58.000000000","message":"One thing I thought about here, is should we move this until after we\u0027ve either deleted the instance locally or cast to the compute to delete the instance? Because if we delete the request spec and then we fail to delete the instance, things could get weird. But if we moved this, there are like 3 places we\u0027d have to duplicate this call which isn\u0027t fun either.","commit_id":"b2eed2c2812dcb44af684ed3748d930c14019a16"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c6be783ed3cf9a57f18c10c3cefcf78a79271ef0","unresolved":false,"context_lines":[{"line_number":1853,"context_line":"            # here."},{"line_number":1854,"context_line":"            # TODO(sbauza): Provide a CLI or periodic task to cleanup orphaned"},{"line_number":1855,"context_line":"            # request spec records."},{"line_number":1856,"context_line":"            self._delete_request_spec(context, instance)"},{"line_number":1857,"context_line":""},{"line_number":1858,"context_line":"        # If there is an instance.host (or the instance is shelved-offloaded),"},{"line_number":1859,"context_line":"        # the instance has been scheduled and sent to a cell/compute which"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_c0a7270b","line":1856,"in_reply_to":"ff0f0b1f_9c1aec7a","updated":"2017-05-22 17:12:45.000000000","message":"FWIW, we still have in code a safe procedure that fakes a RequestSpec object if we\u0027re unable to find one for each move operation, so I think it\u0027s harmless to delete the Spec now scheduler-wise.\n\nThat said, we could have a more conservative approach and do that later like you said. Honestly, I\u0027m not super opiniated.","commit_id":"b2eed2c2812dcb44af684ed3748d930c14019a16"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d82387ad18f15dbe892fea83a11bb546daa7100e","unresolved":false,"context_lines":[{"line_number":1853,"context_line":"            # here."},{"line_number":1854,"context_line":"            # TODO(sbauza): Provide a CLI or periodic task to cleanup orphaned"},{"line_number":1855,"context_line":"            # request spec records."},{"line_number":1856,"context_line":"            self._delete_request_spec(context, instance)"},{"line_number":1857,"context_line":""},{"line_number":1858,"context_line":"        # If there is an instance.host (or the instance is shelved-offloaded),"},{"line_number":1859,"context_line":"        # the instance has been scheduled and sent to a cell/compute which"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_9c1aec7a","line":1856,"in_reply_to":"ff0f0b1f_bcd5b0e7","updated":"2017-05-19 20:42:29.000000000","message":"+1, I thought the same thing. Example scenario: destroy fails and the user decides to just keep the instance around. But then things will fail if they do a resize or something that will invoke the scheduler, right? Because the reqspec will be gone.\n\nIt seems risky to not destroy them at the same time, but most of the time instance.destroy() is in compute and we don\u0027t want to be writing to the API database from compute.\n\nI\u0027m not sure what to do but I was thinking we should put a bit more thought into this before we do it.","commit_id":"b2eed2c2812dcb44af684ed3748d930c14019a16"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a36d87c29a92f962d7dac7042445cecc8cf90dfd","unresolved":false,"context_lines":[{"line_number":1853,"context_line":"            # here."},{"line_number":1854,"context_line":"            # TODO(sbauza): Provide a CLI or periodic task to cleanup orphaned"},{"line_number":1855,"context_line":"            # request spec records."},{"line_number":1856,"context_line":"            self._delete_request_spec(context, instance)"},{"line_number":1857,"context_line":""},{"line_number":1858,"context_line":"        # If there is an instance.host (or the instance is shelved-offloaded),"},{"line_number":1859,"context_line":"        # the instance has been scheduled and sent to a cell/compute which"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f4b6375_4f291788","line":1856,"in_reply_to":"ff0f0b1f_c0a7270b","updated":"2017-11-02 15:05:55.000000000","message":"\u003e FWIW, we still have in code a safe procedure that fakes a\n \u003e RequestSpec object if we\u0027re unable to find one for each move\n \u003e operation, so I think it\u0027s harmless to delete the Spec now\n \u003e scheduler-wise.\n \u003e \n \u003e That said, we could have a more conservative approach and do that\n \u003e later like you said. Honestly, I\u0027m not super opiniated.\n\nHaving been through a lot of the move operation code lately, I know what you\u0027re talking about with the \"if not request_spec: create_one()\" logic, but a lot of the time that is missing information and I don\u0027t think we should rely on it, plus it was there for newton compatibility and I think we want to start removing that stuff so that if we don\u0027t find a request spec, it\u0027s an error.\n\nI think doing it similar to https://review.openstack.org/#/c/515034/ is a better approach.","commit_id":"b2eed2c2812dcb44af684ed3748d930c14019a16"}],"nova/compute/cells_api.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e06ed4696abec16350cdd4c44302c0ef814f7a0f","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        self._handle_cell_delete(context, instance, \u0027delete\u0027)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _handle_cell_delete(self, context, instance, method_name):"},{"line_number":217,"context_line":"        self._delete_request_spec(context, instance)"},{"line_number":218,"context_line":"        if not instance.cell_name:"},{"line_number":219,"context_line":"            delete_type \u003d method_name \u003d\u003d \u0027soft_delete\u0027 and \u0027soft\u0027 or \u0027hard\u0027"},{"line_number":220,"context_line":"            self.cells_rpcapi.instance_delete_everywhere(context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_5fcece2e","line":217,"updated":"2017-03-21 10:42:31.000000000","message":"Unnecessary, we call nova.compute.api delete method by the cells messaging module for each cell when calling instance_delete_everywhere() below.","commit_id":"e541c03aa4809078a2ce43decf08c86a8491280a"}],"nova/tests/unit/compute/test_compute_api.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ba85e4e835a25291bd8ca76067c82dc76447e011","unresolved":false,"context_lines":[{"line_number":1437,"context_line":"    def test_delete_request_spec_with_success(self, get_by_instance_uuid):"},{"line_number":1438,"context_line":"        inst \u003d self._create_instance_obj()"},{"line_number":1439,"context_line":"        req_spec \u003d mock.MagicMock()"},{"line_number":1440,"context_line":"        get_by_instance_uuid.return_value \u003d req_spec"},{"line_number":1441,"context_line":"        self.compute_api._delete_request_spec(self.context, inst)"},{"line_number":1442,"context_line":"        req_spec.destroy.assert_called_once_with()"},{"line_number":1443,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ffe62b97_ed57e701","line":1440,"range":{"start_line":1440,"start_character":8,"end_line":1440,"end_character":52},"updated":"2017-03-27 15:39:05.000000000","message":"Just FYI, you don\u0027t need to do this. Below you can do:\n\n get_by_instance_uuid.return_value.destroy.assert_called_once_with()","commit_id":"d72c288f1ba959a0217e0ce64b5fc979ad65d949"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ad19b8736adfbaadd0d4191ee3ae71f0d04a12bc","unresolved":false,"context_lines":[{"line_number":1455,"context_line":"                                                 mock_destroy):"},{"line_number":1456,"context_line":"        inst \u003d self._create_instance_obj()"},{"line_number":1457,"context_line":"        get_by_instance_uuid.side_effect \u003d exception.RequestSpecNotFound("},{"line_number":1458,"context_line":"            instance_uuid\u003d\u0027uuid\u0027)"},{"line_number":1459,"context_line":"        mock_destroy.side_effect \u003d exception.RequestSpecNotFound("},{"line_number":1460,"context_line":"            instance_uuid\u003d\u0027uuid\u0027)"},{"line_number":1461,"context_line":"        # Just make sure we don\u0027t raise an exception here."}],"source_content_type":"text/x-python","patch_set":7,"id":"dfeb2761_d5c6009b","line":1458,"updated":"2017-04-03 16:00:35.000000000","message":"This will mean we never test the destroy NotFound case, right? This should return a thing and we should validate that if that thing\u0027s destroy() raises then we\u0027re still clean. Just using the MagicMock returned from mocking out get_by_instance_uuid should be fine.\n\n get_by_instance_uuid.return_value.destroy.side_effect \u003d exception..","commit_id":"8388d3e82218ef4d51e888af2a11bbf07aa9bb97"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"147dc993cd1ecb6d96bbcdadde598e02c9a29982","unresolved":false,"context_lines":[{"line_number":1455,"context_line":"                                                 mock_destroy):"},{"line_number":1456,"context_line":"        inst \u003d self._create_instance_obj()"},{"line_number":1457,"context_line":"        get_by_instance_uuid.side_effect \u003d exception.RequestSpecNotFound("},{"line_number":1458,"context_line":"            instance_uuid\u003d\u0027uuid\u0027)"},{"line_number":1459,"context_line":"        mock_destroy.side_effect \u003d exception.RequestSpecNotFound("},{"line_number":1460,"context_line":"            instance_uuid\u003d\u0027uuid\u0027)"},{"line_number":1461,"context_line":"        # Just make sure we don\u0027t raise an exception here."}],"source_content_type":"text/x-python","patch_set":7,"id":"7ffa3b31_3a5f5873","line":1458,"in_reply_to":"dfeb2761_d5c6009b","updated":"2017-04-18 15:35:51.000000000","message":"Oops","commit_id":"8388d3e82218ef4d51e888af2a11bbf07aa9bb97"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"78de033cdcf1b114cd94ef9f51d2485430e68a87","unresolved":false,"context_lines":[{"line_number":1361,"context_line":"        self.compute_api._delete_request_spec(self.context, inst)"},{"line_number":1362,"context_line":"        get_by_instance_uuid.return_value.destroy.assert_called_once_with()"},{"line_number":1363,"context_line":""},{"line_number":1364,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027destroy\u0027)"},{"line_number":1365,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027get_by_instance_uuid\u0027)"},{"line_number":1366,"context_line":"    def test_delete_request_spec_not_found(self, get_by_instance_uuid,"},{"line_number":1367,"context_line":"                                           mock_destroy):"},{"line_number":1368,"context_line":"        inst \u003d self._create_instance_obj()"},{"line_number":1369,"context_line":"        get_by_instance_uuid.side_effect \u003d exception.RequestSpecNotFound("},{"line_number":1370,"context_line":"            instance_uuid\u003d\u0027uuid\u0027)"},{"line_number":1371,"context_line":"        self.compute_api._delete_request_spec(self.context, inst)"},{"line_number":1372,"context_line":"        self.assertFalse(mock_destroy.called)"},{"line_number":1373,"context_line":""},{"line_number":1374,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027destroy\u0027)"},{"line_number":1375,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027get_by_instance_uuid\u0027)"},{"line_number":1376,"context_line":"    def test_delete_request_spec_already_deleted(self, get_by_instance_uuid,"},{"line_number":1377,"context_line":"                                                 mock_destroy):"},{"line_number":1378,"context_line":"        inst \u003d self._create_instance_obj()"},{"line_number":1379,"context_line":"        get_by_instance_uuid.return_value.destroy.side_effect \u003d ("},{"line_number":1380,"context_line":"            exception.RequestSpecNotFound("},{"line_number":1381,"context_line":"                instance_uuid\u003d\u0027uuid\u0027))"},{"line_number":1382,"context_line":"        # Just make sure we don\u0027t raise an exception here."},{"line_number":1383,"context_line":"        self.assertIsNone(self.compute_api._delete_request_spec(self.context,"},{"line_number":1384,"context_line":"                                                                inst))"},{"line_number":1385,"context_line":""},{"line_number":1386,"context_line":"    @mock.patch.object(objects.Service, \u0027get_minimum_version\u0027, return_value\u003d0)"},{"line_number":1387,"context_line":"    def test_delete_while_booting_low_service_version(self,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_9016c948","line":1384,"range":{"start_line":1364,"start_character":0,"end_line":1384,"end_character":70},"updated":"2017-07-28 07:51:55.000000000","message":"These two test cases are same substantially.\nSo remove the latter (test_delete_request_spec_already_deleted) and add self.assertIsNone(line 1383-1384) at the end of the former (test_delete_request_spec_not_found).","commit_id":"fbae76848ac88eab56e073a4f793ce62a0c80c15"}],"releasenotes/notes/destroy_deletes_reqspec-bff511ec8bc8d24d.yaml":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ba85e4e835a25291bd8ca76067c82dc76447e011","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    request when booting an instance. Previously, it was keeping all the"},{"line_number":5,"context_line":"    records even if an instance was deleted but now we delete the related"},{"line_number":6,"context_line":"    request_specs record if an instance is \u0027hard-deleted\u0027 only (ie. if"},{"line_number":7,"context_line":"    DEFAULT/reclaim_instance_interval\u003d0 which is the default opt value.)."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"ffe62b97_2a1b7581","line":7,"updated":"2017-03-27 15:39:05.000000000","message":"I don\u0027t really understand why this is important for operators. This is a super low-level implementation detail (i.e. we\u0027re now deleting things we should be deleting). What action do you expect to come out of this for the operator, or what are they going to be looking for as a result?","commit_id":"d72c288f1ba959a0217e0ce64b5fc979ad65d949"}]}
