)]}'
{"doc/source/admin/configuration/schedulers.rst":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7db02e62ae60ebdea75c3a77ca6ba3e6465cfc48","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"Ensures hosts in tenant-isolated :ref:`host-aggregates` will only be available"},{"line_number":217,"context_line":"to a specified set of tenants. If a host is in an aggregate that has the"},{"line_number":218,"context_line":"``filter_tenant_id`` metadata key, the host creates instances from only that"},{"line_number":219,"context_line":"tenant or comma-separated list of tenants. A host can be in different"},{"line_number":220,"context_line":"aggregates. If a host does not belong to an aggregate with the metadata key,"},{"line_number":221,"context_line":"the host can create instances from all tenants. This does not restrict the"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f79a3b5_87fc1fb6","line":218,"range":{"start_line":218,"start_character":44,"end_line":218,"end_character":51},"updated":"2018-09-12 14:56:21.000000000","message":"receives?\n\nSaying \"the host creates instances\" doesn\u0027t sound right to me.","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"36f19f40db78694f6fb65cdc3d229ce7dc96655d","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"Ensures hosts in tenant-isolated :ref:`host-aggregates` will only be available"},{"line_number":217,"context_line":"to a specified set of tenants. If a host is in an aggregate that has the"},{"line_number":218,"context_line":"``filter_tenant_id`` metadata key, the host creates instances from only that"},{"line_number":219,"context_line":"tenant or comma-separated list of tenants. A host can be in different"},{"line_number":220,"context_line":"aggregates. If a host does not belong to an aggregate with the metadata key,"},{"line_number":221,"context_line":"the host can create instances from all tenants. This does not restrict the"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f79a3b5_982ea0a9","line":218,"range":{"start_line":218,"start_character":44,"end_line":218,"end_character":51},"in_reply_to":"3f79a3b5_87bf3fa9","updated":"2018-09-13 18:25:21.000000000","message":"How about \"the host can build instances from only that tenant...\"?","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3f8709ce1d896320f29c823561247f8afa82dc3d","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"Ensures hosts in tenant-isolated :ref:`host-aggregates` will only be available"},{"line_number":217,"context_line":"to a specified set of tenants. If a host is in an aggregate that has the"},{"line_number":218,"context_line":"``filter_tenant_id`` metadata key, the host creates instances from only that"},{"line_number":219,"context_line":"tenant or comma-separated list of tenants. A host can be in different"},{"line_number":220,"context_line":"aggregates. If a host does not belong to an aggregate with the metadata key,"},{"line_number":221,"context_line":"the host can create instances from all tenants. This does not restrict the"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f79a3b5_87bf3fa9","line":218,"range":{"start_line":218,"start_character":44,"end_line":218,"end_character":51},"in_reply_to":"3f79a3b5_87fc1fb6","updated":"2018-09-12 15:10:10.000000000","message":"yeah or accepts because technically that\u0027s not the host itself but the nova-compute service which creates the instance.","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fbd26de38b050d82ea80825ad14d37872973818","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"Ensures hosts in tenant-isolated :ref:`host-aggregates` will only be available"},{"line_number":217,"context_line":"to a specified set of tenants. If a host is in an aggregate that has the"},{"line_number":218,"context_line":"``filter_tenant_id`` metadata key, the host creates instances from only that"},{"line_number":219,"context_line":"tenant or comma-separated list of tenants. A host can be in different"},{"line_number":220,"context_line":"aggregates. If a host does not belong to an aggregate with the metadata key,"},{"line_number":221,"context_line":"the host can create instances from all tenants. This does not restrict the"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f79a3b5_6bcc10bb","line":218,"range":{"start_line":218,"start_character":44,"end_line":218,"end_character":51},"in_reply_to":"3f79a3b5_982ea0a9","updated":"2018-09-13 18:37:50.000000000","message":"\"This is fine\".","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7db02e62ae60ebdea75c3a77ca6ba3e6465cfc48","unresolved":false,"context_lines":[{"line_number":218,"context_line":"``filter_tenant_id`` metadata key, the host creates instances from only that"},{"line_number":219,"context_line":"tenant or comma-separated list of tenants. A host can be in different"},{"line_number":220,"context_line":"aggregates. If a host does not belong to an aggregate with the metadata key,"},{"line_number":221,"context_line":"the host can create instances from all tenants. This does not restrict the"},{"line_number":222,"context_line":"tenant from creating servers on hosts outside the tenant-isolation aggregate."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"For example, consider there are two available hosts for scheduling, HostA and"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f79a3b5_272bcb33","line":221,"range":{"start_line":221,"start_character":4,"end_line":221,"end_character":29},"updated":"2018-09-12 14:56:21.000000000","message":"same here.","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1222261fbd5b67187fc3664967e3c689b7339f5","unresolved":false,"context_lines":[{"line_number":219,"context_line":"tenant or comma-separated list of tenants. A host can be in different"},{"line_number":220,"context_line":"aggregates. If a host does not belong to an aggregate with the metadata key,"},{"line_number":221,"context_line":"the host can create instances from all tenants. This does not restrict the"},{"line_number":222,"context_line":"tenant from creating servers on hosts outside the tenant-isolation aggregate."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"For example, consider there are two available hosts for scheduling, HostA and"},{"line_number":225,"context_line":"HostB. HostB is in an aggregate isolated to tenant X. A server create request"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f79a3b5_33e1db9c","line":222,"range":{"start_line":222,"start_character":57,"end_line":222,"end_character":66},"updated":"2018-09-11 22:32:56.000000000","message":"isolated","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1222261fbd5b67187fc3664967e3c689b7339f5","unresolved":false,"context_lines":[{"line_number":224,"context_line":"For example, consider there are two available hosts for scheduling, HostA and"},{"line_number":225,"context_line":"HostB. HostB is in an aggregate isolated to tenant X. A server create request"},{"line_number":226,"context_line":"from tenant X will result in either HostA *or* HostB as candidates during"},{"line_number":227,"context_line":"scheduling. A server create request from another non-isolated tenant Y will"},{"line_number":228,"context_line":"result in only HostA being a scheduling candidate since HostA is not part of"},{"line_number":229,"context_line":"the tenant-isolated aggregate."},{"line_number":230,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f79a3b5_f3c36305","line":227,"range":{"start_line":227,"start_character":49,"end_line":227,"end_character":61},"updated":"2018-09-11 22:32:56.000000000","message":"Maybe remove this? The tenant isn\u0027t isolated, the host is.","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7db02e62ae60ebdea75c3a77ca6ba3e6465cfc48","unresolved":false,"context_lines":[{"line_number":224,"context_line":"For example, consider there are two available hosts for scheduling, HostA and"},{"line_number":225,"context_line":"HostB. HostB is in an aggregate isolated to tenant X. A server create request"},{"line_number":226,"context_line":"from tenant X will result in either HostA *or* HostB as candidates during"},{"line_number":227,"context_line":"scheduling. A server create request from another non-isolated tenant Y will"},{"line_number":228,"context_line":"result in only HostA being a scheduling candidate since HostA is not part of"},{"line_number":229,"context_line":"the tenant-isolated aggregate."},{"line_number":230,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f79a3b5_c71bf719","line":227,"range":{"start_line":227,"start_character":49,"end_line":227,"end_character":61},"in_reply_to":"3f79a3b5_f3c36305","updated":"2018-09-12 14:56:21.000000000","message":"Yes.","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"}],"nova/tests/functional/test_aggregates.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1222261fbd5b67187fc3664967e3c689b7339f5","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        self.host_mappings[\u0027compute2\u0027].destroy()"},{"line_number":69,"context_line":"        self.assertEqual(2, self._add_hosts_to_aggregate())"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_aggregate_multitenancy_isolation_filter(self):"},{"line_number":72,"context_line":"        \"\"\"Tests common scenarios with the AggregateMultiTenancyIsolation"},{"line_number":73,"context_line":"        filter:"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_7300b336","line":71,"updated":"2018-09-11 22:32:56.000000000","message":"Maybe I should move this to a new test class so we can be more opinionated in the setup wrt parent class and scheduler config.","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3f8709ce1d896320f29c823561247f8afa82dc3d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        self.host_mappings[\u0027compute2\u0027].destroy()"},{"line_number":69,"context_line":"        self.assertEqual(2, self._add_hosts_to_aggregate())"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_aggregate_multitenancy_isolation_filter(self):"},{"line_number":72,"context_line":"        \"\"\"Tests common scenarios with the AggregateMultiTenancyIsolation"},{"line_number":73,"context_line":"        filter:"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_472da7fb","line":71,"in_reply_to":"3f79a3b5_7300b336","updated":"2018-09-12 15:10:10.000000000","message":"We have a couple of aggregate-related filters. Having a separate test class sounds a good idea.","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1222261fbd5b67187fc3664967e3c689b7339f5","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        server_req \u003d {\u0027server\u0027: server_req}"},{"line_number":111,"context_line":"        with utils.temporary_mutation(self.api, microversion\u003d\u00272.37\u0027):"},{"line_number":112,"context_line":"            server \u003d self.api.post_server(server_req)"},{"line_number":113,"context_line":"        for x in range(10):"},{"line_number":114,"context_line":"            server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":115,"context_line":"            if server[\u0027status\u0027] \u003d\u003d \u0027ACTIVE\u0027:"},{"line_number":116,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_538c97d6","line":113,"updated":"2018-09-11 22:32:56.000000000","message":"I don\u0027t know why this is needed since we\u0027re using the CastAsCall fixture in the parent class setup, but I was hitting failures without it (the server was in BUILD rather than ACTIVE status).","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3f8709ce1d896320f29c823561247f8afa82dc3d","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        server_req \u003d {\u0027server\u0027: server_req}"},{"line_number":111,"context_line":"        with utils.temporary_mutation(self.api, microversion\u003d\u00272.37\u0027):"},{"line_number":112,"context_line":"            server \u003d self.api.post_server(server_req)"},{"line_number":113,"context_line":"        for x in range(10):"},{"line_number":114,"context_line":"            server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":115,"context_line":"            if server[\u0027status\u0027] \u003d\u003d \u0027ACTIVE\u0027:"},{"line_number":116,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_c74f77bc","line":113,"in_reply_to":"3f79a3b5_538c97d6","updated":"2018-09-12 15:10:10.000000000","message":"IIRC, most of the functional tests have an helper method that does the active wait check (_wait_for_state_check). You could just reuse it.","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4fbd26de38b050d82ea80825ad14d37872973818","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        server_req \u003d {\u0027server\u0027: server_req}"},{"line_number":111,"context_line":"        with utils.temporary_mutation(self.api, microversion\u003d\u00272.37\u0027):"},{"line_number":112,"context_line":"            server \u003d self.api.post_server(server_req)"},{"line_number":113,"context_line":"        for x in range(10):"},{"line_number":114,"context_line":"            server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":115,"context_line":"            if server[\u0027status\u0027] \u003d\u003d \u0027ACTIVE\u0027:"},{"line_number":116,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_cbbc4408","line":113,"in_reply_to":"3f79a3b5_783b84e9","updated":"2018-09-13 18:37:50.000000000","message":"Cool.","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"36f19f40db78694f6fb65cdc3d229ce7dc96655d","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        server_req \u003d {\u0027server\u0027: server_req}"},{"line_number":111,"context_line":"        with utils.temporary_mutation(self.api, microversion\u003d\u00272.37\u0027):"},{"line_number":112,"context_line":"            server \u003d self.api.post_server(server_req)"},{"line_number":113,"context_line":"        for x in range(10):"},{"line_number":114,"context_line":"            server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":115,"context_line":"            if server[\u0027status\u0027] \u003d\u003d \u0027ACTIVE\u0027:"},{"line_number":116,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_783b84e9","line":113,"in_reply_to":"3f79a3b5_c74f77bc","updated":"2018-09-13 18:25:21.000000000","message":"Yes, expect it\u0027s not in _IntegratedTestBase, it\u0027s in a different mixin and those both define _build_minimal_create_server_request so you can\u0027t use both mixins at the same time, which is always annoying. I\u0027ll rewrite the test to be it\u0027s own test class and use the non _IntegratedTestBase base class.","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3f8709ce1d896320f29c823561247f8afa82dc3d","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            time.sleep(.05)"},{"line_number":138,"context_line":"        else:"},{"line_number":139,"context_line":"            self.fail(\u0027Timed out waiting for server to be ACTIVE\u0027)"},{"line_number":140,"context_line":"        self.assertEqual(2, len(self.filtered_hosts))"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class AggregateRequestFiltersTest(test.TestCase,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_c7abf71b","line":140,"updated":"2018-09-12 15:10:10.000000000","message":"Yes, this.","commit_id":"0c945a47e08ea5b70c79a8d27db2483968085a01"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"31e1f5b263c54e1caf45775cffdd03add378405d","unresolved":false,"context_lines":[{"line_number":369,"context_line":""},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"class TestAggregateMultiTenancyIsolationFilter("},{"line_number":372,"context_line":"    test.TestCase, integrated_helpers.InstanceHelperMixin):"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def _start_compute(self, host):"},{"line_number":375,"context_line":"        fake.set_nodes([host])"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_c960ccd2","line":372,"updated":"2018-09-13 20:53:37.000000000","message":"good idea to reuse the mixin and have a separate test class for this filter (just in case we add more checks)","commit_id":"6bc32481fb50bd69dfaee1ea776d8a5622191b00"}]}
