)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e7ed7728253a1a9b8d0cb29e2ccd5317af9293ab","unresolved":false,"context_lines":[{"line_number":12,"context_line":"given by the RequestSpec."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implements: blueprint resource-providers-scheduler-db-filters"},{"line_number":15,"context_line":"Depends-On: I573149b9415da2a8bb3951a4c4ce71c4c3e48c6f"},{"line_number":16,"context_line":"Change-Id: Ie12acb76ec5affba536c3c45fbb6de35d64aea1b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"3a461143_45a8d08d","line":15,"updated":"2017-01-27 23:12:53.000000000","message":"The dependent patch in the series already depends on this so this dependency is redundant.","commit_id":"567c479df73860dbe272382af437bdc5883625e5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f8d8021cbb501c3dc0695830203e0213ee15455","unresolved":false,"context_lines":[{"line_number":12,"context_line":"given by the RequestSpec."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implements: blueprint resource-providers-scheduler-db-filters"},{"line_number":15,"context_line":"Depends-On: I573149b9415da2a8bb3951a4c4ce71c4c3e48c6f"},{"line_number":16,"context_line":"Change-Id: Ie12acb76ec5affba536c3c45fbb6de35d64aea1b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"3a461143_90b9147c","line":15,"in_reply_to":"3a461143_4551b035","updated":"2017-01-27 23:53:13.000000000","message":"But...the bottom patch depends on the grenade change, so the bottom patch won\u0027t merge until the grenade change merges, at which point we don\u0027t need to list it here b/c it will be merged...","commit_id":"567c479df73860dbe272382af437bdc5883625e5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"34f3fffe31589378026723e29ed57b6a8294b335","unresolved":false,"context_lines":[{"line_number":12,"context_line":"given by the RequestSpec."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implements: blueprint resource-providers-scheduler-db-filters"},{"line_number":15,"context_line":"Depends-On: I573149b9415da2a8bb3951a4c4ce71c4c3e48c6f"},{"line_number":16,"context_line":"Change-Id: Ie12acb76ec5affba536c3c45fbb6de35d64aea1b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"3a461143_4551b035","line":15,"in_reply_to":"3a461143_45a8d08d","updated":"2017-01-27 23:23:23.000000000","message":"Another reason I put this on is because if we merge the bottom patch (which _had_ been ready to go earlier this morning), we still need the dep from this one as well.","commit_id":"567c479df73860dbe272382af437bdc5883625e5"}],"nova/cmd/scheduler.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d759e3555620b6ae5e2dda81a18e34ecf19a5475","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    logging.setup(CONF, \"nova\")"},{"line_number":37,"context_line":"    utils.monkey_patch()"},{"line_number":38,"context_line":"    objects.register_all()"},{"line_number":39,"context_line":"    objects.Service.enable_min_version_cache()"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    gmr.TextGuruMeditation.setup_autorun(version)"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"3a461143_72ba09c2","line":39,"updated":"2017-01-27 11:45:24.000000000","message":"If we add this, then do we also need to add reset() handling as in https://review.openstack.org/#/c/265326/4/nova/conductor/manager.py and then tell people to HUP the scheduler?\n\nOtherwise we set the cache at start up and leave it that way for ... the rest of time?\n\nI may have this entirely wrong, but that\u0027s what I\u0027m getting from reading through the code.","commit_id":"64495e0d4c64f86a8799ef2c9c73eb2f6e368f5f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f62562dfc8b1471d8383cd8a159d337e38b9fead","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    logging.setup(CONF, \"nova\")"},{"line_number":37,"context_line":"    utils.monkey_patch()"},{"line_number":38,"context_line":"    objects.register_all()"},{"line_number":39,"context_line":"    objects.Service.enable_min_version_cache()"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    gmr.TextGuruMeditation.setup_autorun(version)"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"3a461143_b23f11d5","line":39,"in_reply_to":"3a461143_72ba09c2","updated":"2017-01-27 11:59:07.000000000","message":"People need to HUP this anyways due to auto pining (or manual pinning) of the compute RPC API.","commit_id":"64495e0d4c64f86a8799ef2c9c73eb2f6e368f5f"}],"nova/compute/manager.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"676fb735177f9d4c9a9756125f7d8b6bc4dfb5fc","unresolved":false,"context_lines":[{"line_number":1140,"context_line":"        # NOTE(sbauza): We want the compute node to hard fail if it can\u0027t be"},{"line_number":1141,"context_line":"        # able to provide its resources to the placement API, or it would not"},{"line_number":1142,"context_line":"        # be able to be eligible as a destination."},{"line_number":1143,"context_line":"        if CONF.placement.password is None:"},{"line_number":1144,"context_line":"                raise exception.PlacementNotConfigured()"},{"line_number":1145,"context_line":""},{"line_number":1146,"context_line":"        self.init_virt_events()"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a461143_382a492d","line":1143,"updated":"2017-01-26 16:47:43.000000000","message":"I would go for auth_url, the URL to keystone.\n\npassword is a bit optional, I believe. passwordv3 might be set, or v2.\n\nhttps://github.com/openstack/nova/blob/master/nova/conf/placement.py#L38","commit_id":"6d2bf7841e326b5e06ea196ac162f414d288fc65"}],"nova/conf/compute.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e7ed7728253a1a9b8d0cb29e2ccd5317af9293ab","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        help\u003d\"\"\""},{"line_number":405,"context_line":"This option helps you specify virtual CPU to physical CPU allocation ratio."},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"From Ocata (15.0.0) this is used to influence the hosts selected by"},{"line_number":408,"context_line":"the Placement API. Note that when Placement is used, the CoreFilter"},{"line_number":409,"context_line":"is redundant, because the Placement API will have already filtered"},{"line_number":410,"context_line":"out hosts that would have failed the CoreFilter."},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"This configuration specifies ratio for CoreFilter which can be set"},{"line_number":413,"context_line":"per compute node. For AggregateCoreFilter, it will fall back to this"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_650a2c7b","line":410,"range":{"start_line":407,"start_character":0,"end_line":410,"end_character":48},"updated":"2017-01-27 23:12:53.000000000","message":"This is good, but seems we should say something about setting this to a very high value (9999.0) if you don\u0027t care about filtering on CPU. Maybe we just leave that for the release note?","commit_id":"567c479df73860dbe272382af437bdc5883625e5"}],"nova/objects/service.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"33932572fd14b3e902761e3ff54d24ed1d55315b","unresolved":false,"context_lines":[{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        self._send_status_update_notification(updates)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        LOG.debug(\u0027Saved service for %(binary)s on \u0027"},{"line_number":323,"context_line":"             \u0027%(host)s version %(version)i\u0027,"},{"line_number":324,"context_line":"            {\u0027binary\u0027: self.binary,"},{"line_number":325,"context_line":"             \u0027host\u0027: self.host,"},{"line_number":326,"context_line":"             \u0027version\u0027: self.version})"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def _send_status_update_notification(self, updates):"},{"line_number":329,"context_line":"        # Note(gibi): We do not trigger notification on version as that field"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a461143_544ece96","line":326,"range":{"start_line":322,"start_character":8,"end_line":326,"end_character":38},"updated":"2017-01-27 17:15:50.000000000","message":"We are going to remove this right?","commit_id":"97a1205fb79a458a36cf39e3c89727c7a583990d"}],"nova/scheduler/caching_scheduler.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a0968dafb4c5b004de88960f4bc8b490b3afd013","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        # fetch the list of hosts."},{"line_number":63,"context_line":"        self.all_host_states \u003d self._get_up_hosts(elevated)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _get_filtered_host_states(self, context, spec_obj):"},{"line_number":66,"context_line":"        \"\"\"Called from the filter scheduler, in a template pattern.\"\"\""},{"line_number":67,"context_line":"        if self.all_host_states is None:"},{"line_number":68,"context_line":"            # NOTE(johngarbutt) We only get here when we a scheduler request"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_a8cc8789","line":65,"updated":"2017-01-24 10:00:07.000000000","message":"This looks correct, although I would prefer we just changed this to _get_candidate_hosts() or something like that?","commit_id":"f956b20585716c2e1cff0fb6956b7b26b129566f"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"7c060e44cfcd4b0d2df45e843d61e66e6e9a1933","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            rps \u003d [objects.ResourceProvider(uuid\u003drp[\u0027uuid\u0027],"},{"line_number":202,"context_line":"                                            name\u003drp[\u0027name\u0027],"},{"line_number":203,"context_line":"                                            generation\u003drp[\u0027generation\u0027],"},{"line_number":204,"context_line":"                                            ) for rp in data]"},{"line_number":205,"context_line":"            return objects.ResourceProviderList(objects\u003drps)"},{"line_number":206,"context_line":"        else:"},{"line_number":207,"context_line":"            msg \u003d _LE(\"Failed to retrieve filtered list of resource providers \""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_497bf47b","line":204,"updated":"2017-01-09 17:42:21.000000000","message":"I think you probably want \"data[\u0027resource_providers\u0027]\" here where you have \u0027data\u0027. The returned data structure is an object with an attribute \u0027resource_providers\u0027 that contains a list. See https://github.com/openstack/nova/blob/master/nova/tests/functional/api/openstack/placement/gabbits/resource-provider.yaml#L95","commit_id":"0208321cdc9d24e42e7037a16e80bc01f984a09d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"041d2327ebd318a7ff1fb7071483903ea0945dfa","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            endpoint_filter\u003dself.ks_filter, raise_exc\u003dFalse)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    @safe_connect"},{"line_number":201,"context_line":"    def get_filtered_resource_providers(self, filters):"},{"line_number":202,"context_line":"        resources \u003d filters.pop(\"resources\")"},{"line_number":203,"context_line":"        if resources:"},{"line_number":204,"context_line":"            resource_query \u003d \",\".join(\"%s:%s\" % (rc, amount)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_b39f054f","line":201,"updated":"2017-01-16 17:46:59.000000000","message":"This is in the wrong place. The report client shouldn\u0027t to be imported by the scheduler, only the resource tracker...","commit_id":"e9a243f52f03016855b12e95ac5c350a46c721b8"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"9386ecc56e50d96e38ee61f79f37d925d800c1fb","unresolved":false,"context_lines":[{"line_number":224,"context_line":"                                            name\u003drp[\u0027name\u0027],"},{"line_number":225,"context_line":"                                            generation\u003drp[\u0027generation\u0027],"},{"line_number":226,"context_line":"                                            ) for rp in raw_rps]"},{"line_number":227,"context_line":"            return objects.ResourceProviderList(objects\u003drps)"},{"line_number":228,"context_line":"        else:"},{"line_number":229,"context_line":"            msg \u003d _LE(\"Failed to retrieve filtered list of resource providers \""},{"line_number":230,"context_line":"                      \"from placement API for filters %(filters)s. \""}],"source_content_type":"text/x-python","patch_set":16,"id":"5a3905b3_09b86fc7","line":227,"updated":"2017-01-24 09:52:02.000000000","message":"objects.ResourceProviderList.from_api(data)? Maybe thats silly.","commit_id":"4f88acdf5df081eb88bee95e1350150a5c720e7d"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f35f81a4ed350fee250ccd70fb4208385d29cbbe","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            endpoint_filter\u003dself.ks_filter, raise_exc\u003dFalse)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    @safe_connect"},{"line_number":212,"context_line":"    def get_filtered_resource_providers(self, filters):"},{"line_number":213,"context_line":"        resources \u003d filters.pop(\"resources\")"},{"line_number":214,"context_line":"        if resources:"},{"line_number":215,"context_line":"            resource_query \u003d \",\".join(\"%s:%s\" % (rc, amount)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_88b26b4a","line":212,"range":{"start_line":212,"start_character":46,"end_line":212,"end_character":53},"updated":"2017-01-24 09:58:00.000000000","message":"In some ways it seems odd not to take the spec_obj here?","commit_id":"f956b20585716c2e1cff0fb6956b7b26b129566f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"9cce70ab59b5f59512fb300ffac1ae6243cf9602","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            endpoint_filter\u003dself.ks_filter, raise_exc\u003dFalse)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    @safe_connect"},{"line_number":212,"context_line":"    def get_filtered_resource_providers(self, filters):"},{"line_number":213,"context_line":"        resources \u003d filters.pop(\"resources\")"},{"line_number":214,"context_line":"        if resources:"},{"line_number":215,"context_line":"            resource_query \u003d \",\".join(\"%s:%s\" % (rc, amount)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_4e0ecbe5","line":212,"range":{"start_line":212,"start_character":46,"end_line":212,"end_character":53},"in_reply_to":"5a3905b3_53fd986c","updated":"2017-01-24 10:35:20.000000000","message":"Summarizing the IRC discussion we had between John and me :\n\n- we basically agree on having the filter scheduler calling the reportclient instead of the host manager and passing the list of compute nodes to the host manager instead\n- the translation logic between a Spec object and a list of RP requirements should still be a scheduler thing and not being implemented in the reportclient\n- the fact that for the moment we pass a dict to the reportclient for expressing the RP requirements is not that great so we should consider longer-term to turn it into a versioned object - which wouldn\u0027t be the Spec object but rather a ResourceProviderRequirement object or something like that.","commit_id":"f956b20585716c2e1cff0fb6956b7b26b129566f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f9fb0b8a72c11ea5d2667198b8be1c0bb09b3fb3","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            endpoint_filter\u003dself.ks_filter, raise_exc\u003dFalse)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    @safe_connect"},{"line_number":212,"context_line":"    def get_filtered_resource_providers(self, filters):"},{"line_number":213,"context_line":"        resources \u003d filters.pop(\"resources\")"},{"line_number":214,"context_line":"        if resources:"},{"line_number":215,"context_line":"            resource_query \u003d \",\".join(\"%s:%s\" % (rc, amount)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_53fd986c","line":212,"range":{"start_line":212,"start_character":46,"end_line":212,"end_character":53},"in_reply_to":"5a3905b3_88b26b4a","updated":"2017-01-24 10:21:25.000000000","message":"Actually, yeah, this has to be resource providers, to match the other methods.\n\nBut I would rather this was some object, like a resource provider list, I get its a dictionary here, I am just wondering what this should be.","commit_id":"f956b20585716c2e1cff0fb6956b7b26b129566f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2ca2eb42ddaa67207fd3ab2628712bd096d76227","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            endpoint_filter\u003dself.ks_filter, raise_exc\u003dFalse)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    # TODO(sbauza): Change that poor interface into passing a rich versioned"},{"line_number":212,"context_line":"    # object that would provide the ResourceProvider requirements."},{"line_number":213,"context_line":"    @safe_connect"},{"line_number":214,"context_line":"    def get_filtered_resource_providers(self, filters):"},{"line_number":215,"context_line":"        \"\"\"Returns a list of ResourceProviders matching the requirements"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a3905b3_664d5dc3","line":212,"updated":"2017-01-24 16:20:01.000000000","message":"I don\u0027t know that it matters a great deal, but my standpoint, I prefer filters here and _not_ a \"rich\" object as it helps preserve the semantics of the interface being used: we are GETting a filtered list of /resource_providers\n\nThe concept of the \"requirements\" doesn\u0027t exist at this layer, it is at the layer of the caller.","commit_id":"a121eb17c6a163816b50f11d9516704c51cdbd72"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"518bc1089bff6888445c4621b73d3333ca80c6de","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                \u0027status_code\u0027: resp.status_code,"},{"line_number":243,"context_line":"                \u0027err_text\u0027: resp.text,"},{"line_number":244,"context_line":"            }"},{"line_number":245,"context_line":"            LOG.error(msg, args)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    @safe_connect"},{"line_number":248,"context_line":"    def _get_provider_aggregates(self, rp_uuid):"}],"source_content_type":"text/x-python","patch_set":30,"id":"3a461143_e45e57e8","line":245,"updated":"2017-01-26 19:04:14.000000000","message":"If there\u0027s another version I\u0027d much prefer to see the explicit return None here, or even better would be an empty list and then the caller can iterate over the empty list.\n\nThe implicit return of None is error prone.","commit_id":"14f42267e923004e9c60eb95402decdd868ecd70"}],"nova/scheduler/filter_scheduler.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"9386ecc56e50d96e38ee61f79f37d925d800c1fb","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        num_instances \u003d spec_obj.num_instances"},{"line_number":100,"context_line":"        for num in range(num_instances):"},{"line_number":101,"context_line":"            # Filter local hosts based on requirements ..."},{"line_number":102,"context_line":"            hosts \u003d self.host_manager.get_filtered_hosts(hosts,"},{"line_number":103,"context_line":"                    spec_obj, index\u003dnum)"},{"line_number":104,"context_line":"            if not hosts:"},{"line_number":105,"context_line":"                # Can\u0027t get any more locally."}],"source_content_type":"text/x-python","patch_set":16,"id":"5a3905b3_a4122255","line":102,"range":{"start_line":102,"start_character":38,"end_line":102,"end_character":56},"updated":"2017-01-24 09:52:02.000000000","message":"For me, get_filtered_host_states and get_filtered_hosts are a bit too different to have such similar names here.","commit_id":"4f88acdf5df081eb88bee95e1350150a5c720e7d"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f35f81a4ed350fee250ccd70fb4208385d29cbbe","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        num_instances \u003d spec_obj.num_instances"},{"line_number":100,"context_line":"        for num in range(num_instances):"},{"line_number":101,"context_line":"            # Filter local hosts based on requirements ..."},{"line_number":102,"context_line":"            hosts \u003d self.host_manager.get_filtered_hosts(hosts,"},{"line_number":103,"context_line":"                    spec_obj, index\u003dnum)"},{"line_number":104,"context_line":"            if not hosts:"},{"line_number":105,"context_line":"                # Can\u0027t get any more locally."}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_e88a0f63","line":102,"range":{"start_line":102,"start_character":38,"end_line":102,"end_character":56},"updated":"2017-01-24 09:58:00.000000000","message":"Same comment as previous patchset, not sure about the names here.","commit_id":"f956b20585716c2e1cff0fb6956b7b26b129566f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f35f81a4ed350fee250ccd70fb4208385d29cbbe","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def _get_filtered_host_states(self, context, spec_obj):"},{"line_number":133,"context_line":"        \"\"\"Template method, so a subclass can implement caching.\"\"\""},{"line_number":134,"context_line":"        return self.host_manager.get_filtered_host_states(context, spec_obj)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_082f5b3f","line":134,"updated":"2017-01-24 09:58:00.000000000","message":"I was expecting to see us call the placement client here, to get the resource providers, then pass that into the host_manager to get a list of host objects to continue the rest of the processing.","commit_id":"f956b20585716c2e1cff0fb6956b7b26b129566f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2bfb03237732f0fc2bde4facb269e1382d539a9d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        # TODO(sbauza): It seems weird that we load a scheduler client for"},{"line_number":46,"context_line":"        # the FilterScheduler but it will be the PlacementClient later on once"},{"line_number":47,"context_line":"        # we split the needed methods into a separate library."},{"line_number":48,"context_line":"        self.scheduler_client \u003d scheduler_client.SchedulerClient()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def select_destinations(self, context, spec_obj):"},{"line_number":51,"context_line":"        \"\"\"Selects a filtered set of hosts and nodes.\"\"\""}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_dbeb5a11","line":48,"updated":"2017-01-24 11:59:38.000000000","message":"Yeah, seems like there should be a placement client that is called by the scheduler client, and here we just use the placement client. But thats another patch.","commit_id":"d608e60e1725f08651d1c25d58e340243691bfeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2bfb03237732f0fc2bde4facb269e1382d539a9d","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            if requested_disk_gb !\u003d 0:"},{"line_number":166,"context_line":"                resources[fields.ResourceClass.DISK_GB] \u003d requested_disk_gb"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        return resources"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def _get_all_host_states(self, context, spec_obj):"},{"line_number":171,"context_line":"        \"\"\"Template method, so a subclass can implement caching.\"\"\""}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_38e9c4b7","line":168,"updated":"2017-01-24 11:59:38.000000000","message":"Maybe we could just create a ResourceClassRequest object that takes a ResourceClass and a requested amount as an int? And we just have an object ResourceRequest that includes a list of ResourceClassRequests as one of its properties? Maybe thats overkill.","commit_id":"d608e60e1725f08651d1c25d58e340243691bfeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2bfb03237732f0fc2bde4facb269e1382d539a9d","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def _get_all_host_states(self, context, spec_obj):"},{"line_number":171,"context_line":"        \"\"\"Template method, so a subclass can implement caching.\"\"\""},{"line_number":172,"context_line":"        filters \u003d {\u0027resources\u0027: self._get_resources_per_request_spec(spec_obj)}"},{"line_number":173,"context_line":"        reportclient \u003d self.scheduler_client.reportclient"},{"line_number":174,"context_line":"        rps \u003d reportclient.get_filtered_resource_providers(filters)"},{"line_number":175,"context_line":"        # NOTE(sbauza): In case the Placement service is not running yet or"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_9bf0f2ca","line":172,"range":{"start_line":172,"start_character":8,"end_line":172,"end_character":31},"updated":"2017-01-24 11:59:38.000000000","message":"I don\u0027t really get why you are including this bit here. I guess there might be things other than resource class requests. But then should this be resource_classes?\n\nI would rather this was populated include the other method, and its renamed to get_placement_filters_from_request(), or something like that?","commit_id":"d608e60e1725f08651d1c25d58e340243691bfeb"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c11d58a16c8e82b5942ed0ca8d973d09ecfbbd77","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def _get_all_host_states(self, context, spec_obj):"},{"line_number":171,"context_line":"        \"\"\"Template method, so a subclass can implement caching.\"\"\""},{"line_number":172,"context_line":"        filters \u003d {\u0027resources\u0027: self._get_resources_per_request_spec(spec_obj)}"},{"line_number":173,"context_line":"        reportclient \u003d self.scheduler_client.reportclient"},{"line_number":174,"context_line":"        rps \u003d reportclient.get_filtered_resource_providers(filters)"},{"line_number":175,"context_line":"        # NOTE(sbauza): In case the Placement service is not running yet or"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_edbf73cd","line":172,"range":{"start_line":172,"start_character":8,"end_line":172,"end_character":31},"in_reply_to":"5a3905b3_9bf0f2ca","updated":"2017-01-24 13:55:47.000000000","message":"It\u0027s related to the GET method for /resource_providers that has a specific schema also accepting 3 other fields : \"name\", \"uuid\" and \"member_of\".\n\nGiven I wrote the below reportclient method for having the same schema, that\u0027s why I\u0027m providing a dict of dicts.","commit_id":"d608e60e1725f08651d1c25d58e340243691bfeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2bfb03237732f0fc2bde4facb269e1382d539a9d","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        # If so, let\u0027s return an empty list so we would get a NoValidHost"},{"line_number":178,"context_line":"        # finally."},{"line_number":179,"context_line":"        if not rps:"},{"line_number":180,"context_line":"            return []"},{"line_number":181,"context_line":"        compute_uuids \u003d [rp.uuid for rp in rps]"},{"line_number":182,"context_line":"        return self.host_manager.get_filtered_host_states(context,"},{"line_number":183,"context_line":"                                                          compute_uuids)"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_9bbd5204","line":180,"updated":"2017-01-24 11:59:38.000000000","message":"You could fallback to returning all hosts here, but maybe only if all the compute nodes are not yet upgraded? I duno really. Maybe this is best.","commit_id":"d608e60e1725f08651d1c25d58e340243691bfeb"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2ca2eb42ddaa67207fd3ab2628712bd096d76227","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        resources \u003d {}"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        # TODO(sbauza): Call each filter to know the resource usage given the"},{"line_number":142,"context_line":"        # RequestSpec object by using the same interface."},{"line_number":143,"context_line":"        if \u0027CoreFilter\u0027 in self.host_manager.filter_obj_map:"},{"line_number":144,"context_line":"            resources[fields.ResourceClass.VCPU] \u003d spec_obj.vcpus"},{"line_number":145,"context_line":"        if \u0027RAMFilter\u0027 in self.host_manager.filter_obj_map:"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a3905b3_a939d6a5","line":142,"updated":"2017-01-24 16:20:01.000000000","message":"Give that Jay said \"no\" to this idea in http://lists.openstack.org/pipermail/openstack-dev/2017-January/110689.html we might want to have a broader conversation about this.\n\nI\u0027m agnostic about it. I think it is probably okay to do this as it seems to reflect the behaviors desired by the people modifying their configurations. However, I\u0027m not sure I understand all the nuances, nor am I sure that the people are modifying their configurations are doing something that is good.","commit_id":"a121eb17c6a163816b50f11d9516704c51cdbd72"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2ca2eb42ddaa67207fd3ab2628712bd096d76227","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            # resources in GB. Since there could be a remainder of the division"},{"line_number":154,"context_line":"            # by 1024, we need to ceil the result to the next bigger Gb so we"},{"line_number":155,"context_line":"            # can be sure there would be enough disk space in the destination"},{"line_number":156,"context_line":"            # to sustain the request."},{"line_number":157,"context_line":"            # FIXME(sbauza): All of that could be using math.ceil() but since"},{"line_number":158,"context_line":"            # we support both py2 and py3, let\u0027s fake it until we only support"},{"line_number":159,"context_line":"            # py3."}],"source_content_type":"text/x-python","patch_set":21,"id":"5a3905b3_294ec63a","line":156,"updated":"2017-01-24 16:20:01.000000000","message":"Thanks for adding this more verbose commentary.","commit_id":"a121eb17c6a163816b50f11d9516704c51cdbd72"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2ca2eb42ddaa67207fd3ab2628712bd096d76227","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        # NOTE(sbauza): In case the Placement service is not running yet or"},{"line_number":176,"context_line":"        # when returning an exception, we wouldn\u0027t get any ResourceProviders."},{"line_number":177,"context_line":"        # If so, let\u0027s return an empty list so we would get a NoValidHost"},{"line_number":178,"context_line":"        # finally."},{"line_number":179,"context_line":"        if not rps:"},{"line_number":180,"context_line":"            return []"},{"line_number":181,"context_line":"        compute_uuids \u003d [rp.uuid for rp in rps]"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a3905b3_c9a622c0","line":178,"updated":"2017-01-24 16:20:01.000000000","message":"What does \"finally\" mean here?","commit_id":"a121eb17c6a163816b50f11d9516704c51cdbd72"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f351604a0cbe306da2d8c54e24b721e302c1e865","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        # TODO(sbauza): Call each filter to know the resource usage given the"},{"line_number":142,"context_line":"        # RequestSpec object by using the same interface."},{"line_number":143,"context_line":"        if \u0027CoreFilter\u0027 in self.host_manager.filter_obj_map:"},{"line_number":144,"context_line":"            resources[fields.ResourceClass.VCPU] \u003d spec_obj.vcpus"},{"line_number":145,"context_line":"        if \u0027RAMFilter\u0027 in self.host_manager.filter_obj_map:"},{"line_number":146,"context_line":"            resources[fields.ResourceClass.MEMORY_MB] \u003d spec_obj.memory_mb"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a461143_a6b57ad1","line":143,"updated":"2017-01-25 15:03:49.000000000","message":"Just reasserting my -1 on this approach.","commit_id":"41382a2ba14ffe77c8538215f8cc1a0018ac6413"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1f5fe5f42a8643cffa5cab9c1c63116b8129e909","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            resources[fields.ResourceClass.MEMORY_MB] \u003d spec_obj.memory_mb"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        if \u0027DiskFilter\u0027 in self.host_manager.filter_obj_map:"},{"line_number":149,"context_line":"            requested_disk_mb \u003d (1024 * (spec_obj.root_gb +"},{"line_number":150,"context_line":"                                         spec_obj.ephemeral_gb) +"},{"line_number":151,"context_line":"                                 spec_obj.swap)"},{"line_number":152,"context_line":"            # NOTE(sbauza): Disk request is expressed in MB but we count"},{"line_number":153,"context_line":"            # resources in GB. Since there could be a remainder of the division"},{"line_number":154,"context_line":"            # by 1024, we need to ceil the result to the next bigger Gb so we"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_e0503f0d","line":151,"range":{"start_line":149,"start_character":12,"end_line":151,"end_character":47},"updated":"2017-01-24 22:11:53.000000000","message":"Can we re-use something from the scheduler report client?\n\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/client/report.py#L127\n\nIf it\u0027s a boot from volume flavor, the resource provider doesn\u0027t have any DISK_GB allocation. I\u0027d think we could re-use some of that logic here.","commit_id":"41382a2ba14ffe77c8538215f8cc1a0018ac6413"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ddad4f79ef91295b400d41dfbd1e61011a54fd7a","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            resources[fields.ResourceClass.MEMORY_MB] \u003d spec_obj.memory_mb"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        if \u0027DiskFilter\u0027 in self.host_manager.filter_obj_map:"},{"line_number":149,"context_line":"            requested_disk_mb \u003d (1024 * (spec_obj.root_gb +"},{"line_number":150,"context_line":"                                         spec_obj.ephemeral_gb) +"},{"line_number":151,"context_line":"                                 spec_obj.swap)"},{"line_number":152,"context_line":"            # NOTE(sbauza): Disk request is expressed in MB but we count"},{"line_number":153,"context_line":"            # resources in GB. Since there could be a remainder of the division"},{"line_number":154,"context_line":"            # by 1024, we need to ceil the result to the next bigger Gb so we"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a461143_13a4cb55","line":151,"range":{"start_line":149,"start_character":12,"end_line":151,"end_character":47},"in_reply_to":"3a461143_26a34aa0","updated":"2017-01-25 15:45:30.000000000","message":"Yup, we would still consume space from a shared-disk provider so we still need to find the right RPs that can support the disk request for a BFV instance.","commit_id":"41382a2ba14ffe77c8538215f8cc1a0018ac6413"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f351604a0cbe306da2d8c54e24b721e302c1e865","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            resources[fields.ResourceClass.MEMORY_MB] \u003d spec_obj.memory_mb"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        if \u0027DiskFilter\u0027 in self.host_manager.filter_obj_map:"},{"line_number":149,"context_line":"            requested_disk_mb \u003d (1024 * (spec_obj.root_gb +"},{"line_number":150,"context_line":"                                         spec_obj.ephemeral_gb) +"},{"line_number":151,"context_line":"                                 spec_obj.swap)"},{"line_number":152,"context_line":"            # NOTE(sbauza): Disk request is expressed in MB but we count"},{"line_number":153,"context_line":"            # resources in GB. Since there could be a remainder of the division"},{"line_number":154,"context_line":"            # by 1024, we need to ceil the result to the next bigger Gb so we"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a461143_26a34aa0","line":151,"range":{"start_line":149,"start_character":12,"end_line":151,"end_character":47},"in_reply_to":"5a3905b3_5a6c8808","updated":"2017-01-25 15:03:49.000000000","message":"It would consume inventory for the cinder provider, not the compute node provider. It doesn\u0027t look like we have the ability to express that much context in the call we make to placement below, right? Filtering out compute nodes with no disk space available when none is actually needed for a BFV instance doesn\u0027t seem right to me.","commit_id":"41382a2ba14ffe77c8538215f8cc1a0018ac6413"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3f054226403d34b65374832fcde8e782aa9d0902","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            resources[fields.ResourceClass.MEMORY_MB] \u003d spec_obj.memory_mb"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        if \u0027DiskFilter\u0027 in self.host_manager.filter_obj_map:"},{"line_number":149,"context_line":"            requested_disk_mb \u003d (1024 * (spec_obj.root_gb +"},{"line_number":150,"context_line":"                                         spec_obj.ephemeral_gb) +"},{"line_number":151,"context_line":"                                 spec_obj.swap)"},{"line_number":152,"context_line":"            # NOTE(sbauza): Disk request is expressed in MB but we count"},{"line_number":153,"context_line":"            # resources in GB. Since there could be a remainder of the division"},{"line_number":154,"context_line":"            # by 1024, we need to ceil the result to the next bigger Gb so we"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a3905b3_5a6c8808","line":151,"range":{"start_line":149,"start_character":12,"end_line":151,"end_character":47},"in_reply_to":"5a3905b3_e0503f0d","updated":"2017-01-25 11:21:25.000000000","message":"That\u0027s a bug, swap is expressed in MB.\nSee the DiskFilter, we do that math https://github.com/openstack/nova/blob/master/nova/scheduler/filters/disk_filter.py#L36-L38\n\nAlso, I think it should be conceptually wrong to not ask for disk usage if the instance is BFV : once we would have the aggregates being RPs and Cinder telling what size the inventory is, we would still take a slice of the Inventory size for creating the instance.","commit_id":"41382a2ba14ffe77c8538215f8cc1a0018ac6413"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d3d6cae271ccfdd0e13192480c757b5bf9ab4985","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    def _get_resources_per_request_spec(self, spec_obj):"},{"line_number":139,"context_line":"        resources \u003d {}"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        resources[fields.ResourceClass.VCPU] \u003d spec_obj.vcpus"},{"line_number":142,"context_line":"        resources[fields.ResourceClass.MEMORY_MB] \u003d spec_obj.memory_mb"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        requested_disk_mb \u003d (1024 * (spec_obj.root_gb +"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a461143_66c47240","line":141,"updated":"2017-01-25 15:04:15.000000000","message":"This looks better to me","commit_id":"63d1adc74c24a93ec5f3fb871992a4e0e7eaf556"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"bcc1da1df36a5575dea572523380fb9fddca2a97","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        # our rolling upgrade process, we define a graceful period for allowing"},{"line_number":172,"context_line":"        # clouds that are not fully upgraded to Ocata to still be able to"},{"line_number":173,"context_line":"        # have instances being scheduled on old nodes."},{"line_number":174,"context_line":"        service_version \u003d objects.Service.get_minimum_version("},{"line_number":175,"context_line":"            context, \u0027nova-osapi_compute\u0027)"},{"line_number":176,"context_line":"        # TODO(sbauza): Remove that version check in Pike so we fully call"},{"line_number":177,"context_line":"        # the placement API anyway."}],"source_content_type":"text/x-python","patch_set":28,"id":"3a461143_38396942","line":174,"updated":"2017-01-26 16:51:50.000000000","message":"This will make a new DB call for every scheduling decision. You need to enable service version caching in cmd/scheduler.py with:\n\n objects.Service.enable_min_version_cache()\n\nand then define a reset handler to run clear(). If we have periodic tasks, we should/could also run clear in there.","commit_id":"6d2bf7841e326b5e06ea196ac162f414d288fc65"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a41ca7f9f253f0e2f8ada8a2b99fc4223d202979","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        # clouds that are not fully upgraded to Ocata to still be able to"},{"line_number":173,"context_line":"        # have instances being scheduled on old nodes."},{"line_number":174,"context_line":"        service_version \u003d objects.Service.get_minimum_version("},{"line_number":175,"context_line":"            context, \u0027nova-osapi_compute\u0027)"},{"line_number":176,"context_line":"        LOG.debug(\u0027Bauzas: Minimum service ver: %s\u0027 % service_version)"},{"line_number":177,"context_line":"        services \u003d objects.ServiceList.get_all(context)"},{"line_number":178,"context_line":"        debug_services \u003d \"\""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a461143_3e03ea10","line":175,"range":{"start_line":175,"start_character":27,"end_line":175,"end_character":40},"updated":"2017-01-27 13:27:42.000000000","message":"What we really want here is nova-compute, not the API.\n\nBugger.","commit_id":"72ef5827b73ffb85872e597f105a45f9f51f4dad"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"9e1716b422ce9e3b5408dde4d179ad5e1bc2c855","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        # clouds that are not fully upgraded to Ocata to still be able to"},{"line_number":173,"context_line":"        # have instances being scheduled on old nodes."},{"line_number":174,"context_line":"        service_version \u003d objects.Service.get_minimum_version("},{"line_number":175,"context_line":"            context, \u0027nova-osapi_compute\u0027)"},{"line_number":176,"context_line":"        LOG.debug(\u0027Bauzas: Minimum service ver: %s\u0027 % service_version)"},{"line_number":177,"context_line":"        services \u003d objects.ServiceList.get_all(context)"},{"line_number":178,"context_line":"        debug_services \u003d \"\""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a461143_fadc0b14","line":175,"range":{"start_line":175,"start_character":27,"end_line":175,"end_character":40},"in_reply_to":"3a461143_3e03ea10","updated":"2017-01-27 14:33:41.000000000","message":"Oh jeez, yeah.","commit_id":"72ef5827b73ffb85872e597f105a45f9f51f4dad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"33932572fd14b3e902761e3ff54d24ed1d55315b","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        # have instances being scheduled on old nodes."},{"line_number":174,"context_line":"        service_version \u003d objects.Service.get_minimum_version("},{"line_number":175,"context_line":"            context, \u0027nova-compute\u0027)"},{"line_number":176,"context_line":"        LOG.debug(\u0027Bauzas: Minimum service ver: %s\u0027 % service_version)"},{"line_number":177,"context_line":"        services \u003d objects.ServiceList.get_all(context)"},{"line_number":178,"context_line":"        debug_services \u003d \"\""},{"line_number":179,"context_line":"        for service in services:"},{"line_number":180,"context_line":"            debug_services +\u003d \" host\u003d%s,binary\u003d%s,version\u003d%s\" % ("},{"line_number":181,"context_line":"                service.host, service.binary, service.version)"},{"line_number":182,"context_line":"        LOG.debug(\u0027Bauzas: all services: %s\u0027 % debug_services)"},{"line_number":183,"context_line":"        # TODO(sbauza): Remove that version check in Pike so we fully call"},{"line_number":184,"context_line":"        # the placement API anyway."},{"line_number":185,"context_line":"        if service_version \u003c 16:"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a461143_6f421712","line":182,"range":{"start_line":176,"start_character":8,"end_line":182,"end_character":62},"updated":"2017-01-27 17:15:50.000000000","message":"And remove all this.","commit_id":"97a1205fb79a458a36cf39e3c89727c7a583990d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"33932572fd14b3e902761e3ff54d24ed1d55315b","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        # TODO(sbauza): Remove that version check in Pike so we fully call"},{"line_number":184,"context_line":"        # the placement API anyway."},{"line_number":185,"context_line":"        if service_version \u003c 16:"},{"line_number":186,"context_line":"            return self.host_manager.get_all_host_states(context)"},{"line_number":187,"context_line":"        filters \u003d {\u0027resources\u0027: self._get_resources_per_request_spec(spec_obj)}"},{"line_number":188,"context_line":"        reportclient \u003d self.scheduler_client.reportclient"},{"line_number":189,"context_line":"        rps \u003d reportclient.get_filtered_resource_providers(filters)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a461143_efbfe7f8","line":186,"updated":"2017-01-27 17:15:50.000000000","message":"Maybe we log something at debug here?","commit_id":"97a1205fb79a458a36cf39e3c89727c7a583990d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5bf8bb2abd41550498781bb2c3149d0b99005b3e","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        # TODO(sbauza): Remove that version check in Pike so we fully call"},{"line_number":177,"context_line":"        # the placement API anyway."},{"line_number":178,"context_line":"        if service_version \u003c 16:"},{"line_number":179,"context_line":"            return self.host_manager.get_all_host_states(context)"},{"line_number":180,"context_line":"        filters \u003d {\u0027resources\u0027: self._get_resources_per_request_spec(spec_obj)}"},{"line_number":181,"context_line":"        reportclient \u003d self.scheduler_client.reportclient"},{"line_number":182,"context_line":"        rps \u003d reportclient.get_filtered_resource_providers(filters)"}],"source_content_type":"text/x-python","patch_set":38,"id":"3a461143_810d5739","line":179,"updated":"2017-01-27 17:21:04.000000000","message":"We may want to log something at debug here...optional.","commit_id":"82ba048b8b73215e20e2ae8201a7d5236ffcf05b"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"5fbe32b6dc44cab17f0355c544529bce90d94a39","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        # TODO(sbauza): Remove that version check in Pike so we fully call"},{"line_number":177,"context_line":"        # the placement API anyway."},{"line_number":178,"context_line":"        if service_version \u003c 16:"},{"line_number":179,"context_line":"            return self.host_manager.get_all_host_states(context)"},{"line_number":180,"context_line":"        filters \u003d {\u0027resources\u0027: self._get_resources_per_request_spec(spec_obj)}"},{"line_number":181,"context_line":"        reportclient \u003d self.scheduler_client.reportclient"},{"line_number":182,"context_line":"        rps \u003d reportclient.get_filtered_resource_providers(filters)"}],"source_content_type":"text/x-python","patch_set":38,"id":"3a461143_21bd8368","line":179,"in_reply_to":"3a461143_810d5739","updated":"2017-01-27 17:41:52.000000000","message":"good idea.","commit_id":"82ba048b8b73215e20e2ae8201a7d5236ffcf05b"}],"nova/scheduler/host_manager.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"7c060e44cfcd4b0d2df45e843d61e66e6e9a1933","unresolved":false,"context_lines":[{"line_number":639,"context_line":"                             spec_obj.swap)"},{"line_number":640,"context_line":"        requested_disk_gb \u003d requested_disk_mb / 1024"},{"line_number":641,"context_line":"        if requested_disk_mb % 1024 !\u003d 0:"},{"line_number":642,"context_line":"            # Let\u0027s ask for a bit more space since we count in GB"},{"line_number":643,"context_line":"            requested_disk_gb +\u003d 1"},{"line_number":644,"context_line":"        resources[fields.ResourceClass.DISK_GB] \u003d requested_disk_gb"},{"line_number":645,"context_line":"        return resources"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_6913580e","line":642,"updated":"2017-01-09 17:42:21.000000000","message":"?","commit_id":"0208321cdc9d24e42e7037a16e80bc01f984a09d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"041d2327ebd318a7ff1fb7071483903ea0945dfa","unresolved":false,"context_lines":[{"line_number":359,"context_line":"        self._instance_info \u003d {}"},{"line_number":360,"context_line":"        if self.track_instance_changes:"},{"line_number":361,"context_line":"            self._init_instance_info()"},{"line_number":362,"context_line":"        self.scheduler_client \u003d scheduler_client.SchedulerClient()"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def _load_filters(self):"},{"line_number":365,"context_line":"        return CONF.filter_scheduler.enabled_filters"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_93f92983","line":362,"updated":"2017-01-16 17:46:59.000000000","message":"See note on previous, but this shouldn\u0027t here. There shouldn\u0027t be a need to have the scheduler reporting client querying filtered resource providers. Either that should go in the query client or the get_filtered_resource_providers() method you put in the report client should be put here inline.","commit_id":"e9a243f52f03016855b12e95ac5c350a46c721b8"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c128c6fcf2d196c6fd47399fec2efcdbb7e748d2","unresolved":false,"context_lines":[{"line_number":359,"context_line":"        self._instance_info \u003d {}"},{"line_number":360,"context_line":"        if self.track_instance_changes:"},{"line_number":361,"context_line":"            self._init_instance_info()"},{"line_number":362,"context_line":"        self.scheduler_client \u003d scheduler_client.SchedulerClient()"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def _load_filters(self):"},{"line_number":365,"context_line":"        return CONF.filter_scheduler.enabled_filters"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_1268cc86","line":362,"in_reply_to":"7a3c09a3_93f92983","updated":"2017-01-16 20:25:40.000000000","message":"We *could* do that for sure, but given it needs to have all the get methods + the keystone/SC upcall, I first tried to cut the related methods into a PlacementClient (see  https://review.openstack.org/#/c/417111/ )\n\nThat said, after trying to do that, I saw it could be a hairy change needing a lot of time for reviewing it, and given we only have 2 weeks for merging this change, I went to IRC and asked if it was okay to first use the existing report client so we could later change that to a placement client.\n\nThe consensus I had by that time was +1 with that. Thoughts?","commit_id":"e9a243f52f03016855b12e95ac5c350a46c721b8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2703371c5fcfb91bcbf888eb430bfc224bfd8c7f","unresolved":false,"context_lines":[{"line_number":639,"context_line":"        requested_disk_mb \u003d (1024 * (spec_obj.root_gb +"},{"line_number":640,"context_line":"                                     spec_obj.ephemeral_gb) +"},{"line_number":641,"context_line":"                             spec_obj.swap)"},{"line_number":642,"context_line":"        requested_disk_gb \u003d requested_disk_mb / 1024"},{"line_number":643,"context_line":"        if requested_disk_mb % 1024 !\u003d 0:"},{"line_number":644,"context_line":"            # Let\u0027s ask for a bit more space since we count in GB"},{"line_number":645,"context_line":"            requested_disk_gb +\u003d 1"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_1838f89f","line":642,"updated":"2017-01-16 17:25:32.000000000","message":"For sake of python 3 this should be // otherwise requested_disk_gb will be a float and we don\u0027t want that.","commit_id":"e9a243f52f03016855b12e95ac5c350a46c721b8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2703371c5fcfb91bcbf888eb430bfc224bfd8c7f","unresolved":false,"context_lines":[{"line_number":641,"context_line":"                             spec_obj.swap)"},{"line_number":642,"context_line":"        requested_disk_gb \u003d requested_disk_mb / 1024"},{"line_number":643,"context_line":"        if requested_disk_mb % 1024 !\u003d 0:"},{"line_number":644,"context_line":"            # Let\u0027s ask for a bit more space since we count in GB"},{"line_number":645,"context_line":"            requested_disk_gb +\u003d 1"},{"line_number":646,"context_line":"        resources[fields.ResourceClass.DISK_GB] \u003d requested_disk_gb"},{"line_number":647,"context_line":"        return resources"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_5827e063","line":644,"updated":"2017-01-16 17:25:32.000000000","message":"I think the comment could be more clear about how, since requested_disk_gb is not a float (at least when the above is correct) and / implies a floor() we need to fake a ceil().","commit_id":"e9a243f52f03016855b12e95ac5c350a46c721b8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"041d2327ebd318a7ff1fb7071483903ea0945dfa","unresolved":false,"context_lines":[{"line_number":654,"context_line":"        # the same model than other drivers... That\u0027s silly but we need to know"},{"line_number":655,"context_line":"        # the host field value only because Ironic."},{"line_number":656,"context_line":"        compute_nodes \u003d [objects.ComputeNode.get_by_uuid(context, rp.uuid)"},{"line_number":657,"context_line":"                         for rp in rps]"},{"line_number":658,"context_line":"        return self.updates_host_state_map(context, compute_nodes)"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    def _get_aggregates_info(self, host):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_53a6e110","line":657,"updated":"2017-01-16 17:46:59.000000000","message":"We need a ComputeNodeList.get_all_by_uuid() method. Doing a single CopmuteNode.get_by_uuid() call in a list comprehension is going to nullify any benefit we get from winnowing the list of resource providers by the placement API.","commit_id":"e9a243f52f03016855b12e95ac5c350a46c721b8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1f520dd5f8933231c977e81db9e214b6cbe23f08","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        filters \u003d {\u0027resources\u0027: self._get_resources_per_request_spec(spec_obj)}"},{"line_number":651,"context_line":"        reportclient \u003d self.scheduler_client.reportclient"},{"line_number":652,"context_line":"        rps \u003d reportclient.get_filtered_resource_providers(context, filters)"},{"line_number":653,"context_line":"        # TODO(sbauza): Remove that unnecessary lookup once Ironic supports"},{"line_number":654,"context_line":"        # the same model than other drivers... That\u0027s silly but we need to know"},{"line_number":655,"context_line":"        # the host field value only because Ironic."},{"line_number":656,"context_line":"        compute_nodes \u003d [objects.ComputeNode.get_by_uuid(context, rp.uuid)"},{"line_number":657,"context_line":"                         for rp in rps]"},{"line_number":658,"context_line":"        return self.updates_host_state_map(context, compute_nodes)"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    def _get_aggregates_info(self, host):"},{"line_number":661,"context_line":"        return [self.aggs_by_id[agg_id] for agg_id in"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_5ff42af1","line":658,"range":{"start_line":653,"start_character":8,"end_line":658,"end_character":66},"updated":"2017-01-16 16:34:28.000000000","message":"Can we avoid this if we know we\u0027re not running the IronicHostManager?","commit_id":"e9a243f52f03016855b12e95ac5c350a46c721b8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"041d2327ebd318a7ff1fb7071483903ea0945dfa","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        filters \u003d {\u0027resources\u0027: self._get_resources_per_request_spec(spec_obj)}"},{"line_number":651,"context_line":"        reportclient \u003d self.scheduler_client.reportclient"},{"line_number":652,"context_line":"        rps \u003d reportclient.get_filtered_resource_providers(context, filters)"},{"line_number":653,"context_line":"        # TODO(sbauza): Remove that unnecessary lookup once Ironic supports"},{"line_number":654,"context_line":"        # the same model than other drivers... That\u0027s silly but we need to know"},{"line_number":655,"context_line":"        # the host field value only because Ironic."},{"line_number":656,"context_line":"        compute_nodes \u003d [objects.ComputeNode.get_by_uuid(context, rp.uuid)"},{"line_number":657,"context_line":"                         for rp in rps]"},{"line_number":658,"context_line":"        return self.updates_host_state_map(context, compute_nodes)"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    def _get_aggregates_info(self, host):"},{"line_number":661,"context_line":"        return [self.aggs_by_id[agg_id] for agg_id in"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_336235ae","line":658,"range":{"start_line":653,"start_character":8,"end_line":658,"end_character":66},"in_reply_to":"7a3c09a3_5ff42af1","updated":"2017-01-16 17:46:59.000000000","message":"This call isn\u0027t actually expensive. It\u0027s the lookup from the DB that is expensive.","commit_id":"e9a243f52f03016855b12e95ac5c350a46c721b8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"834ec1c057f565ce777cbffefe549ee923191709","unresolved":false,"context_lines":[{"line_number":639,"context_line":"        requested_disk_mb \u003d (1024 * (spec_obj.root_gb +"},{"line_number":640,"context_line":"                                     spec_obj.ephemeral_gb) +"},{"line_number":641,"context_line":"                             spec_obj.swap)"},{"line_number":642,"context_line":"        requested_disk_gb \u003d requested_disk_mb / 1024"},{"line_number":643,"context_line":"        if requested_disk_mb % 1024 !\u003d 0:"},{"line_number":644,"context_line":"            # Let\u0027s ask for a bit more space since we count in GB"},{"line_number":645,"context_line":"            requested_disk_gb +\u003d 1"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a3c09a3_f4e9f37f","line":642,"updated":"2017-01-18 18:02:04.000000000","message":"Repeating my comment from an earlier patchset:\n\nFor sake of python 3 this should be // otherwise requested_disk_gb will be a float and we don\u0027t want that.","commit_id":"dd1d2b59d69c9da7e20ab31c4abd62272318254d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"834ec1c057f565ce777cbffefe549ee923191709","unresolved":false,"context_lines":[{"line_number":641,"context_line":"                             spec_obj.swap)"},{"line_number":642,"context_line":"        requested_disk_gb \u003d requested_disk_mb / 1024"},{"line_number":643,"context_line":"        if requested_disk_mb % 1024 !\u003d 0:"},{"line_number":644,"context_line":"            # Let\u0027s ask for a bit more space since we count in GB"},{"line_number":645,"context_line":"            requested_disk_gb +\u003d 1"},{"line_number":646,"context_line":"        resources[fields.ResourceClass.DISK_GB] \u003d requested_disk_gb"},{"line_number":647,"context_line":"        return resources"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a3c09a3_3400db33","line":644,"updated":"2017-01-18 18:02:04.000000000","message":"I think the comment could be more clear about how, since requested_disk_gb is not a float (at least when the above is correct) and / implies a floor() we need to fake a ceil()","commit_id":"dd1d2b59d69c9da7e20ab31c4abd62272318254d"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f35f81a4ed350fee250ccd70fb4208385d29cbbe","unresolved":false,"context_lines":[{"line_number":477,"context_line":"            raise exception.SchedulerHostFilterNotFound(filter_name\u003dmsg)"},{"line_number":478,"context_line":"        return good_filters"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    def get_filtered_hosts(self, hosts, spec_obj, index\u003d0):"},{"line_number":481,"context_line":"        \"\"\"Filter hosts and return only ones passing all filters.\"\"\""},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"        def _strip_ignore_hosts(host_map, hosts_to_ignore):"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_68437f13","line":480,"range":{"start_line":480,"start_character":8,"end_line":480,"end_character":26},"updated":"2017-01-24 09:58:00.000000000","message":"Have a look at this name here, compare it to the new function you added.","commit_id":"f956b20585716c2e1cff0fb6956b7b26b129566f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f35f81a4ed350fee250ccd70fb4208385d29cbbe","unresolved":false,"context_lines":[{"line_number":587,"context_line":"        compute_nodes \u003d objects.ComputeNodeList.get_all(context)"},{"line_number":588,"context_line":"        return self.get_host_states(context, compute_nodes)"},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    def get_host_states(self, context, compute_nodes):"},{"line_number":591,"context_line":"        \"\"\"Returns a generator of HostStates given a list of computes."},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"        Also updates the HostStates internal mapping for the HostManager."}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_083afb98","line":590,"range":{"start_line":590,"start_character":8,"end_line":590,"end_character":23},"updated":"2017-01-24 09:58:00.000000000","message":"Should this be a private method?","commit_id":"f956b20585716c2e1cff0fb6956b7b26b129566f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f35f81a4ed350fee250ccd70fb4208385d29cbbe","unresolved":false,"context_lines":[{"line_number":632,"context_line":""},{"line_number":633,"context_line":"        return (self.host_state_map[host] for host in seen_nodes)"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"    def _get_resources_per_request_spec(self, spec_obj):"},{"line_number":636,"context_line":"        resources \u003d {}"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"        # TODO(sbauza): Call each filter to know the resource usage given the"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_48f24307","line":635,"updated":"2017-01-24 09:58:00.000000000","message":"Does this belong here? Would it be better in the placement client?","commit_id":"f956b20585716c2e1cff0fb6956b7b26b129566f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f35f81a4ed350fee250ccd70fb4208385d29cbbe","unresolved":false,"context_lines":[{"line_number":664,"context_line":""},{"line_number":665,"context_line":"        return resources"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"    def get_filtered_host_states(self, context, spec_obj):"},{"line_number":668,"context_line":"        filters \u003d {\u0027resources\u0027: self._get_resources_per_request_spec(spec_obj)}"},{"line_number":669,"context_line":"        reportclient \u003d self.scheduler_client.reportclient"},{"line_number":670,"context_line":"        rps \u003d reportclient.get_filtered_resource_providers(filters)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_6811bf03","line":667,"range":{"start_line":667,"start_character":8,"end_line":667,"end_character":32},"updated":"2017-01-24 09:58:00.000000000","message":"get_hosts_from_placement() might be a better name that avoids a clash with the get_filtered_hosts thing above.\n\nBut I wonder if really the scheduler should directly call the scheduler client, and this method should be get_hosts_from_resource_providers() instead?","commit_id":"f956b20585716c2e1cff0fb6956b7b26b129566f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2bfb03237732f0fc2bde4facb269e1382d539a9d","unresolved":false,"context_lines":[{"line_number":474,"context_line":"            raise exception.SchedulerHostFilterNotFound(filter_name\u003dmsg)"},{"line_number":475,"context_line":"        return good_filters"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def get_filtered_hosts(self, hosts, spec_obj, index\u003d0):"},{"line_number":478,"context_line":"        \"\"\"Filter hosts and return only ones passing all filters.\"\"\""},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"        def _strip_ignore_hosts(host_map, hosts_to_ignore):"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_d891a048","line":477,"range":{"start_line":477,"start_character":8,"end_line":477,"end_character":26},"updated":"2017-01-24 11:59:38.000000000","message":"I keep comparing your new method to this one.","commit_id":"d608e60e1725f08651d1c25d58e340243691bfeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2bfb03237732f0fc2bde4facb269e1382d539a9d","unresolved":false,"context_lines":[{"line_number":576,"context_line":"        return self.weight_handler.get_weighed_objects(self.weighers,"},{"line_number":577,"context_line":"                hosts, spec_obj)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def get_filtered_host_states(self, context, compute_uuids):"},{"line_number":580,"context_line":"        # TODO(sbauza): Remove that unnecessary lookup once Ironic supports"},{"line_number":581,"context_line":"        # the same model than other drivers... That\u0027s silly but we need to know"},{"line_number":582,"context_line":"        # the host field value only because Ironic."}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_58ea10dc","line":579,"range":{"start_line":579,"start_character":8,"end_line":579,"end_character":32},"updated":"2017-01-24 11:59:38.000000000","message":"get_host_state_by_uuid() might be a better name here?","commit_id":"d608e60e1725f08651d1c25d58e340243691bfeb"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5e52e9803ecd53531e44c1740937ab244bc5a12a","unresolved":false,"context_lines":[{"line_number":576,"context_line":"        return self.weight_handler.get_weighed_objects(self.weighers,"},{"line_number":577,"context_line":"                hosts, spec_obj)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def get_filtered_host_states(self, context, compute_uuids):"},{"line_number":580,"context_line":"        # TODO(sbauza): Remove that unnecessary lookup once Ironic supports"},{"line_number":581,"context_line":"        # the same model than other drivers... That\u0027s silly but we need to know"},{"line_number":582,"context_line":"        # the host field value only because Ironic."}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_4da6c7ae","line":579,"range":{"start_line":579,"start_character":8,"end_line":579,"end_character":32},"in_reply_to":"5a3905b3_58ea10dc","updated":"2017-01-24 14:00:23.000000000","message":"Done","commit_id":"d608e60e1725f08651d1c25d58e340243691bfeb"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2bfb03237732f0fc2bde4facb269e1382d539a9d","unresolved":false,"context_lines":[{"line_number":579,"context_line":"    def get_filtered_host_states(self, context, compute_uuids):"},{"line_number":580,"context_line":"        # TODO(sbauza): Remove that unnecessary lookup once Ironic supports"},{"line_number":581,"context_line":"        # the same model than other drivers... That\u0027s silly but we need to know"},{"line_number":582,"context_line":"        # the host field value only because Ironic."},{"line_number":583,"context_line":"        compute_nodes \u003d objects.ComputeNodeList.get_all_by_uuids(context,"},{"line_number":584,"context_line":"                                                                 compute_uuids)"},{"line_number":585,"context_line":"        return self._get_host_states(context, compute_nodes)"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_78cc2c89","line":582,"updated":"2017-01-24 11:59:38.000000000","message":"If thats true, do we need to pass more info than just the uuid here? Right now seems like we always will have to look up the info from the DB?\n\nFWIW, I am OK passing resource provider list into this method, if thats the way we are going. For me it was just odd that this had to know about spec_object, resource providers and the scheduler client, and how they all map. We have fixed that bit.","commit_id":"d608e60e1725f08651d1c25d58e340243691bfeb"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5e52e9803ecd53531e44c1740937ab244bc5a12a","unresolved":false,"context_lines":[{"line_number":579,"context_line":"    def get_filtered_host_states(self, context, compute_uuids):"},{"line_number":580,"context_line":"        # TODO(sbauza): Remove that unnecessary lookup once Ironic supports"},{"line_number":581,"context_line":"        # the same model than other drivers... That\u0027s silly but we need to know"},{"line_number":582,"context_line":"        # the host field value only because Ironic."},{"line_number":583,"context_line":"        compute_nodes \u003d objects.ComputeNodeList.get_all_by_uuids(context,"},{"line_number":584,"context_line":"                                                                 compute_uuids)"},{"line_number":585,"context_line":"        return self._get_host_states(context, compute_nodes)"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a3905b3_cd7b97f3","line":582,"in_reply_to":"5a3905b3_78cc2c89","updated":"2017-01-24 14:00:23.000000000","message":"TBH, I don\u0027t want to pass a Placement-related object to the HostManager. I prefer to have the HostManager method just having attributes related to compute nodes like we have for others in that module.\n\nHonestly, I think changing the method name could help us to be more clear. \n\nAnd let\u0027s be clear, that is only needed because we need to lookup the ComputeNode.host field which is not provided by the ResourceProvider. If we were having it, we could just have mocked the Compute objects by hydrating only two fields.","commit_id":"d608e60e1725f08651d1c25d58e340243691bfeb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"33932572fd14b3e902761e3ff54d24ed1d55315b","unresolved":false,"context_lines":[{"line_number":577,"context_line":"                hosts, spec_obj)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def get_host_states_by_uuids(self, context, compute_uuids):"},{"line_number":580,"context_line":"        # TODO(sbauza): Remove that unnecessary lookup once Ironic supports"},{"line_number":581,"context_line":"        # the same model than other drivers... That\u0027s silly but we need to know"},{"line_number":582,"context_line":"        # the host field value only because Ironic."},{"line_number":583,"context_line":"        compute_nodes \u003d objects.ComputeNodeList.get_all_by_uuids(context,"},{"line_number":584,"context_line":"                                                                 compute_uuids)"},{"line_number":585,"context_line":"        return self._get_host_states(context, compute_nodes)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a461143_8f9d835b","line":582,"range":{"start_line":580,"start_character":8,"end_line":582,"end_character":51},"updated":"2017-01-27 17:15:50.000000000","message":"Where does this Ironic thing happen?","commit_id":"97a1205fb79a458a36cf39e3c89727c7a583990d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"33932572fd14b3e902761e3ff54d24ed1d55315b","unresolved":false,"context_lines":[{"line_number":643,"context_line":"                         \"from scheduler\"), {\u0027host\u0027: host, \u0027node\u0027: node})"},{"line_number":644,"context_line":"            del self.host_state_map[state_key]"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        return (self.host_state_map[host] for host in seen_nodes)"},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"    def _get_aggregates_info(self, host):"},{"line_number":649,"context_line":"        return [self.aggs_by_id[agg_id] for agg_id in"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a461143_ef77e737","line":646,"updated":"2017-01-27 17:15:50.000000000","message":"This is no longer returning an iterator so I guess we need to update the docstring.","commit_id":"97a1205fb79a458a36cf39e3c89727c7a583990d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5bf8bb2abd41550498781bb2c3149d0b99005b3e","unresolved":false,"context_lines":[{"line_number":579,"context_line":"    def get_host_states_by_uuids(self, context, compute_uuids):"},{"line_number":580,"context_line":"        # TODO(sbauza): Remove that unnecessary lookup once Ironic supports"},{"line_number":581,"context_line":"        # the same model than other drivers... That\u0027s silly but we need to know"},{"line_number":582,"context_line":"        # the host field value only because Ironic."},{"line_number":583,"context_line":"        compute_nodes \u003d objects.ComputeNodeList.get_all_by_uuids(context,"},{"line_number":584,"context_line":"                                                                 compute_uuids)"},{"line_number":585,"context_line":"        return self._get_host_states(context, compute_nodes)"}],"source_content_type":"text/x-python","patch_set":38,"id":"3a461143_011a476e","line":582,"range":{"start_line":582,"start_character":44,"end_line":582,"end_character":50},"updated":"2017-01-27 17:21:04.000000000","message":"What about the following is specific to Ironic?","commit_id":"82ba048b8b73215e20e2ae8201a7d5236ffcf05b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5bf8bb2abd41550498781bb2c3149d0b99005b3e","unresolved":false,"context_lines":[{"line_number":593,"context_line":"        return self._get_host_states(context, compute_nodes)"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"    def _get_host_states(self, context, compute_nodes):"},{"line_number":596,"context_line":"        \"\"\"Returns a generator of HostStates given a list of computes."},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"        Also updates the HostStates internal mapping for the HostManager."},{"line_number":599,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":38,"id":"3a461143_c10f5f2c","line":596,"range":{"start_line":596,"start_character":21,"end_line":596,"end_character":30},"updated":"2017-01-27 17:21:04.000000000","message":"This is no longer true.","commit_id":"82ba048b8b73215e20e2ae8201a7d5236ffcf05b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e7ed7728253a1a9b8d0cb29e2ccd5317af9293ab","unresolved":false,"context_lines":[{"line_number":590,"context_line":"        return self._get_host_states(context, compute_nodes)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    def _get_host_states(self, context, compute_nodes):"},{"line_number":593,"context_line":"        \"\"\"Returns a list of HostStates given a list of computes."},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        Also updates the HostStates internal mapping for the HostManager."},{"line_number":596,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_a556d459","line":593,"range":{"start_line":593,"start_character":21,"end_line":593,"end_character":25},"updated":"2017-01-27 23:12:53.000000000","message":"nit: technically it returns a tuple.","commit_id":"567c479df73860dbe272382af437bdc5883625e5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"2f3e707bd06a91153e399ee274740723dc16265b","unresolved":false,"context_lines":[{"line_number":590,"context_line":"        return self._get_host_states(context, compute_nodes)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    def _get_host_states(self, context, compute_nodes):"},{"line_number":593,"context_line":"        \"\"\"Returns a tuple of HostStates given a list of computes."},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        Also updates the HostStates internal mapping for the HostManager."},{"line_number":596,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":41,"id":"3a461143_06a31201","line":593,"range":{"start_line":593,"start_character":21,"end_line":593,"end_character":26},"updated":"2017-01-30 10:32:53.000000000","message":"nope, it returns an iterator of HostStates which is a generator created by the generator expression below L635. I used the previous word \u0027list\u0027 which is also untrue, but that\u0027s really not a tuple, given it\u0027s still mutable.","commit_id":"4660333d0d97d8e00cf290ea1d4ed932f5edc1dc"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c0a5294a116e108c75dc0f99992b17f54320b212","unresolved":false,"context_lines":[{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        Also updates the HostStates internal mapping for the HostManager."},{"line_number":596,"context_line":"        \"\"\""},{"line_number":597,"context_line":"        service_refs \u003d {service.host: service"},{"line_number":598,"context_line":"                        for service in objects.ServiceList.get_by_binary("},{"line_number":599,"context_line":"                            context, \u0027nova-compute\u0027, include_disabled\u003dTrue)}"},{"line_number":600,"context_line":"        # Get resource usage across the available compute nodes:"},{"line_number":601,"context_line":"        seen_nodes \u003d set()"},{"line_number":602,"context_line":"        for compute in compute_nodes:"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a461143_766ca0d0","line":599,"range":{"start_line":597,"start_character":8,"end_line":599,"end_character":76},"updated":"2017-01-28 00:48:13.000000000","message":"Emm..This always gets all the services. We can just get part of them. But it can be improved later.","commit_id":"4660333d0d97d8e00cf290ea1d4ed932f5edc1dc"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"2f3e707bd06a91153e399ee274740723dc16265b","unresolved":false,"context_lines":[{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        Also updates the HostStates internal mapping for the HostManager."},{"line_number":596,"context_line":"        \"\"\""},{"line_number":597,"context_line":"        service_refs \u003d {service.host: service"},{"line_number":598,"context_line":"                        for service in objects.ServiceList.get_by_binary("},{"line_number":599,"context_line":"                            context, \u0027nova-compute\u0027, include_disabled\u003dTrue)}"},{"line_number":600,"context_line":"        # Get resource usage across the available compute nodes:"},{"line_number":601,"context_line":"        seen_nodes \u003d set()"},{"line_number":602,"context_line":"        for compute in compute_nodes:"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a461143_6695b685","line":599,"range":{"start_line":597,"start_character":8,"end_line":599,"end_character":76},"in_reply_to":"3a461143_766ca0d0","updated":"2017-01-30 10:32:53.000000000","message":"Right, I thought about that previously, but it would have needed a new ServiceList object method to be written, and given the deadline, I preferred to leave that (no performance penalty)","commit_id":"4660333d0d97d8e00cf290ea1d4ed932f5edc1dc"}],"nova/service.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"33932572fd14b3e902761e3ff54d24ed1d55315b","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    service.topic \u003d this_service.topic"},{"line_number":71,"context_line":"    service.report_count \u003d 0"},{"line_number":72,"context_line":"    service.create()"},{"line_number":73,"context_line":"    LOG.info(_LI(\u0027Created service for %(binary)s on \u0027"},{"line_number":74,"context_line":"                 \u0027%(host)s version %(version)i\u0027),"},{"line_number":75,"context_line":"             {\u0027binary\u0027: service.binary,"},{"line_number":76,"context_line":"              \u0027host\u0027: service.host,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a461143_4f08fb91","line":73,"updated":"2017-01-27 17:15:50.000000000","message":"Do we want to leave this?","commit_id":"97a1205fb79a458a36cf39e3c89727c7a583990d"}],"nova/tests/functional/test_server_group.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2ca2eb42ddaa67207fd3ab2628712bd096d76227","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":73,"context_line":"            api_version\u003d\u0027v2.1\u0027))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        self.api \u003d api_fixture.api"},{"line_number":76,"context_line":"        self.api.microversion \u003d self.microversion"},{"line_number":77,"context_line":"        self.admin_api \u003d api_fixture.admin_api"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a3905b3_4924f20b","side":"PARENT","line":74,"updated":"2017-01-24 16:20:01.000000000","message":"unrelated?","commit_id":"ad78158deb48d03b90520f88640a92956ee7b9f3"}],"nova/tests/unit/scheduler/test_caching_scheduler.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2ca2eb42ddaa67207fd3ab2628712bd096d76227","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    @mock.patch.object(caching_scheduler.CachingScheduler,"},{"line_number":47,"context_line":"                       \"_get_up_hosts\")"},{"line_number":48,"context_line":"    def test_get_all_host_states_returns_cached_value(self,"},{"line_number":49,"context_line":"                                                           mock_up_hosts):"},{"line_number":50,"context_line":"        self.driver.all_host_states \u003d []"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        self.driver._get_all_host_states(self.context, None)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a3905b3_49007234","line":49,"updated":"2017-01-24 16:20:01.000000000","message":"strange formatting","commit_id":"a121eb17c6a163816b50f11d9516704c51cdbd72"}],"releasenotes/notes/resource_providers_scheduler_db_filters-16b2ed3da00c51dd.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"518bc1089bff6888445c4621b73d3333ca80c6de","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    a list of valid destinations before calling the filters. That works only"},{"line_number":5,"context_line":"    if all your compute nodes are fully upgraded to Ocata unless in case of a"},{"line_number":6,"context_line":"    partial upgrade, the scheduler will still lookup the DB instead which is"},{"line_number":7,"context_line":"    underperformant."},{"line_number":8,"context_line":"upgrade:"},{"line_number":9,"context_line":"  - Since the Placement service is now mandatory in Ocata, you need to deploy"},{"line_number":10,"context_line":"    it and amend your compute node configuration with correct placement"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3a461143_64cb4754","line":7,"updated":"2017-01-26 19:04:14.000000000","message":"perhaps change as:\n\nfully upgraded to Ocata. If some nodes are not upgraded, the scheduler will still read all host information from the DB which is less performant.","commit_id":"14f42267e923004e9c60eb95402decdd868ecd70"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"518bc1089bff6888445c4621b73d3333ca80c6de","unresolved":false,"context_lines":[{"line_number":8,"context_line":"upgrade:"},{"line_number":9,"context_line":"  - Since the Placement service is now mandatory in Ocata, you need to deploy"},{"line_number":10,"context_line":"    it and amend your compute node configuration with correct placement"},{"line_number":11,"context_line":"    instructions before restarting nova-compute or the compute node would"},{"line_number":12,"context_line":"    refuse to start."},{"line_number":13,"context_line":"  - If by Newton (14.0.0), you don\u0027t use neither CoreFilter, RAMFilter or"},{"line_number":14,"context_line":"    DiskFilter, then please modify all your compute node\u0027s configuration by"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3a461143_c4c07b2d","line":11,"updated":"2017-01-26 19:04:14.000000000","message":"s/would/will/","commit_id":"14f42267e923004e9c60eb95402decdd868ecd70"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"518bc1089bff6888445c4621b73d3333ca80c6de","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    it and amend your compute node configuration with correct placement"},{"line_number":11,"context_line":"    instructions before restarting nova-compute or the compute node would"},{"line_number":12,"context_line":"    refuse to start."},{"line_number":13,"context_line":"  - If by Newton (14.0.0), you don\u0027t use neither CoreFilter, RAMFilter or"},{"line_number":14,"context_line":"    DiskFilter, then please modify all your compute node\u0027s configuration by"},{"line_number":15,"context_line":"    amending either ``cpu_allocation_ratio`` (if you don\u0027t use CoreFilter) or"},{"line_number":16,"context_line":"    ``ram_allocation_ratio`` (if you don\u0027t use RAMFilter) or"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3a461143_a4dc4f13","line":13,"updated":"2017-01-26 19:04:14.000000000","message":"s/neither/any of the/","commit_id":"14f42267e923004e9c60eb95402decdd868ecd70"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"33932572fd14b3e902761e3ff54d24ed1d55315b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    a list of valid destinations before calling the filters. That works only"},{"line_number":5,"context_line":"    if all your compute nodes are fully upgraded to Ocata. If some"},{"line_number":6,"context_line":"    nodes are not upgraded, the scheduler will still lookup from the DB"},{"line_number":7,"context_line":"    instead which is less performant and will result in poorer decisions."},{"line_number":8,"context_line":"upgrade:"},{"line_number":9,"context_line":"  - Since the Placement service is now mandatory in Ocata, you need to deploy"},{"line_number":10,"context_line":"    it and amend your compute node configuration with correct placement"}],"source_content_type":"text/x-yaml","patch_set":36,"id":"3a461143_4fcb9b1e","line":7,"range":{"start_line":7,"start_character":37,"end_line":7,"end_character":73},"updated":"2017-01-27 17:15:50.000000000","message":"Que? How is that any worse than what we do today?","commit_id":"97a1205fb79a458a36cf39e3c89727c7a583990d"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"d22cba9ffe8fa469e7f9cec1e5f19d6a90392a90","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    a list of valid destinations before calling the filters. That works only"},{"line_number":5,"context_line":"    if all your compute nodes are fully upgraded to Ocata. If some"},{"line_number":6,"context_line":"    nodes are not upgraded, the scheduler will still lookup from the DB"},{"line_number":7,"context_line":"    instead which is less performant and will result in poorer decisions."},{"line_number":8,"context_line":"upgrade:"},{"line_number":9,"context_line":"  - Since the Placement service is now mandatory in Ocata, you need to deploy"},{"line_number":10,"context_line":"    it and amend your compute node configuration with correct placement"}],"source_content_type":"text/x-yaml","patch_set":36,"id":"3a461143_a15fb33f","line":7,"range":{"start_line":7,"start_character":37,"end_line":7,"end_character":73},"in_reply_to":"3a461143_4fcb9b1e","updated":"2017-01-27 18:13:05.000000000","message":"hmm, true I am not sure we improve that yet.","commit_id":"97a1205fb79a458a36cf39e3c89727c7a583990d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"33932572fd14b3e902761e3ff54d24ed1d55315b","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    it and amend your compute node configuration with correct placement"},{"line_number":11,"context_line":"    instructions before restarting nova-compute or the compute node will"},{"line_number":12,"context_line":"    refuse to start."},{"line_number":13,"context_line":"  - If by Newton (14.0.0), you don\u0027t use any of the CoreFilter, RAMFilter or"},{"line_number":14,"context_line":"    DiskFilter, then please modify all your compute node\u0027s configuration by"},{"line_number":15,"context_line":"    amending either ``cpu_allocation_ratio`` (if you don\u0027t use CoreFilter) or"},{"line_number":16,"context_line":"    ``ram_allocation_ratio`` (if you don\u0027t use RAMFilter) or"},{"line_number":17,"context_line":"    ``disk_allocation_ratio`` (if you don\u0027t use DiskFilter) by putting a 9999.0"},{"line_number":18,"context_line":"    value for the ratio before upgrading the nova-scheduler to Ocata."}],"source_content_type":"text/x-yaml","patch_set":36,"id":"3a461143_8fa3c34e","line":18,"range":{"start_line":13,"start_character":2,"end_line":18,"end_character":69},"updated":"2017-01-27 17:15:50.000000000","message":"We could do this in a follow up change, but I think we also want to update the various config option help text for the filter_scheduler.enabled_filters option and the *_allocation_ratio options.","commit_id":"97a1205fb79a458a36cf39e3c89727c7a583990d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e7ed7728253a1a9b8d0cb29e2ccd5317af9293ab","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    it and amend your compute node configuration with correct placement"},{"line_number":11,"context_line":"    instructions before restarting nova-compute or the compute node will"},{"line_number":12,"context_line":"    refuse to start."},{"line_number":13,"context_line":"  - If by Newton (14.0.0), you don\u0027t use any of the CoreFilter, RAMFilter or"},{"line_number":14,"context_line":"    DiskFilter, then please modify all your compute node\u0027s configuration by"},{"line_number":15,"context_line":"    amending either ``cpu_allocation_ratio`` (if you don\u0027t use CoreFilter) or"},{"line_number":16,"context_line":"    ``ram_allocation_ratio`` (if you don\u0027t use RAMFilter) or"}],"source_content_type":"text/x-yaml","patch_set":40,"id":"3a461143_054a48ac","line":13,"range":{"start_line":13,"start_character":64,"end_line":13,"end_character":73},"updated":"2017-01-27 23:12:53.000000000","message":"nit: RamFilter","commit_id":"567c479df73860dbe272382af437bdc5883625e5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e7ed7728253a1a9b8d0cb29e2ccd5317af9293ab","unresolved":false,"context_lines":[{"line_number":13,"context_line":"  - If by Newton (14.0.0), you don\u0027t use any of the CoreFilter, RAMFilter or"},{"line_number":14,"context_line":"    DiskFilter, then please modify all your compute node\u0027s configuration by"},{"line_number":15,"context_line":"    amending either ``cpu_allocation_ratio`` (if you don\u0027t use CoreFilter) or"},{"line_number":16,"context_line":"    ``ram_allocation_ratio`` (if you don\u0027t use RAMFilter) or"},{"line_number":17,"context_line":"    ``disk_allocation_ratio`` (if you don\u0027t use DiskFilter) by putting a 9999.0"},{"line_number":18,"context_line":"    value for the ratio before upgrading the nova-scheduler to Ocata."}],"source_content_type":"text/x-yaml","patch_set":40,"id":"3a461143_25c90427","line":16,"range":{"start_line":16,"start_character":47,"end_line":16,"end_character":56},"updated":"2017-01-27 23:12:53.000000000","message":"RamFilter","commit_id":"567c479df73860dbe272382af437bdc5883625e5"}]}
