)]}'
{"nova/compute/claims.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7d401ad09bd1f6cc0a084edd8984a82d9cb62085","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        resources required to execute the claim."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        :param resources: available local compute node resources"},{"line_number":135,"context_line":"        :param limits: Optional limits to test, either dict or"},{"line_number":136,"context_line":"            objects.SchedulerLimits"},{"line_number":137,"context_line":"        :raises: exception.ComputeResourcesUnavailable if any resource claim"},{"line_number":138,"context_line":"            fails"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_b77483d0","line":135,"updated":"2019-02-12 13:27:06.000000000","message":"Split this out at the bottom of the series since it will require a test.","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"505e2060a6b64387507ce1ccc2868c03de56ebcb","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        resources required to execute the claim."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        :param resources: available local compute node resources"},{"line_number":135,"context_line":"        :param limits: Optional limits to test, either dict or"},{"line_number":136,"context_line":"            objects.SchedulerLimits"},{"line_number":137,"context_line":"        :raises: exception.ComputeResourcesUnavailable if any resource claim"},{"line_number":138,"context_line":"            fails"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_9a44ff48","line":135,"in_reply_to":"9fdfeff1_b77483d0","updated":"2019-02-12 17:44:38.000000000","message":"Done","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"}],"nova/compute/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02d12a77e33b518b66ce75e1f0bcf5e9d2893ef8","unresolved":false,"context_lines":[{"line_number":4425,"context_line":"            # Claim resources on this target host using the new flavor which"},{"line_number":4426,"context_line":"            # will create the MigrationContext object. Do the other validation"},{"line_number":4427,"context_line":"            # within the MoveClaim context so we can drop the claim if anything"},{"line_number":4428,"context_line":"            # fails. The instance.new_flavor must be set before we call"},{"line_number":4429,"context_line":"            # resize_claim in order to track the new_flavor usage on this"},{"line_number":4430,"context_line":"            # host."},{"line_number":4431,"context_line":"            instance.new_flavor \u003d flavor"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_a8b2ef04","line":4428,"updated":"2019-02-12 01:20:10.000000000","message":"This should probably happen in conductor.","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"505e2060a6b64387507ce1ccc2868c03de56ebcb","unresolved":false,"context_lines":[{"line_number":4425,"context_line":"            # Claim resources on this target host using the new flavor which"},{"line_number":4426,"context_line":"            # will create the MigrationContext object. Do the other validation"},{"line_number":4427,"context_line":"            # within the MoveClaim context so we can drop the claim if anything"},{"line_number":4428,"context_line":"            # fails. The instance.new_flavor must be set before we call"},{"line_number":4429,"context_line":"            # resize_claim in order to track the new_flavor usage on this"},{"line_number":4430,"context_line":"            # host."},{"line_number":4431,"context_line":"            instance.new_flavor \u003d flavor"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_0572f4ad","line":4428,"in_reply_to":"9fdfeff1_a8b2ef04","updated":"2019-02-12 17:44:38.000000000","message":"Done","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02d12a77e33b518b66ce75e1f0bcf5e9d2893ef8","unresolved":false,"context_lines":[{"line_number":4454,"context_line":""},{"line_number":4455,"context_line":"        except Exception as ex:"},{"line_number":4456,"context_line":"            err \u003d six.text_type(ex)"},{"line_number":4457,"context_line":"            LOG.info(\u0027Cross-cell resize pre-checks failed for this host (%s). \u0027"},{"line_number":4458,"context_line":"                     \u0027Cleaning up. Failure: %s\u0027, self.host, err,"},{"line_number":4459,"context_line":"                     instance\u003dinstance, exc_info\u003dTrue)"},{"line_number":4460,"context_line":"            raise exception.MigrationPreCheckError("}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_c8b733f5","line":4457,"range":{"start_line":4457,"start_character":16,"end_line":4457,"end_character":20},"updated":"2019-02-12 01:20:10.000000000","message":"Maybe make this a warning so the exc_info makes more sense. And split it out.","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"505e2060a6b64387507ce1ccc2868c03de56ebcb","unresolved":false,"context_lines":[{"line_number":5075,"context_line":""},{"line_number":5076,"context_line":"        self._update_instance_after_spawn("},{"line_number":5077,"context_line":"            ctxt, instance, vm_state\u003dvm_states.RESIZED)"},{"line_number":5078,"context_line":"        instance.host \u003d migration.dest_compute"},{"line_number":5079,"context_line":"        instance.node \u003d migration.dest_node"},{"line_number":5080,"context_line":"        instance.save(expected_task_state\u003dtask_states.RESIZE_FINISH)"},{"line_number":5081,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_6560a0d0","line":5078,"updated":"2019-02-12 17:44:38.000000000","message":"These changes need to be split out.","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f550944c62dba5e60ad2aa56af208d8fd15838be","unresolved":false,"context_lines":[{"line_number":5075,"context_line":""},{"line_number":5076,"context_line":"        self._update_instance_after_spawn("},{"line_number":5077,"context_line":"            ctxt, instance, vm_state\u003dvm_states.RESIZED)"},{"line_number":5078,"context_line":"        instance.host \u003d migration.dest_compute"},{"line_number":5079,"context_line":"        instance.node \u003d migration.dest_node"},{"line_number":5080,"context_line":"        instance.save(expected_task_state\u003dtask_states.RESIZE_FINISH)"},{"line_number":5081,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_00598233","line":5078,"in_reply_to":"9fdfeff1_6560a0d0","updated":"2019-02-12 18:26:39.000000000","message":"Done","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"}],"nova/compute/resource_tracker.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7d401ad09bd1f6cc0a084edd8984a82d9cb62085","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"            return"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"        uuid \u003d migration.instance_uuid"},{"line_number":1041,"context_line":"        LOG.info(\"Updating resource usage from migration %s\", migration.uuid,"},{"line_number":1042,"context_line":"                 instance_uuid\u003duuid)"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"        incoming \u003d (migration.dest_compute \u003d\u003d self.host and"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_77a5bb46","line":1041,"updated":"2019-02-12 13:27:06.000000000","message":"Split the logging in here out to a separate patch at the bottom of the series since it requires some test changes.","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"505e2060a6b64387507ce1ccc2868c03de56ebcb","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"            return"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"        uuid \u003d migration.instance_uuid"},{"line_number":1041,"context_line":"        LOG.info(\"Updating resource usage from migration %s\", migration.uuid,"},{"line_number":1042,"context_line":"                 instance_uuid\u003duuid)"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"        incoming \u003d (migration.dest_compute \u003d\u003d self.host and"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_1a724fae","line":1041,"in_reply_to":"9fdfeff1_77a5bb46","updated":"2019-02-12 17:44:38.000000000","message":"Done","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"}],"nova/conductor/tasks/cross_cell_migrate.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02d12a77e33b518b66ce75e1f0bcf5e9d2893ef8","unresolved":false,"context_lines":[{"line_number":838,"context_line":"        :param target_cell_migration: Migration object from the target cell DB"},{"line_number":839,"context_line":"        :param target_cell_mapping: CellMapping object for the target cell"},{"line_number":840,"context_line":"        \"\"\""},{"line_number":841,"context_line":"        self._target_cell_instance.new_flavor \u003d self.flavor"},{"line_number":842,"context_line":"        task \u003d FinishResizeAtDestTask("},{"line_number":843,"context_line":"            self._target_cell_context, self._target_cell_instance,"},{"line_number":844,"context_line":"            target_cell_migration, self.instance, self.compute_rpcapi,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_88cdab86","line":841,"updated":"2019-02-12 01:20:10.000000000","message":"We actually need to do this in _prep_resize_at_dest.","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"505e2060a6b64387507ce1ccc2868c03de56ebcb","unresolved":false,"context_lines":[{"line_number":838,"context_line":"        :param target_cell_migration: Migration object from the target cell DB"},{"line_number":839,"context_line":"        :param target_cell_mapping: CellMapping object for the target cell"},{"line_number":840,"context_line":"        \"\"\""},{"line_number":841,"context_line":"        self._target_cell_instance.new_flavor \u003d self.flavor"},{"line_number":842,"context_line":"        task \u003d FinishResizeAtDestTask("},{"line_number":843,"context_line":"            self._target_cell_context, self._target_cell_instance,"},{"line_number":844,"context_line":"            target_cell_migration, self.instance, self.compute_rpcapi,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_5a377700","line":841,"in_reply_to":"9fdfeff1_88cdab86","updated":"2019-02-12 17:44:38.000000000","message":"Done","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02d12a77e33b518b66ce75e1f0bcf5e9d2893ef8","unresolved":false,"context_lines":[{"line_number":1748,"context_line":"            context, target_consumer_uuid)"},{"line_number":1749,"context_line":""},{"line_number":1750,"context_line":"        if target_alloc and target_alloc[\u0027allocations\u0027]:"},{"line_number":1751,"context_line":"            # Check to see if the source allocations still exist because if"},{"line_number":1752,"context_line":"            # they don\u0027t they might have already been moved to the target."},{"line_number":1753,"context_line":"            if not (source_alloc and source_alloc[\u0027allocations\u0027]):"},{"line_number":1754,"context_line":"                LOG.info(\u0027Allocations not found for consumer %s; assuming \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_6895e73f","line":1751,"updated":"2019-02-12 01:20:10.000000000","message":"This is a separate fix but I\u0027m not sure where to put it, probably before the first compute change that reverts the allocations on failure.","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"505e2060a6b64387507ce1ccc2868c03de56ebcb","unresolved":false,"context_lines":[{"line_number":1748,"context_line":"            context, target_consumer_uuid)"},{"line_number":1749,"context_line":""},{"line_number":1750,"context_line":"        if target_alloc and target_alloc[\u0027allocations\u0027]:"},{"line_number":1751,"context_line":"            # Check to see if the source allocations still exist because if"},{"line_number":1752,"context_line":"            # they don\u0027t they might have already been moved to the target."},{"line_number":1753,"context_line":"            if not (source_alloc and source_alloc[\u0027allocations\u0027]):"},{"line_number":1754,"context_line":"                LOG.info(\u0027Allocations not found for consumer %s; assuming \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_7ae11b9b","line":1751,"in_reply_to":"9fdfeff1_6895e73f","updated":"2019-02-12 17:44:38.000000000","message":"Done","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"}],"nova/tests/fixtures.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"02d12a77e33b518b66ce75e1f0bcf5e9d2893ef8","unresolved":false,"context_lines":[{"line_number":1374,"context_line":"            \u0027get_instances_security_groups_bindings\u0027,"},{"line_number":1375,"context_line":"            lambda *args, **kwargs: {})"},{"line_number":1376,"context_line":""},{"line_number":1377,"context_line":"        # Stub out port binding APIs which go through a KSA client Adapter"},{"line_number":1378,"context_line":"        # rather than python-neutronclient."},{"line_number":1379,"context_line":"        self.test.stub_out("},{"line_number":1380,"context_line":"            \u0027nova.network.neutronv2.api._get_ksa_client\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_a8a74fbc","line":1377,"updated":"2019-02-12 01:20:10.000000000","message":"This needs to all be separated out.","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"505e2060a6b64387507ce1ccc2868c03de56ebcb","unresolved":false,"context_lines":[{"line_number":1374,"context_line":"            \u0027get_instances_security_groups_bindings\u0027,"},{"line_number":1375,"context_line":"            lambda *args, **kwargs: {})"},{"line_number":1376,"context_line":""},{"line_number":1377,"context_line":"        # Stub out port binding APIs which go through a KSA client Adapter"},{"line_number":1378,"context_line":"        # rather than python-neutronclient."},{"line_number":1379,"context_line":"        self.test.stub_out("},{"line_number":1380,"context_line":"            \u0027nova.network.neutronv2.api._get_ksa_client\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_1aa1ef46","line":1377,"in_reply_to":"9fdfeff1_a8a74fbc","updated":"2019-02-12 17:44:38.000000000","message":"Done","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b02c65eb144fe67a9df801988565d21cb11adb1d","unresolved":false,"context_lines":[{"line_number":1952,"context_line":"        for volume_id, attachments in self.volume_to_attachment.items():"},{"line_number":1953,"context_line":"            for attachment in attachments.values():"},{"line_number":1954,"context_line":"                if attachment[\u0027instance_uuid\u0027] \u003d\u003d instance_uuid:"},{"line_number":1955,"context_line":"                    attachment_ids.append(attachment[\u0027id\u0027])"},{"line_number":1956,"context_line":"        return attachment_ids"},{"line_number":1957,"context_line":""},{"line_number":1958,"context_line":"    def setUp(self):"},{"line_number":1959,"context_line":"        super(CinderFixture, self).setUp()"}],"source_content_type":"text/x-python","patch_set":54,"id":"3fa7e38b_88c3898a","line":1956,"range":{"start_line":1955,"start_character":20,"end_line":1956,"end_character":29},"updated":"2019-11-14 17:20:19.000000000","message":"I assume we can\u0027t use yield here since that\u0027s not what the cinder API returns?","commit_id":"3b60442456ffa4470d0219d3ddf9ba6a572ee87e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f6176e7015171b0688e88fa555d0b91fef712f98","unresolved":false,"context_lines":[{"line_number":1952,"context_line":"        for volume_id, attachments in self.volume_to_attachment.items():"},{"line_number":1953,"context_line":"            for attachment in attachments.values():"},{"line_number":1954,"context_line":"                if attachment[\u0027instance_uuid\u0027] \u003d\u003d instance_uuid:"},{"line_number":1955,"context_line":"                    attachment_ids.append(attachment[\u0027id\u0027])"},{"line_number":1956,"context_line":"        return attachment_ids"},{"line_number":1957,"context_line":""},{"line_number":1958,"context_line":"    def setUp(self):"},{"line_number":1959,"context_line":"        super(CinderFixture, self).setUp()"}],"source_content_type":"text/x-python","patch_set":54,"id":"3fa7e38b_a88d2536","line":1956,"range":{"start_line":1955,"start_character":20,"end_line":1956,"end_character":29},"in_reply_to":"3fa7e38b_88c3898a","updated":"2019-11-14 17:24:10.000000000","message":"It\u0027s not really about the cinder API, this is just getting information out of the fixture about state it\u0027s tracking for attachments, i.e. it\u0027s counting how many attachments exist for a given volume and instance so that tests can assert that the attachments are what are expected after some operation, like server delete, is done. I needed this (and added the earlier attachment counting stuff) because I was having a hard time chasing down some bugs in the code which was doing volume attachment tracking incorrectly.","commit_id":"3b60442456ffa4470d0219d3ddf9ba6a572ee87e"}],"nova/tests/functional/test_cross_cell_migrate.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7d401ad09bd1f6cc0a084edd8984a82d9cb62085","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self.assertEqual(flavor[\u0027ram\u0027], hypervisor[\u0027memory_mb_used\u0027])"},{"line_number":94,"context_line":"        self.assertEqual(flavor[\u0027vcpus\u0027], hypervisor[\u0027vcpus_used\u0027])"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _resize_and_validate(self, volume_backed\u003dFalse):"},{"line_number":97,"context_line":"        \"\"\"Creates and resizes the server to another cell. Validates various"},{"line_number":98,"context_line":"        aspects of the server and its related records (allocations, migrations,"},{"line_number":99,"context_line":"        actions, VIF tags, etc)."}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_17322f11","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":28},"updated":"2019-02-12 13:27:06.000000000","message":"If image-backed, we should stub the image create fixture method so we can snoop and assert if a snapshot image was created and then deleted during the resize process.","commit_id":"daa521828640dfd077a485f81f086b7b04a9784e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bdd56f55e9e3ce5678ac1e840c4393e246b5d97d","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        # other cell."},{"line_number":143,"context_line":"        new_flavor \u003d flavors[1]"},{"line_number":144,"context_line":"        body \u003d {\u0027resize\u0027: {\u0027flavorRef\u0027: new_flavor[\u0027id\u0027]}}"},{"line_number":145,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], body)"},{"line_number":146,"context_line":"        # Wait for the server to be resized and then verify the host has"},{"line_number":147,"context_line":"        # changed to be the host in the other cell."},{"line_number":148,"context_line":"        server \u003d self._wait_for_state_change(self.api, server, \u0027VERIFY_RESIZE\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_0c5d0b78","line":145,"updated":"2019-02-14 16:10:05.000000000","message":"Before this we should stub out the image create API fixture so we can assert that in the image-backed case a snapshot image is created and then deleted.","commit_id":"4bbbfa176befa9dfa0df84c1de155d1c016f365b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ea7178ad6dd3a2fb080132f89877335b3c29d5b8","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        # other cell."},{"line_number":143,"context_line":"        new_flavor \u003d flavors[1]"},{"line_number":144,"context_line":"        body \u003d {\u0027resize\u0027: {\u0027flavorRef\u0027: new_flavor[\u0027id\u0027]}}"},{"line_number":145,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], body)"},{"line_number":146,"context_line":"        # Wait for the server to be resized and then verify the host has"},{"line_number":147,"context_line":"        # changed to be the host in the other cell."},{"line_number":148,"context_line":"        server \u003d self._wait_for_state_change(self.api, server, \u0027VERIFY_RESIZE\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_ca7fde12","line":145,"in_reply_to":"9fdfeff1_0c5d0b78","updated":"2019-02-14 21:41:46.000000000","message":"Added a TODO.","commit_id":"4bbbfa176befa9dfa0df84c1de155d1c016f365b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb2789c1306c3a19756373f10477c1736ff26228","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.host_to_cell_mappings \u003d {"},{"line_number":39,"context_line":"            \u0027host1\u0027: \u0027cell1\u0027, \u0027host2\u0027: \u0027cell2\u0027}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        # Make sure we start with 0 resource usage on each host (by default,"},{"line_number":42,"context_line":"        # reserved_host_memory_mb\u003d512 and is counted as usage in the"},{"line_number":43,"context_line":"        # hypervisors API)."},{"line_number":44,"context_line":"        self.flags(reserved_host_memory_mb\u003d0)"},{"line_number":45,"context_line":"        # TODO(mriedem): Should probably put the hosts in separate AZs so we"},{"line_number":46,"context_line":"        # can assert the instance.availability_zone value is updated when it"},{"line_number":47,"context_line":"        # moves."}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_a0aee02b","line":44,"range":{"start_line":41,"start_character":8,"end_line":44,"end_character":45},"updated":"2019-03-06 23:56:07.000000000","message":"Don\u0027t need this if we rebase on top of https://review.openstack.org/#/c/641521/.","commit_id":"b7200a89ba5f421a447558e5844ebe360af57a0f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"73efa95a224af3d5d9a9c99f70a0d2b83ee8e1c4","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.host_to_cell_mappings \u003d {"},{"line_number":39,"context_line":"            \u0027host1\u0027: \u0027cell1\u0027, \u0027host2\u0027: \u0027cell2\u0027}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        # Make sure we start with 0 resource usage on each host (by default,"},{"line_number":42,"context_line":"        # reserved_host_memory_mb\u003d512 and is counted as usage in the"},{"line_number":43,"context_line":"        # hypervisors API)."},{"line_number":44,"context_line":"        self.flags(reserved_host_memory_mb\u003d0)"},{"line_number":45,"context_line":"        # TODO(mriedem): Should probably put the hosts in separate AZs so we"},{"line_number":46,"context_line":"        # can assert the instance.availability_zone value is updated when it"},{"line_number":47,"context_line":"        # moves."}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_4d92baf8","line":44,"range":{"start_line":41,"start_character":8,"end_line":44,"end_character":45},"in_reply_to":"5fc1f717_a0aee02b","updated":"2019-03-07 22:42:16.000000000","message":"Done","commit_id":"b7200a89ba5f421a447558e5844ebe360af57a0f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb2789c1306c3a19756373f10477c1736ff26228","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.assertEqual("},{"line_number":81,"context_line":"            instance.ephemeral_gb, flavor[\u0027OS-FLV-EXT-DATA:ephemeral\u0027])"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def assert_hypervisor_usage(self, compute_node_uuid, flavor,"},{"line_number":84,"context_line":"                                volume_backed):"},{"line_number":85,"context_line":"        \"\"\"Asserts the given hypervisor\u0027s resource usage matches the"},{"line_number":86,"context_line":"        given flavor (assumes a single instance on the hypervisor)."},{"line_number":87,"context_line":"        \"\"\""},{"line_number":88,"context_line":"        hypervisor \u003d self.admin_api.api_get("},{"line_number":89,"context_line":"            \u0027/os-hypervisors/%s\u0027 % compute_node_uuid).body[\u0027hypervisor\u0027]"},{"line_number":90,"context_line":"        if volume_backed:"},{"line_number":91,"context_line":"            self.assertEqual(0, hypervisor[\u0027local_gb_used\u0027])"},{"line_number":92,"context_line":"        else:"},{"line_number":93,"context_line":"            self.assertEqual(flavor[\u0027disk\u0027], hypervisor[\u0027local_gb_used\u0027])"},{"line_number":94,"context_line":"        self.assertEqual(flavor[\u0027ram\u0027], hypervisor[\u0027memory_mb_used\u0027])"},{"line_number":95,"context_line":"        self.assertEqual(flavor[\u0027vcpus\u0027], hypervisor[\u0027vcpus_used\u0027])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def _count_volume_attachments(self, server_id):"},{"line_number":98,"context_line":"        attachment_ids \u003d self.cinder.attachment_ids_for_instance(server_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_e0bce86a","line":95,"range":{"start_line":83,"start_character":0,"end_line":95,"end_character":67},"updated":"2019-03-06 23:56:07.000000000","message":"Should rebase https://review.openstack.org/#/c/641521/ earlier in the series and then we can just re-use from that.","commit_id":"b7200a89ba5f421a447558e5844ebe360af57a0f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"73efa95a224af3d5d9a9c99f70a0d2b83ee8e1c4","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.assertEqual("},{"line_number":81,"context_line":"            instance.ephemeral_gb, flavor[\u0027OS-FLV-EXT-DATA:ephemeral\u0027])"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def assert_hypervisor_usage(self, compute_node_uuid, flavor,"},{"line_number":84,"context_line":"                                volume_backed):"},{"line_number":85,"context_line":"        \"\"\"Asserts the given hypervisor\u0027s resource usage matches the"},{"line_number":86,"context_line":"        given flavor (assumes a single instance on the hypervisor)."},{"line_number":87,"context_line":"        \"\"\""},{"line_number":88,"context_line":"        hypervisor \u003d self.admin_api.api_get("},{"line_number":89,"context_line":"            \u0027/os-hypervisors/%s\u0027 % compute_node_uuid).body[\u0027hypervisor\u0027]"},{"line_number":90,"context_line":"        if volume_backed:"},{"line_number":91,"context_line":"            self.assertEqual(0, hypervisor[\u0027local_gb_used\u0027])"},{"line_number":92,"context_line":"        else:"},{"line_number":93,"context_line":"            self.assertEqual(flavor[\u0027disk\u0027], hypervisor[\u0027local_gb_used\u0027])"},{"line_number":94,"context_line":"        self.assertEqual(flavor[\u0027ram\u0027], hypervisor[\u0027memory_mb_used\u0027])"},{"line_number":95,"context_line":"        self.assertEqual(flavor[\u0027vcpus\u0027], hypervisor[\u0027vcpus_used\u0027])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def _count_volume_attachments(self, server_id):"},{"line_number":98,"context_line":"        attachment_ids \u003d self.cinder.attachment_ids_for_instance(server_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_6d8f76cc","line":95,"range":{"start_line":83,"start_character":0,"end_line":95,"end_character":67},"in_reply_to":"5fc1f717_e0bce86a","updated":"2019-03-07 22:42:16.000000000","message":"Done","commit_id":"b7200a89ba5f421a447558e5844ebe360af57a0f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dee5a990022f89a37ab3d111e971dc3c4c0687a5","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.host_to_cell_mappings \u003d {"},{"line_number":39,"context_line":"            \u0027host1\u0027: \u0027cell1\u0027, \u0027host2\u0027: \u0027cell2\u0027}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        # TODO(mriedem): Should probably put the hosts in separate AZs so we"},{"line_number":42,"context_line":"        # can assert the instance.availability_zone value is updated when it"},{"line_number":43,"context_line":"        # moves."},{"line_number":44,"context_line":"        for host in sorted(self.host_to_cell_mappings):"},{"line_number":45,"context_line":"            self._start_compute("},{"line_number":46,"context_line":"                host, cell_name\u003dself.host_to_cell_mappings[host])"}],"source_content_type":"text/x-python","patch_set":10,"id":"5fc1f717_03cbeb1d","line":43,"range":{"start_line":41,"start_character":8,"end_line":43,"end_character":16},"updated":"2019-03-11 22:47:55.000000000","message":"This actually gets complicated because of...","commit_id":"94848cce76e1e50f2927d6b9aea901dfcd404fff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dee5a990022f89a37ab3d111e971dc3c4c0687a5","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            image_uuid\u003dfake_image.get_valid_image_id(),"},{"line_number":112,"context_line":"            flavor_id\u003dold_flavor[\u0027id\u0027],"},{"line_number":113,"context_line":"            networks\u003dnetworks,"},{"line_number":114,"context_line":"            # Something about migrating from host1 to host2 teases out failures"},{"line_number":115,"context_line":"            # which probably has to do with cell1 being the default cell DB in"},{"line_number":116,"context_line":"            # our base test class setup, so force host1 to make the tests"},{"line_number":117,"context_line":"            # deterministic."},{"line_number":118,"context_line":"            az\u003d\u0027nova:host1\u0027)"},{"line_number":119,"context_line":"        # Put a tag on the server to make sure that survives the resize."},{"line_number":120,"context_line":"        server[\u0027tags\u0027] \u003d [\u0027test\u0027]"},{"line_number":121,"context_line":"        if volume_backed:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5fc1f717_c3d403c0","line":118,"range":{"start_line":114,"start_character":12,"end_line":118,"end_character":28},"updated":"2019-03-11 22:47:55.000000000","message":"...this since this restricts the server to AZ\u003d\u0027nova\u0027...so I\u0027m not sure what to do about that. To ensure host1 is always picked for server create without using forced_hosts we could add a custom weigher which always weighs host1 higher than host2.","commit_id":"94848cce76e1e50f2927d6b9aea901dfcd404fff"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"698691c62f4d7a281e3d6b897ae174d90501a794","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"3fce034c_92b79c3b","line":367,"updated":"2019-04-10 20:40:22.000000000","message":"Could also be good to make sure archive still works by resize and confirm, then delete the server and then archive/purge the records to make sure it\u0027s all happy, meaning we didn\u0027t leave some unhandled referential constraint in the DB.","commit_id":"1f0ef854559188683b9c16748317999de0c1459a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"12541f8cdb54a45ff6049c420320b9c8cae9ea9f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"3fce034c_1282ccc9","line":367,"in_reply_to":"3fce034c_92b79c3b","updated":"2019-04-10 21:13:44.000000000","message":"Done: https://review.openstack.org/#/c/651650/","commit_id":"1f0ef854559188683b9c16748317999de0c1459a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"10453f9db1190480568a53c6d29c9db3b21cb7b5","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        self.assertEqual(expected_host, server[\u0027OS-EXT-SRV-ATTR:host\u0027])"},{"line_number":189,"context_line":"        # Assert that the instance is only listed one time from the API (to"},{"line_number":190,"context_line":"        # make sure it\u0027s not listed out of both cells)."},{"line_number":191,"context_line":"        # Note that we only get one because of _get_unique_filter_method in"},{"line_number":192,"context_line":"        # compute.api.API.get_all() which keys off uuid."},{"line_number":193,"context_line":"        servers \u003d self.api.get_servers()"},{"line_number":194,"context_line":"        self.assertEqual(1, len(servers),"},{"line_number":195,"context_line":"                         \u0027Unexpected number of servers: %s\u0027 % servers)"}],"source_content_type":"text/x-python","patch_set":40,"id":"7faddb67_a93415fc","line":192,"range":{"start_line":191,"start_character":1,"end_line":192,"end_character":56},"updated":"2019-09-02 14:48:53.000000000","message":"Is it still true? I thought we added instance.hidden to hide the second instance.","commit_id":"e11f4a0043d58f320b314c140967d33df753b4ab"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e852489e74fa489e9f9c74323c3e85e92cc61a42","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        self.assertEqual(expected_host, server[\u0027OS-EXT-SRV-ATTR:host\u0027])"},{"line_number":189,"context_line":"        # Assert that the instance is only listed one time from the API (to"},{"line_number":190,"context_line":"        # make sure it\u0027s not listed out of both cells)."},{"line_number":191,"context_line":"        # Note that we only get one because of _get_unique_filter_method in"},{"line_number":192,"context_line":"        # compute.api.API.get_all() which keys off uuid."},{"line_number":193,"context_line":"        servers \u003d self.api.get_servers()"},{"line_number":194,"context_line":"        self.assertEqual(1, len(servers),"},{"line_number":195,"context_line":"                         \u0027Unexpected number of servers: %s\u0027 % servers)"}],"source_content_type":"text/x-python","patch_set":40,"id":"3fa7e38b_630b0e8e","line":192,"range":{"start_line":191,"start_character":1,"end_line":192,"end_character":56},"in_reply_to":"7faddb67_a93415fc","updated":"2019-09-18 20:50:18.000000000","message":"Yeah this could be removed or re-worded since I changed Iaffb27bd8c562ba120047c04bb62619c0864f594 at Dan\u0027s suggestion to just filter hidden instances out of the DB API results by default.","commit_id":"e11f4a0043d58f320b314c140967d33df753b4ab"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"10453f9db1190480568a53c6d29c9db3b21cb7b5","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        \"\"\""},{"line_number":316,"context_line":"        self._resize_and_validate()"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # TODO(mriedem): See: https://review.openstack.org/#/c/603930/"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def test_resize_revert_volume_backed(self):"},{"line_number":321,"context_line":"        \"\"\"Tests a volume-backed resize to another cell where the resize"}],"source_content_type":"text/x-python","patch_set":40,"id":"7faddb67_69b7fd86","line":318,"updated":"2019-09-02 14:48:53.000000000","message":"The referred review has been abandoned.","commit_id":"e11f4a0043d58f320b314c140967d33df753b4ab"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e852489e74fa489e9f9c74323c3e85e92cc61a42","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        \"\"\""},{"line_number":316,"context_line":"        self._resize_and_validate()"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # TODO(mriedem): See: https://review.openstack.org/#/c/603930/"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def test_resize_revert_volume_backed(self):"},{"line_number":321,"context_line":"        \"\"\"Tests a volume-backed resize to another cell where the resize"}],"source_content_type":"text/x-python","patch_set":40,"id":"3fa7e38b_83f3aa9e","line":318,"in_reply_to":"7faddb67_69b7fd86","updated":"2019-09-18 20:50:18.000000000","message":"I think that was just a TODO to myself to copy the confirm assertions from that into here which happens later in the series, so maybe I\u0027ll just link to that instead or just re-word the TODO.","commit_id":"e11f4a0043d58f320b314c140967d33df753b4ab"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"10453f9db1190480568a53c6d29c9db3b21cb7b5","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    # being resized to is only available, via aggregate, on the host in the"},{"line_number":359,"context_line":"    # other cell so the CrossCellWeigher is overruled by the filters."},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    # TODO(mriedem): Test a bunch of rollback scenarios."},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    # TODO(mriedem): Test cross-cell anti-affinity group assumptions from"},{"line_number":364,"context_line":"    # scheduler utils setup_instance_group where it assumes moves are within"}],"source_content_type":"text/x-python","patch_set":40,"id":"7faddb67_143f80b5","line":361,"updated":"2019-09-02 14:48:53.000000000","message":"+ test re-schedule scenarios.","commit_id":"e11f4a0043d58f320b314c140967d33df753b4ab"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e852489e74fa489e9f9c74323c3e85e92cc61a42","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    # being resized to is only available, via aggregate, on the host in the"},{"line_number":359,"context_line":"    # other cell so the CrossCellWeigher is overruled by the filters."},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    # TODO(mriedem): Test a bunch of rollback scenarios."},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    # TODO(mriedem): Test cross-cell anti-affinity group assumptions from"},{"line_number":364,"context_line":"    # scheduler utils setup_instance_group where it assumes moves are within"}],"source_content_type":"text/x-python","patch_set":40,"id":"3fa7e38b_e33b7e35","line":361,"in_reply_to":"7faddb67_143f80b5","updated":"2019-09-18 20:50:18.000000000","message":"Done","commit_id":"e11f4a0043d58f320b314c140967d33df753b4ab"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b1cf2f1093714a02afc8fc913cad001b9fe6d952","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.tests.unit.image import fake as fake_image"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class HostNameWeigher(weights.BaseHostWeigher):"},{"line_number":22,"context_line":"    # TestMultiCellMigrate creates host1 in cell1 and host2 in cell2."},{"line_number":23,"context_line":"    # Something about migrating from host1 to host2 teases out failures"},{"line_number":24,"context_line":"    # which probably has to do with cell1 being the default cell DB in"},{"line_number":25,"context_line":"    # our base test class setup, so prefer host1 to make the tests"},{"line_number":26,"context_line":"    # deterministic."},{"line_number":27,"context_line":"    _weights \u003d {\u0027host1\u0027: 100, \u0027host2\u0027: 50}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def _weigh_object(self, host_state, weight_properties):"},{"line_number":30,"context_line":"        # Any undefined host gets no weight."},{"line_number":31,"context_line":"        return self._weights.get(host_state.host, 0)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TestMultiCellMigrate(integrated_helpers.ProviderUsageBaseTestCase):"}],"source_content_type":"text/x-python","patch_set":54,"id":"3fa7e38b_14434713","line":31,"range":{"start_line":21,"start_character":0,"end_line":31,"end_character":52},"updated":"2019-11-13 16:45:36.000000000","message":"There is now a fixture for this nova.tests.fixtures.HostNameWeigherFixture","commit_id":"3b60442456ffa4470d0219d3ddf9ba6a572ee87e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"db7af1e0d5bf14de9fa61522e6cb8a30c50c4830","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.tests.unit.image import fake as fake_image"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class HostNameWeigher(weights.BaseHostWeigher):"},{"line_number":22,"context_line":"    # TestMultiCellMigrate creates host1 in cell1 and host2 in cell2."},{"line_number":23,"context_line":"    # Something about migrating from host1 to host2 teases out failures"},{"line_number":24,"context_line":"    # which probably has to do with cell1 being the default cell DB in"},{"line_number":25,"context_line":"    # our base test class setup, so prefer host1 to make the tests"},{"line_number":26,"context_line":"    # deterministic."},{"line_number":27,"context_line":"    _weights \u003d {\u0027host1\u0027: 100, \u0027host2\u0027: 50}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def _weigh_object(self, host_state, weight_properties):"},{"line_number":30,"context_line":"        # Any undefined host gets no weight."},{"line_number":31,"context_line":"        return self._weights.get(host_state.host, 0)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TestMultiCellMigrate(integrated_helpers.ProviderUsageBaseTestCase):"}],"source_content_type":"text/x-python","patch_set":54,"id":"3fa7e38b_34b5237f","line":31,"range":{"start_line":21,"start_character":0,"end_line":31,"end_character":52},"in_reply_to":"3fa7e38b_14434713","updated":"2019-11-13 17:00:56.000000000","message":"Ack. I like the documentation in this so if it\u0027s all the same I\u0027ll likely leave it.","commit_id":"3b60442456ffa4470d0219d3ddf9ba6a572ee87e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bbaf22c61634c156bef8180fad31416137ed0cd0","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.tests.unit.image import fake as fake_image"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class HostNameWeigher(weights.BaseHostWeigher):"},{"line_number":22,"context_line":"    # TestMultiCellMigrate creates host1 in cell1 and host2 in cell2."},{"line_number":23,"context_line":"    # Something about migrating from host1 to host2 teases out failures"},{"line_number":24,"context_line":"    # which probably has to do with cell1 being the default cell DB in"},{"line_number":25,"context_line":"    # our base test class setup, so prefer host1 to make the tests"},{"line_number":26,"context_line":"    # deterministic."},{"line_number":27,"context_line":"    _weights \u003d {\u0027host1\u0027: 100, \u0027host2\u0027: 50}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def _weigh_object(self, host_state, weight_properties):"},{"line_number":30,"context_line":"        # Any undefined host gets no weight."},{"line_number":31,"context_line":"        return self._weights.get(host_state.host, 0)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TestMultiCellMigrate(integrated_helpers.ProviderUsageBaseTestCase):"}],"source_content_type":"text/x-python","patch_set":54,"id":"3fa7e38b_b7a7cb09","line":31,"range":{"start_line":21,"start_character":0,"end_line":31,"end_character":52},"in_reply_to":"3fa7e38b_34b5237f","updated":"2019-11-14 07:29:25.000000000","message":"I think you can move the documentation to to the place where you call         self.useFixture(nova_fixtures.HostNameWeigherFixture()) in setUp()","commit_id":"3b60442456ffa4470d0219d3ddf9ba6a572ee87e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"19f600e334ffcef57a8f769b38821a4336d2f35c","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.tests.unit.image import fake as fake_image"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class HostNameWeigher(weights.BaseHostWeigher):"},{"line_number":22,"context_line":"    # TestMultiCellMigrate creates host1 in cell1 and host2 in cell2."},{"line_number":23,"context_line":"    # Something about migrating from host1 to host2 teases out failures"},{"line_number":24,"context_line":"    # which probably has to do with cell1 being the default cell DB in"},{"line_number":25,"context_line":"    # our base test class setup, so prefer host1 to make the tests"},{"line_number":26,"context_line":"    # deterministic."},{"line_number":27,"context_line":"    _weights \u003d {\u0027host1\u0027: 100, \u0027host2\u0027: 50}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def _weigh_object(self, host_state, weight_properties):"},{"line_number":30,"context_line":"        # Any undefined host gets no weight."},{"line_number":31,"context_line":"        return self._weights.get(host_state.host, 0)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TestMultiCellMigrate(integrated_helpers.ProviderUsageBaseTestCase):"}],"source_content_type":"text/x-python","patch_set":54,"id":"3fa7e38b_ee88f322","line":31,"range":{"start_line":21,"start_character":0,"end_line":31,"end_character":52},"in_reply_to":"3fa7e38b_a843e510","updated":"2019-11-15 20:55:39.000000000","message":"I tried using the fixture at the end of the series and it\u0027s not a straight replacement because it overwrites the weights and later in the series when I add the CrossCellWeigher I need to be able to control that:\n\nhttps://review.opendev.org/#/c/614353/64/nova/tests/functional/test_cross_cell_migrate.py\n\nSo I\u0027m just going to leave it for now.","commit_id":"3b60442456ffa4470d0219d3ddf9ba6a572ee87e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b02c65eb144fe67a9df801988565d21cb11adb1d","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.tests.unit.image import fake as fake_image"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class HostNameWeigher(weights.BaseHostWeigher):"},{"line_number":22,"context_line":"    # TestMultiCellMigrate creates host1 in cell1 and host2 in cell2."},{"line_number":23,"context_line":"    # Something about migrating from host1 to host2 teases out failures"},{"line_number":24,"context_line":"    # which probably has to do with cell1 being the default cell DB in"},{"line_number":25,"context_line":"    # our base test class setup, so prefer host1 to make the tests"},{"line_number":26,"context_line":"    # deterministic."},{"line_number":27,"context_line":"    _weights \u003d {\u0027host1\u0027: 100, \u0027host2\u0027: 50}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def _weigh_object(self, host_state, weight_properties):"},{"line_number":30,"context_line":"        # Any undefined host gets no weight."},{"line_number":31,"context_line":"        return self._weights.get(host_state.host, 0)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TestMultiCellMigrate(integrated_helpers.ProviderUsageBaseTestCase):"}],"source_content_type":"text/x-python","patch_set":54,"id":"3fa7e38b_a843e510","line":31,"range":{"start_line":21,"start_character":0,"end_line":31,"end_character":52},"in_reply_to":"3fa7e38b_b7a7cb09","updated":"2019-11-14 17:20:19.000000000","message":"+1. Would be a decent follow-up, IMO","commit_id":"3b60442456ffa4470d0219d3ddf9ba6a572ee87e"}],"nova/virt/fake.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"933e1ca7c703f3a13306c088583a467222572673","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        \"supports_evacuate\": True,"},{"line_number":131,"context_line":"        \"supports_migrate_to_same_host\": True,"},{"line_number":132,"context_line":"        \"supports_attach_interface\": True,"},{"line_number":133,"context_line":"        \"supports_device_tagging\": True,"},{"line_number":134,"context_line":"        \"supports_tagged_attach_interface\": True,"},{"line_number":135,"context_line":"        \"supports_tagged_attach_volume\": True,"},{"line_number":136,"context_line":"        \"supports_extend_volume\": True,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_829f0302","line":133,"updated":"2019-03-08 14:24:51.000000000","message":"Oh I see this throws off the auto-generated compute traits.","commit_id":"cc9a9cdddf1c64a208afe03b6873d9f74d923ac0"}]}
