)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c4d9e79c6888a1c0303a1cc96fd2912f52785722","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Added new scheduler filter: AggregateTypeExtraSpecsAffinityFilter"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"https://blueprints.launchpad.net/nova/+spec/aggregate-type-extra-specs-afinity-filter"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Added unit test for this feature."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3afb71cf_6001d905","line":9,"updated":"2015-06-10 08:45:55.000000000","message":"the blueprint should be referenced with and implements line.\nsee comment below.","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e8d1457b177bb5514b269a0dc7605aef4e5e7564","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Added new scheduler filter: AggregateTypeExtraSpecsAffinityFilter"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"https://blueprints.launchpad.net/nova/+spec/aggregate-type-extra-specs-afinity-filter"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Added unit test for this feature."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3afb71cf_aba1edf9","line":9,"in_reply_to":"3afb71cf_6001d905","updated":"2015-06-10 11:26:00.000000000","message":"Changed","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c4d9e79c6888a1c0303a1cc96fd2912f52785722","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"https://blueprints.launchpad.net/nova/+spec/aggregate-type-extra-specs-afinity-filter"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Added unit test for this feature."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Id3a9918cf9f83b2a9b1dfbcd91803b5b1b2bcc78"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3afb71cf_c0608d03","line":11,"updated":"2015-06-10 08:45:55.000000000","message":"the commit message should explain the change introduced by the patchset.","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e8d1457b177bb5514b269a0dc7605aef4e5e7564","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"https://blueprints.launchpad.net/nova/+spec/aggregate-type-extra-specs-afinity-filter"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Added unit test for this feature."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Id3a9918cf9f83b2a9b1dfbcd91803b5b1b2bcc78"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3afb71cf_8ba4f107","line":11,"in_reply_to":"3afb71cf_c0608d03","updated":"2015-06-10 11:26:00.000000000","message":"Changed","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c4d9e79c6888a1c0303a1cc96fd2912f52785722","unresolved":false,"context_lines":[{"line_number":9,"context_line":"https://blueprints.launchpad.net/nova/+spec/aggregate-type-extra-specs-afinity-filter"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Added unit test for this feature."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Id3a9918cf9f83b2a9b1dfbcd91803b5b1b2bcc78"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3afb71cf_a05d9148","line":12,"updated":"2015-06-10 08:45:55.000000000","message":"this should have an implements tag.\n\nImplements: blueprint aggregate-type-extra-specs-afinity-filter","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e8d1457b177bb5514b269a0dc7605aef4e5e7564","unresolved":false,"context_lines":[{"line_number":9,"context_line":"https://blueprints.launchpad.net/nova/+spec/aggregate-type-extra-specs-afinity-filter"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Added unit test for this feature."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Id3a9918cf9f83b2a9b1dfbcd91803b5b1b2bcc78"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3afb71cf_4bb39950","line":12,"in_reply_to":"3afb71cf_a05d9148","updated":"2015-06-10 11:26:00.000000000","message":"Changed","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0cdab26d1c134382188dbd90a8667b713a0c0e7d","unresolved":false,"context_lines":[{"line_number":16,"context_line":"flavor_extra_spec: \"mem_page_size\u003d2M,mem_page_size\u003d1G,mem_page_size\u003dlarge\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Added unit test for this feature."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Implements: blueprint aggregate-extra-specs-filter"},{"line_number":21,"context_line":"Change-Id: Id3a9918cf9f83b2a9b1dfbcd91803b5b1b2bcc78"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba3cc151_82481a8c","line":19,"updated":"2015-07-10 15:20:36.000000000","message":"This adds a new filter with complicated encoding in extra_specs. Surely seems like a DocImpact is warranted here.","commit_id":"4633ff510ce26b78b673fa9a300b5becde9cc044"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9c34ea083db6eef81fdbf8bd719b52f5275504ef","unresolved":false,"context_lines":[{"line_number":16,"context_line":"flavor_extra_spec: \"mem_page_size\u003d2M,mem_page_size\u003d1G,mem_page_size\u003dlarge\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Added unit test for this feature."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Implements: blueprint aggregate-extra-specs-filter"},{"line_number":21,"context_line":"Change-Id: Id3a9918cf9f83b2a9b1dfbcd91803b5b1b2bcc78"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9a41bdd9_f7cd08b8","line":19,"in_reply_to":"ba3cc151_82481a8c","updated":"2015-07-13 13:56:34.000000000","message":"Done","commit_id":"4633ff510ce26b78b673fa9a300b5becde9cc044"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4ed3878094d8359888e941f68dc8ea0266661d23","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Added new scheduler filter: AggregateTypeExtraSpecsAffinityFilter"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The flavor_extra_spec metadata pair will be consumed by the"},{"line_number":10,"context_line":"AggregateTypeExtraSpecsAfinityFilter to allow operators to define a set of"},{"line_number":11,"context_line":"extra specs key value pairs that are required to schedule to the aggregate,"},{"line_number":12,"context_line":"e.g.:"},{"line_number":13,"context_line":"standard memory backing aggregate:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3a7e1126_9a85355b","line":10,"updated":"2015-12-21 10:02:03.000000000","message":"s/Afinity/Affinity/","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0257306a3ae204df684d7020d9a955b55d4b0be1","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Added new scheduler filter: AggregateTypeExtraSpecsAffinityFilter"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The flavor_extra_spec metadata pair will be consumed by the"},{"line_number":10,"context_line":"AggregateTypeExtraSpecsAfinityFilter to allow operators to define a set of"},{"line_number":11,"context_line":"extra specs key value pairs that are required to schedule to the aggregate,"},{"line_number":12,"context_line":"e.g.:"},{"line_number":13,"context_line":"standard memory backing aggregate:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3a7e1126_28295b9e","line":10,"in_reply_to":"3a7e1126_9a85355b","updated":"2015-12-21 10:51:45.000000000","message":"Done","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"61ab790e0204caa36f6ebb9e07e5f18593906cb8","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Added new scheduler filter: AggregateTypeExtraSpecsAffinityFilter"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The flavor_extra_spec metadata pair will be consumed by the"},{"line_number":10,"context_line":"AggregateTypeExtraSpecsAffinityFilter to allow operators to define a set of"},{"line_number":11,"context_line":"extra specs key value pairs that are required to schedule to the aggregate,"},{"line_number":12,"context_line":"e.g.:"},{"line_number":13,"context_line":"standard memory backing aggregate:"},{"line_number":14,"context_line":"flavor_extra_spec: \"mem_page_size\u003dsmall,mem_page_size\u003dany\""},{"line_number":15,"context_line":"high bandwidth memory backing aggregate:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"fa69d971_7d4adc27","line":12,"range":{"start_line":9,"start_character":0,"end_line":12,"end_character":5},"updated":"2016-01-05 16:39:00.000000000","message":"nit: these lines are too long","commit_id":"9ec34a6addf8eb8f94bd5e22b732c85d16efacf5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"18822f33b7a01a380d930479f60a27908d340499","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Added new scheduler filter: AggregateTypeExtraSpecsAffinityFilter"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The flavor_extra_spec metadata pair will be consumed by the"},{"line_number":10,"context_line":"AggregateTypeExtraSpecsAffinityFilter to allow operators to define a set of"},{"line_number":11,"context_line":"extra specs key value pairs that are required to schedule to the aggregate,"},{"line_number":12,"context_line":"e.g.:"},{"line_number":13,"context_line":"standard memory backing aggregate:"},{"line_number":14,"context_line":"flavor_extra_spec: \"mem_page_size\u003dsmall,mem_page_size\u003dany\""},{"line_number":15,"context_line":"high bandwidth memory backing aggregate:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"fa69d971_db292c39","line":12,"range":{"start_line":9,"start_character":0,"end_line":12,"end_character":5},"in_reply_to":"fa69d971_7d4adc27","updated":"2016-01-07 15:23:09.000000000","message":"Done","commit_id":"9ec34a6addf8eb8f94bd5e22b732c85d16efacf5"},{"author":{"_account_id":13177,"name":"Emma Foley","email":"efoley@redhat.com","username":"emma-l-foley"},"change_message_id":"3816b62abe9b5ea325ca66e170165803f82243b9","unresolved":false,"context_lines":[{"line_number":9,"context_line":"The flavor_extra_spec metadata pair will be consumed by the"},{"line_number":10,"context_line":"AggregateTypeExtraSpecsAffinityFilter to allow operators to define a"},{"line_number":11,"context_line":"set of extra specs key value pairs that are required to schedule to"},{"line_number":12,"context_line":"the aggregate, e.g.:"},{"line_number":13,"context_line":"standard memory backing aggregate:"},{"line_number":14,"context_line":"flavor_extra_spec: \"mem_page_size\u003dsmall,mem_page_size\u003dany\""},{"line_number":15,"context_line":"high bandwidth memory backing aggregate:"},{"line_number":16,"context_line":"flavor_extra_spec: \"mem_page_size\u003d2M,mem_page_size\u003d1G,mem_page_size\u003dlarge\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Added unit test for this feature."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"ba63e191_50c73512","line":16,"range":{"start_line":12,"start_character":0,"end_line":16,"end_character":73},"updated":"2016-01-19 12:03:38.000000000","message":"Can you put some indentation on the commit message, to make it more readable?\nI\u0027m suggesting: \n\nthe aggregate, e.g.:\n    standard memory backing aggregate:\n        flavor_extra_spec:   \"mem_page_size\u003dsmall,mem_page_size\u003dany\"\n    high bandwidth memory backing aggregate:\n        flavor_extra_spec:\n\"mem_page_size\u003d2M,mem_page_size\u003d1G,mem_page_size\u003dlarge\"","commit_id":"49b48ac41ec09b9536d7b05cfad4b5256dff35fa"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb70a2a6bda3403b3102b7eee35ad997179f57e1","unresolved":false,"context_lines":[{"line_number":9,"context_line":"The flavor_extra_spec metadata pair will be consumed by the"},{"line_number":10,"context_line":"AggregateTypeExtraSpecsAffinityFilter to allow operators to define a"},{"line_number":11,"context_line":"set of extra specs key value pairs that are required to schedule to"},{"line_number":12,"context_line":"the aggregate, e.g.:"},{"line_number":13,"context_line":"standard memory backing aggregate:"},{"line_number":14,"context_line":"flavor_extra_spec: \"mem_page_size\u003dsmall,mem_page_size\u003dany\""},{"line_number":15,"context_line":"high bandwidth memory backing aggregate:"},{"line_number":16,"context_line":"flavor_extra_spec: \"mem_page_size\u003d2M,mem_page_size\u003d1G,mem_page_size\u003dlarge\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Added unit test for this feature."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"ba63e191_1f046915","line":16,"range":{"start_line":12,"start_character":0,"end_line":16,"end_character":73},"in_reply_to":"ba63e191_50c73512","updated":"2016-01-19 13:16:43.000000000","message":"Done","commit_id":"49b48ac41ec09b9536d7b05cfad4b5256dff35fa"},{"author":{"_account_id":13177,"name":"Emma Foley","email":"efoley@redhat.com","username":"emma-l-foley"},"change_message_id":"3816b62abe9b5ea325ca66e170165803f82243b9","unresolved":false,"context_lines":[{"line_number":15,"context_line":"high bandwidth memory backing aggregate:"},{"line_number":16,"context_line":"flavor_extra_spec: \"mem_page_size\u003d2M,mem_page_size\u003d1G,mem_page_size\u003dlarge\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Added unit test for this feature."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"DocImpact"},{"line_number":21,"context_line":"Implements: blueprint aggregate-extra-specs-filter"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"ba63e191_70f35974","line":18,"range":{"start_line":18,"start_character":2,"end_line":18,"end_character":33},"updated":"2016-01-19 12:03:38.000000000","message":"This line isn\u0027t necessary. Adding unit tests is implied.","commit_id":"49b48ac41ec09b9536d7b05cfad4b5256dff35fa"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb70a2a6bda3403b3102b7eee35ad997179f57e1","unresolved":false,"context_lines":[{"line_number":15,"context_line":"high bandwidth memory backing aggregate:"},{"line_number":16,"context_line":"flavor_extra_spec: \"mem_page_size\u003d2M,mem_page_size\u003d1G,mem_page_size\u003dlarge\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Added unit test for this feature."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"DocImpact"},{"line_number":21,"context_line":"Implements: blueprint aggregate-extra-specs-filter"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"ba63e191_ca04d116","line":18,"range":{"start_line":18,"start_character":2,"end_line":18,"end_character":33},"in_reply_to":"ba63e191_70f35974","updated":"2016-01-19 13:16:43.000000000","message":"Done","commit_id":"49b48ac41ec09b9536d7b05cfad4b5256dff35fa"},{"author":{"_account_id":13177,"name":"Emma Foley","email":"efoley@redhat.com","username":"emma-l-foley"},"change_message_id":"c175e68f00caf2bf1d203f3930dbd4ea44cd3635","unresolved":false,"context_lines":[{"line_number":13,"context_line":"  standard memory backing aggregate:"},{"line_number":14,"context_line":"    flavor_extra_spec: \"mem_page_size\u003dsmall,mem_page_size\u003dany\""},{"line_number":15,"context_line":"  high bandwidth memory backing aggregate:"},{"line_number":16,"context_line":"    flavor_extra_spec: \"mem_page_size\u003d2M,mem_page_size\u003d1G,\" \\"},{"line_number":17,"context_line":"                       \"mem_page_size\u003dlarge\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"DocImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"ba63e191_f044181c","line":16,"range":{"start_line":16,"start_character":60,"end_line":16,"end_character":61},"updated":"2016-01-19 16:21:38.000000000","message":"nit","commit_id":"7de1b01272ab9543eb0ef24c381430efa880671f"}],"doc/source/filter_scheduler.rst":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"19fbce36f4e1bd92ef10009a0cdeceb5054f8276","unresolved":false,"context_lines":[{"line_number":169,"context_line":"* |AggregateTypeExtraSpecsAffinityFilter| - filters only hosts aggregated inside"},{"line_number":170,"context_line":"  host aggregates containing \"flavor_extra_spec\" metadata. Keys inside this"},{"line_number":171,"context_line":"  variable must match with the instance extra specs. Eg. \u0027flavor_extra_spec\u003d\\"},{"line_number":172,"context_line":"  mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"Now we can focus on these standard filter classes in details. I will pass the"},{"line_number":175,"context_line":"simplest ones, such as |AllHostsFilter|, |CoreFilter| and |RamFilter| are,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a50d1a3_bfda7ae6","line":172,"updated":"2015-07-22 19:41:03.000000000","message":"sorry but by trying to read since like 5 mins the BP, I can\u0027t really see why a new filter is needed and why AggregateInstanceExtraSpecsFilter is not good for that.\n\nCould you please further explain ?\n\nI\u0027m not saying that the filter is exactly providing the gap, but I just wonder if the change you want to provide couldn\u0027t be a behavioural conditional to the above filter.\n\nTo be clear, I really want to avoid whenever possible new flavor or aggregate keys that are poor interfaces for the operators and can possibly create confusion.","commit_id":"4b142e53e43132e996d35c335da30959f9f361be"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"99cb4378f02e8572fcba1a8b70498c27c9f2940d","unresolved":false,"context_lines":[{"line_number":169,"context_line":"* |AggregateTypeExtraSpecsAffinityFilter| - filters only hosts aggregated inside"},{"line_number":170,"context_line":"  host aggregates containing \"flavor_extra_spec\" metadata. Keys inside this"},{"line_number":171,"context_line":"  variable must match with the instance extra specs. Eg. \u0027flavor_extra_spec\u003d\\"},{"line_number":172,"context_line":"  mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"Now we can focus on these standard filter classes in details. I will pass the"},{"line_number":175,"context_line":"simplest ones, such as |AllHostsFilter|, |CoreFilter| and |RamFilter| are,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a50d1a3_58bbf075","line":172,"in_reply_to":"3a50d1a3_4ec04350","updated":"2015-07-24 09:01:39.000000000","message":"I didn\u0027t said that AggregateInstanceExtraSpecsFilter is exactly doing what\u0027s needed by the BP. What I\u0027m a bit worried is that adding a new filter for a slight change in behaviour sounds really expensive to me.\n\nTo be clear, it\u0027s pretty easy to have out-of-tree filters so anyone can fit his own needs, but I really want to make sure that each in-tree filter that we\u0027re adding is clear enough to have added value.\n\nFrom my perspective, having two filters for managing the mapping between aggregate metadata and flavor extra fields sounds really confusing for operators who would possibly miss the technical details about why they are different.\n\nLike I said, I\u0027m more in favor of modifying the existing  AggregateInstanceExtraSpecsFilter to keep its behaviour but also have a more stricter enforcement logic (ie. the opposite logic) or provide a new semantics for the aggregate keys like sean gave.","commit_id":"4b142e53e43132e996d35c335da30959f9f361be"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"43be8927a3c70c0f5032278e939d866990f65cca","unresolved":false,"context_lines":[{"line_number":169,"context_line":"* |AggregateTypeExtraSpecsAffinityFilter| - filters only hosts aggregated inside"},{"line_number":170,"context_line":"  host aggregates containing \"flavor_extra_spec\" metadata. Keys inside this"},{"line_number":171,"context_line":"  variable must match with the instance extra specs. Eg. \u0027flavor_extra_spec\u003d\\"},{"line_number":172,"context_line":"  mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"Now we can focus on these standard filter classes in details. I will pass the"},{"line_number":175,"context_line":"simplest ones, such as |AllHostsFilter|, |CoreFilter| and |RamFilter| are,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a50d1a3_0a8d67d5","line":172,"in_reply_to":"3a50d1a3_bfda7ae6","updated":"2015-07-22 22:36:45.000000000","message":"Thank you for your comment. Let me explain it. If the explanation is not enough, please let me know.\n\nBoth filters have different behaviours:\n- NUMATopology depens on host properties, and the conditions defined in the filter must be satisfied always.\n- TypeExtraSpecsAffinityFilter depens on extra properties defined at aggregated level. This properties must be satisfied only if the host aggregation has metadata extra specifications. If the host aggregated don\u0027t have any metadata, the filter will pass all hosts inside it.\n\nBoth behaviours are very different and this is why we have implemented an independent class.\n\nIn addition, this feature can be enable or disable independently from other filters (via config file during the stack process)","commit_id":"4b142e53e43132e996d35c335da30959f9f361be"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d0ac98b124a58964e34033d320dcb601a5da29bd","unresolved":false,"context_lines":[{"line_number":169,"context_line":"* |AggregateTypeExtraSpecsAffinityFilter| - filters only hosts aggregated inside"},{"line_number":170,"context_line":"  host aggregates containing \"flavor_extra_spec\" metadata. Keys inside this"},{"line_number":171,"context_line":"  variable must match with the instance extra specs. Eg. \u0027flavor_extra_spec\u003d\\"},{"line_number":172,"context_line":"  mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"Now we can focus on these standard filter classes in details. I will pass the"},{"line_number":175,"context_line":"simplest ones, such as |AllHostsFilter|, |CoreFilter| and |RamFilter| are,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"3a50d1a3_4ec04350","line":172,"in_reply_to":"3a50d1a3_bfda7ae6","updated":"2015-07-23 11:31:24.000000000","message":"hi\nthe AggregateInstanceExtraSpecsFilter does not allow you to reserve portions of your cloud for vms that require limited resources this filter does.\nit would not be a small change to extend the AggregateInstanceExtraSpecsFilter  to cater for this usecase.\n\nIn the AggregateInstanceExtraSpecsFilter filter the relationships between which field is authoritative (the vms flavor extra or the aggregate metadata value) is reversed. \n\nthis filter also is more flexable in how it validates the flavor extra specs.\n\nwith the AggregateInstanceExtraSpecsFilter the vm flavor extra specs must be the identity of the set of values specified in the aggregate metadata.\n\nwith this new filter the keys specified in the aggregate metadata are checked against those requested in the vms flavor extra specs. if all keys are present and the value match those defined in the aggregate metadata then the aggreage is valid to be shcedued too.\n\nthis can be further modified with 3 sentinel values specified in the aggregate metadata: \n\nsentinel: * meaning: key must be present with any value\ne.g. flavor_extra_spec\u003d\"mem_page_size\u003d*\u0027\n\nsentinel: ! meaning: key must not be present with any value\ne.g. flavor_extra_spec\u003d\"mem_page_size\u003d!\u0027\n\nsentinel: ~ meaning: key must be present with one of the other values specified in the metadata or absent.\ne.g. flavor_extra_spec\u003d\"mem_page_size\u003dany,mem_page_size\u003d~\u0027","commit_id":"4b142e53e43132e996d35c335da30959f9f361be"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"254646f6270d2492dd13d46cb083156ae3c44a3b","unresolved":false,"context_lines":[{"line_number":172,"context_line":"  host aggregates containing \"flavor_extra_spec\" metadata. Keys inside this"},{"line_number":173,"context_line":"  variable must match with the instance extra specs. Eg. \u0027flavor_extra_spec\u003d\\"},{"line_number":174,"context_line":"  mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"Now we can focus on these standard filter classes in some detail. We\u0027ll skip the"},{"line_number":177,"context_line":"simplest ones, such as |AllHostsFilter|, |CoreFilter| and |RamFilter|,"},{"line_number":178,"context_line":"because their functionality is relatively simple and can be understood from the"}],"source_content_type":"text/x-rst","patch_set":17,"id":"da6ed579_f080edf8","line":175,"updated":"2016-01-15 14:36:42.000000000","message":"I think you shall document the possible modifiers, *, ~, !","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":172,"context_line":"  host aggregates containing \"flavor_extra_spec\" metadata. Keys inside this"},{"line_number":173,"context_line":"  variable must match with the instance extra specs. Eg. \u0027flavor_extra_spec\u003d\\"},{"line_number":174,"context_line":"  mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"Now we can focus on these standard filter classes in some detail. We\u0027ll skip the"},{"line_number":177,"context_line":"simplest ones, such as |AllHostsFilter|, |CoreFilter| and |RamFilter|,"},{"line_number":178,"context_line":"because their functionality is relatively simple and can be understood from the"}],"source_content_type":"text/x-rst","patch_set":17,"id":"da6ed579_2b3ec6b8","line":175,"in_reply_to":"da6ed579_4e6115d2","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c2086eaec254e11f01f7b83169389f845be55141","unresolved":false,"context_lines":[{"line_number":172,"context_line":"  host aggregates containing \"flavor_extra_spec\" metadata. Keys inside this"},{"line_number":173,"context_line":"  variable must match with the instance extra specs. Eg. \u0027flavor_extra_spec\u003d\\"},{"line_number":174,"context_line":"  mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"Now we can focus on these standard filter classes in some detail. We\u0027ll skip the"},{"line_number":177,"context_line":"simplest ones, such as |AllHostsFilter|, |CoreFilter| and |RamFilter|,"},{"line_number":178,"context_line":"because their functionality is relatively simple and can be understood from the"}],"source_content_type":"text/x-rst","patch_set":17,"id":"da6ed579_4b456cb1","line":175,"in_reply_to":"da6ed579_4e6115d2","updated":"2016-01-16 01:18:35.000000000","message":"sure that is easily done.\nwe can reuse some of the details captured in the original spec to document them here.","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2c3fd032238ee0dc941677889e796ada2c453d79","unresolved":false,"context_lines":[{"line_number":172,"context_line":"  host aggregates containing \"flavor_extra_spec\" metadata. Keys inside this"},{"line_number":173,"context_line":"  variable must match with the instance extra specs. Eg. \u0027flavor_extra_spec\u003d\\"},{"line_number":174,"context_line":"  mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"Now we can focus on these standard filter classes in some detail. We\u0027ll skip the"},{"line_number":177,"context_line":"simplest ones, such as |AllHostsFilter|, |CoreFilter| and |RamFilter|,"},{"line_number":178,"context_line":"because their functionality is relatively simple and can be understood from the"}],"source_content_type":"text/x-rst","patch_set":17,"id":"da6ed579_4e6115d2","line":175,"in_reply_to":"da6ed579_f080edf8","updated":"2016-01-15 15:15:04.000000000","message":"+1 please include those here.","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":172,"context_line":"  host aggregates containing \"flavor_extra_spec\" metadata. Keys inside this"},{"line_number":173,"context_line":"  variable must match with the instance extra specs. Eg. \u0027flavor_extra_spec\u003d\\"},{"line_number":174,"context_line":"  mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"Now we can focus on these standard filter classes in some detail. We\u0027ll skip the"},{"line_number":177,"context_line":"simplest ones, such as |AllHostsFilter|, |CoreFilter| and |RamFilter|,"},{"line_number":178,"context_line":"because their functionality is relatively simple and can be understood from the"}],"source_content_type":"text/x-rst","patch_set":17,"id":"da6ed579_6b5b5e2f","line":175,"in_reply_to":"da6ed579_f080edf8","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"aa6db797957db665c9ab74cb49161121696e9fef","unresolved":false,"context_lines":[{"line_number":177,"context_line":"  an instance type extra spec key followed by and equals \"\u003d\" followed by a"},{"line_number":178,"context_line":"  value: \u003ckey\u003e\u003d\u003cvalue\u003e."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"  Eg. \u0027flavor_extra_spec\u003dmem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"  Valid sentinel values are:"},{"line_number":183,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":25,"id":"9a68dd71_92db0b4f","line":180,"range":{"start_line":180,"start_character":25,"end_line":180,"end_character":78},"updated":"2016-01-22 18:32:01.000000000","message":"nit: mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\nshould be \nhw:mem_page_size\u003dany,hw:mem_page_size\u003d~,hw:mem_page_size\u003dsmall","commit_id":"675624b9848a15af3358a31fb86412fa9b791903"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e8c6a73a19c2edbfcfc61d161132df998d0e7dd3","unresolved":false,"context_lines":[{"line_number":177,"context_line":"  an instance type extra spec key followed by and equals \"\u003d\" followed by a"},{"line_number":178,"context_line":"  value: \u003ckey\u003e\u003d\u003cvalue\u003e."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"  Eg. \u0027flavor_extra_spec\u003dmem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"  Valid sentinel values are:"},{"line_number":183,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":25,"id":"9a68dd71_3b540f20","line":180,"range":{"start_line":180,"start_character":25,"end_line":180,"end_character":78},"in_reply_to":"9a68dd71_92db0b4f","updated":"2016-01-26 09:38:01.000000000","message":"Done","commit_id":"675624b9848a15af3358a31fb86412fa9b791903"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":183,"context_line":"::"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"  * (asterisk): may be used to specify that any value is valid."},{"line_number":186,"context_line":"  ~ (tilde): may be used to specify that a key may optionally be omitted."},{"line_number":187,"context_line":"  ! (exclamation): may be used to specify that the key must not be present."},{"line_number":188,"context_line":"::"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-rst","patch_set":26,"id":"7a5de9d1_016e2095","line":186,"updated":"2016-01-28 23:34:41.000000000","message":"I\u0027m curious, how were the symbols selected? I\u0027m used to ? meaning optionally omit","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":183,"context_line":"::"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"  * (asterisk): may be used to specify that any value is valid."},{"line_number":186,"context_line":"  ~ (tilde): may be used to specify that a key may optionally be omitted."},{"line_number":187,"context_line":"  ! (exclamation): may be used to specify that the key must not be present."},{"line_number":188,"context_line":"::"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-rst","patch_set":26,"id":"7a5de9d1_ea8aaabe","line":186,"in_reply_to":"7a5de9d1_016e2095","updated":"2016-01-29 09:20:07.000000000","message":"Maybe the symbol could be changed, but the spec was approved twice and nobody made any comment about this.\nFor sure, this could be changed in a future patch.","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2c2f9abcfb64e61932a223bea3326952a5c3840e","unresolved":false,"context_lines":[{"line_number":183,"context_line":"::"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"  * (asterisk): may be used to specify that any value is valid."},{"line_number":186,"context_line":"  ~ (tilde): may be used to specify that a key may optionally be omitted."},{"line_number":187,"context_line":"  ! (exclamation): may be used to specify that the key must not be present."},{"line_number":188,"context_line":"::"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-rst","patch_set":26,"id":"7a5de9d1_4ea652af","line":186,"in_reply_to":"7a5de9d1_ea8aaabe","updated":"2016-01-29 19:45:23.000000000","message":"Not a problem, I was just curious.","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":461,"context_line":".. |TrustedFilter| replace:: :class:`TrustedFilter \u003cnova.scheduler.filters.trusted_filter.TrustedFilter\u003e`"},{"line_number":462,"context_line":".. |TypeAffinityFilter| replace:: :class:`TypeAffinityFilter \u003cnova.scheduler.filters.type_filter.TypeAffinityFilter\u003e`"},{"line_number":463,"context_line":".. |AggregateTypeAffinityFilter| replace:: :class:`AggregateTypeAffinityFilter \u003cnova.scheduler.filters.type_filter.AggregateTypeAffinityFilter\u003e`"},{"line_number":464,"context_line":".. |AggregateTypeExtraSpecsAffinityFilter| replace:: :class:`AggregateTypeAffinityFilter \u003cnova.scheduler.filters.type_filter.AggregateTypeExtraSpecsAffinityFilter\u003e`"},{"line_number":465,"context_line":".. |ServerGroupAntiAffinityFilter| replace:: :class:`ServerGroupAntiAffinityFilter \u003cnova.scheduler.filters.affinity_filter.ServerGroupAntiAffinityFilter\u003e`"},{"line_number":466,"context_line":".. |ServerGroupAffinityFilter| replace:: :class:`ServerGroupAffinityFilter \u003cnova.scheduler.filters.affinity_filter.ServerGroupAffinityFilter\u003e`"},{"line_number":467,"context_line":".. |AggregateInstanceExtraSpecsFilter| replace:: :class:`AggregateInstanceExtraSpecsFilter \u003cnova.scheduler.filters.aggregate_instance_extra_specs.AggregateInstanceExtraSpecsFilter\u003e`"}],"source_content_type":"text/x-rst","patch_set":26,"id":"7a5de9d1_a613a20c","line":464,"range":{"start_line":464,"start_character":61,"end_line":464,"end_character":88},"updated":"2016-01-28 23:34:41.000000000","message":"I think this should be s/AggregateTypeAffinityFilter/AggregateTypeExtraSpecsAffinityFilter/","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":461,"context_line":".. |TrustedFilter| replace:: :class:`TrustedFilter \u003cnova.scheduler.filters.trusted_filter.TrustedFilter\u003e`"},{"line_number":462,"context_line":".. |TypeAffinityFilter| replace:: :class:`TypeAffinityFilter \u003cnova.scheduler.filters.type_filter.TypeAffinityFilter\u003e`"},{"line_number":463,"context_line":".. |AggregateTypeAffinityFilter| replace:: :class:`AggregateTypeAffinityFilter \u003cnova.scheduler.filters.type_filter.AggregateTypeAffinityFilter\u003e`"},{"line_number":464,"context_line":".. |AggregateTypeExtraSpecsAffinityFilter| replace:: :class:`AggregateTypeAffinityFilter \u003cnova.scheduler.filters.type_filter.AggregateTypeExtraSpecsAffinityFilter\u003e`"},{"line_number":465,"context_line":".. |ServerGroupAntiAffinityFilter| replace:: :class:`ServerGroupAntiAffinityFilter \u003cnova.scheduler.filters.affinity_filter.ServerGroupAntiAffinityFilter\u003e`"},{"line_number":466,"context_line":".. |ServerGroupAffinityFilter| replace:: :class:`ServerGroupAffinityFilter \u003cnova.scheduler.filters.affinity_filter.ServerGroupAffinityFilter\u003e`"},{"line_number":467,"context_line":".. |AggregateInstanceExtraSpecsFilter| replace:: :class:`AggregateInstanceExtraSpecsFilter \u003cnova.scheduler.filters.aggregate_instance_extra_specs.AggregateInstanceExtraSpecsFilter\u003e`"}],"source_content_type":"text/x-rst","patch_set":26,"id":"7a5de9d1_4ab41ed0","line":464,"range":{"start_line":464,"start_character":61,"end_line":464,"end_character":88},"in_reply_to":"7a5de9d1_a613a20c","updated":"2016-01-29 09:20:07.000000000","message":"Done","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"}],"nova/scheduler/filters/type_filter.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0cdab26d1c134382188dbd90a8667b713a0c0e7d","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                if \u0027*\u0027 in value:"},{"line_number":114,"context_line":"                    if key not in instance_extra_specs:"},{"line_number":115,"context_line":"                        LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":116,"context_line":"                            \"is not present\", {\u0027key\u0027: key})"},{"line_number":117,"context_line":"                        return False"},{"line_number":118,"context_line":"                    else:"},{"line_number":119,"context_line":"                        continue"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_02f72a8d","line":116,"updated":"2015-07-10 15:20:36.000000000","message":"This is nested extremely deep. Can you please break some of the loops out into helper functions to make it easier to validate?","commit_id":"4633ff510ce26b78b673fa9a300b5becde9cc044"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9c34ea083db6eef81fdbf8bd719b52f5275504ef","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                if \u0027*\u0027 in value:"},{"line_number":114,"context_line":"                    if key not in instance_extra_specs:"},{"line_number":115,"context_line":"                        LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":116,"context_line":"                            \"is not present\", {\u0027key\u0027: key})"},{"line_number":117,"context_line":"                        return False"},{"line_number":118,"context_line":"                    else:"},{"line_number":119,"context_line":"                        continue"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_fd38873f","line":116,"in_reply_to":"ba3cc151_02f72a8d","updated":"2015-07-13 13:56:34.000000000","message":"Done","commit_id":"4633ff510ce26b78b673fa9a300b5becde9cc044"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0cdab26d1c134382188dbd90a8667b713a0c0e7d","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                            \"key/value: %(key)s/%(value)s doesn\u0027t match\","},{"line_number":144,"context_line":"                            {\u0027key\u0027: key,"},{"line_number":145,"context_line":"                            \u0027value\u0027: value})"},{"line_number":146,"context_line":"        # END for aggregate in ha_aggregates:"},{"line_number":147,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_6238763e","line":146,"updated":"2015-07-10 15:20:36.000000000","message":"This doesn\u0027t seem very useful","commit_id":"4633ff510ce26b78b673fa9a300b5becde9cc044"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9c34ea083db6eef81fdbf8bd719b52f5275504ef","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                            \"key/value: %(key)s/%(value)s doesn\u0027t match\","},{"line_number":144,"context_line":"                            {\u0027key\u0027: key,"},{"line_number":145,"context_line":"                            \u0027value\u0027: value})"},{"line_number":146,"context_line":"        # END for aggregate in ha_aggregates:"},{"line_number":147,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_1d7a0bf2","line":146,"in_reply_to":"ba3cc151_6238763e","updated":"2015-07-13 13:56:34.000000000","message":"Done","commit_id":"4633ff510ce26b78b673fa9a300b5becde9cc044"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f7ba52ef2bdcf3f86967102ed0703b9bf801d011","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        return extra_specs"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _test_extra_specs_elements(self,"},{"line_number":97,"context_line":"                                   aggregate_extraspec,"},{"line_number":98,"context_line":"                                   instance_extra_specs):"},{"line_number":99,"context_line":"        \"\"\"Analyze and execute all aggregate_extraspec parsed."},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a41bdd9_e05a1b50","line":97,"updated":"2015-07-13 14:32:33.000000000","message":"please change aggregate_extraspec to be aggregate_extra_spec to be consistent with the line below","commit_id":"c4f692014737af1968ed4bb3436b09e4a7fa22b7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bd51784198af2e49458a027a90985ba5301096d3","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        return extra_specs"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _test_extra_specs_elements(self,"},{"line_number":97,"context_line":"                                   aggregate_extraspec,"},{"line_number":98,"context_line":"                                   instance_extra_specs):"},{"line_number":99,"context_line":"        \"\"\"Analyze and execute all aggregate_extraspec parsed."},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a41bdd9_76bfb1fb","line":97,"in_reply_to":"9a41bdd9_e05a1b50","updated":"2015-07-13 14:55:45.000000000","message":"Done","commit_id":"c4f692014737af1968ed4bb3436b09e4a7fa22b7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f7ba52ef2bdcf3f86967102ed0703b9bf801d011","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        :param aggregate_extraspec: dictionary with the values parsed and"},{"line_number":102,"context_line":"        grouped by keys"},{"line_number":103,"context_line":"        :type aggregate: dict."},{"line_number":104,"context_line":"        :return: True if all parameters executed correctly; False is there"},{"line_number":105,"context_line":"        is any error."},{"line_number":106,"context_line":"        :type: boolean."}],"source_content_type":"text/x-python","patch_set":6,"id":"9a41bdd9_203fa3d7","line":103,"updated":"2015-07-13 14:32:33.000000000","message":"aggregate \u003d\u003e aggregate_extraspec","commit_id":"c4f692014737af1968ed4bb3436b09e4a7fa22b7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bd51784198af2e49458a027a90985ba5301096d3","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        :param aggregate_extraspec: dictionary with the values parsed and"},{"line_number":102,"context_line":"        grouped by keys"},{"line_number":103,"context_line":"        :type aggregate: dict."},{"line_number":104,"context_line":"        :return: True if all parameters executed correctly; False is there"},{"line_number":105,"context_line":"        is any error."},{"line_number":106,"context_line":"        :type: boolean."}],"source_content_type":"text/x-python","patch_set":6,"id":"9a41bdd9_16450516","line":103,"in_reply_to":"9a41bdd9_203fa3d7","updated":"2015-07-13 14:55:45.000000000","message":"Done","commit_id":"c4f692014737af1968ed4bb3436b09e4a7fa22b7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f7ba52ef2bdcf3f86967102ed0703b9bf801d011","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            if \u0027!\u0027 in value:"},{"line_number":118,"context_line":"                if key in instance_extra_specs:"},{"line_number":119,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":120,"context_line":"                        \"is present\", {\u0027key\u0027: key})"},{"line_number":121,"context_line":"                    return False"},{"line_number":122,"context_line":"                else:"},{"line_number":123,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a41bdd9_a02bb393","line":120,"updated":"2015-07-13 14:32:33.000000000","message":"please sort out alignment","commit_id":"c4f692014737af1968ed4bb3436b09e4a7fa22b7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bd51784198af2e49458a027a90985ba5301096d3","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            if \u0027!\u0027 in value:"},{"line_number":118,"context_line":"                if key in instance_extra_specs:"},{"line_number":119,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":120,"context_line":"                        \"is present\", {\u0027key\u0027: key})"},{"line_number":121,"context_line":"                    return False"},{"line_number":122,"context_line":"                else:"},{"line_number":123,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a41bdd9_b673f97f","line":120,"in_reply_to":"9a41bdd9_a02bb393","updated":"2015-07-13 14:55:45.000000000","message":"Done","commit_id":"c4f692014737af1968ed4bb3436b09e4a7fa22b7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f7ba52ef2bdcf3f86967102ed0703b9bf801d011","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            for element in value:"},{"line_number":132,"context_line":"                if key not in instance_extra_specs:"},{"line_number":133,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":134,"context_line":"                        \"is not present\", {\u0027key\u0027: key})"},{"line_number":135,"context_line":"                    return False"},{"line_number":136,"context_line":"                if instance_extra_specs[key] not in value:"},{"line_number":137,"context_line":"                    LOG.debug(\"The following \u0027flavor_extra_spec\u0027 \""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a41bdd9_00137f67","line":134,"updated":"2015-07-13 14:32:33.000000000","message":"please sort out alignment","commit_id":"c4f692014737af1968ed4bb3436b09e4a7fa22b7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bd51784198af2e49458a027a90985ba5301096d3","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            for element in value:"},{"line_number":132,"context_line":"                if key not in instance_extra_specs:"},{"line_number":133,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":134,"context_line":"                        \"is not present\", {\u0027key\u0027: key})"},{"line_number":135,"context_line":"                    return False"},{"line_number":136,"context_line":"                if instance_extra_specs[key] not in value:"},{"line_number":137,"context_line":"                    LOG.debug(\"The following \u0027flavor_extra_spec\u0027 \""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a41bdd9_d66ebd95","line":134,"in_reply_to":"9a41bdd9_00137f67","updated":"2015-07-13 14:55:45.000000000","message":"Done","commit_id":"c4f692014737af1968ed4bb3436b09e4a7fa22b7"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"1928810a4ac07d7f3884c2ce35919f4e31d9cf03","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        # Create an entry in a dict for every new key/value."},{"line_number":88,"context_line":"        for kv_element in kv_list:"},{"line_number":89,"context_line":"            key, value \u003d kv_element.split(\u0027\u003d\u0027)[:2]"},{"line_number":90,"context_line":"            if key not in extra_specs:"},{"line_number":91,"context_line":"                extra_specs[key] \u003d set()"},{"line_number":92,"context_line":"            extra_specs[key].add(value)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_b20f7ce0","line":90,"updated":"2015-07-13 17:37:46.000000000","message":"This defeats the purpose of defaultdict. Instead, define it above as:\n\n    extra_specs \u003d collections.defaultdict(set)\n\nand then remove the \u0027if key not in extra_specs:\u0027 conditional block, so that all that\u0027s left is:\n\n    for kv_element in kv_list:\n        key, value \u003d kv_element.split(\u0027\u003d\u0027)[:2]\n        extra_specs[key].add(value)","commit_id":"f74085e8d65807cf28977d2bf95daeade5cafdb6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7c342c0c9bdb58975c57862d2ebbe270d7f0f68f","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        # Create an entry in a dict for every new key/value."},{"line_number":88,"context_line":"        for kv_element in kv_list:"},{"line_number":89,"context_line":"            key, value \u003d kv_element.split(\u0027\u003d\u0027)[:2]"},{"line_number":90,"context_line":"            if key not in extra_specs:"},{"line_number":91,"context_line":"                extra_specs[key] \u003d set()"},{"line_number":92,"context_line":"            extra_specs[key].add(value)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_c686eb64","line":90,"in_reply_to":"9a41bdd9_b20f7ce0","updated":"2015-07-14 07:43:26.000000000","message":"Done.\nThanks for the warning!","commit_id":"f74085e8d65807cf28977d2bf95daeade5cafdb6"},{"author":{"_account_id":16929,"name":"Giridhar Jayavelu","email":"gjayavelu@vmware.com","username":"gjayavelu"},"change_message_id":"fe54cdef37b8a033d33b53badbeac2041ca9d442","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        is any error."},{"line_number":104,"context_line":"        :type: boolean."},{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":"        for key, value in aggregate_extra_spec.iteritems():"},{"line_number":107,"context_line":"            if \u0027*\u0027 in value:"},{"line_number":108,"context_line":"                if key not in instance_extra_specs:"},{"line_number":109,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_00d106fa","line":106,"updated":"2015-07-21 23:41:17.000000000","message":"if aggregate_extra_spec is empty i.e flavor_extra_spec is not part of host aggregate metadata, then shouldn\u0027t we return False?\nLet\u0027s say if the only filter used is AggregateTypeExtraSpecsAffinityFilter so that instances are guaranteed to be placed on hosts that matches the requirement, then we do not want to return True if the metadata doesn\u0027t even have the flavor_extra_spec. Please correct me if I understood the spec wrong.","commit_id":"4b142e53e43132e996d35c335da30959f9f361be"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0d8397113383aecb645067ae26b3aad2726c2833","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        is any error."},{"line_number":104,"context_line":"        :type: boolean."},{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":"        for key, value in aggregate_extra_spec.iteritems():"},{"line_number":107,"context_line":"            if \u0027*\u0027 in value:"},{"line_number":108,"context_line":"                if key not in instance_extra_specs:"},{"line_number":109,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_cad7a249","line":106,"in_reply_to":"3a50d1a3_00d106fa","updated":"2015-07-22 11:45:14.000000000","message":"no the intention is that unless you explicitly configure the  flavor_extra_spec as part of the host aggregate metadata this filter should not filter out any hosts.\n\nso if this is the only filter active and you have not created any host aggregates or have not configured the host aggregates with flavor_extra_spec metadata then all node host should be available for scheduling.\n\nif you have specified a  flavor_extra_spec metadata parameter for an aggregate then this filter will take effect and filter the hosts appropriately.","commit_id":"4b142e53e43132e996d35c335da30959f9f361be"},{"author":{"_account_id":16929,"name":"Giridhar Jayavelu","email":"gjayavelu@vmware.com","username":"gjayavelu"},"change_message_id":"45a8416a007f8bdd8696b2835630b3652d97ffcd","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        is any error."},{"line_number":104,"context_line":"        :type: boolean."},{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":"        for key, value in aggregate_extra_spec.iteritems():"},{"line_number":107,"context_line":"            if \u0027*\u0027 in value:"},{"line_number":108,"context_line":"                if key not in instance_extra_specs:"},{"line_number":109,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_82c65066","line":106,"in_reply_to":"3a50d1a3_cad7a249","updated":"2015-07-22 15:49:06.000000000","message":"makes sense. thanks.","commit_id":"4b142e53e43132e996d35c335da30959f9f361be"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f9131c83927121561d69eaad0d7e562288161ca7","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        return True"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def host_passes(self, host_state, filter_properties):"},{"line_number":144,"context_line":"        # Read extra specs needed by instance."},{"line_number":145,"context_line":"        instance_type \u003d filter_properties.get(\u0027instance_type\u0027)"},{"line_number":146,"context_line":"        instance_extra_specs \u003d instance_type.get(\u0027extra_specs\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a710552_ed7e86ad","line":143,"updated":"2015-12-15 16:11:54.000000000","message":"This needs to take a RequestSpec object now, seeing as the rest of the file has been converted","commit_id":"0f33cd16890fab103a5596de9521836e922a8a83"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c04bce7b3f02b8a853cb69617f559d43583ada68","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        return True"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def host_passes(self, host_state, filter_properties):"},{"line_number":144,"context_line":"        # Read extra specs needed by instance."},{"line_number":145,"context_line":"        instance_type \u003d filter_properties.get(\u0027instance_type\u0027)"},{"line_number":146,"context_line":"        instance_extra_specs \u003d instance_type.get(\u0027extra_specs\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a710552_35510f63","line":143,"in_reply_to":"5a710552_ed7e86ad","updated":"2015-12-16 09:33:41.000000000","message":"Done","commit_id":"0f33cd16890fab103a5596de9521836e922a8a83"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4ed3878094d8359888e941f68dc8ea0266661d23","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    this variable must match with the instance extra specs."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _group_extra_specs(self, aggregate_extraspec):"},{"line_number":76,"context_line":"        \"\"\"Group all key/data from aggregate_extraspec."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        :param aggregate_extraspec: string containing a list of required"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_fae1d92a","line":75,"updated":"2015-12-21 10:02:03.000000000","message":"s/aggregate_extraspec/aggregate_extra_spec/","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0257306a3ae204df684d7020d9a955b55d4b0be1","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    this variable must match with the instance extra specs."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _group_extra_specs(self, aggregate_extraspec):"},{"line_number":76,"context_line":"        \"\"\"Group all key/data from aggregate_extraspec."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        :param aggregate_extraspec: string containing a list of required"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_837070a5","line":75,"in_reply_to":"3a7e1126_fae1d92a","updated":"2015-12-21 10:51:45.000000000","message":"Done","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4ed3878094d8359888e941f68dc8ea0266661d23","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _group_extra_specs(self, aggregate_extraspec):"},{"line_number":76,"context_line":"        \"\"\"Group all key/data from aggregate_extraspec."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        :param aggregate_extraspec: string containing a list of required"},{"line_number":79,"context_line":"        instance flavor extra specs, separated by commas, with format"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_1ac865a5","line":76,"updated":"2015-12-21 10:02:03.000000000","message":"ditto","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0257306a3ae204df684d7020d9a955b55d4b0be1","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _group_extra_specs(self, aggregate_extraspec):"},{"line_number":76,"context_line":"        \"\"\"Group all key/data from aggregate_extraspec."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        :param aggregate_extraspec: string containing a list of required"},{"line_number":79,"context_line":"        instance flavor extra specs, separated by commas, with format"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_239adcb9","line":76,"in_reply_to":"3a7e1126_1ac865a5","updated":"2015-12-21 10:51:45.000000000","message":"Done","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4ed3878094d8359888e941f68dc8ea0266661d23","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def _group_extra_specs(self, aggregate_extraspec):"},{"line_number":76,"context_line":"        \"\"\"Group all key/data from aggregate_extraspec."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        :param aggregate_extraspec: string containing a list of required"},{"line_number":79,"context_line":"        instance flavor extra specs, separated by commas, with format"},{"line_number":80,"context_line":"        \"key\u003dvalue\""},{"line_number":81,"context_line":"        :type aggregate: basestring."}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_fab8f912","line":78,"updated":"2015-12-21 10:02:03.000000000","message":"ditto","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0257306a3ae204df684d7020d9a955b55d4b0be1","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def _group_extra_specs(self, aggregate_extraspec):"},{"line_number":76,"context_line":"        \"\"\"Group all key/data from aggregate_extraspec."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        :param aggregate_extraspec: string containing a list of required"},{"line_number":79,"context_line":"        instance flavor extra specs, separated by commas, with format"},{"line_number":80,"context_line":"        \"key\u003dvalue\""},{"line_number":81,"context_line":"        :type aggregate: basestring."}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_038b2069","line":78,"in_reply_to":"3a7e1126_fab8f912","updated":"2015-12-21 10:51:45.000000000","message":"Done","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4ed3878094d8359888e941f68dc8ea0266661d23","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        :type: dict."},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        extra_specs \u003d collections.defaultdict(set)"},{"line_number":86,"context_line":"        kv_list \u003d aggregate_extraspec.split(\u0027,\u0027)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Create an entry in a dict for every new key/value."},{"line_number":89,"context_line":"        for kv_element in kv_list:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_bad6f14c","line":86,"updated":"2015-12-21 10:02:03.000000000","message":"ditto","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0257306a3ae204df684d7020d9a955b55d4b0be1","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        :type: dict."},{"line_number":84,"context_line":"        \"\"\""},{"line_number":85,"context_line":"        extra_specs \u003d collections.defaultdict(set)"},{"line_number":86,"context_line":"        kv_list \u003d aggregate_extraspec.split(\u0027,\u0027)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Create an entry in a dict for every new key/value."},{"line_number":89,"context_line":"        for kv_element in kv_list:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_a3ec8c2a","line":86,"in_reply_to":"3a7e1126_bad6f14c","updated":"2015-12-21 10:51:45.000000000","message":"Done","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4ed3878094d8359888e941f68dc8ea0266661d23","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return extra_specs"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _test_extra_specs_elements(self,"},{"line_number":96,"context_line":"                                   aggregate_extra_spec,"},{"line_number":97,"context_line":"                                   instance_extra_specs):"},{"line_number":98,"context_line":"        \"\"\"Analyze and execute all aggregate_extra_spec parsed."}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_5ab34d0a","line":95,"updated":"2015-12-21 10:02:03.000000000","message":"IMO, \u0027test\u0027 is not good because this method is not called from unit tests. How about \u0027check\u0027?","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0257306a3ae204df684d7020d9a955b55d4b0be1","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return extra_specs"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _test_extra_specs_elements(self,"},{"line_number":96,"context_line":"                                   aggregate_extra_spec,"},{"line_number":97,"context_line":"                                   instance_extra_specs):"},{"line_number":98,"context_line":"        \"\"\"Analyze and execute all aggregate_extra_spec parsed."}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_c33d1890","line":95,"in_reply_to":"3a7e1126_5ab34d0a","updated":"2015-12-21 10:51:45.000000000","message":"Done","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4ed3878094d8359888e941f68dc8ea0266661d23","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            \u0027flavor_extra_spec\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":158,"context_line":"            # Recover and group all key/data from aggregate_extraspec."},{"line_number":159,"context_line":"            aggregate_extra_spec \u003d \\"},{"line_number":160,"context_line":"                self._group_extra_specs(aggregate_extra_spec)"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_da617dd4","line":158,"updated":"2015-12-21 10:02:03.000000000","message":"ditto.\ns/aggregate_extraspec/aggregate_extra_spec/","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0257306a3ae204df684d7020d9a955b55d4b0be1","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            \u0027flavor_extra_spec\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":158,"context_line":"            # Recover and group all key/data from aggregate_extraspec."},{"line_number":159,"context_line":"            aggregate_extra_spec \u003d \\"},{"line_number":160,"context_line":"                self._group_extra_specs(aggregate_extra_spec)"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_c30bd8d4","line":158,"in_reply_to":"3a7e1126_da617dd4","updated":"2015-12-21 10:51:45.000000000","message":"Done","commit_id":"0adcaa2b6e64d08ccfd72cf112f6932942a81009"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"61ab790e0204caa36f6ebb9e07e5f18593906cb8","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        kv_list \u003d aggregate_extra_spec.split(\u0027,\u0027)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Create an entry in a dict for every new key/value."},{"line_number":89,"context_line":"        for kv_element in kv_list:"},{"line_number":90,"context_line":"            key, value \u003d kv_element.split(\u0027\u003d\u0027)[:2]"},{"line_number":91,"context_line":"            extra_specs[key].add(value)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return extra_specs"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_6b01b505","line":91,"range":{"start_line":89,"start_character":0,"end_line":91,"end_character":39},"updated":"2016-01-05 16:39:00.000000000","message":"nit: this whole thing could be done as a dictionary comprehension","commit_id":"9ec34a6addf8eb8f94bd5e22b732c85d16efacf5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"18822f33b7a01a380d930479f60a27908d340499","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        kv_list \u003d aggregate_extra_spec.split(\u0027,\u0027)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Create an entry in a dict for every new key/value."},{"line_number":89,"context_line":"        for kv_element in kv_list:"},{"line_number":90,"context_line":"            key, value \u003d kv_element.split(\u0027\u003d\u0027)[:2]"},{"line_number":91,"context_line":"            extra_specs[key].add(value)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return extra_specs"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_bb247860","line":91,"range":{"start_line":89,"start_character":0,"end_line":91,"end_character":39},"in_reply_to":"fa69d971_6b01b505","updated":"2016-01-07 15:23:09.000000000","message":"Done","commit_id":"9ec34a6addf8eb8f94bd5e22b732c85d16efacf5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"93ddf44da607d48dddd989aa98ccb317d2655b07","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        kv_list \u003d aggregate_extra_spec.split(\u0027,\u0027)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Create an entry in a dict for every new key/value."},{"line_number":89,"context_line":"        for kv_element in kv_list:"},{"line_number":90,"context_line":"            key, value \u003d kv_element.split(\u0027\u003d\u0027)[:2]"},{"line_number":91,"context_line":"            extra_specs[key].add(value)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return extra_specs"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_7eeeebb5","line":91,"range":{"start_line":89,"start_character":0,"end_line":91,"end_character":39},"in_reply_to":"fa69d971_bb247860","updated":"2016-01-07 16:49:08.000000000","message":"My mistake. I can\u0027t because it\u0027s not a regular dictionary, it\u0027s a default dict of sets. I don\u0027t assign the values, I add the values to the default one (the empty set).","commit_id":"9ec34a6addf8eb8f94bd5e22b732c85d16efacf5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"61ab790e0204caa36f6ebb9e07e5f18593906cb8","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    def _check_extra_specs_elements(self,"},{"line_number":96,"context_line":"                                   aggregate_extra_spec,"},{"line_number":97,"context_line":"                                   instance_extra_specs):"},{"line_number":98,"context_line":"        \"\"\"Analyze and execute all aggregate_extra_spec parsed."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        :param aggregate_extra_spec: dictionary with the values parsed and"},{"line_number":101,"context_line":"        grouped by keys"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_1d6080ce","line":98,"range":{"start_line":98,"start_character":11,"end_line":98,"end_character":63},"updated":"2016-01-05 16:39:00.000000000","message":"nit: this comment makes no sense - what do you mean?","commit_id":"9ec34a6addf8eb8f94bd5e22b732c85d16efacf5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"18822f33b7a01a380d930479f60a27908d340499","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    def _check_extra_specs_elements(self,"},{"line_number":96,"context_line":"                                   aggregate_extra_spec,"},{"line_number":97,"context_line":"                                   instance_extra_specs):"},{"line_number":98,"context_line":"        \"\"\"Analyze and execute all aggregate_extra_spec parsed."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        :param aggregate_extra_spec: dictionary with the values parsed and"},{"line_number":101,"context_line":"        grouped by keys"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_806c9f37","line":98,"range":{"start_line":98,"start_character":11,"end_line":98,"end_character":63},"in_reply_to":"fa69d971_1d6080ce","updated":"2016-01-07 15:23:09.000000000","message":"Done","commit_id":"9ec34a6addf8eb8f94bd5e22b732c85d16efacf5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"61ab790e0204caa36f6ebb9e07e5f18593906cb8","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"            # Loop all aggregate flavor extra specs and compare to"},{"line_number":163,"context_line":"            # instance extra specs."},{"line_number":164,"context_line":"            if self._check_extra_specs_elements(aggregate_extra_spec,"},{"line_number":165,"context_line":"                    instance_type.extra_specs) is False:"},{"line_number":166,"context_line":"                return False"},{"line_number":167,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_ddd18858","line":165,"range":{"start_line":164,"start_character":12,"end_line":165,"end_character":56},"updated":"2016-01-05 16:39:00.000000000","message":"nit: rewrite as\n\n    if not self._check..","commit_id":"9ec34a6addf8eb8f94bd5e22b732c85d16efacf5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"18822f33b7a01a380d930479f60a27908d340499","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"            # Loop all aggregate flavor extra specs and compare to"},{"line_number":163,"context_line":"            # instance extra specs."},{"line_number":164,"context_line":"            if self._check_extra_specs_elements(aggregate_extra_spec,"},{"line_number":165,"context_line":"                    instance_type.extra_specs) is False:"},{"line_number":166,"context_line":"                return False"},{"line_number":167,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_207db3e7","line":165,"range":{"start_line":164,"start_character":12,"end_line":165,"end_character":56},"in_reply_to":"fa69d971_ddd18858","updated":"2016-01-07 15:23:09.000000000","message":"Done","commit_id":"9ec34a6addf8eb8f94bd5e22b732c85d16efacf5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2c3fd032238ee0dc941677889e796ada2c453d79","unresolved":false,"context_lines":[{"line_number":69,"context_line":"class AggregateTypeExtraSpecsAffinityFilter(filters.BaseHostFilter):"},{"line_number":70,"context_line":"    \"\"\"AggregateTypeExtraSpecsAffinityFilter filters only hosts aggregated"},{"line_number":71,"context_line":"    inside host aggregates containing \"flavor_extra_spec\" metadata. Keys inside"},{"line_number":72,"context_line":"    this variable must match with the instance extra specs."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _group_extra_specs(self, aggregate_extra_spec):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_6be16b29","line":72,"updated":"2016-01-15 15:15:04.000000000","message":"I think it would really help if you added an example use of this, with the scheduler CONF, and the flavor_extra_specs applied, and matching and non-matching host_aggregates.","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":69,"context_line":"class AggregateTypeExtraSpecsAffinityFilter(filters.BaseHostFilter):"},{"line_number":70,"context_line":"    \"\"\"AggregateTypeExtraSpecsAffinityFilter filters only hosts aggregated"},{"line_number":71,"context_line":"    inside host aggregates containing \"flavor_extra_spec\" metadata. Keys inside"},{"line_number":72,"context_line":"    this variable must match with the instance extra specs."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _group_extra_specs(self, aggregate_extra_spec):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_e1020f0b","line":72,"in_reply_to":"da6ed579_6be16b29","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"254646f6270d2492dd13d46cb083156ae3c44a3b","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        \"\"\"Group all key/data from aggregate_extra_spec."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        :param aggregate_extra_spec: string containing a list of required"},{"line_number":79,"context_line":"        instance flavor extra specs, separated by commas, with format"},{"line_number":80,"context_line":"        \"key\u003dvalue\""},{"line_number":81,"context_line":"        :type aggregate: basestring."},{"line_number":82,"context_line":"        :return: dictionary with the values parsed and grouped by keys."}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_357c37eb","line":79,"updated":"2016-01-15 14:36:42.000000000","message":"please indent the second doc line under the first , e.g. \u0027instance\u0027 in the second line shall start at the same column as \u0027string\u0027 starts in the first line","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        \"\"\"Group all key/data from aggregate_extra_spec."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        :param aggregate_extra_spec: string containing a list of required"},{"line_number":79,"context_line":"        instance flavor extra specs, separated by commas, with format"},{"line_number":80,"context_line":"        \"key\u003dvalue\""},{"line_number":81,"context_line":"        :type aggregate: basestring."},{"line_number":82,"context_line":"        :return: dictionary with the values parsed and grouped by keys."}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_318b9820","line":79,"in_reply_to":"da6ed579_357c37eb","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"254646f6270d2492dd13d46cb083156ae3c44a3b","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        # Create a new set entry in a dict for every new key, update the key"},{"line_number":89,"context_line":"        # value (set object) for every other value."},{"line_number":90,"context_line":"        for kv_element in kv_list:"},{"line_number":91,"context_line":"            key, value \u003d kv_element.split(\u0027\u003d\u0027)[:2]"},{"line_number":92,"context_line":"            extra_specs[key].add(value)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        return extra_specs"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_3a66642a","line":91,"updated":"2016-01-15 14:36:42.000000000","message":"It is now silently ignores malformed elements e.g. key\u003dvalue\u003dfoobaar. I think we shall at least log something if the aggregate config is malformed.","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        # Create a new set entry in a dict for every new key, update the key"},{"line_number":89,"context_line":"        # value (set object) for every other value."},{"line_number":90,"context_line":"        for kv_element in kv_list:"},{"line_number":91,"context_line":"            key, value \u003d kv_element.split(\u0027\u003d\u0027)[:2]"},{"line_number":92,"context_line":"            extra_specs[key].add(value)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        return extra_specs"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_f15c207f","line":91,"in_reply_to":"da6ed579_3a66642a","updated":"2016-01-18 14:39:27.000000000","message":"Good catch.\nThe user can write any string after the equal. I will accept everything after the equal, but I\u0027ll check if there is something like your example (with an equal char inside the \"value\" string) and I\u0027ll write a log.\nI\u0027ll also write a test for this.","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"254646f6270d2492dd13d46cb083156ae3c44a3b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            appropriate filter action."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        :param aggregate_extra_spec: dictionary with the values parsed and"},{"line_number":103,"context_line":"        grouped by keys"},{"line_number":104,"context_line":"        :type aggregate_extra_spec: dict."},{"line_number":105,"context_line":"        :return: True if all parameters executed correctly; False is there"},{"line_number":106,"context_line":"        is any error."}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_b570270c","line":103,"updated":"2016-01-15 14:36:42.000000000","message":"indetation","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            appropriate filter action."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        :param aggregate_extra_spec: dictionary with the values parsed and"},{"line_number":103,"context_line":"        grouped by keys"},{"line_number":104,"context_line":"        :type aggregate_extra_spec: dict."},{"line_number":105,"context_line":"        :return: True if all parameters executed correctly; False is there"},{"line_number":106,"context_line":"        is any error."}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_20d01c53","line":103,"in_reply_to":"da6ed579_b570270c","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"254646f6270d2492dd13d46cb083156ae3c44a3b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        :return: True if all parameters executed correctly; False is there"},{"line_number":106,"context_line":"        is any error."},{"line_number":107,"context_line":"        :type: boolean."},{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":"        for key, value in six.iteritems(aggregate_extra_spec):"},{"line_number":110,"context_line":"            if \u0027*\u0027 in value:"},{"line_number":111,"context_line":"                if key not in instance_extra_specs:"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_75bdcf00","line":108,"updated":"2016-01-15 14:36:42.000000000","message":"doc of instance_extra_spec is missing","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        :return: True if all parameters executed correctly; False is there"},{"line_number":106,"context_line":"        is any error."},{"line_number":107,"context_line":"        :type: boolean."},{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":"        for key, value in six.iteritems(aggregate_extra_spec):"},{"line_number":110,"context_line":"            if \u0027*\u0027 in value:"},{"line_number":111,"context_line":"                if key not in instance_extra_specs:"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_a04bac2a","line":108,"in_reply_to":"da6ed579_75bdcf00","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2c3fd032238ee0dc941677889e796ada2c453d79","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                if key not in instance_extra_specs:"},{"line_number":128,"context_line":"                    continue"},{"line_number":129,"context_line":"                else:"},{"line_number":130,"context_line":"                    value.discard(\u0027~\u0027)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"            for element in value:"},{"line_number":133,"context_line":"                if key not in instance_extra_specs:"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_2e05c10f","line":130,"updated":"2016-01-15 15:15:04.000000000","message":"We really must document this all somewhere.","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c2086eaec254e11f01f7b83169389f845be55141","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                if key not in instance_extra_specs:"},{"line_number":128,"context_line":"                    continue"},{"line_number":129,"context_line":"                else:"},{"line_number":130,"context_line":"                    value.discard(\u0027~\u0027)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"            for element in value:"},{"line_number":133,"context_line":"                if key not in instance_extra_specs:"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_ab9d080c","line":130,"in_reply_to":"da6ed579_2e05c10f","updated":"2016-01-16 01:18:35.000000000","message":"we can document the sentil values in /doc/source/filter_scheduler.rst as you suggeted in you previous comment \n\nbut if desired we could convert the old liberty spec into a dev ref.\n\nhttps://review.openstack.org/#/c/183876/4/specs/liberty/approved/aggregate-flavor-extra-spec-affinity-filter.rst\n\nwe can also add an example configuration at the top of the file as suggested.","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                if key not in instance_extra_specs:"},{"line_number":128,"context_line":"                    continue"},{"line_number":129,"context_line":"                else:"},{"line_number":130,"context_line":"                    value.discard(\u0027~\u0027)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"            for element in value:"},{"line_number":133,"context_line":"                if key not in instance_extra_specs:"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_604934d0","line":130,"in_reply_to":"da6ed579_ab9d080c","updated":"2016-01-18 14:39:27.000000000","message":"Added:\n- Doc and examples at the top of the class.\n- More information in dev ref.","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"254646f6270d2492dd13d46cb083156ae3c44a3b","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        return True"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def host_passes(self, host_state, spec_obj):"},{"line_number":146,"context_line":"        # Read extra specs needed by instance."},{"line_number":147,"context_line":"        instance_type \u003d spec_obj.flavor"},{"line_number":148,"context_line":"        # If \u0027extra_specs\u0027 is not present or extra_specs are empty then we"},{"line_number":149,"context_line":"        # need not proceed further"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_d180618d","line":146,"updated":"2016-01-15 14:36:42.000000000","message":"I feel this comment is unnecessary","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        return True"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def host_passes(self, host_state, spec_obj):"},{"line_number":146,"context_line":"        # Read extra specs needed by instance."},{"line_number":147,"context_line":"        instance_type \u003d spec_obj.flavor"},{"line_number":148,"context_line":"        # If \u0027extra_specs\u0027 is not present or extra_specs are empty then we"},{"line_number":149,"context_line":"        # need not proceed further"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_a0d16cfd","line":146,"in_reply_to":"da6ed579_d180618d","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2c3fd032238ee0dc941677889e796ada2c453d79","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            return True"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        # Read metadata from host: find \"flavor_extra_spec\" in host"},{"line_number":155,"context_line":"        # aggregates metadata, each separately."},{"line_number":156,"context_line":"        aggregate_extra_spec_list \u003d utils.aggregate_values_from_key(host_state,"},{"line_number":157,"context_line":"            \u0027flavor_extra_spec\u0027)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_cb5657cd","line":155,"updated":"2016-01-15 15:15:04.000000000","message":"I think this would be more readable, and easier to maintain if you remove most of these comments.\n\nBut to do that, I think we need some better function names here.","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            return True"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        # Read metadata from host: find \"flavor_extra_spec\" in host"},{"line_number":155,"context_line":"        # aggregates metadata, each separately."},{"line_number":156,"context_line":"        aggregate_extra_spec_list \u003d utils.aggregate_values_from_key(host_state,"},{"line_number":157,"context_line":"            \u0027flavor_extra_spec\u0027)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_cb3cc1c1","line":155,"in_reply_to":"da6ed579_cb5657cd","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"254646f6270d2492dd13d46cb083156ae3c44a3b","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            \u0027flavor_extra_spec\u0027)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":160,"context_line":"            # Recover and group all key/data from aggregate_extra_spec."},{"line_number":161,"context_line":"            aggregate_extra_spec \u003d \\"},{"line_number":162,"context_line":"                self._group_extra_specs(aggregate_extra_spec)"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_aca1d0f9","line":160,"range":{"start_line":160,"start_character":14,"end_line":160,"end_character":21},"updated":"2016-01-15 14:36:42.000000000","message":"What do you mean by recover?","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            \u0027flavor_extra_spec\u0027)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":160,"context_line":"            # Recover and group all key/data from aggregate_extra_spec."},{"line_number":161,"context_line":"            aggregate_extra_spec \u003d \\"},{"line_number":162,"context_line":"                self._group_extra_specs(aggregate_extra_spec)"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_a002cc3c","line":160,"range":{"start_line":160,"start_character":14,"end_line":160,"end_character":21},"in_reply_to":"da6ed579_aca1d0f9","updated":"2016-01-18 14:39:27.000000000","message":"Bad translation.\nRemoved comment, John\u0027s suggestion.","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"254646f6270d2492dd13d46cb083156ae3c44a3b","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":160,"context_line":"            # Recover and group all key/data from aggregate_extra_spec."},{"line_number":161,"context_line":"            aggregate_extra_spec \u003d \\"},{"line_number":162,"context_line":"                self._group_extra_specs(aggregate_extra_spec)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            # Loop all aggregate flavor extra specs and compare to"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_552c4b98","line":161,"range":{"start_line":161,"start_character":35,"end_line":161,"end_character":36},"updated":"2016-01-15 14:36:42.000000000","message":"You can avoid backslash by splitting the line after the opening parentheses","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":160,"context_line":"            # Recover and group all key/data from aggregate_extra_spec."},{"line_number":161,"context_line":"            aggregate_extra_spec \u003d \\"},{"line_number":162,"context_line":"                self._group_extra_specs(aggregate_extra_spec)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            # Loop all aggregate flavor extra specs and compare to"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_60aa941b","line":161,"range":{"start_line":161,"start_character":35,"end_line":161,"end_character":36},"in_reply_to":"da6ed579_552c4b98","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2c3fd032238ee0dc941677889e796ada2c453d79","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":160,"context_line":"            # Recover and group all key/data from aggregate_extra_spec."},{"line_number":161,"context_line":"            aggregate_extra_spec \u003d \\"},{"line_number":162,"context_line":"                self._group_extra_specs(aggregate_extra_spec)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            # Loop all aggregate flavor extra specs and compare to"},{"line_number":165,"context_line":"            # instance extra specs."}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_6bf64b5e","line":162,"updated":"2016-01-15 15:15:04.000000000","message":"What not call this something like:\n\n  aggregate_key_pairs \u003d self._parse_extra_spec_key_pairs(aggregate_extra_spec)","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        for aggregate_extra_spec in aggregate_extra_spec_list:"},{"line_number":160,"context_line":"            # Recover and group all key/data from aggregate_extra_spec."},{"line_number":161,"context_line":"            aggregate_extra_spec \u003d \\"},{"line_number":162,"context_line":"                self._group_extra_specs(aggregate_extra_spec)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            # Loop all aggregate flavor extra specs and compare to"},{"line_number":165,"context_line":"            # instance extra specs."}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_ab414d3b","line":162,"in_reply_to":"da6ed579_6bf64b5e","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2c3fd032238ee0dc941677889e796ada2c453d79","unresolved":false,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            # Loop all aggregate flavor extra specs and compare to"},{"line_number":165,"context_line":"            # instance extra specs."},{"line_number":166,"context_line":"            if not self._check_extra_specs_elements(aggregate_extra_spec,"},{"line_number":167,"context_line":"                    instance_type.extra_specs):"},{"line_number":168,"context_line":"                return False"},{"line_number":169,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_2b31335a","line":166,"updated":"2016-01-15 15:15:04.000000000","message":"Why not have this method here:\n\n  if not self._instance_is_allowed_in_aggregate(..)\n      return false","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            # Loop all aggregate flavor extra specs and compare to"},{"line_number":165,"context_line":"            # instance extra specs."},{"line_number":166,"context_line":"            if not self._check_extra_specs_elements(aggregate_extra_spec,"},{"line_number":167,"context_line":"                    instance_type.extra_specs):"},{"line_number":168,"context_line":"                return False"},{"line_number":169,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_4b50d10a","line":166,"in_reply_to":"da6ed579_2b31335a","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f7a93d1bcb5e8484c6ffba5a67ac806683613d21","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Eg. \u0027flavor_extra_spec\u003dmem_page_size\u003dany,mem_page_size\u003d~, \\"},{"line_number":88,"context_line":"         mem_page_size\u003dsmall\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    Valid sentinel values are:"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    | * (asterisk): may be used to specify that any value is valid."}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_1f746933","line":89,"updated":"2016-01-19 13:21:39.000000000","message":"The above flavor_extra_spec is defined as a host aggregate metadata?","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"63aa1caac8cd521276092ac39b10d3efb5856a54","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Eg. \u0027flavor_extra_spec\u003dmem_page_size\u003dany,mem_page_size\u003d~, \\"},{"line_number":88,"context_line":"         mem_page_size\u003dsmall\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    Valid sentinel values are:"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    | * (asterisk): may be used to specify that any value is valid."}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_859eca54","line":89,"in_reply_to":"ba63e191_1f746933","updated":"2016-01-19 14:25:41.000000000","message":"This variable is inside the flavor metadata.\nHost aggregate metadata should contain the key/values inside this variable.\nflavor.metadata\u003d\"flavor_extra_spec\u003dmem_page_size\u003dany,mem_page_size\u003d~\"\nhost_aggr.metadata\u003d\"mem_page_size\u003d100\"","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c71d2e0f525c620efa0b21cd1a7565c4fcc7c44f","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Eg. \u0027flavor_extra_spec\u003dmem_page_size\u003dany,mem_page_size\u003d~, \\"},{"line_number":88,"context_line":"         mem_page_size\u003dsmall\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    Valid sentinel values are:"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    | * (asterisk): may be used to specify that any value is valid."}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_e4a53a04","line":89,"in_reply_to":"ba63e191_859eca54","updated":"2016-01-19 17:11:22.000000000","message":"Just the opposite:\nflavor.extra_specs\u003d{\"mem_page_size\": \"any\"}\nhost_aggr.metadata\u003d\"flavor_extra_spec\u003dmem_page_size\u003dany,mem_page_size\u003d~\"","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"cd4585eca662bfeef46d5252dd2cd1961e276401","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Eg. \u0027flavor_extra_spec\u003dmem_page_size\u003dany,mem_page_size\u003d~, \\"},{"line_number":88,"context_line":"         mem_page_size\u003dsmall\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    Valid sentinel values are:"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    | * (asterisk): may be used to specify that any value is valid."}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_27dd6de0","line":89,"in_reply_to":"ba63e191_8906b2cc","updated":"2016-01-20 09:57:30.000000000","message":"Done","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6d5bfe1a5c10f554a57f9d35cb1e21ffb6e260cb","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Eg. \u0027flavor_extra_spec\u003dmem_page_size\u003dany,mem_page_size\u003d~, \\"},{"line_number":88,"context_line":"         mem_page_size\u003dsmall\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    Valid sentinel values are:"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    | * (asterisk): may be used to specify that any value is valid."}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_8906b2cc","line":89,"in_reply_to":"ba63e191_e4a53a04","updated":"2016-01-20 09:20:37.000000000","message":"could you document it as it seems it is not just me who get confused :)","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f7a93d1bcb5e8484c6ffba5a67ac806683613d21","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        :type: boolean."},{"line_number":135,"context_line":"        \"\"\""},{"line_number":136,"context_line":"        for key, value in six.iteritems(aggregate_extra_spec):"},{"line_number":137,"context_line":"            if \u0027*\u0027 in value:"},{"line_number":138,"context_line":"                if key not in instance_extra_specs:"},{"line_number":139,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":140,"context_line":"                              \"is not present\", {\u0027key\u0027: key})"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_9f461922","line":137,"range":{"start_line":137,"start_character":12,"end_line":137,"end_character":28},"updated":"2016-01-19 13:21:39.000000000","message":"Based on the example I think asterisk is only valid if it is the only char in the value.\n\nif \u0027*\u0027 \u003d\u003d value:","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6d5bfe1a5c10f554a57f9d35cb1e21ffb6e260cb","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        :type: boolean."},{"line_number":135,"context_line":"        \"\"\""},{"line_number":136,"context_line":"        for key, value in six.iteritems(aggregate_extra_spec):"},{"line_number":137,"context_line":"            if \u0027*\u0027 in value:"},{"line_number":138,"context_line":"                if key not in instance_extra_specs:"},{"line_number":139,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":140,"context_line":"                              \"is not present\", {\u0027key\u0027: key})"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_c9782af5","line":137,"range":{"start_line":137,"start_character":12,"end_line":137,"end_character":28},"in_reply_to":"ba63e191_30739a82","updated":"2016-01-20 09:20:37.000000000","message":"Sorry, my bad. I see now.","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"63aa1caac8cd521276092ac39b10d3efb5856a54","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        :type: boolean."},{"line_number":135,"context_line":"        \"\"\""},{"line_number":136,"context_line":"        for key, value in six.iteritems(aggregate_extra_spec):"},{"line_number":137,"context_line":"            if \u0027*\u0027 in value:"},{"line_number":138,"context_line":"                if key not in instance_extra_specs:"},{"line_number":139,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":140,"context_line":"                              \"is not present\", {\u0027key\u0027: key})"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_30739a82","line":137,"range":{"start_line":137,"start_character":12,"end_line":137,"end_character":28},"in_reply_to":"ba63e191_9f461922","updated":"2016-01-19 14:25:41.000000000","message":"I changed the type of \"aggregate_extra_spec\", just to be more accurate.\nThis variable is a dict of sets. So, each \"value\" variable is a set. When I search for \"*\", or \"!\" or \"~\" in this set, I match and find the exact value.","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f7a93d1bcb5e8484c6ffba5a67ac806683613d21","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                else:"},{"line_number":143,"context_line":"                    continue"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            if \u0027!\u0027 in value:"},{"line_number":146,"context_line":"                if key in instance_extra_specs:"},{"line_number":147,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":148,"context_line":"                              \"is present\", {\u0027key\u0027: key})"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_df0a51d2","line":145,"range":{"start_line":145,"start_character":12,"end_line":145,"end_character":28},"updated":"2016-01-19 13:21:39.000000000","message":"if \u0027!\u0027 \u003d\u003d value: ?","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"63aa1caac8cd521276092ac39b10d3efb5856a54","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                else:"},{"line_number":143,"context_line":"                    continue"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            if \u0027!\u0027 in value:"},{"line_number":146,"context_line":"                if key in instance_extra_specs:"},{"line_number":147,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":148,"context_line":"                              \"is present\", {\u0027key\u0027: key})"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_f003c2b6","line":145,"range":{"start_line":145,"start_character":12,"end_line":145,"end_character":28},"in_reply_to":"ba63e191_df0a51d2","updated":"2016-01-19 14:25:41.000000000","message":"Ditto","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f7a93d1bcb5e8484c6ffba5a67ac806683613d21","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                else:"},{"line_number":151,"context_line":"                    continue"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"            if \u0027~\u0027 in value:"},{"line_number":154,"context_line":"                if key not in instance_extra_specs:"},{"line_number":155,"context_line":"                    continue"},{"line_number":156,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_3ffa8dbe","line":153,"range":{"start_line":153,"start_character":12,"end_line":153,"end_character":28},"updated":"2016-01-19 13:21:39.000000000","message":"Based on the example I feel \u0027~\u0027 only make sense as the first char of the value. Is it so?","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"63aa1caac8cd521276092ac39b10d3efb5856a54","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                else:"},{"line_number":151,"context_line":"                    continue"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"            if \u0027~\u0027 in value:"},{"line_number":154,"context_line":"                if key not in instance_extra_specs:"},{"line_number":155,"context_line":"                    continue"},{"line_number":156,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":19,"id":"ba63e191_7026f269","line":153,"range":{"start_line":153,"start_character":12,"end_line":153,"end_character":28},"in_reply_to":"ba63e191_3ffa8dbe","updated":"2016-01-19 14:25:41.000000000","message":"Ditto","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7da54ba6902b488e2daec0d1655c8198d64c0891","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    comprise of an instance type extra spec key followed by and equals \"\u003d\""},{"line_number":85,"context_line":"    followed by a value: \u003ckey\u003e\u003d\u003cvalue\u003e."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Eg. \u0027flavor_extra_spec\u003dmem_page_size\u003dany,mem_page_size\u003d~,\u0027 \\"},{"line_number":88,"context_line":"        \u0027mem_page_size\u003dsmall\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    Valid sentinel values are:"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba63e191_37c4d05d","line":87,"range":{"start_line":87,"start_character":27,"end_line":87,"end_character":40},"updated":"2016-01-19 23:40:47.000000000","message":"i think this was a mistake i had in my original spec but\n\nmem_page_size should be namespaced e.g.  hw:mem_page_size\n\nthis does not change the implementation but the example is incorrect.","commit_id":"b8d2753ff07d84fed1007fad49ebe0d241b28c28"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"18546347dfb9ef9d43bc6485773d0be5bfd2e32e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    comprise of an instance type extra spec key followed by and equals \"\u003d\""},{"line_number":85,"context_line":"    followed by a value: \u003ckey\u003e\u003d\u003cvalue\u003e."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Eg. \u0027flavor_extra_spec\u003dmem_page_size\u003dany,mem_page_size\u003d~,\u0027 \\"},{"line_number":88,"context_line":"        \u0027mem_page_size\u003dsmall\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    Valid sentinel values are:"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba63e191_7613190e","line":87,"range":{"start_line":87,"start_character":27,"end_line":87,"end_character":40},"in_reply_to":"ba63e191_37c4d05d","updated":"2016-01-20 09:04:44.000000000","message":"Done.","commit_id":"b8d2753ff07d84fed1007fad49ebe0d241b28c28"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova.scheduler import filters"},{"line_number":21,"context_line":"from nova.scheduler.filters import utils"},{"line_number":22,"context_line":"from oslo_log import log as logging"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_e1a504b5","line":23,"updated":"2016-01-28 23:34:41.000000000","message":"Formatting: You should have two blank lines here between globals, i.e. between the set of imports together and the LOG variable","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova.scheduler import filters"},{"line_number":21,"context_line":"from nova.scheduler.filters import utils"},{"line_number":22,"context_line":"from oslo_log import log as logging"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_4abade6f","line":23,"in_reply_to":"7a5de9d1_e1a504b5","updated":"2016-01-29 09:20:07.000000000","message":"Done","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    inside host aggregates containing \"flavor_extra_spec\" metadata. Keys inside"},{"line_number":73,"context_line":"    this variable must match with the instance extra specs."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    To use this filter, the name of this class should be add to the variable"},{"line_number":76,"context_line":"    ``scheduler_default_filters``, in ``nova.conf``:"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    |   [DEFAULT]"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_a1862c11","line":75,"range":{"start_line":75,"start_character":57,"end_line":75,"end_character":60},"updated":"2016-01-28 23:34:41.000000000","message":"s/add/added/","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    inside host aggregates containing \"flavor_extra_spec\" metadata. Keys inside"},{"line_number":73,"context_line":"    this variable must match with the instance extra specs."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    To use this filter, the name of this class should be add to the variable"},{"line_number":76,"context_line":"    ``scheduler_default_filters``, in ``nova.conf``:"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    |   [DEFAULT]"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_eab14a90","line":75,"range":{"start_line":75,"start_character":57,"end_line":75,"end_character":60},"in_reply_to":"7a5de9d1_a1862c11","updated":"2016-01-29 09:20:07.000000000","message":"Done","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    |   [DEFAULT]"},{"line_number":79,"context_line":"    |   scheduler_default_filters\u003d\u003clist of other filters\u003e, \\"},{"line_number":80,"context_line":"    |                             AggregateTypeExtraSpecsAffinityFilter"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    The content of the list will be formatted as follows. The entries in the"},{"line_number":83,"context_line":"    list will be separated by commas without white space. Each entry will"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_e12f44f4","line":80,"updated":"2016-01-28 23:34:41.000000000","message":"This part isn\u0027t rendering properly [1], I think you need to remove the pipe \"|\" after the \\\n\n[1] http://docs-draft.openstack.org/79/189279/26/check/gate-nova-docs/1ab4f33//doc/build/html/api/nova.scheduler.filters.type_filter.html#nova.scheduler.filters.type_filter.AggregateTypeExtraSpecsAffinityFilter","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    |   [DEFAULT]"},{"line_number":79,"context_line":"    |   scheduler_default_filters\u003d\u003clist of other filters\u003e, \\"},{"line_number":80,"context_line":"    |                             AggregateTypeExtraSpecsAffinityFilter"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    The content of the list will be formatted as follows. The entries in the"},{"line_number":83,"context_line":"    list will be separated by commas without white space. Each entry will"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_6a19da87","line":80,"in_reply_to":"7a5de9d1_e12f44f4","updated":"2016-01-29 09:20:07.000000000","message":"Done","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        :param aggregate_extra_spec: string containing a list of required"},{"line_number":105,"context_line":"                                     instance flavor extra specs, separated by"},{"line_number":106,"context_line":"                                     commas, with format \"key\u003dvalue\""},{"line_number":107,"context_line":"        :type aggregate: basestring."},{"line_number":108,"context_line":"        :return: dictionary with the values parsed and grouped by keys."},{"line_number":109,"context_line":"        :type: dict."},{"line_number":110,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_21e23ca0","line":107,"range":{"start_line":107,"start_character":14,"end_line":107,"end_character":23},"updated":"2016-01-28 23:34:41.000000000","message":"s/aggregate/aggregate_extra_spec/","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        :param aggregate_extra_spec: string containing a list of required"},{"line_number":105,"context_line":"                                     instance flavor extra specs, separated by"},{"line_number":106,"context_line":"                                     commas, with format \"key\u003dvalue\""},{"line_number":107,"context_line":"        :type aggregate: basestring."},{"line_number":108,"context_line":"        :return: dictionary with the values parsed and grouped by keys."},{"line_number":109,"context_line":"        :type: dict."},{"line_number":110,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_ca024e0b","line":107,"range":{"start_line":107,"start_character":14,"end_line":107,"end_character":23},"in_reply_to":"7a5de9d1_21e23ca0","updated":"2016-01-29 09:20:07.000000000","message":"Done","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        :type: dict."},{"line_number":110,"context_line":"        \"\"\""},{"line_number":111,"context_line":"        extra_specs \u003d collections.defaultdict(set)"},{"line_number":112,"context_line":"        kv_list \u003d str(aggregate_extra_spec).split(\u0027,\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        # Create a new set entry in a dict for every new key, update the key"},{"line_number":115,"context_line":"        # value (set object) for every other value."}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_aca943e1","line":112,"range":{"start_line":112,"start_character":18,"end_line":112,"end_character":22},"updated":"2016-01-28 23:34:41.000000000","message":"Why do you need to convert to string? How would aggregate_extra_spec not already be a string?","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        :type: dict."},{"line_number":110,"context_line":"        \"\"\""},{"line_number":111,"context_line":"        extra_specs \u003d collections.defaultdict(set)"},{"line_number":112,"context_line":"        kv_list \u003d str(aggregate_extra_spec).split(\u0027,\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        # Create a new set entry in a dict for every new key, update the key"},{"line_number":115,"context_line":"        # value (set object) for every other value."}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_fdd91684","line":112,"range":{"start_line":112,"start_character":18,"end_line":112,"end_character":22},"in_reply_to":"7a5de9d1_aca943e1","updated":"2016-01-29 09:20:07.000000000","message":"\u0027aggregate_extra_spec\u0027 is an unicode class variable (basestring), and I want to convert it to string (with the same parent class, basestring)\nI have changed the type of \u0027aggregate_extra_spec\u0027 in the description.","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            extra_specs[key].add(value)"},{"line_number":119,"context_line":"            if \u0027\u003d\u0027 in value:"},{"line_number":120,"context_line":"                LOG.info(_LI(\"Value string has an \u0027\u003d\u0027 char: %(value)s. Check \""},{"line_number":121,"context_line":"                             \"if it\u0027s malformed\"), {\u0027value\u0027: value})"},{"line_number":122,"context_line":"        return extra_specs"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def _instance_is_allowed_in_aggregate(self,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_212c7caa","line":121,"updated":"2016-01-28 23:34:41.000000000","message":"It seems like this should be a warn, not an info\n\nAlso, I think a better message would show the key as well, for example use kv_element instead of just value.","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            extra_specs[key].add(value)"},{"line_number":119,"context_line":"            if \u0027\u003d\u0027 in value:"},{"line_number":120,"context_line":"                LOG.info(_LI(\"Value string has an \u0027\u003d\u0027 char: %(value)s. Check \""},{"line_number":121,"context_line":"                             \"if it\u0027s malformed\"), {\u0027value\u0027: value})"},{"line_number":122,"context_line":"        return extra_specs"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def _instance_is_allowed_in_aggregate(self,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_7d93e64f","line":121,"in_reply_to":"7a5de9d1_212c7caa","updated":"2016-01-29 09:20:07.000000000","message":"The user can insert any text as value, also a text containing \u0027\u003d\u0027 char. We shouldn\u0027t send a warning message in normal operation; of course, we inform the user there is a \"special\" character being used in the value string.\nAbout using kv_element, I\u0027ll insert this change.","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                if match:"},{"line_number":166,"context_line":"                    LOG.info(_LI(\"Value string has \u0027%(chars)s\u0027 char(s): \""},{"line_number":167,"context_line":"                                 \"%(value)s. Check if it\u0027s malformed\"),"},{"line_number":168,"context_line":"                             {\u0027value\u0027: element, \u0027chars\u0027: match})"},{"line_number":169,"context_line":"                if key not in instance_extra_specs:"},{"line_number":170,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":171,"context_line":"                              \"is not present\", {\u0027key\u0027: key})"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_ecbadbbf","line":168,"updated":"2016-01-28 23:34:41.000000000","message":"Again, it seems like this should be a warning if something is wrong and should be checked. It means the filtering isn\u0027t working as the operator intended, right?\n\nI think it would help to put the key here too and not just the value on its own: %(key)s\u003d%(value)s","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                if match:"},{"line_number":166,"context_line":"                    LOG.info(_LI(\"Value string has \u0027%(chars)s\u0027 char(s): \""},{"line_number":167,"context_line":"                                 \"%(value)s. Check if it\u0027s malformed\"),"},{"line_number":168,"context_line":"                             {\u0027value\u0027: element, \u0027chars\u0027: match})"},{"line_number":169,"context_line":"                if key not in instance_extra_specs:"},{"line_number":170,"context_line":"                    LOG.debug(\"\u0027flavor_extra_spec\u0027 key: %(key)s \""},{"line_number":171,"context_line":"                              \"is not present\", {\u0027key\u0027: key})"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_40a95dde","line":168,"in_reply_to":"7a5de9d1_ecbadbbf","updated":"2016-01-29 09:20:07.000000000","message":"Done","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                    return False"},{"line_number":173,"context_line":"                if instance_extra_specs[key] not in value:"},{"line_number":174,"context_line":"                    LOG.debug(\"The following \u0027flavor_extra_spec\u0027 \""},{"line_number":175,"context_line":"                              \"key/value: %(key)s/%(value)s doesn\u0027t \""},{"line_number":176,"context_line":"                              \"match\", {\u0027key\u0027: key, \u0027value\u0027: value})"},{"line_number":177,"context_line":"                    return False"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_6ce4ab0c","line":175,"range":{"start_line":175,"start_character":31,"end_line":175,"end_character":59},"updated":"2016-01-28 23:34:41.000000000","message":"This might read better with key\u003dvalue: %(key)s\u003d%(value)s","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                    return False"},{"line_number":173,"context_line":"                if instance_extra_specs[key] not in value:"},{"line_number":174,"context_line":"                    LOG.debug(\"The following \u0027flavor_extra_spec\u0027 \""},{"line_number":175,"context_line":"                              \"key/value: %(key)s/%(value)s doesn\u0027t \""},{"line_number":176,"context_line":"                              \"match\", {\u0027key\u0027: key, \u0027value\u0027: value})"},{"line_number":177,"context_line":"                    return False"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_c08c6d81","line":175,"range":{"start_line":175,"start_character":31,"end_line":175,"end_character":59},"in_reply_to":"7a5de9d1_6ce4ab0c","updated":"2016-01-29 09:20:07.000000000","message":"Done","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                aggregate_extra_spec)"},{"line_number":195,"context_line":"            if not self._instance_is_allowed_in_aggregate(aggregate_extra_spec,"},{"line_number":196,"context_line":"                    instance_type.extra_specs):"},{"line_number":197,"context_line":"                return False"},{"line_number":198,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_cc135fb7","line":197,"updated":"2016-01-28 23:34:41.000000000","message":"General suggestion with these variable names, you could have less line wrapping if you name them e.g. agg_extra_specs and agg_extra_spec","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9b1d722054e8cbfd1f7b1605e2626dbc80db36a3","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":14,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":"import collections"},{"line_number":17,"context_line":"import six"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from nova.i18n import _LI"}],"source_content_type":"text/x-python","patch_set":27,"id":"7a5de9d1_aeb9067b","line":16,"updated":"2016-01-29 19:53:55.000000000","message":"Ah, I missed this is stdlib and should be in its own section","commit_id":"800a5098ba3a104f0e2b01c8c9d60d95a907f050"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e0afb983af5afdc838d69a5f6584585bd23339de","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            key, value \u003d kv_element.split(\u0027\u003d\u0027, 1)"},{"line_number":119,"context_line":"            extra_specs[key].add(value)"},{"line_number":120,"context_line":"            if \u0027\u003d\u0027 in value:"},{"line_number":121,"context_line":"                LOG.info(_LI(\"Value string has an \u0027\u003d\u0027 char: key \u003d \u0027%(key)s\u0027, \""},{"line_number":122,"context_line":"                             \"value \u003d \u0027%(value)s\u0027. Check if it\u0027s malformed\"),"},{"line_number":123,"context_line":"                         {\u0027value\u0027: value, \u0027key\u0027: key})"},{"line_number":124,"context_line":"        return extra_specs"}],"source_content_type":"text/x-python","patch_set":27,"id":"7a5de9d1_a454b7fd","line":121,"updated":"2016-01-30 11:23:33.000000000","message":"Nit: maybe warn would be better?","commit_id":"800a5098ba3a104f0e2b01c8c9d60d95a907f050"}],"nova/tests/unit/scheduler/filters/test_type_filters.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c4d9e79c6888a1c0303a1cc96fd2912f52785722","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        super(TestAggregateTypeExtraSpecsAffinityFilter, self).setUp()"},{"line_number":65,"context_line":"        self.filt_cls \u003d type_filter.AggregateTypeExtraSpecsAffinityFilter()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        self.aggr1_no_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":68,"context_line":"        self.aggr1_no_extraspecs.metadata \u003d {}"},{"line_number":69,"context_line":"        self.aggr2_wrong_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":70,"context_line":"        self.aggr2_wrong_extraspecs.metadata \u003d {}"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_bb4142ab","line":67,"updated":"2015-06-10 08:45:55.000000000","message":"i think it would be better to remove the numbering and use more descriptive names.\nit is unclear what these aggregates are when they are being used in the testes below.","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f723138f47cbe721522d604de22ce0b418c3a58b","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        super(TestAggregateTypeExtraSpecsAffinityFilter, self).setUp()"},{"line_number":65,"context_line":"        self.filt_cls \u003d type_filter.AggregateTypeExtraSpecsAffinityFilter()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        self.aggr1_no_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":68,"context_line":"        self.aggr1_no_extraspecs.metadata \u003d {}"},{"line_number":69,"context_line":"        self.aggr2_wrong_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":70,"context_line":"        self.aggr2_wrong_extraspecs.metadata \u003d {}"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_1006ec1f","line":67,"in_reply_to":"3afb71cf_bb4142ab","updated":"2015-06-10 11:23:41.000000000","message":"I will remove the numbers. The names are descriptive enough, also the names of the functions using this variables.","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c4d9e79c6888a1c0303a1cc96fd2912f52785722","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        self.aggr3_correct_extraspecs.metadata \u003d {}"},{"line_number":75,"context_line":"        self.aggr3_correct_extraspecs.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":76,"context_line":"            \u0027mem_page_size\u003dsmall\u0027"},{"line_number":77,"context_line":"        self.aggr4a_any \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":78,"context_line":"        self.aggr4a_any.metadata \u003d {}"},{"line_number":79,"context_line":"        self.aggr4a_any.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":80,"context_line":"            \u0027mem_page_size\u003dlarge,mem_page_size\u003d~\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_5b536e39","line":77,"updated":"2015-06-10 08:45:55.000000000","message":"what does any refer to in this contex?","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f723138f47cbe721522d604de22ce0b418c3a58b","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        self.aggr3_correct_extraspecs.metadata \u003d {}"},{"line_number":75,"context_line":"        self.aggr3_correct_extraspecs.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":76,"context_line":"            \u0027mem_page_size\u003dsmall\u0027"},{"line_number":77,"context_line":"        self.aggr4a_any \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":78,"context_line":"        self.aggr4a_any.metadata \u003d {}"},{"line_number":79,"context_line":"        self.aggr4a_any.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":80,"context_line":"            \u0027mem_page_size\u003dlarge,mem_page_size\u003d~\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_2b129d57","line":77,"in_reply_to":"3afb71cf_5b536e39","updated":"2015-06-10 11:23:41.000000000","message":"Any value.","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c4d9e79c6888a1c0303a1cc96fd2912f52785722","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.aggr4e_any.metadata \u003d {}"},{"line_number":95,"context_line":"        self.aggr4e_any.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":96,"context_line":"            \u0027mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":97,"context_line":"        self.aggr5_kleene \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":98,"context_line":"        self.aggr5_kleene.metadata \u003d {}"},{"line_number":99,"context_line":"        self.aggr5_kleene.metadata[\u0027flavor_extra_spec\u0027] \u003d \u0027mem_page_size\u003d*\u0027"},{"line_number":100,"context_line":"        self.aggr6_nospec \u003d objects.Aggregate(context\u003d\u0027test\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_1bf5f655","line":97,"updated":"2015-06-10 08:45:55.000000000","message":"what is kleene?\ndo you mean Asterisk e.g. *\nhttp://en.wikipedia.org/wiki/Asterisk","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f723138f47cbe721522d604de22ce0b418c3a58b","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.aggr4e_any.metadata \u003d {}"},{"line_number":95,"context_line":"        self.aggr4e_any.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":96,"context_line":"            \u0027mem_page_size\u003dany,mem_page_size\u003d~,mem_page_size\u003dsmall\u0027"},{"line_number":97,"context_line":"        self.aggr5_kleene \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":98,"context_line":"        self.aggr5_kleene.metadata \u003d {}"},{"line_number":99,"context_line":"        self.aggr5_kleene.metadata[\u0027flavor_extra_spec\u0027] \u003d \u0027mem_page_size\u003d*\u0027"},{"line_number":100,"context_line":"        self.aggr6_nospec \u003d objects.Aggregate(context\u003d\u0027test\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_eb17e542","line":97,"in_reply_to":"3afb71cf_1bf5f655","updated":"2015-06-10 11:23:41.000000000","message":"Kleene star. I will change it.","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c4d9e79c6888a1c0303a1cc96fd2912f52785722","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self.aggr5_kleene.metadata[\u0027flavor_extra_spec\u0027] \u003d \u0027mem_page_size\u003d*\u0027"},{"line_number":100,"context_line":"        self.aggr6_nospec \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":101,"context_line":"        self.aggr6_nospec.metadata \u003d {}"},{"line_number":102,"context_line":"        self.aggr6_nospec.metadata[\u0027flavor_extra_spec\u0027] \u003d \u0027mem_page_size\u003d!\u0027"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        self.filter_properties \u003d {\u0027instance_type\u0027: {\u0027extra_specs\u0027:"},{"line_number":105,"context_line":"            {\u0027mem_page_size\u0027: \u0027small\u0027}}}"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_3b4c329d","line":102,"updated":"2015-06-10 08:45:55.000000000","message":"what does nospec refer too?\nhear you are created an aggregate with a flavor_extra_spec value testing\nthe sentinel value \"!\" for this key must not be present in the instance extra specs.","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f723138f47cbe721522d604de22ce0b418c3a58b","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self.aggr5_kleene.metadata[\u0027flavor_extra_spec\u0027] \u003d \u0027mem_page_size\u003d*\u0027"},{"line_number":100,"context_line":"        self.aggr6_nospec \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":101,"context_line":"        self.aggr6_nospec.metadata \u003d {}"},{"line_number":102,"context_line":"        self.aggr6_nospec.metadata[\u0027flavor_extra_spec\u0027] \u003d \u0027mem_page_size\u003d!\u0027"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        self.filter_properties \u003d {\u0027instance_type\u0027: {\u0027extra_specs\u0027:"},{"line_number":105,"context_line":"            {\u0027mem_page_size\u0027: \u0027small\u0027}}}"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_5062240b","line":102,"in_reply_to":"3afb71cf_3b4c329d","updated":"2015-06-10 11:23:41.000000000","message":"Changed to nopresent","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c4d9e79c6888a1c0303a1cc96fd2912f52785722","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self.filter_properties_noextraspecs \u003d {\u0027instance_type\u0027:"},{"line_number":107,"context_line":"            {\u0027extra_specs\u0027: {}}}"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def _do_test_compute_filter_extra_specs(self, host_state,"},{"line_number":110,"context_line":"        filter_properties, passes):"},{"line_number":111,"context_line":"        assertion \u003d self.assertTrue if passes else self.assertFalse"},{"line_number":112,"context_line":"        assertion(self.filt_cls.host_passes(host_state, filter_properties))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_db84fe0b","line":109,"updated":"2015-06-10 08:45:55.000000000","message":"is this required?","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f723138f47cbe721522d604de22ce0b418c3a58b","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self.filter_properties_noextraspecs \u003d {\u0027instance_type\u0027:"},{"line_number":107,"context_line":"            {\u0027extra_specs\u0027: {}}}"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def _do_test_compute_filter_extra_specs(self, host_state,"},{"line_number":110,"context_line":"        filter_properties, passes):"},{"line_number":111,"context_line":"        assertion \u003d self.assertTrue if passes else self.assertFalse"},{"line_number":112,"context_line":"        assertion(self.filt_cls.host_passes(host_state, filter_properties))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_b0503833","line":109,"in_reply_to":"3afb71cf_db84fe0b","updated":"2015-06-10 11:23:41.000000000","message":"Removed","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c4d9e79c6888a1c0303a1cc96fd2912f52785722","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        self._do_test_compute_filter_extra_specs(host_state,"},{"line_number":118,"context_line":"            self.filter_properties, True)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def test_aggregate_type_extra_specs_ha_wrong_extraspecs(self):"},{"line_number":121,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":122,"context_line":"        host_state.aggregates.append(self.aggr2_wrong_extraspecs)"},{"line_number":123,"context_line":"        self._do_test_compute_filter_extra_specs(host_state,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_1bbdf6b6","line":120,"updated":"2015-06-10 08:45:55.000000000","message":"i would use valid and invalid instead or wrong and right.","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f723138f47cbe721522d604de22ce0b418c3a58b","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        self._do_test_compute_filter_extra_specs(host_state,"},{"line_number":118,"context_line":"            self.filter_properties, True)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def test_aggregate_type_extra_specs_ha_wrong_extraspecs(self):"},{"line_number":121,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":122,"context_line":"        host_state.aggregates.append(self.aggr2_wrong_extraspecs)"},{"line_number":123,"context_line":"        self._do_test_compute_filter_extra_specs(host_state,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3afb71cf_d034d4fc","line":120,"in_reply_to":"3afb71cf_1bbdf6b6","updated":"2015-06-10 11:23:41.000000000","message":"Changed","commit_id":"954425d05902d6104567d77ceca1f1f76822dfc8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0cdab26d1c134382188dbd90a8667b713a0c0e7d","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        self.aggr_no_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":131,"context_line":"        self.aggr_no_extraspecs.metadata \u003d {}"},{"line_number":132,"context_line":"        self.aggr_invalid_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":133,"context_line":"        self.aggr_invalid_extraspecs.metadata \u003d {}"},{"line_number":134,"context_line":"        self.aggr_invalid_extraspecs.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":135,"context_line":"            \u0027mem_page_size\u003dlarge\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_026c0a35","line":132,"updated":"2015-07-10 15:20:36.000000000","message":"Some white space between the aggregates you\u0027re adding would be really helpful","commit_id":"4633ff510ce26b78b673fa9a300b5becde9cc044"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9c34ea083db6eef81fdbf8bd719b52f5275504ef","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        self.aggr_no_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":131,"context_line":"        self.aggr_no_extraspecs.metadata \u003d {}"},{"line_number":132,"context_line":"        self.aggr_invalid_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":133,"context_line":"        self.aggr_invalid_extraspecs.metadata \u003d {}"},{"line_number":134,"context_line":"        self.aggr_invalid_extraspecs.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":135,"context_line":"            \u0027mem_page_size\u003dlarge\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_7d547720","line":132,"in_reply_to":"ba3cc151_026c0a35","updated":"2015-07-13 13:56:34.000000000","message":"Done","commit_id":"4633ff510ce26b78b673fa9a300b5becde9cc044"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0cdab26d1c134382188dbd90a8667b713a0c0e7d","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        self.aggr_valid_extraspecs.metadata \u003d {}"},{"line_number":138,"context_line":"        self.aggr_valid_extraspecs.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":139,"context_line":"            \u0027mem_page_size\u003dsmall\u0027"},{"line_number":140,"context_line":"        self.aggra_prime \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":141,"context_line":"        self.aggra_prime.metadata \u003d {}"},{"line_number":142,"context_line":"        self.aggra_prime.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":143,"context_line":"            \u0027mem_page_size\u003dlarge,mem_page_size\u003d~\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_e28ec6cf","line":140,"range":{"start_line":140,"start_character":8,"end_line":140,"end_character":24},"updated":"2015-07-10 15:20:36.000000000","message":"Can you please make these meaningful names? It\u0027s really hard to read your tests below with names like this.","commit_id":"4633ff510ce26b78b673fa9a300b5becde9cc044"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9c34ea083db6eef81fdbf8bd719b52f5275504ef","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        self.aggr_valid_extraspecs.metadata \u003d {}"},{"line_number":138,"context_line":"        self.aggr_valid_extraspecs.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":139,"context_line":"            \u0027mem_page_size\u003dsmall\u0027"},{"line_number":140,"context_line":"        self.aggra_prime \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":141,"context_line":"        self.aggra_prime.metadata \u003d {}"},{"line_number":142,"context_line":"        self.aggra_prime.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":143,"context_line":"            \u0027mem_page_size\u003dlarge,mem_page_size\u003d~\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_a640b0a6","line":140,"in_reply_to":"ba3cc151_e28ec6cf","updated":"2015-07-13 13:56:34.000000000","message":"Done","commit_id":"4633ff510ce26b78b673fa9a300b5becde9cc044"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"1928810a4ac07d7f3884c2ce35919f4e31d9cf03","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        self.aggr_no_extraspecs.metadata \u003d {}"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        self.aggr_invalid_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":134,"context_line":"        self.aggr_invalid_extraspecs.metadata \u003d {}"},{"line_number":135,"context_line":"        self.aggr_invalid_extraspecs.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":136,"context_line":"            \u0027mem_page_size\u003dlarge\u0027"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        self.aggr_valid_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":139,"context_line":"        self.aggr_valid_extraspecs.metadata \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_b2b0dcde","line":136,"range":{"start_line":134,"start_character":0,"end_line":136,"end_character":33},"updated":"2015-07-13 17:37:46.000000000","message":"For this and all the similar constructs below, you can combine into a single line, like this:\n\n    self.aggr_invalid_extraspecs.metadata \u003d {\u0027flavor_extra_spec\u0027: \u0027mem_page_size\u003dlarge\u0027}","commit_id":"f74085e8d65807cf28977d2bf95daeade5cafdb6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"07c22f7aa0d5f38f4c6f5bb1ad7a0a438ef58f5c","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        self.aggr_invalid_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":134,"context_line":"        self.aggr_invalid_extraspecs.metadata \u003d {}"},{"line_number":135,"context_line":"        self.aggr_invalid_extraspecs.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":136,"context_line":"            \u0027mem_page_size\u003dlarge\u0027"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        self.aggr_valid_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":139,"context_line":"        self.aggr_valid_extraspecs.metadata \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_febf0b5e","line":136,"in_reply_to":"9a41bdd9_b2b0dcde","updated":"2015-07-13 19:14:55.000000000","message":"+1","commit_id":"f74085e8d65807cf28977d2bf95daeade5cafdb6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7c342c0c9bdb58975c57862d2ebbe270d7f0f68f","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        self.aggr_invalid_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":134,"context_line":"        self.aggr_invalid_extraspecs.metadata \u003d {}"},{"line_number":135,"context_line":"        self.aggr_invalid_extraspecs.metadata[\u0027flavor_extra_spec\u0027] \u003d \\"},{"line_number":136,"context_line":"            \u0027mem_page_size\u003dlarge\u0027"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        self.aggr_valid_extraspecs \u003d objects.Aggregate(context\u003d\u0027test\u0027)"},{"line_number":139,"context_line":"        self.aggr_valid_extraspecs.metadata \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_a65f27e4","line":136,"in_reply_to":"9a41bdd9_febf0b5e","updated":"2015-07-14 07:43:26.000000000","message":"Done","commit_id":"f74085e8d65807cf28977d2bf95daeade5cafdb6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"07c22f7aa0d5f38f4c6f5bb1ad7a0a438ef58f5c","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        assertion(self.filt_cls.host_passes(host_state, filter_properties))"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def test_aggregate_type_extra_specs_ha_no_extraspecs(self):"},{"line_number":187,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":188,"context_line":"        host_state.aggregates.append(self.aggr_no_extraspecs)"},{"line_number":189,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"},{"line_number":190,"context_line":"            self.filter_properties))"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_5e8ab7c0","line":187,"updated":"2015-07-13 19:14:55.000000000","message":"host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})\nshould probably be moved to setup as it is the same for all tests.","commit_id":"f74085e8d65807cf28977d2bf95daeade5cafdb6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7c342c0c9bdb58975c57862d2ebbe270d7f0f68f","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        assertion(self.filt_cls.host_passes(host_state, filter_properties))"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def test_aggregate_type_extra_specs_ha_no_extraspecs(self):"},{"line_number":187,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":188,"context_line":"        host_state.aggregates.append(self.aggr_no_extraspecs)"},{"line_number":189,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"},{"line_number":190,"context_line":"            self.filter_properties))"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_86b8e3e6","line":187,"in_reply_to":"9a41bdd9_5e8ab7c0","updated":"2015-07-14 07:43:26.000000000","message":"A new FakeHostState should be instantiated each time a test is called.","commit_id":"f74085e8d65807cf28977d2bf95daeade5cafdb6"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"254646f6270d2492dd13d46cb083156ae3c44a3b","unresolved":false,"context_lines":[{"line_number":182,"context_line":"            context\u003dmock.sentinel.ctx,"},{"line_number":183,"context_line":"            flavor\u003dobjects.Flavor())"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _do_test_compute_filter_extra_specs(self, host_state,"},{"line_number":186,"context_line":"        filter_properties, passes):"},{"line_number":187,"context_line":"        assertion \u003d self.assertTrue if passes else self.assertFalse"},{"line_number":188,"context_line":"        assertion(self.filt_cls.host_passes(host_state, filter_properties))"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_307765a1","line":185,"range":{"start_line":185,"start_character":8,"end_line":185,"end_character":43},"updated":"2016-01-15 14:36:42.000000000","message":"it is used only once so you can simply drop it","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2c3fd032238ee0dc941677889e796ada2c453d79","unresolved":false,"context_lines":[{"line_number":182,"context_line":"            context\u003dmock.sentinel.ctx,"},{"line_number":183,"context_line":"            flavor\u003dobjects.Flavor())"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _do_test_compute_filter_extra_specs(self, host_state,"},{"line_number":186,"context_line":"        filter_properties, passes):"},{"line_number":187,"context_line":"        assertion \u003d self.assertTrue if passes else self.assertFalse"},{"line_number":188,"context_line":"        assertion(self.filt_cls.host_passes(host_state, filter_properties))"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_4e4a7556","line":185,"range":{"start_line":185,"start_character":8,"end_line":185,"end_character":43},"in_reply_to":"da6ed579_307765a1","updated":"2016-01-15 15:15:04.000000000","message":"+1","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":182,"context_line":"            context\u003dmock.sentinel.ctx,"},{"line_number":183,"context_line":"            flavor\u003dobjects.Flavor())"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _do_test_compute_filter_extra_specs(self, host_state,"},{"line_number":186,"context_line":"        filter_properties, passes):"},{"line_number":187,"context_line":"        assertion \u003d self.assertTrue if passes else self.assertFalse"},{"line_number":188,"context_line":"        assertion(self.filt_cls.host_passes(host_state, filter_properties))"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_ebb50e31","line":185,"range":{"start_line":185,"start_character":8,"end_line":185,"end_character":43},"in_reply_to":"da6ed579_307765a1","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f5e1a9df298b5ee40a37ead2a87a947f24474c96","unresolved":false,"context_lines":[{"line_number":182,"context_line":"            context\u003dmock.sentinel.ctx,"},{"line_number":183,"context_line":"            flavor\u003dobjects.Flavor())"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _do_test_compute_filter_extra_specs(self, host_state,"},{"line_number":186,"context_line":"        filter_properties, passes):"},{"line_number":187,"context_line":"        assertion \u003d self.assertTrue if passes else self.assertFalse"},{"line_number":188,"context_line":"        assertion(self.filt_cls.host_passes(host_state, filter_properties))"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_4b7bfa7b","line":185,"range":{"start_line":185,"start_character":8,"end_line":185,"end_character":43},"in_reply_to":"da6ed579_4e4a7556","updated":"2016-01-18 14:39:27.000000000","message":"Done","commit_id":"c4c86b6949a3fd32f6a7f299bf4206e79b5b5cb9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f7a93d1bcb5e8484c6ffba5a67ac806683613d21","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"ba63e191_0ab7493a","line":289,"updated":"2016-01-19 13:21:39.000000000","message":"Could you add some test regarding malformed value like\n\u0027key\u003dfoo\u003dbar\u0027?\nAnd some negative test of bad modifier usage like:\n\u0027key\u003d*some_value\u0027\n\u0027key\u003d!some_value\u0027\n\u0027key\u003dmy_optional_value~\u0027","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"63aa1caac8cd521276092ac39b10d3efb5856a54","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"ba63e191_9dc7fe11","line":289,"in_reply_to":"ba63e191_0ab7493a","updated":"2016-01-19 14:25:41.000000000","message":"The first test is cover in \"test_parse_extra_spec_key_pairs\"\nThe other examples are not malformed: you can add any string as value. I\u0027ll add some tests to verify the value (including the sentinel chars) are allowed strings. Sentinel chars are valid only if written alone.","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":6508,"name":"Dmitry Stepanenko","email":"dstepanenko@mirantis.com","username":"dstepanenko"},"change_message_id":"3983130a0c70f8d8b2a8c3cd015ede624d20edb9","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":213,"context_line":"        host_state.aggregates.append(self.aggr_asterisk_inline)"},{"line_number":214,"context_line":"        self.filt_cls.host_passes(host_state, self.rs_extraspecs)"},{"line_number":215,"context_line":"        mock_logging.assert_called_with("},{"line_number":216,"context_line":"            (\"Value string has \u0027%(chars)s\u0027 char(s): %(value)s. Check if it\u0027s \""},{"line_number":217,"context_line":"             \"malformed\"),"},{"line_number":218,"context_line":"            {\u0027chars\u0027: [\u0027*\u0027], \u0027value\u0027: \u0027*value\u0027})"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a68dd71_2572257c","line":215,"updated":"2016-01-22 15:59:27.000000000","message":"So, you\u0027re running 3 scenarious - each for different sentinel value. Why don\u0027t you do the same using loop?","commit_id":"675624b9848a15af3358a31fb86412fa9b791903"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e8c6a73a19c2edbfcfc61d161132df998d0e7dd3","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":213,"context_line":"        host_state.aggregates.append(self.aggr_asterisk_inline)"},{"line_number":214,"context_line":"        self.filt_cls.host_passes(host_state, self.rs_extraspecs)"},{"line_number":215,"context_line":"        mock_logging.assert_called_with("},{"line_number":216,"context_line":"            (\"Value string has \u0027%(chars)s\u0027 char(s): %(value)s. Check if it\u0027s \""},{"line_number":217,"context_line":"             \"malformed\"),"},{"line_number":218,"context_line":"            {\u0027chars\u0027: [\u0027*\u0027], \u0027value\u0027: \u0027*value\u0027})"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a68dd71_f62f6e3c","line":215,"in_reply_to":"9a68dd71_2572257c","updated":"2016-01-26 09:38:01.000000000","message":"Done","commit_id":"675624b9848a15af3358a31fb86412fa9b791903"},{"author":{"_account_id":6508,"name":"Dmitry Stepanenko","email":"dstepanenko@mirantis.com","username":"dstepanenko"},"change_message_id":"3983130a0c70f8d8b2a8c3cd015ede624d20edb9","unresolved":false,"context_lines":[{"line_number":231,"context_line":"             \"malformed\"),"},{"line_number":232,"context_line":"            {\u0027chars\u0027: [\u0027!\u0027], \u0027value\u0027: \u0027va!lue\u0027})"},{"line_number":233,"context_line":"        mock_logging.reset_mock()"},{"line_number":234,"context_line":"        host_state.aggregates \u003d [self.aggr_valid_extraspecs]"},{"line_number":235,"context_line":"        self.filt_cls.host_passes(host_state, self.rs_extraspecs)"},{"line_number":236,"context_line":"        mock_logging.assert_not_called()"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a68dd71_45a9598f","line":234,"updated":"2016-01-22 15:59:27.000000000","message":"What do you think about moving this case into separate test? This scenario is not about sentinels, while the test is called \"test_sentinel_values_inline\"","commit_id":"675624b9848a15af3358a31fb86412fa9b791903"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e8c6a73a19c2edbfcfc61d161132df998d0e7dd3","unresolved":false,"context_lines":[{"line_number":231,"context_line":"             \"malformed\"),"},{"line_number":232,"context_line":"            {\u0027chars\u0027: [\u0027!\u0027], \u0027value\u0027: \u0027va!lue\u0027})"},{"line_number":233,"context_line":"        mock_logging.reset_mock()"},{"line_number":234,"context_line":"        host_state.aggregates \u003d [self.aggr_valid_extraspecs]"},{"line_number":235,"context_line":"        self.filt_cls.host_passes(host_state, self.rs_extraspecs)"},{"line_number":236,"context_line":"        mock_logging.assert_not_called()"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a68dd71_966cf2d1","line":234,"in_reply_to":"9a68dd71_45a9598f","updated":"2016-01-26 09:38:01.000000000","message":"Done","commit_id":"675624b9848a15af3358a31fb86412fa9b791903"},{"author":{"_account_id":6508,"name":"Dmitry Stepanenko","email":"dstepanenko@mirantis.com","username":"dstepanenko"},"change_message_id":"3983130a0c70f8d8b2a8c3cd015ede624d20edb9","unresolved":false,"context_lines":[{"line_number":244,"context_line":"    def test_aggregate_type_extra_specs_ha_wrong_extraspecs(self):"},{"line_number":245,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":246,"context_line":"        host_state.aggregates.append(self.aggr_invalid_extraspecs)"},{"line_number":247,"context_line":"        self.assertFalse(self.filt_cls.host_passes(host_state,"},{"line_number":248,"context_line":"            self.rs_extraspecs))"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def test_aggregate_type_extra_specs_ha_right_extraspecs(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a68dd71_c5fa2943","line":247,"updated":"2016-01-22 15:59:27.000000000","message":"nit: here and in all the other tests where host_passes returns False you can also check log message, like you did it in the very first test case","commit_id":"675624b9848a15af3358a31fb86412fa9b791903"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e8c6a73a19c2edbfcfc61d161132df998d0e7dd3","unresolved":false,"context_lines":[{"line_number":244,"context_line":"    def test_aggregate_type_extra_specs_ha_wrong_extraspecs(self):"},{"line_number":245,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":246,"context_line":"        host_state.aggregates.append(self.aggr_invalid_extraspecs)"},{"line_number":247,"context_line":"        self.assertFalse(self.filt_cls.host_passes(host_state,"},{"line_number":248,"context_line":"            self.rs_extraspecs))"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def test_aggregate_type_extra_specs_ha_right_extraspecs(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a68dd71_e129eaf3","line":247,"in_reply_to":"9a68dd71_c5fa2943","updated":"2016-01-26 09:38:01.000000000","message":"I could but I think two separate tests to check the info log is enough. And I prefer to patch as few functions as possible per test.","commit_id":"675624b9848a15af3358a31fb86412fa9b791903"},{"author":{"_account_id":6508,"name":"Dmitry Stepanenko","email":"dstepanenko@mirantis.com","username":"dstepanenko"},"change_message_id":"3983130a0c70f8d8b2a8c3cd015ede624d20edb9","unresolved":false,"context_lines":[{"line_number":295,"context_line":"    def test_aggregate_type_extra_specs_any_order(self):"},{"line_number":296,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":297,"context_line":"        host_state.aggregates.append(self.aggr_optional_first)"},{"line_number":298,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"},{"line_number":299,"context_line":"            self.rs_extraspecs))"},{"line_number":300,"context_line":"        host_state.aggregates \u003d [self.aggr_optional_last]"},{"line_number":301,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a68dd71_e52acd8f","line":298,"updated":"2016-01-22 15:59:27.000000000","message":"nit: you can also use loop here","commit_id":"675624b9848a15af3358a31fb86412fa9b791903"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e8c6a73a19c2edbfcfc61d161132df998d0e7dd3","unresolved":false,"context_lines":[{"line_number":295,"context_line":"    def test_aggregate_type_extra_specs_any_order(self):"},{"line_number":296,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":297,"context_line":"        host_state.aggregates.append(self.aggr_optional_first)"},{"line_number":298,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"},{"line_number":299,"context_line":"            self.rs_extraspecs))"},{"line_number":300,"context_line":"        host_state.aggregates \u003d [self.aggr_optional_last]"},{"line_number":301,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a68dd71_61dadaeb","line":298,"in_reply_to":"9a68dd71_e52acd8f","updated":"2016-01-26 09:38:01.000000000","message":"Done","commit_id":"675624b9848a15af3358a31fb86412fa9b791903"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import logging"},{"line_number":14,"context_line":"import mock"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from nova import objects"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_8cb7a785","line":13,"updated":"2016-01-28 23:34:41.000000000","message":"This is a stdlib import and goes in its own section [1]. mock is third party so also has its own section\n\n[1] http://docs.openstack.org/developer/hacking/#import-order-template","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import logging"},{"line_number":14,"context_line":"import mock"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from nova import objects"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_e073a97e","line":13,"in_reply_to":"7a5de9d1_8cb7a785","updated":"2016-01-29 09:20:07.000000000","message":"Done","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":297,"context_line":"            self.assertTrue(self.filt_cls.host_passes(host_state,"},{"line_number":298,"context_line":"                self.rs_extraspecs))"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def test_aggregate_type_extra_specs_kleene(self):"},{"line_number":301,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":302,"context_line":"        host_state.aggregates.append(self.aggr_any)"},{"line_number":303,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_8cd247d1","line":300,"range":{"start_line":300,"start_character":40,"end_line":300,"end_character":46},"updated":"2016-01-28 23:34:41.000000000","message":"I don\u0027t think \"kleene\" is widely known to mean asterisk or any. Could you please use either \"asterisk\" or \"any\" instead?","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":297,"context_line":"            self.assertTrue(self.filt_cls.host_passes(host_state,"},{"line_number":298,"context_line":"                self.rs_extraspecs))"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def test_aggregate_type_extra_specs_kleene(self):"},{"line_number":301,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":302,"context_line":"        host_state.aggregates.append(self.aggr_any)"},{"line_number":303,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_2010e100","line":300,"range":{"start_line":300,"start_character":40,"end_line":300,"end_character":46},"in_reply_to":"7a5de9d1_8cd247d1","updated":"2016-01-29 09:20:07.000000000","message":"Done","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ef1cd5c766a641720f507c40e4417f2ad64af5da","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"},{"line_number":304,"context_line":"            self.rs_extraspecs))"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def test_aggregate_type_extra_specs_kleene_no_extraspecs(self):"},{"line_number":307,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":308,"context_line":"        host_state.aggregates.append(self.aggr_any)"},{"line_number":309,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_8ca00745","line":306,"range":{"start_line":306,"start_character":40,"end_line":306,"end_character":46},"updated":"2016-01-28 23:34:41.000000000","message":"\"asterisk\" or \"any\" please","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e81a356d413b8efd71a001dbf7080f363114b09f","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"},{"line_number":304,"context_line":"            self.rs_extraspecs))"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def test_aggregate_type_extra_specs_kleene_no_extraspecs(self):"},{"line_number":307,"context_line":"        host_state \u003d fakes.FakeHostState(\u0027host1\u0027, \u0027compute\u0027, {})"},{"line_number":308,"context_line":"        host_state.aggregates.append(self.aggr_any)"},{"line_number":309,"context_line":"        self.assertTrue(self.filt_cls.host_passes(host_state,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7a5de9d1_40139d0d","line":306,"range":{"start_line":306,"start_character":40,"end_line":306,"end_character":46},"in_reply_to":"7a5de9d1_8ca00745","updated":"2016-01-29 09:20:07.000000000","message":"Done","commit_id":"de2218351ab4e6f07de728fcbdbf3e1bfa97d701"}],"releasenotes/notes/add-aggregate-type-extra-specs-affinity-filter-79a2d3ee152b8ecd.yaml":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f7a93d1bcb5e8484c6ffba5a67ac806683613d21","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    \"flavor_extra_spec\" metadata. Keys inside this variable must match with the"},{"line_number":6,"context_line":"    instance extra specs. The entries in the list will be separated by commas"},{"line_number":7,"context_line":"    without white space. Each entry will comprise of an instance type extra"},{"line_number":8,"context_line":"    spec key followed by and equals \"\u003d\" followed by a value (\u003ckey\u003e\u003d\u003cvalue\u003e)."},{"line_number":9,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":19,"id":"ba63e191_eae7553e","line":8,"range":{"start_line":8,"start_character":25,"end_line":8,"end_character":28},"updated":"2016-01-19 13:21:39.000000000","message":"nit: s/and/an/","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"63aa1caac8cd521276092ac39b10d3efb5856a54","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    \"flavor_extra_spec\" metadata. Keys inside this variable must match with the"},{"line_number":6,"context_line":"    instance extra specs. The entries in the list will be separated by commas"},{"line_number":7,"context_line":"    without white space. Each entry will comprise of an instance type extra"},{"line_number":8,"context_line":"    spec key followed by and equals \"\u003d\" followed by a value (\u003ckey\u003e\u003d\u003cvalue\u003e)."},{"line_number":9,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":19,"id":"ba63e191_7044b273","line":8,"range":{"start_line":8,"start_character":25,"end_line":8,"end_character":28},"in_reply_to":"ba63e191_eae7553e","updated":"2016-01-19 14:25:41.000000000","message":"Done","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f7a93d1bcb5e8484c6ffba5a67ac806683613d21","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    instance extra specs. The entries in the list will be separated by commas"},{"line_number":7,"context_line":"    without white space. Each entry will comprise of an instance type extra"},{"line_number":8,"context_line":"    spec key followed by and equals \"\u003d\" followed by a value (\u003ckey\u003e\u003d\u003cvalue\u003e)."},{"line_number":9,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":19,"id":"ba63e191_6a41250b","line":9,"updated":"2016-01-19 13:21:39.000000000","message":"it might be good to refer to the filter_scheduler doc here you updated.","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"63aa1caac8cd521276092ac39b10d3efb5856a54","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    instance extra specs. The entries in the list will be separated by commas"},{"line_number":7,"context_line":"    without white space. Each entry will comprise of an instance type extra"},{"line_number":8,"context_line":"    spec key followed by and equals \"\u003d\" followed by a value (\u003ckey\u003e\u003d\u003cvalue\u003e)."},{"line_number":9,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":19,"id":"ba63e191_4b70e372","line":9,"in_reply_to":"ba63e191_6a41250b","updated":"2016-01-19 14:25:41.000000000","message":"Done","commit_id":"f5b494a42dd0c514f768099d38fe3c355ff138a4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"772cc404398863e1a6b3e750b7ce4e8ea0bbb258","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    instance extra specs. The entries in the list will be separated by commas"},{"line_number":7,"context_line":"    without white space. Each entry will comprise of an instance type extra"},{"line_number":8,"context_line":"    spec key followed by an equals \"\u003d\" followed by a value (\u003ckey\u003e\u003d\u003cvalue\u003e)."},{"line_number":9,"context_line":"    Documentation can be find in doc folder (doc/source/filter_scheduler.rst)."}],"source_content_type":"text/x-yaml","patch_set":24,"id":"ba63e191_e9a64e52","line":9,"updated":"2016-01-20 09:21:00.000000000","message":"This doc available online: http://docs.openstack.org/developer/nova/filter_scheduler.html","commit_id":"7d2c5147af476f6f4bc8031e7045e83907c0b6d6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"21e4d2e1366afa31e187630fb9d12ba66810a73a","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    instance extra specs. The entries in the list will be separated by commas"},{"line_number":7,"context_line":"    without white space. Each entry will comprise of an instance type extra"},{"line_number":8,"context_line":"    spec key followed by an equals \"\u003d\" followed by a value (\u003ckey\u003e\u003d\u003cvalue\u003e)."},{"line_number":9,"context_line":"    Documentation can be find in doc folder (doc/source/filter_scheduler.rst)."}],"source_content_type":"text/x-yaml","patch_set":24,"id":"ba63e191_2727adcb","line":9,"in_reply_to":"ba63e191_e9a64e52","updated":"2016-01-20 09:57:00.000000000","message":"Done","commit_id":"7d2c5147af476f6f4bc8031e7045e83907c0b6d6"}]}
