)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a9433241d4c4d1f012116dc0f960eb923559a7e9","unresolved":false,"context_lines":[{"line_number":15,"context_line":"set of extra specs key value pairs that are required to schedule to"},{"line_number":16,"context_line":"the aggregate, e.g.:"},{"line_number":17,"context_line":"  standard memory backing aggregate:"},{"line_number":18,"context_line":"    flavor extra_spec: \"hw:mem_page_size\": \"\u003cor\u003e small \u003cor\u003e ~\""},{"line_number":19,"context_line":"  high bandwidth memory backing aggregate:"},{"line_number":20,"context_line":"    flavor_extra_spec: \"hw:mem_page_size\": \"\u003cor\u003e 2M \u003cor\u003e 1G,\" \\"},{"line_number":21,"context_line":"                       \"\u003cor\u003e large\""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a57f1b5_1c49e931","line":18,"range":{"start_line":18,"start_character":4,"end_line":18,"end_character":21},"updated":"2016-02-10 10:11:50.000000000","message":"you forgot to modify the commit msg details","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"52d878d2ac4c76b09f614342e349f87e5f4e8d78","unresolved":false,"context_lines":[{"line_number":15,"context_line":"set of extra specs key value pairs that are required to schedule to"},{"line_number":16,"context_line":"the aggregate, e.g.:"},{"line_number":17,"context_line":"  standard memory backing aggregate:"},{"line_number":18,"context_line":"    flavor extra_spec: \"hw:mem_page_size\": \"\u003cor\u003e small \u003cor\u003e ~\""},{"line_number":19,"context_line":"  high bandwidth memory backing aggregate:"},{"line_number":20,"context_line":"    flavor_extra_spec: \"hw:mem_page_size\": \"\u003cor\u003e 2M \u003cor\u003e 1G,\" \\"},{"line_number":21,"context_line":"                       \"\u003cor\u003e large\""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a57f1b5_323ac937","line":18,"range":{"start_line":18,"start_character":4,"end_line":18,"end_character":21},"in_reply_to":"3a57f1b5_1c49e931","updated":"2016-02-10 15:25:57.000000000","message":"Done","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"30e29c87c58ad82305c023b8e7097fca93ab5a86","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    flavor_extra_spec: \"hw:mem_page_size\": \"\u003cor\u003e 2M \u003cor\u003e 1G,\" \\"},{"line_number":21,"context_line":"                       \"\u003cor\u003e large\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I1f58dae3bef113a0803980f1a26ae712e8b1840e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a57f1b5_973132a5","line":23,"updated":"2016-02-10 10:12:52.000000000","message":"I made a top-level comment, could you please make sure to read it ?\n\nAlso, I feel that this commit msg is now a bit untrue, because it\u0027s not a revert of a revert, but rather a plain new patchset.","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"52d878d2ac4c76b09f614342e349f87e5f4e8d78","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    flavor_extra_spec: \"hw:mem_page_size\": \"\u003cor\u003e 2M \u003cor\u003e 1G,\" \\"},{"line_number":21,"context_line":"                       \"\u003cor\u003e large\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I1f58dae3bef113a0803980f1a26ae712e8b1840e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a57f1b5_12354d45","line":23,"in_reply_to":"3a57f1b5_973132a5","updated":"2016-02-10 15:25:57.000000000","message":"That\u0027s true. Fixed.","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"}],"nova/scheduler/filters/aggregate_extra_specs.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a9433241d4c4d1f012116dc0f960eb923559a7e9","unresolved":false,"context_lines":[{"line_number":30,"context_line":"SENTINELS \u003d [ASTERISK, TILDE, EXCLAMATION]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class AggregateExtraSpecsFilter(filters.BaseHostFilter):"},{"line_number":34,"context_line":"    \"\"\"AggregateExtraSpecsFilter checks that the extra specs associated with the"},{"line_number":35,"context_line":"    instance type match the metadata provided by aggregates, based on the"},{"line_number":36,"context_line":"    following rules:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_9c7e39e3","line":33,"range":{"start_line":33,"start_character":6,"end_line":33,"end_character":31},"updated":"2016-02-10 10:11:50.000000000","message":"just a comment on the naming : most of our operators already have hard time considering what is the difference between metadata and extra specs. I\u0027d rather consider naming our filter like \u0027AggregateInstanceTypeFilter\".\n\nThat said, I\u0027m very bad at naming things, you should definitely get another opinion.","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"52d878d2ac4c76b09f614342e349f87e5f4e8d78","unresolved":false,"context_lines":[{"line_number":30,"context_line":"SENTINELS \u003d [ASTERISK, TILDE, EXCLAMATION]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class AggregateExtraSpecsFilter(filters.BaseHostFilter):"},{"line_number":34,"context_line":"    \"\"\"AggregateExtraSpecsFilter checks that the extra specs associated with the"},{"line_number":35,"context_line":"    instance type match the metadata provided by aggregates, based on the"},{"line_number":36,"context_line":"    following rules:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_a5ef55af","line":33,"range":{"start_line":33,"start_character":6,"end_line":33,"end_character":31},"in_reply_to":"3a57f1b5_9c7e39e3","updated":"2016-02-10 15:25:57.000000000","message":"I agree with AggregateInstanceTypeFilter","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a9433241d4c4d1f012116dc0f960eb923559a7e9","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"AggregateExtraSpecsFilter checks that the extra specs associated with the"},{"line_number":35,"context_line":"    instance type match the metadata provided by aggregates, based on the"},{"line_number":36,"context_line":"    following rules:"},{"line_number":37,"context_line":"    - If the key it\u0027s not scoped, it will be checked always."},{"line_number":38,"context_line":"    - If the key it\u0027s scoped with \"aggregate_instance_extra_specs\", this"},{"line_number":39,"context_line":"      scope will be removed and the key will be checked always."},{"line_number":40,"context_line":"    - If the key it\u0027s scoped with other namespace, the key (included the"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_dc7ef1ad","line":37,"range":{"start_line":37,"start_character":17,"end_line":37,"end_character":21},"updated":"2016-02-10 10:11:50.000000000","message":"nit: s/it\u0027s/is","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"52d878d2ac4c76b09f614342e349f87e5f4e8d78","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"\"\"AggregateExtraSpecsFilter checks that the extra specs associated with the"},{"line_number":35,"context_line":"    instance type match the metadata provided by aggregates, based on the"},{"line_number":36,"context_line":"    following rules:"},{"line_number":37,"context_line":"    - If the key it\u0027s not scoped, it will be checked always."},{"line_number":38,"context_line":"    - If the key it\u0027s scoped with \"aggregate_instance_extra_specs\", this"},{"line_number":39,"context_line":"      scope will be removed and the key will be checked always."},{"line_number":40,"context_line":"    - If the key it\u0027s scoped with other namespace, the key (included the"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_257285e6","line":37,"range":{"start_line":37,"start_character":17,"end_line":37,"end_character":21},"in_reply_to":"3a57f1b5_dc7ef1ad","updated":"2016-02-10 15:25:57.000000000","message":"Done","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a9433241d4c4d1f012116dc0f960eb923559a7e9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    - If the key it\u0027s not scoped, it will be checked always."},{"line_number":38,"context_line":"    - If the key it\u0027s scoped with \"aggregate_instance_extra_specs\", this"},{"line_number":39,"context_line":"      scope will be removed and the key will be checked always."},{"line_number":40,"context_line":"    - If the key it\u0027s scoped with other namespace, the key (included the"},{"line_number":41,"context_line":"      namespace) will be checked only if it exists in the aggregate"},{"line_number":42,"context_line":"      metadata. If not, the host will pass despite of the value in the key."},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_1c2329bf","line":40,"range":{"start_line":40,"start_character":33,"end_line":40,"end_character":34},"updated":"2016-02-10 10:11:50.000000000","message":"nit: with /any/ other (but English is not my native language, so I leave others commenting)","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"52d878d2ac4c76b09f614342e349f87e5f4e8d78","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    - If the key it\u0027s not scoped, it will be checked always."},{"line_number":38,"context_line":"    - If the key it\u0027s scoped with \"aggregate_instance_extra_specs\", this"},{"line_number":39,"context_line":"      scope will be removed and the key will be checked always."},{"line_number":40,"context_line":"    - If the key it\u0027s scoped with other namespace, the key (included the"},{"line_number":41,"context_line":"      namespace) will be checked only if it exists in the aggregate"},{"line_number":42,"context_line":"      metadata. If not, the host will pass despite of the value in the key."},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_8581f991","line":40,"range":{"start_line":40,"start_character":33,"end_line":40,"end_character":34},"in_reply_to":"3a57f1b5_1c2329bf","updated":"2016-02-10 15:25:57.000000000","message":"Done","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a9433241d4c4d1f012116dc0f960eb923559a7e9","unresolved":false,"context_lines":[{"line_number":39,"context_line":"      scope will be removed and the key will be checked always."},{"line_number":40,"context_line":"    - If the key it\u0027s scoped with other namespace, the key (included the"},{"line_number":41,"context_line":"      namespace) will be checked only if it exists in the aggregate"},{"line_number":42,"context_line":"      metadata. If not, the host will pass despite of the value in the key."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    To use this filter, the name of this class should be added to the variable"},{"line_number":45,"context_line":"    ``scheduler_default_filters``, in ``nova.conf``:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_7c181d85","line":42,"updated":"2016-02-10 10:11:50.000000000","message":"the expected behaviour looks good to me","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"52d878d2ac4c76b09f614342e349f87e5f4e8d78","unresolved":false,"context_lines":[{"line_number":39,"context_line":"      scope will be removed and the key will be checked always."},{"line_number":40,"context_line":"    - If the key it\u0027s scoped with other namespace, the key (included the"},{"line_number":41,"context_line":"      namespace) will be checked only if it exists in the aggregate"},{"line_number":42,"context_line":"      metadata. If not, the host will pass despite of the value in the key."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    To use this filter, the name of this class should be added to the variable"},{"line_number":45,"context_line":"    ``scheduler_default_filters``, in ``nova.conf``:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_a57e75ac","line":42,"in_reply_to":"3a57f1b5_7c181d85","updated":"2016-02-10 15:25:57.000000000","message":"Thanks!","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a9433241d4c4d1f012116dc0f960eb923559a7e9","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    ``scheduler_default_filters``, in ``nova.conf``:"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    |   [DEFAULT]"},{"line_number":48,"context_line":"    |   scheduler_default_filters\u003d\u003clist of other filters\u003e, \\"},{"line_number":49,"context_line":"                                  AggregateExtraSpecsFilter"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    Each \u003ckey\u003e:\u003cvalue\u003e will be stored in host aggregate metadata and flavor"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_9c9ab913","line":48,"range":{"start_line":48,"start_character":32,"end_line":48,"end_character":35},"updated":"2016-02-10 10:11:50.000000000","message":"nit: FYI, since it\u0027s a ListOpt, you can do +\u003d myfilter it works","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"52d878d2ac4c76b09f614342e349f87e5f4e8d78","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    ``scheduler_default_filters``, in ``nova.conf``:"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    |   [DEFAULT]"},{"line_number":48,"context_line":"    |   scheduler_default_filters\u003d\u003clist of other filters\u003e, \\"},{"line_number":49,"context_line":"                                  AggregateExtraSpecsFilter"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    Each \u003ckey\u003e:\u003cvalue\u003e will be stored in host aggregate metadata and flavor"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_454a2185","line":48,"range":{"start_line":48,"start_character":32,"end_line":48,"end_character":35},"in_reply_to":"3a57f1b5_9c9ab913","updated":"2016-02-10 15:25:57.000000000","message":"Thanks for the tip!","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a9433241d4c4d1f012116dc0f960eb923559a7e9","unresolved":false,"context_lines":[{"line_number":42,"context_line":"      metadata. If not, the host will pass despite of the value in the key."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    To use this filter, the name of this class should be added to the variable"},{"line_number":45,"context_line":"    ``scheduler_default_filters``, in ``nova.conf``:"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    |   [DEFAULT]"},{"line_number":48,"context_line":"    |   scheduler_default_filters\u003d\u003clist of other filters\u003e, \\"},{"line_number":49,"context_line":"                                  AggregateExtraSpecsFilter"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    Each \u003ckey\u003e:\u003cvalue\u003e will be stored in host aggregate metadata and flavor"},{"line_number":52,"context_line":"    extra specs. The following operators inside the value are supported:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_bcaa1518","line":49,"range":{"start_line":45,"start_character":52,"end_line":49,"end_character":59},"updated":"2016-02-10 10:11:50.000000000","message":"all of that is redundant, you don\u0027t need to mention that","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a9433241d4c4d1f012116dc0f960eb923559a7e9","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    Each \u003ckey\u003e:\u003cvalue\u003e will be stored in host aggregate metadata and flavor"},{"line_number":52,"context_line":"    extra specs. The following operators inside the value are supported:"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    |   \u003d, s\u003d\u003d, s!\u003d, s\u003e\u003d, s\u003e, s\u003c\u003d, s\u003c, \u003cin\u003e, \u003call-in\u003e, \u003cor\u003e, \u003d\u003d, !\u003d, \u003e\u003d, \u003c\u003d"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    And example of content could be:"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_575c1a25","line":54,"updated":"2016-02-10 10:11:50.000000000","message":"you could just mention that this filter will support the same operators as ComputeCapabilitiesFilter (or rather mention the method which syntaxically check the logic, ie. extra_specs_ops.match), that\u0027s acceptable IMHO","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"52d878d2ac4c76b09f614342e349f87e5f4e8d78","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    Each \u003ckey\u003e:\u003cvalue\u003e will be stored in host aggregate metadata and flavor"},{"line_number":52,"context_line":"    extra specs. The following operators inside the value are supported:"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    |   \u003d, s\u003d\u003d, s!\u003d, s\u003e\u003d, s\u003e, s\u003c\u003d, s\u003c, \u003cin\u003e, \u003call-in\u003e, \u003cor\u003e, \u003d\u003d, !\u003d, \u003e\u003d, \u003c\u003d"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    And example of content could be:"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_28257caa","line":54,"in_reply_to":"3a57f1b5_575c1a25","updated":"2016-02-10 15:25:57.000000000","message":"I agree with that. It\u0027s already documented in this file.","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"}],"nova/scheduler/filters/aggregate_instance_extra_specs.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a9433241d4c4d1f012116dc0f960eb923559a7e9","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __init__(self):"},{"line_number":38,"context_line":"        LOG.warning(_LW("},{"line_number":39,"context_line":"            \"Deprecated: Starting with the Mitaka release, this filter will \""},{"line_number":40,"context_line":"            \"be removed and substituted by AggregateExtraSpecsFilter. This \""},{"line_number":41,"context_line":"            \"new filter is syntactically backwards compatible and adds new \""},{"line_number":42,"context_line":"            \"features.\"))"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_7c825d54","line":39,"range":{"start_line":39,"start_character":43,"end_line":39,"end_character":49},"updated":"2016-02-10 10:11:50.000000000","message":"You should say \u0027Mitaka (13.0.0.0)\u0027 to be precise","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"52d878d2ac4c76b09f614342e349f87e5f4e8d78","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __init__(self):"},{"line_number":38,"context_line":"        LOG.warning(_LW("},{"line_number":39,"context_line":"            \"Deprecated: Starting with the Mitaka release, this filter will \""},{"line_number":40,"context_line":"            \"be removed and substituted by AggregateExtraSpecsFilter. This \""},{"line_number":41,"context_line":"            \"new filter is syntactically backwards compatible and adds new \""},{"line_number":42,"context_line":"            \"features.\"))"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_e83764e1","line":39,"range":{"start_line":39,"start_character":43,"end_line":39,"end_character":49},"in_reply_to":"3a57f1b5_7c825d54","updated":"2016-02-10 15:25:57.000000000","message":"Done","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"}],"nova/scheduler/filters/type_filter.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"01df13bb4d71edd95c5cad21e2f672e1a968c541","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _instance_is_allowed_in_aggregate(self,"},{"line_number":127,"context_line":"                                          aggregate_extra_spec,"},{"line_number":128,"context_line":"                                          instance_extra_specs):"},{"line_number":129,"context_line":"        \"\"\"Loop over all aggregate_extra_spec elements parsed and execute the"},{"line_number":130,"context_line":"        appropriate filter action."},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_43c4795e","line":128,"range":{"start_line":128,"start_character":42,"end_line":128,"end_character":62},"updated":"2016-02-02 12:03:11.000000000","message":"here you could check the _SCOPE like AggregateInstanceExtraSpecsFilter was doing","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"083f492433fa8dfa55d85e7fb64b420d61d7433a","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _instance_is_allowed_in_aggregate(self,"},{"line_number":127,"context_line":"                                          aggregate_extra_spec,"},{"line_number":128,"context_line":"                                          instance_extra_specs):"},{"line_number":129,"context_line":"        \"\"\"Loop over all aggregate_extra_spec elements parsed and execute the"},{"line_number":130,"context_line":"        appropriate filter action."},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a5ae5dd_9fdc0b48","line":128,"range":{"start_line":128,"start_character":42,"end_line":128,"end_character":62},"in_reply_to":"5a5ae5dd_a5ec5e90","updated":"2016-02-03 02:42:51.000000000","message":"ok so if we want to support compatablity with _SCOPE code and allow for namespaced keys then would the follow be acceptable.\n\nwe introduce a new function _normalies_instance_extra_specs which will pre process the instance extra spec keys and retrun a normalied version which we would call on line 199, that way the instance_extra_specs is normalised before it is passed into this function.\n\n_normalies_instance_extra_specs would look something like this.\n\n_SCOPE \u003d \u0027aggregate_instance_extra_specs\u0027\ndef _normalies_instance_extra_specs(self, instance_extra_specs):\n    ret \u003d {}\n    for key in instance_extra_specs:\n        if key.startwith(_SCOPE+\u0027:\u0027):\n            norm_key \u003d key.replace(_SCOPE+\u0027:\u0027,\u0027\u0027,1)\n            ret[norm_key]\u003dinstance_extra_specs[key]\n        else:\n            ret[key]\u003dinstance_extra_specs[key]\n    return ret","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8a84dde62dcd9daf66354dc034799b757157ddef","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _instance_is_allowed_in_aggregate(self,"},{"line_number":127,"context_line":"                                          aggregate_extra_spec,"},{"line_number":128,"context_line":"                                          instance_extra_specs):"},{"line_number":129,"context_line":"        \"\"\"Loop over all aggregate_extra_spec elements parsed and execute the"},{"line_number":130,"context_line":"        appropriate filter action."},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_74ba71c2","line":128,"range":{"start_line":128,"start_character":42,"end_line":128,"end_character":62},"in_reply_to":"7a5de9d1_43c4795e","updated":"2016-02-02 22:30:38.000000000","message":"i am assuming that you are referring to the following section of code \n\nhttps://github.com/openstack/nova/blob/3716752f0d09581044c86228dbff9fdc84dc0720/nova/scheduler/filters/aggregate_instance_extra_specs.py#L49-L55\n\n_SCOPE \u003d \u0027aggregate_instance_extra_specs\u0027\n\n\nfor key, req in instance_type[\u0027extra_specs\u0027].iteritems():\n            # Either not scope format, or aggregate_instance_extra_specs scope\n            scope \u003d key.split(\u0027:\u0027, 1)\n            if len(scope) \u003e 1:\n                if scope[0] !\u003d _SCOPE:\n                    continue\n                else:\n                    del scope[0]\n            key \u003d scope[0]\n\n\nif i understand that code correctly then including it would break how we want the filter to work.\n\nif key was hw:mem_page_size in with the above code the scope[0] !\u003d _SCOPE comparison would evaluate to true and the iteration of the loop would be skipped by the call to continue. \n\nif this is not what you intended can you provide an example of what you were suggesting.\n\nwith this filter we want to support keys that are namespaced as part of the key/value pairs in flavor_extra_spec and do not want \u0027hw:mem_page_size\u0027 to be considered equal to \u0027mem_page_size\u0027","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"518aae4160d3cc74d4db8755781e480e509abe84","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _instance_is_allowed_in_aggregate(self,"},{"line_number":127,"context_line":"                                          aggregate_extra_spec,"},{"line_number":128,"context_line":"                                          instance_extra_specs):"},{"line_number":129,"context_line":"        \"\"\"Loop over all aggregate_extra_spec elements parsed and execute the"},{"line_number":130,"context_line":"        appropriate filter action."},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a5ae5dd_a5ec5e90","line":128,"range":{"start_line":128,"start_character":42,"end_line":128,"end_character":62},"in_reply_to":"7a5de9d1_74ba71c2","updated":"2016-02-02 23:29:34.000000000","message":"I get what you want :-) What I\u0027m trying to explain is that I don\u0027t want to have two filters for that, so I\u0027d like to have this filter having a compatibility with the old one.","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"01df13bb4d71edd95c5cad21e2f672e1a968c541","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":174,"context_line":"                              \"is not present\", {\u0027key\u0027: key})"},{"line_number":175,"context_line":"                    return False"},{"line_number":176,"context_line":"                if instance_extra_specs[key] not in value:"},{"line_number":177,"context_line":"                    LOG.debug(\"The following \u0027flavor_extra_spec\u0027 \""},{"line_number":178,"context_line":"                              \"key\u003dvalue: %(key)s\u003d%(value)s doesn\u0027t \""},{"line_number":179,"context_line":"                              \"match\", {\u0027key\u0027: key, \u0027value\u0027: value})"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_a3e52ddd","line":176,"range":{"start_line":176,"start_character":19,"end_line":176,"end_character":57},"updated":"2016-02-02 12:03:11.000000000","message":"here you could just use extra_specs_ops.match() like AggregateInstanceExtraSpecsFilter does.","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"083f492433fa8dfa55d85e7fb64b420d61d7433a","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":174,"context_line":"                              \"is not present\", {\u0027key\u0027: key})"},{"line_number":175,"context_line":"                    return False"},{"line_number":176,"context_line":"                if instance_extra_specs[key] not in value:"},{"line_number":177,"context_line":"                    LOG.debug(\"The following \u0027flavor_extra_spec\u0027 \""},{"line_number":178,"context_line":"                              \"key\u003dvalue: %(key)s\u003d%(value)s doesn\u0027t \""},{"line_number":179,"context_line":"                              \"match\", {\u0027key\u0027: key, \u0027value\u0027: value})"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a5ae5dd_59b0f38b","line":176,"range":{"start_line":176,"start_character":19,"end_line":176,"end_character":57},"in_reply_to":"5a5ae5dd_25f94e4e","updated":"2016-02-03 02:42:51.000000000","message":"provided we do the sentinel evaluation first as above and we change our key/value separator form \u003d to \u0027;\u0027 \u0027|\u0027 or \u0027#\u0027 on line 118 we could replace this with \nif any( extra_specs_ops.match(instance_extra_specs[key],ret) for val in value):\n\nassumuing we chose \u0027|\u0027 as our separator instead of \nflavor_extra_spec\u003d\u0027hw:mem_page_size\u003dany,hw:mem_page_size\u003dsmall,hw:mem_page_size\u003d~\u0027\n\nyou would write\nflavor_extra_spec\u003d\u0027hw:mem_page_size|s\u003d\u003d any,hw:mem_page_size|s\u003d\u003d small,hw:mem_page_size|~\u0027 \nor more terse as\nflavor_extra_spec\u003d\u0027hw:mem_page_size|\u003cin\u003e any small,hw:mem_page_size|~\u0027\n\nI think the original syntax is cleaner but the later with our suggested change is more expressive","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8a84dde62dcd9daf66354dc034799b757157ddef","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":174,"context_line":"                              \"is not present\", {\u0027key\u0027: key})"},{"line_number":175,"context_line":"                    return False"},{"line_number":176,"context_line":"                if instance_extra_specs[key] not in value:"},{"line_number":177,"context_line":"                    LOG.debug(\"The following \u0027flavor_extra_spec\u0027 \""},{"line_number":178,"context_line":"                              \"key\u003dvalue: %(key)s\u003d%(value)s doesn\u0027t \""},{"line_number":179,"context_line":"                              \"match\", {\u0027key\u0027: key, \u0027value\u0027: value})"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_f1d753bd","line":176,"range":{"start_line":176,"start_character":19,"end_line":176,"end_character":57},"in_reply_to":"7a5de9d1_a3e52ddd","updated":"2016-02-02 22:30:38.000000000","message":"i will look into this but i believe this would introduce in correct behaviour. \n\nin particular the conversion to float and how\u0027\u003d\u0027 is treated.\nthe fact that \u003d is mapped to \u003e\u003d and not \u003d\u003d is completely non intuitive and troubling. \n\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/filters/extra_specs_ops.py#L23-L29","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"518aae4160d3cc74d4db8755781e480e509abe84","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":174,"context_line":"                              \"is not present\", {\u0027key\u0027: key})"},{"line_number":175,"context_line":"                    return False"},{"line_number":176,"context_line":"                if instance_extra_specs[key] not in value:"},{"line_number":177,"context_line":"                    LOG.debug(\"The following \u0027flavor_extra_spec\u0027 \""},{"line_number":178,"context_line":"                              \"key\u003dvalue: %(key)s\u003d%(value)s doesn\u0027t \""},{"line_number":179,"context_line":"                              \"match\", {\u0027key\u0027: key, \u0027value\u0027: value})"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a5ae5dd_25f94e4e","line":176,"range":{"start_line":176,"start_character":19,"end_line":176,"end_character":57},"in_reply_to":"7a5de9d1_f1d753bd","updated":"2016-02-02 23:29:34.000000000","message":"Sure, but that\u0027s the existing UX for ComputeCapabilitiesFilter and the one I mentioned, so I\u0027d like to see the same logic","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"01df13bb4d71edd95c5cad21e2f672e1a968c541","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            return True"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        aggregate_extra_spec_list \u003d utils.aggregate_values_from_key(host_state,"},{"line_number":193,"context_line":"            \u0027flavor_extra_spec\u0027)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":196,"context_line":"            aggregate_extra_spec \u003d self._parse_extra_spec_key_pairs("}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_c312a909","line":193,"updated":"2016-02-02 12:03:11.000000000","message":"if you were getting the list of all key/values from the aggregate, then you would be having the same behaviour with AggregateInstanceExtraSpecsFilter which means that you could deprecate it instead...","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"083f492433fa8dfa55d85e7fb64b420d61d7433a","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            return True"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        aggregate_extra_spec_list \u003d utils.aggregate_values_from_key(host_state,"},{"line_number":193,"context_line":"            \u0027flavor_extra_spec\u0027)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":196,"context_line":"            aggregate_extra_spec \u003d self._parse_extra_spec_key_pairs("}],"source_content_type":"text/x-python","patch_set":1,"id":"5a5ae5dd_6e3c0330","line":193,"in_reply_to":"5a5ae5dd_a5ba1e6d","updated":"2016-02-03 02:42:51.000000000","message":"correct that is how the other filter works but the relation ship between the metadata keys and the flavor extra spec keys is reversed in this filter by design. \n\nwith the AggregateInstanceExtraSpecsFilter  all flavour extra spec keys present in the instance must exist in the aggregate metadata for the host to pass. \n\nwith this filter all keys present in the aggregate \u0027flavor_extra_spec\u0027 property must be requested by the flavor for the host to pass. \n\nif we removed the \u0027flavor_extra_spec\u0027 entry and instead allowed any metadata key to be used then every metadata key defined on the aggreagate would have to exist in the instance flavor extra specs and there values would have to match.\n\nfor example with that change to use this with the availablity zone filter the \u0027availability_zone\u0027 metadata key would also have to be defined in the flavor extra specs and therfore you would need one flavor per availability zone. \n\nyou will have the same issue with the AggregateMultiTenancyIsolation ,AggregateImagePropertiesIsolation,AggregateIoOpsFilter,AggregateCoreFilter,AggregateRamFilter,AggregateDiskFilter,AggregateNumInstancesFilter and AggregateTypeAffinityFilter\n\nthis would effectively mean this filter could not be used with any other filter that adds metadata to an aggrevate unless you added that to the flavor also.\nby only looking at the \u0027flavor_extra_spec\u0027 this limitation can be avoided. the only other way to support this would be to require a prefix on metadata keys that would be consumed by this filter or have an excltion list of all metadata keys used in all other filters both of which i think is far less clean then the \u0027flavor_extra_spec\u0027 property.","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"518aae4160d3cc74d4db8755781e480e509abe84","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            return True"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        aggregate_extra_spec_list \u003d utils.aggregate_values_from_key(host_state,"},{"line_number":193,"context_line":"            \u0027flavor_extra_spec\u0027)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":196,"context_line":"            aggregate_extra_spec \u003d self._parse_extra_spec_key_pairs("}],"source_content_type":"text/x-python","patch_set":1,"id":"5a5ae5dd_a5ba1e6d","line":193,"in_reply_to":"7a5de9d1_275cc9ec","updated":"2016-02-02 23:29:34.000000000","message":"Because I don\u0027t want to have a specific \u0027flavor_extra_spec\u0027 key for that. Instead, all aggregate keys should be considered as possible flavor extra spec. That\u0027s exactly what the other filter is doing.","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8a84dde62dcd9daf66354dc034799b757157ddef","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            return True"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        aggregate_extra_spec_list \u003d utils.aggregate_values_from_key(host_state,"},{"line_number":193,"context_line":"            \u0027flavor_extra_spec\u0027)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":196,"context_line":"            aggregate_extra_spec \u003d self._parse_extra_spec_key_pairs("}],"source_content_type":"text/x-python","patch_set":1,"id":"7a5de9d1_275cc9ec","line":193,"in_reply_to":"7a5de9d1_c312a909","updated":"2016-02-02 22:30:38.000000000","message":"can you expand on this more? i don\u0027t understand why we  should be looking at any other values on the aggregate beyond \u0027flavor_extra_spec\u0027.","commit_id":"f37353fb990e81e54d4032c6a22f7305f1f0ba5e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a9433241d4c4d1f012116dc0f960eb923559a7e9","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class TypeAffinityFilter(filters.BaseHostFilter):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_bc6215d7","line":21,"updated":"2016-02-10 10:11:50.000000000","message":"I guess you forgot to remove that.","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"52d878d2ac4c76b09f614342e349f87e5f4e8d78","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class TypeAffinityFilter(filters.BaseHostFilter):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_c8af08e2","line":21,"in_reply_to":"3a57f1b5_bc6215d7","updated":"2016-02-10 15:25:57.000000000","message":"Done","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"}],"nova/tests/unit/scheduler/filters/test_aggregate_extra_specs_filters.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"d71e11d606f57b5570158884ee9134bf5534c156","unresolved":false,"context_lines":[{"line_number":273,"context_line":"    #     host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":274,"context_line":"    #     host_state.aggregates.append(self.aggr_nopresent)"},{"line_number":275,"context_line":"    #     self.assertTrue(self.filt_cls.host_passes(host_state,"},{"line_number":276,"context_line":"    #         self.rs_no_extraspecs))"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a57f1b5_b368a988","line":276,"updated":"2016-02-11 16:02:23.000000000","message":"all these tests need to be provided you know before merging...","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"}],"releasenotes/notes/add-aggregate-extra-specs-filter-5b3e23780c1154c7.yaml":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"65ab85bd801c93fc3a8a9d8ea38552908ba80768","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    extra specs associated with the instance type match the metadata provided by"},{"line_number":5,"context_line":"    host aggregates metadata."},{"line_number":6,"context_line":"  - The following operators inside the value are supported:"},{"line_number":7,"context_line":"    \u003d, s\u003d\u003d, s!\u003d, s\u003e\u003d, s\u003e, s\u003c\u003d, s\u003c, \u003cin\u003e, \u003call-in\u003e, \u003cor\u003e, \u003d\u003d, !\u003d, \u003e\u003d, \u003c\u003d"},{"line_number":8,"context_line":"  - The following sentinel values are supported also inside extra specs:"},{"line_number":9,"context_line":"    !, *, ~"},{"line_number":10,"context_line":"  - Documentation can be find in doc folder (doc/source/filter_scheduler.rst)"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"3a57f1b5_b749ced2","line":7,"updated":"2016-02-10 10:20:16.000000000","message":"you should rather use pre-formatted blocks (ie. RST :: )\n\nsee http://docs.openstack.org/developer/reno/usage.html#formatting","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"52d878d2ac4c76b09f614342e349f87e5f4e8d78","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    extra specs associated with the instance type match the metadata provided by"},{"line_number":5,"context_line":"    host aggregates metadata."},{"line_number":6,"context_line":"  - The following operators inside the value are supported:"},{"line_number":7,"context_line":"    \u003d, s\u003d\u003d, s!\u003d, s\u003e\u003d, s\u003e, s\u003c\u003d, s\u003c, \u003cin\u003e, \u003call-in\u003e, \u003cor\u003e, \u003d\u003d, !\u003d, \u003e\u003d, \u003c\u003d"},{"line_number":8,"context_line":"  - The following sentinel values are supported also inside extra specs:"},{"line_number":9,"context_line":"    !, *, ~"},{"line_number":10,"context_line":"  - Documentation can be find in doc folder (doc/source/filter_scheduler.rst)"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"3a57f1b5_32a40956","line":7,"in_reply_to":"3a57f1b5_b749ced2","updated":"2016-02-10 15:25:57.000000000","message":"I was working on it. Thanks for the tip! (I always have doubts about how to correctly format rst texts)","commit_id":"2a59114aea8a423291b8e57cd69a6d510979e93d"}]}
