)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"51c9a40daa1ae1a8ca409a4eb4262ecd7de46faa","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Ib64a1348cce1dca995746214616c4f33d9d664bd"},{"line_number":23,"context_line":"Signed-off-by: Stephen Finucane \u003csfinucan@redhat.com\u003e"},{"line_number":24,"context_line":"Depends-on: https://review.opendev.org/704642"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa7e38b_ecd9bf80","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":45},"updated":"2020-02-10 20:02:31.000000000","message":"this is merged, can be removed next time you respin","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"958b04242acf4dab53565be5a21d435c75bad542","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Ib64a1348cce1dca995746214616c4f33d9d664bd"},{"line_number":23,"context_line":"Signed-off-by: Stephen Finucane \u003csfinucan@redhat.com\u003e"},{"line_number":24,"context_line":"Depends-on: https://review.opendev.org/704642"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa7e38b_a42433c5","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":45},"in_reply_to":"3fa7e38b_6c9aaf12","updated":"2020-02-11 13:14:09.000000000","message":"Done","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"48940db7093c337bb949b1616f2e60503466b1b0","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Ib64a1348cce1dca995746214616c4f33d9d664bd"},{"line_number":23,"context_line":"Signed-off-by: Stephen Finucane \u003csfinucan@redhat.com\u003e"},{"line_number":24,"context_line":"Depends-on: https://review.opendev.org/704642"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa7e38b_6c9aaf12","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":45},"in_reply_to":"3fa7e38b_ecd9bf80","updated":"2020-02-10 20:59:29.000000000","message":"oh thats for dataclasses support.","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"73dcae9f6c648d0e1558a5357ff935b1b00fabb0","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"- Use dataclasses to describe extra spec parameters and values, rather"},{"line_number":12,"context_line":"  than dicts"},{"line_number":13,"context_line":"- Fix existing, now-broken tests and add new ones"},{"line_number":14,"context_line":"- Wire up the API microversions and new parameter"},{"line_number":15,"context_line":"- Add a release notes"},{"line_number":16,"context_line":"- Triple check to see if we\u0027re missing an extra specs (!!!)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3fa7e38b_84aed02e","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":49},"updated":"2020-02-11 18:17:09.000000000","message":"Just got new ones to add now :) Existing ones are all green","commit_id":"e20a450fd85eccc8d3ae7754c34e9daa19f34977"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46ee20ebf3ea31494dbbb51e057ff87f6542bdac","unresolved":false,"context_lines":[{"line_number":10,"context_line":"the definitions for every extra spec we currently recognize in-tree."},{"line_number":11,"context_line":"None of this is currently used since we don\u0027t have the API microversions"},{"line_number":12,"context_line":"wired up, but that will come in a future patch."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Part of blueprint flavor-extra-spec-validators"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: Ib64a1348cce1dca995746214616c4f33d9d664bd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"df33271e_694bd4af","line":13,"updated":"2020-04-06 10:07:56.000000000","message":"Here, you should at least explain why you now want to ignore H238 PEP8 check.","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2071fce7d534bdf578859170ca3118dc7babef23","unresolved":false,"context_lines":[{"line_number":10,"context_line":"the definitions for every extra spec we currently recognize in-tree."},{"line_number":11,"context_line":"None of this is currently used since we don\u0027t have the API microversions"},{"line_number":12,"context_line":"wired up, but that will come in a future patch."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Part of blueprint flavor-extra-spec-validators"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: Ib64a1348cce1dca995746214616c4f33d9d664bd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"df33271e_d1e0c299","line":13,"in_reply_to":"df33271e_694bd4af","updated":"2020-04-06 16:19:40.000000000","message":"Done","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"92feb64157ecaecc371a208c5d17632304737a39","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: Ib64a1348cce1dca995746214616c4f33d9d664bd"},{"line_number":22,"context_line":"Signed-off-by: Stephen Finucane \u003csfinucan@redhat.com\u003e"},{"line_number":23,"context_line":"Depends-On: https://review.opendev.org/707223"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"df33271e_b49215f5","line":23,"updated":"2020-04-08 11:59:08.000000000","message":"I\u0027m not sure we need this now as tempest does not use extra speces from known namespaces","commit_id":"64ea3c4a1685d5cc124243a50793425002061c09"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"29f2de90d88e00819537326002900618d8abfdab","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: Ib64a1348cce1dca995746214616c4f33d9d664bd"},{"line_number":22,"context_line":"Signed-off-by: Stephen Finucane \u003csfinucan@redhat.com\u003e"},{"line_number":23,"context_line":"Depends-On: https://review.opendev.org/707223"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"df33271e_173e63d9","line":23,"in_reply_to":"df33271e_b49215f5","updated":"2020-04-08 12:47:23.000000000","message":"Done","commit_id":"64ea3c4a1685d5cc124243a50793425002061c09"}],"doc/source/user/filter-scheduler.rst":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46ee20ebf3ea31494dbbb51e057ff87f6542bdac","unresolved":false,"context_lines":[{"line_number":376,"context_line":"via the ``nova.api.extra_spec_validator`` `entrypoint`__."},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"The module containing your custom filter(s) must be packaged and available in"},{"line_number":379,"context_line":"the same environment(s) that the nova controllers, or specifically the"},{"line_number":380,"context_line":":program:`nova-scheduler` and :program:`nova-api` services, are available in."},{"line_number":381,"context_line":"As an example, consider the following sample package, which is the `minimal"},{"line_number":382,"context_line":"structure`__ for a standard, setuptools-based Python package:"}],"source_content_type":"text/x-rst","patch_set":21,"id":"df33271e_49e5300a","line":379,"range":{"start_line":379,"start_character":33,"end_line":379,"end_character":49},"updated":"2020-04-06 10:07:56.000000000","message":"just a nit : a \"nova controller\" is not something supported by the nova project, just by downstream products or operators.\nSince you provided the needed services using the above, I\u0027m fine.","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46ee20ebf3ea31494dbbb51e057ff87f6542bdac","unresolved":false,"context_lines":[{"line_number":386,"context_line":""},{"line_number":387,"context_line":".. code-block:: none"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    acmefilter/"},{"line_number":390,"context_line":"        acmefilter/"},{"line_number":391,"context_line":"            __init__.py"},{"line_number":392,"context_line":"            validators.py"}],"source_content_type":"text/x-rst","patch_set":21,"id":"df33271e_29cb8c72","line":389,"updated":"2020-04-06 10:07:56.000000000","message":"nit: not sure why you wanted to change the package name but okay.","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2d48338dfece22f781c1458428ac7014a7d55d0a","unresolved":false,"context_lines":[{"line_number":386,"context_line":""},{"line_number":387,"context_line":".. code-block:: none"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    acmefilter/"},{"line_number":390,"context_line":"        acmefilter/"},{"line_number":391,"context_line":"            __init__.py"},{"line_number":392,"context_line":"            validators.py"}],"source_content_type":"text/x-rst","patch_set":21,"id":"df33271e_9c3ad895","line":389,"in_reply_to":"df33271e_29cb8c72","updated":"2020-04-06 12:29:32.000000000","message":"+1","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9415337863ccabbb1d413aea4d9a1824b1e6a075","unresolved":false,"context_lines":[{"line_number":437,"context_line":"``setup.py`` contains:"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":".. code-block:: python"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"    from setuptools import setup"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"    setup("},{"line_number":444,"context_line":"        name\u003d\u0027acmefilter\u0027,"},{"line_number":445,"context_line":"        version\u003d\u00270.1\u0027,"},{"line_number":446,"context_line":"        description\u003d\u0027My custom filter\u0027,"},{"line_number":447,"context_line":"        packages\u003d["},{"line_number":448,"context_line":"            \u0027acmefilter\u0027"},{"line_number":449,"context_line":"        ],"},{"line_number":450,"context_line":"        entry_points\u003d{"},{"line_number":451,"context_line":"            \u0027nova.api.extra_spec_validators\u0027: ["},{"line_number":452,"context_line":"                \u0027acme \u003d acmefilter.validators\u0027,"},{"line_number":453,"context_line":"            ],"},{"line_number":454,"context_line":"        },"},{"line_number":455,"context_line":"    )"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"To enable this, you would set the following in :file:`nova.conf`:"},{"line_number":458,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"df33271e_1a6c0807","line":455,"range":{"start_line":440,"start_character":0,"end_line":455,"end_character":5},"updated":"2020-04-06 12:34:53.000000000","message":"we should probably prefer doing this the setup.cfg way\n\nit is the more stable interface for doing this.\nsetup.py has brokent the compatiblity of the setup function before so i dont really like using it if it can be done via setup.cfg","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46ee20ebf3ea31494dbbb51e057ff87f6542bdac","unresolved":false,"context_lines":[{"line_number":453,"context_line":"            ],"},{"line_number":454,"context_line":"        },"},{"line_number":455,"context_line":"    )"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"To enable this, you would set the following in :file:`nova.conf`:"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":".. code-block:: ini"}],"source_content_type":"text/x-rst","patch_set":21,"id":"df33271e_09b5e8ee","line":456,"updated":"2020-04-06 10:07:56.000000000","message":"thanks for this","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b2844b816f8315997d2812847dd9eae444cc5c44","unresolved":false,"context_lines":[{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        return validators"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"``setup.py`` contains:"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":".. code-block:: python"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"    from setuptools import setup"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"    setup("},{"line_number":444,"context_line":"        name\u003d\u0027acmefilter\u0027,"},{"line_number":445,"context_line":"        version\u003d\u00270.1\u0027,"},{"line_number":446,"context_line":"        description\u003d\u0027My custom filter\u0027,"},{"line_number":447,"context_line":"        packages\u003d["},{"line_number":448,"context_line":"            \u0027acmefilter\u0027"},{"line_number":449,"context_line":"        ],"},{"line_number":450,"context_line":"        entry_points\u003d{"},{"line_number":451,"context_line":"            \u0027nova.api.extra_spec_validators\u0027: ["},{"line_number":452,"context_line":"                \u0027acme \u003d acmefilter.validators\u0027,"},{"line_number":453,"context_line":"            ],"},{"line_number":454,"context_line":"        },"},{"line_number":455,"context_line":"    )"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"To enable this, you would set the following in :file:`nova.conf`:"},{"line_number":458,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"df33271e_5f983969","line":455,"range":{"start_line":437,"start_character":1,"end_line":455,"end_character":5},"updated":"2020-04-06 17:35:23.000000000","message":"nit if you have time in a follow up can you show how to do this with setup.cfg instead or add it as a second example.","commit_id":"64ea3c4a1685d5cc124243a50793425002061c09"}],"nova/api/openstack/compute/flavors_extraspecs.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46ee20ebf3ea31494dbbb51e057ff87f6542bdac","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        flavor \u003d common.get_flavor(context, flavor_id)"},{"line_number":35,"context_line":"        return dict(extra_specs\u003dflavor.extra_specs)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _check_extra_specs_value(self, req, specs):"},{"line_number":38,"context_line":"        # TODO(stephenfin): Wire this up to check the API microversion"},{"line_number":39,"context_line":"        validation_supported \u003d False"},{"line_number":40,"context_line":"        validation_mode \u003d \u0027strict\u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"df33271e_a98ddc32","line":37,"range":{"start_line":37,"start_character":39,"end_line":37,"end_character":43},"updated":"2020-04-06 10:07:56.000000000","message":"i don\u0027t see where and why you need to use this argument ?\n\nLATER : Ahah, I see, you need it in a later change (see below). It\u0027s a bit confusing but OK.","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46ee20ebf3ea31494dbbb51e057ff87f6542bdac","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _check_extra_specs_value(self, req, specs):"},{"line_number":38,"context_line":"        # TODO(stephenfin): Wire this up to check the API microversion"},{"line_number":39,"context_line":"        validation_supported \u003d False"},{"line_number":40,"context_line":"        validation_mode \u003d \u0027strict\u0027"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        for name, value in specs.items():"}],"source_content_type":"text/x-python","patch_set":21,"id":"df33271e_691d94bc","line":39,"updated":"2020-04-06 10:07:56.000000000","message":"NOTE(sbauza): For the moment, this change won\u0027t support the validation until https://review.opendev.org/#/c/708436/16/nova/api/openstack/compute/flavors_extraspecs.py in a later change","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46ee20ebf3ea31494dbbb51e057ff87f6542bdac","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        context.can(fes_policies.POLICY_ROOT % \u0027create\u0027)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        specs \u003d body[\u0027extra_specs\u0027]"},{"line_number":75,"context_line":"        self._check_extra_specs_value(req, specs)"},{"line_number":76,"context_line":"        flavor \u003d common.get_flavor(context, flavor_id)"},{"line_number":77,"context_line":"        try:"},{"line_number":78,"context_line":"            flavor.extra_specs \u003d dict(flavor.extra_specs, **specs)"}],"source_content_type":"text/x-python","patch_set":21,"id":"df33271e_29d6ecc4","line":75,"updated":"2020-04-06 10:07:56.000000000","message":"changing it seems a bit premature, but that\u0027s just a stylistic nit.","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"}],"nova/api/validation/extra_specs/base.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@dataclasses.dataclass"},{"line_number":23,"context_line":"class ExtraSpecValidator():"},{"line_number":24,"context_line":"    name: str"},{"line_number":25,"context_line":"    description: str"},{"line_number":26,"context_line":"    value: Dict[str, Any]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_21c30e3b","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":27},"updated":"2020-01-29 14:09:03.000000000","message":"Isn\u0027t it\n\n    class ExtraSpecValidator:","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1b1f953b47d79f1f6d2bb303a101f3da417576b2","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@dataclasses.dataclass"},{"line_number":23,"context_line":"class ExtraSpecValidator():"},{"line_number":24,"context_line":"    name: str"},{"line_number":25,"context_line":"    description: str"},{"line_number":26,"context_line":"    value: Dict[str, Any]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_f9460a22","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":27},"in_reply_to":"3fa7e38b_21c30e3b","updated":"2020-01-29 14:55:06.000000000","message":"Oh, so it is. Still getting used to this Python 3 stuff :D","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"440af53994a5a5b244b94e61f315f6e9702bb4b0","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@dataclasses.dataclass"},{"line_number":23,"context_line":"class ExtraSpecValidator():"},{"line_number":24,"context_line":"    name: str"},{"line_number":25,"context_line":"    description: str"},{"line_number":26,"context_line":"    value: Dict[str, Any]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_d8a9bd26","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":27},"in_reply_to":"3fa7e38b_d93b0e33","updated":"2020-01-30 09:24:02.000000000","message":"yeah either ExtraSpecValidator(object): or ExtraSpecValidator:","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@dataclasses.dataclass"},{"line_number":23,"context_line":"class ExtraSpecValidator():"},{"line_number":24,"context_line":"    name: str"},{"line_number":25,"context_line":"    description: str"},{"line_number":26,"context_line":"    value: Dict[str, Any]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_d93b0e33","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":27},"in_reply_to":"3fa7e38b_f9460a22","updated":"2020-01-29 15:02:03.000000000","message":"well technically if this was python 2 you should have\n ExtraSpecValidator(object) right to make it inheit form the \"new\" type objects\n\nin python3 only \nclass ExtraSpecValidator: might be fine i have not used data classes so dont know what that class decorator changes.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"440af53994a5a5b244b94e61f315f6e9702bb4b0","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    description: str"},{"line_number":26,"context_line":"    value: Dict[str, Any]"},{"line_number":27,"context_line":"    deprecated: bool \u003d False"},{"line_number":28,"context_line":"    parameters: List[Dict[str, Any]] \u003d dataclasses.field(default_factory\u003dlist)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    _name_regex: str \u003d None"},{"line_number":31,"context_line":"    _value_regex: str \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_134f366a","line":28,"updated":"2020-01-30 09:24:02.000000000","message":"An unrelated observation: dataclasses with defaulted fields does not support inheritance. I learned that the hard way recently. https://gist.github.com/gibizer/af7fb55e2f34708c400d96bb9a65368d","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    _value_regex: str \u003d None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @property"},{"line_number":34,"context_line":"    def name_regex(self):"},{"line_number":35,"context_line":"        if not self._name_regex:"},{"line_number":36,"context_line":"            name_regex \u003d self.name"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e1b896c1","line":34,"updated":"2020-01-29 14:09:03.000000000","message":"This feels like a property with lazy loading behavior that does some level of validation as well during the load. This feels overly complex to me. I would do the initialization of the object with __init__ instead","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                pattern \u003d None"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"                if param[\u0027type\u0027] \u003d\u003d int:"},{"line_number":43,"context_line":"                    pattern \u003d r\u0027\\\\d+\u0027"},{"line_number":44,"context_line":"                elif param[\u0027type\u0027] \u003d\u003d str:"},{"line_number":45,"context_line":"                    pattern \u003d param.get(\u0027pattern\u0027) or r\u0027\\\\w+\u0027"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_41ebaa0f","line":43,"range":{"start_line":43,"start_character":30,"end_line":43,"end_character":34},"updated":"2020-01-29 14:09:03.000000000","message":"Doe we need both double blackslash and raw string? I think r\u0027\\d+\u0027 or \u0027\\\\d+\u0027 is what you want","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1b1f953b47d79f1f6d2bb303a101f3da417576b2","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                pattern \u003d None"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"                if param[\u0027type\u0027] \u003d\u003d int:"},{"line_number":43,"context_line":"                    pattern \u003d r\u0027\\\\d+\u0027"},{"line_number":44,"context_line":"                elif param[\u0027type\u0027] \u003d\u003d str:"},{"line_number":45,"context_line":"                    pattern \u003d param.get(\u0027pattern\u0027) or r\u0027\\\\w+\u0027"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_b9fad2b7","line":43,"range":{"start_line":43,"start_character":30,"end_line":43,"end_character":34},"in_reply_to":"3fa7e38b_41ebaa0f","updated":"2020-01-29 14:55:06.000000000","message":"I thought so too, but Python told me I was wrong and docs [1] pointed me to this. It\u0027s the use of re.sub below that\u0027s problematic.\n\n[1] https://bugs.python.org/issue34304","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"440af53994a5a5b244b94e61f315f6e9702bb4b0","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                pattern \u003d None"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"                if param[\u0027type\u0027] \u003d\u003d int:"},{"line_number":43,"context_line":"                    pattern \u003d r\u0027\\\\d+\u0027"},{"line_number":44,"context_line":"                elif param[\u0027type\u0027] \u003d\u003d str:"},{"line_number":45,"context_line":"                    pattern \u003d param.get(\u0027pattern\u0027) or r\u0027\\\\w+\u0027"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_f86b59eb","line":43,"range":{"start_line":43,"start_character":30,"end_line":43,"end_character":34},"in_reply_to":"3fa7e38b_b9fad2b7","updated":"2020-01-30 09:24:02.000000000","message":"Python 3.7.6 (default, Jan 19 2020, 22:34:52) \n[GCC 9.2.1 20200117] on linux\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n\u003e\u003e\u003e import re\n\u003e\u003e\u003e re.match(r\u0027\\d+\u0027, \u0027123\u0027)\n\u003cre.Match object; span\u003d(0, 3), match\u003d\u0027123\u0027\u003e\n\u003e\u003e\u003e re.match(r\u0027\\\\d+\u0027, \u0027123\u0027)\n\u003e\u003e\u003e re.sub(r\u0027\\\\d+\u0027, \u0027!\u0027, \u0027123\u0027)\n\u0027123\u0027\n\u003e\u003e\u003e re.sub(r\u0027\\d+\u0027, \u0027!\u0027, \u0027123\u0027)\n\u0027!\u0027\n\u003e\u003e\u003e\n\nIsn\u0027t difference that you copy this pattern into and f\u0027 string? I\u0027m puzzled but I accept that if it works like this then it works like this :)","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2b763962afdd88ac49be18c878bc1a060cc425ff","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                pattern \u003d None"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"                if param[\u0027type\u0027] \u003d\u003d int:"},{"line_number":43,"context_line":"                    pattern \u003d r\u0027\\\\d+\u0027"},{"line_number":44,"context_line":"                elif param[\u0027type\u0027] \u003d\u003d str:"},{"line_number":45,"context_line":"                    pattern \u003d param.get(\u0027pattern\u0027) or r\u0027\\\\w+\u0027"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_04366750","line":43,"range":{"start_line":43,"start_character":30,"end_line":43,"end_character":34},"in_reply_to":"3fa7e38b_f86b59eb","updated":"2020-02-11 11:58:18.000000000","message":"Turns out this worked in Python 3.6 but not in 3.7 or 3.8 (hence the currently failing unit tests). I switched to \u0027string.replace\u0027 since I didn\u0027t need the regex magic \u0027re.sub\u0027 provided, which lets me drop this double escaping madness","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                if not pattern:"},{"line_number":48,"context_line":"                    raise ValueError(\u0027Unsupported parameter type\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"                pattern \u003d f\u0027(?P\u003c{param[\"name\"]}\u003e{pattern})\u0027"},{"line_number":51,"context_line":"                name_regex \u003d re.sub(f\u0027{{{param[\"name\"]}}}\u0027, pattern, self.name)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"            self._name_regex \u003d name_regex"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_81ec4292","line":51,"range":{"start_line":50,"start_character":1,"end_line":51,"end_character":79},"updated":"2020-01-29 14:09:03.000000000","message":"I\u0027m lost here, I guess I need to play with this code to get it.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"440af53994a5a5b244b94e61f315f6e9702bb4b0","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                if not pattern:"},{"line_number":48,"context_line":"                    raise ValueError(\u0027Unsupported parameter type\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"                pattern \u003d f\u0027(?P\u003c{param[\"name\"]}\u003e{pattern})\u0027"},{"line_number":51,"context_line":"                name_regex \u003d re.sub(f\u0027{{{param[\"name\"]}}}\u0027, pattern, self.name)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"            self._name_regex \u003d name_regex"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_b3118253","line":51,"range":{"start_line":50,"start_character":1,"end_line":51,"end_character":79},"in_reply_to":"3fa7e38b_79b8dae6","updated":"2020-01-30 09:24:02.000000000","message":"thanks. so we add a named group for each substitutable param.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1b1f953b47d79f1f6d2bb303a101f3da417576b2","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                if not pattern:"},{"line_number":48,"context_line":"                    raise ValueError(\u0027Unsupported parameter type\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"                pattern \u003d f\u0027(?P\u003c{param[\"name\"]}\u003e{pattern})\u0027"},{"line_number":51,"context_line":"                name_regex \u003d re.sub(f\u0027{{{param[\"name\"]}}}\u0027, pattern, self.name)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"            self._name_regex \u003d name_regex"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_79b8dae6","line":51,"range":{"start_line":50,"start_character":1,"end_line":51,"end_character":79},"in_reply_to":"3fa7e38b_81ec4292","updated":"2020-01-29 14:55:06.000000000","message":"I clearly need comments but, in summary, given:\n\n    base.ExtraSpecValidator(\n        name\u003d\u0027hw:numa_cpu.{id}\u0027,\n        ...\n        parameters\u003d[\n            {\n                \u0027name\u0027: \u0027id\u0027,\n                \u0027type\u0027: int,\n                \u0027description\u0027: \u0027The ID of the **guest** NUMA node.\u0027,\n            },\n        ],\n        ...\n    ),\n\nThis will transform \u0027hw:numa_cpu.{id}\u0027 to \u0027hw:numa_cpu.(?P\u003cid\u003e\\d+)\u0027 by substituting \u0027{id}\u0027 with \u0027(?P\u003cid\u003e\\d+)\u0027. Putting this complexity here seemed better than having to write a regex for every extra spec name and value definition.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        return self._value_regex"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def validate(self, value):"},{"line_number":84,"context_line":"        # TODO(stephenfin): Use (and handle) a custom exception type"},{"line_number":85,"context_line":"        if not re.match(self.value_regex, value):"},{"line_number":86,"context_line":"            raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_21fb0e48","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":16},"updated":"2020-01-29 14:09:03.000000000","message":"What do we gain by using dataclasses? Having an action on the dataclass feels a bit strange to me.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1b1f953b47d79f1f6d2bb303a101f3da417576b2","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        return self._value_regex"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def validate(self, value):"},{"line_number":84,"context_line":"        # TODO(stephenfin): Use (and handle) a custom exception type"},{"line_number":85,"context_line":"        if not re.match(self.value_regex, value):"},{"line_number":86,"context_line":"            raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_799d3a6a","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":16},"in_reply_to":"3fa7e38b_21fb0e48","updated":"2020-01-29 14:55:06.000000000","message":"I can\u0027t use dicts because I want these actions. I could use a plain old class but since there\u0027s not a lot of complicated logic here, this seems like a good use of dataclasses.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"440af53994a5a5b244b94e61f315f6e9702bb4b0","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        return self._value_regex"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def validate(self, value):"},{"line_number":84,"context_line":"        # TODO(stephenfin): Use (and handle) a custom exception type"},{"line_number":85,"context_line":"        if not re.match(self.value_regex, value):"},{"line_number":86,"context_line":"            raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_5345ae49","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":16},"in_reply_to":"3fa7e38b_799d3a6a","updated":"2020-01-30 09:24:02.000000000","message":"I guess we have different thresholds. The lazy loading name_regex property and the validate function makes this a non pure data class for me. But this is just matter of style so I won\u0027t push it.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f2cdd638b611a24f1f20bcc9664b8afbe0490b7","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import dataclasses"},{"line_number":16,"context_line":"import re"},{"line_number":17,"context_line":"from typing import Any, List, Dict"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from nova import exception"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_c5a7914f","line":17,"updated":"2020-02-25 11:39:12.000000000","message":"doesn\u0027t pep8 cry because of multiple import per line?","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8238529e06d539a0493a137c5b4ae444f82eeae4","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import dataclasses"},{"line_number":16,"context_line":"import re"},{"line_number":17,"context_line":"from typing import Any, List, Dict"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from nova import exception"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_e7a07ea8","line":17,"in_reply_to":"1fa4df85_c5a7914f","updated":"2020-02-25 11:58:57.000000000","message":"No, this is an exception (like oslo.i18n). I\u0027ve taken to doing\n\n  import typing as ty\n\nelsewhere though so can update this to do the same","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fc80b5f665011218a3a857cfffbe82904b97b55","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import dataclasses"},{"line_number":16,"context_line":"import re"},{"line_number":17,"context_line":"from typing import Any, List, Dict"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from nova import exception"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_eddccb47","line":17,"in_reply_to":"1fa4df85_e7a07ea8","updated":"2020-02-26 10:28:05.000000000","message":"both works for me, I just did not know that this was an exception.","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f2cdd638b611a24f1f20bcc9664b8afbe0490b7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            if param[\u0027type\u0027] \u003d\u003d int:"},{"line_number":43,"context_line":"                pattern \u003d r\u0027-?\\d+\u0027"},{"line_number":44,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d float:"},{"line_number":45,"context_line":"                pattern \u003d r\u0027\\d+\\.\\d+\u0027"},{"line_number":46,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d str:"},{"line_number":47,"context_line":"                pattern \u003d param.get(\u0027pattern\u0027) or r\u0027\\w+\u0027"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_e523adbd","line":45,"updated":"2020-02-25 11:39:12.000000000","message":"the followings are not floats according to this regex: \n1 \n1.\n.1\n-1.0\n3.870892419913343e+20\n\nI\u0027m not sure if we need to support all the formats, but -1.0 is definitely missing. The rest needs to be documented to not be supported.\n\nBtw, do we need to support floats in keys?","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1c2c61921c73133b203fd516901683b0853f2e03","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            if param[\u0027type\u0027] \u003d\u003d int:"},{"line_number":43,"context_line":"                pattern \u003d r\u0027-?\\d+\u0027"},{"line_number":44,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d float:"},{"line_number":45,"context_line":"                pattern \u003d r\u0027\\d+\\.\\d+\u0027"},{"line_number":46,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d str:"},{"line_number":47,"context_line":"                pattern \u003d param.get(\u0027pattern\u0027) or r\u0027\\w+\u0027"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_2884115e","line":45,"in_reply_to":"1fa4df85_0d892722","updated":"2020-02-26 11:07:52.000000000","message":"Okay, I\u0027ve moved this to the PowerVM case. We can move it back in the future if necessary.","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fc80b5f665011218a3a857cfffbe82904b97b55","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            if param[\u0027type\u0027] \u003d\u003d int:"},{"line_number":43,"context_line":"                pattern \u003d r\u0027-?\\d+\u0027"},{"line_number":44,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d float:"},{"line_number":45,"context_line":"                pattern \u003d r\u0027\\d+\\.\\d+\u0027"},{"line_number":46,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d str:"},{"line_number":47,"context_line":"                pattern \u003d param.get(\u0027pattern\u0027) or r\u0027\\w+\u0027"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_0d892722","line":45,"in_reply_to":"1fa4df85_c78782d7","updated":"2020-02-26 10:28:05.000000000","message":"Floats are tricky so if we can limit them to power VM then there we can easily say that we only support a subset of the floats that is enough for the power VM case. So I guess moving this to powerVM only would be a good thing. I would also accept to keep it global but have a thick documentation what format of floats we support.","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8238529e06d539a0493a137c5b4ae444f82eeae4","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            if param[\u0027type\u0027] \u003d\u003d int:"},{"line_number":43,"context_line":"                pattern \u003d r\u0027-?\\d+\u0027"},{"line_number":44,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d float:"},{"line_number":45,"context_line":"                pattern \u003d r\u0027\\d+\\.\\d+\u0027"},{"line_number":46,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d str:"},{"line_number":47,"context_line":"                pattern \u003d param.get(\u0027pattern\u0027) or r\u0027\\w+\u0027"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_c78782d7","line":45,"in_reply_to":"1fa4df85_e523adbd","updated":"2020-02-25 11:58:57.000000000","message":"\u003e the followings are not floats according to this regex:\n \u003e 1\n \u003e 1.\n \u003e .1\n \u003e -1.0\n \u003e 3.870892419913343e+20\n \u003e \n \u003e I\u0027m not sure if we need to support all the formats, but -1.0 is\n \u003e definitely missing. The rest needs to be documented to not be\n \u003e supported.\n\nGood point. Done.\n\n \u003e Btw, do we need to support floats in keys?\n\nYeah, just for the PowerVM case at the moment. Maybe I\u0027d be better off defining a pattern for those particular keys?","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f2cdd638b611a24f1f20bcc9664b8afbe0490b7","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d float:"},{"line_number":45,"context_line":"                pattern \u003d r\u0027\\d+\\.\\d+\u0027"},{"line_number":46,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d str:"},{"line_number":47,"context_line":"                pattern \u003d param.get(\u0027pattern\u0027) or r\u0027\\w+\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"            if not pattern:"},{"line_number":50,"context_line":"                raise ValueError("}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_050a8925","line":47,"range":{"start_line":47,"start_character":50,"end_line":47,"end_character":56},"updated":"2020-02-25 11:39:12.000000000","message":"So is it a rule that we only allow letters, numbers and underscore in a string?","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8238529e06d539a0493a137c5b4ae444f82eeae4","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d float:"},{"line_number":45,"context_line":"                pattern \u003d r\u0027\\d+\\.\\d+\u0027"},{"line_number":46,"context_line":"            elif param[\u0027type\u0027] \u003d\u003d str:"},{"line_number":47,"context_line":"                pattern \u003d param.get(\u0027pattern\u0027) or r\u0027\\w+\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"            if not pattern:"},{"line_number":50,"context_line":"                raise ValueError("}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_a7aa8682","line":47,"range":{"start_line":47,"start_character":50,"end_line":47,"end_character":56},"in_reply_to":"1fa4df85_050a8925","updated":"2020-02-25 11:58:57.000000000","message":"Hmm, good point. Probably should be \u0027.*\u0027. Will update","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f2cdd638b611a24f1f20bcc9664b8afbe0490b7","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        value_regex \u003d None"},{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d float:"},{"line_number":65,"context_line":"            value_regex \u003d r\u0027\\d+\\.\\d+\u0027"},{"line_number":66,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_2038d3d1","line":63,"updated":"2020-02-25 11:39:12.000000000","message":"\u0027-\u0027 is missing here but added above. Should we extract a type - regexp mapping instead of duplicating these regexps?","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8238529e06d539a0493a137c5b4ae444f82eeae4","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        value_regex \u003d None"},{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d float:"},{"line_number":65,"context_line":"            value_regex \u003d r\u0027\\d+\\.\\d+\u0027"},{"line_number":66,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_0767da4f","line":63,"in_reply_to":"1fa4df85_2038d3d1","updated":"2020-02-25 11:58:57.000000000","message":"Done","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f2cdd638b611a24f1f20bcc9664b8afbe0490b7","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d float:"},{"line_number":65,"context_line":"            value_regex \u003d r\u0027\\d+\\.\\d+\u0027"},{"line_number":66,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":67,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":68,"context_line":"            # strict mode"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_00403735","line":65,"updated":"2020-02-25 11:39:12.000000000","message":"float format issues as above","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8238529e06d539a0493a137c5b4ae444f82eeae4","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d float:"},{"line_number":65,"context_line":"            value_regex \u003d r\u0027\\d+\\.\\d+\u0027"},{"line_number":66,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":67,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":68,"context_line":"            # strict mode"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_a75b6685","line":65,"in_reply_to":"1fa4df85_00403735","updated":"2020-02-25 11:58:57.000000000","message":"Done","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f2cdd638b611a24f1f20bcc9664b8afbe0490b7","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":67,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":68,"context_line":"            # strict mode"},{"line_number":69,"context_line":"            value_regex \u003d r\u0027(?i)(t|true|f|false|y|yes|n|no|1|0)\u0027"},{"line_number":70,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d str:"},{"line_number":71,"context_line":"            if self.value.get(\u0027pattern\u0027):"},{"line_number":72,"context_line":"                value_regex \u003d self.value[\u0027pattern\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_e05f1b0c","line":69,"range":{"start_line":69,"start_character":29,"end_line":69,"end_character":31},"updated":"2020-02-25 11:39:12.000000000","message":"not to myself: this means ignorecase","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b5173bc9e7003177d203b5a14c7e263f307d0cc6","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                f\"but got \u0027{name}\u0027.\""},{"line_number":108,"context_line":"            )"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        # TODO(stephenfin): Use (and handle) a custom exception type."},{"line_number":111,"context_line":"        value_match \u003d re.fullmatch(self.value_regex, value)"},{"line_number":112,"context_line":"        if not value_match:"},{"line_number":113,"context_line":"            if self.value[\u0027type\u0027] \u003d\u003d int:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_274f76be","line":110,"updated":"2020-02-25 11:59:36.000000000","message":"@gibi: Any suggestions on what I should use here? Perhaps what I have is good enough?","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fc80b5f665011218a3a857cfffbe82904b97b55","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                f\"but got \u0027{name}\u0027.\""},{"line_number":108,"context_line":"            )"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        # TODO(stephenfin): Use (and handle) a custom exception type."},{"line_number":111,"context_line":"        value_match \u003d re.fullmatch(self.value_regex, value)"},{"line_number":112,"context_line":"        if not value_match:"},{"line_number":113,"context_line":"            if self.value[\u0027type\u0027] \u003d\u003d int:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_edb12be3","line":110,"in_reply_to":"1fa4df85_274f76be","updated":"2020-02-26 10:28:05.000000000","message":"For me ValidationError is good enough for now.","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2833d5e4aa0180e09ced27b44ea7d296c55d5001","unresolved":false,"context_lines":[{"line_number":30,"context_line":"@dataclasses.dataclass"},{"line_number":31,"context_line":"class ExtraSpecValidator:"},{"line_number":32,"context_line":"    name: str"},{"line_number":33,"context_line":"    description: str"},{"line_number":34,"context_line":"    value: ty.Dict[str, ty.Any]"},{"line_number":35,"context_line":"    deprecated: bool \u003d False"},{"line_number":36,"context_line":"    parameters: ty.List[ty.Dict[str, ty.Any]] \u003d dataclasses.field("}],"source_content_type":"text/x-python","patch_set":12,"id":"1fa4df85_6d021bb7","line":33,"range":{"start_line":33,"start_character":4,"end_line":33,"end_character":20},"updated":"2020-02-26 10:21:39.000000000","message":"just a question, are we going to serialize those to API or file? I just feel we put the \u0027description\u0027 and \u0027deprecated\u0027 into the class, sounds like it is useful for serialization.","commit_id":"66d7922dbfc7bccea3c0f175fa303a0bd48d034b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1c2c61921c73133b203fd516901683b0853f2e03","unresolved":false,"context_lines":[{"line_number":30,"context_line":"@dataclasses.dataclass"},{"line_number":31,"context_line":"class ExtraSpecValidator:"},{"line_number":32,"context_line":"    name: str"},{"line_number":33,"context_line":"    description: str"},{"line_number":34,"context_line":"    value: ty.Dict[str, ty.Any]"},{"line_number":35,"context_line":"    deprecated: bool \u003d False"},{"line_number":36,"context_line":"    parameters: ty.List[ty.Dict[str, ty.Any]] \u003d dataclasses.field("}],"source_content_type":"text/x-python","patch_set":12,"id":"1fa4df85_287651a6","line":33,"range":{"start_line":33,"start_character":4,"end_line":33,"end_character":20},"in_reply_to":"1fa4df85_6d021bb7","updated":"2020-02-26 11:07:52.000000000","message":"Yes, I was to produce a Sphinx extension to automatically document this for us so I want it to be somewhat machine readable","commit_id":"66d7922dbfc7bccea3c0f175fa303a0bd48d034b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"61d6b210cf28a6c187ff8ad2d74d5fcf9800fd48","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        # ...and do the same for the value"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        value_regex \u003d None"},{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":65,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":66,"context_line":"            # strict mode"}],"source_content_type":"text/x-python","patch_set":14,"id":"1fa4df85_b5833acc","line":63,"range":{"start_line":62,"start_character":8,"end_line":63,"end_character":32},"updated":"2020-03-02 13:49:47.000000000","message":"I appreciate the desire to reuse the regex validator, but since we\u0027re doing this in python now, why not just\n\n try:\n     int(value)\n except ValueError:\n     # invalid","commit_id":"6a28c82ffa8716ad2966716c3c666d81e32772e7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"778c2b10539b66f073b7c89fb446961d397e1d30","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        value_regex \u003d None"},{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":65,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":66,"context_line":"            # strict mode"}],"source_content_type":"text/x-python","patch_set":14,"id":"1fa4df85_e23b3fe8","line":63,"range":{"start_line":63,"start_character":26,"end_line":63,"end_character":32},"updated":"2020-03-02 09:39:12.000000000","message":"negative numbers are still not accepted here but accepted above for the keys.","commit_id":"6a28c82ffa8716ad2966716c3c666d81e32772e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f27b3d70ca6c37e6ee414708e9b88ba6a206b5d6","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        # ...and do the same for the value"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        value_regex \u003d None"},{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":65,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":66,"context_line":"            # strict mode"}],"source_content_type":"text/x-python","patch_set":14,"id":"1fa4df85_8b2cb102","line":63,"range":{"start_line":62,"start_character":8,"end_line":63,"end_character":32},"in_reply_to":"1fa4df85_0b99a1c2","updated":"2020-03-04 18:07:53.000000000","message":"You\u0027re parsing these as strings, though.\n\n ----\u003e 1 int(\u00270.786\u0027)\n\n ValueError: invalid literal for int() with base 10: \u00270.786\u0027","commit_id":"6a28c82ffa8716ad2966716c3c666d81e32772e7"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f2577bca7c936fd7afe9050c40f01bdf8ae27a0","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        # ...and do the same for the value"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        value_regex \u003d None"},{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":65,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":66,"context_line":"            # strict mode"}],"source_content_type":"text/x-python","patch_set":14,"id":"1fa4df85_f8e3a732","line":63,"range":{"start_line":62,"start_character":8,"end_line":63,"end_character":32},"in_reply_to":"1fa4df85_2f5edb11","updated":"2020-03-05 15:10:55.000000000","message":"Okay, that\u0027s fair. I\u0027ve switched to the int format and also started using \u0027oslo_utils.strutils.bool_from_string\u0027 for booleans. lmk if it works for you","commit_id":"6a28c82ffa8716ad2966716c3c666d81e32772e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d36b9c248d934228216416132c04e701cb770245","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        # ...and do the same for the value"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        value_regex \u003d None"},{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":65,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":66,"context_line":"            # strict mode"}],"source_content_type":"text/x-python","patch_set":14,"id":"1fa4df85_2f5edb11","line":63,"range":{"start_line":62,"start_character":8,"end_line":63,"end_character":32},"in_reply_to":"1fa4df85_6cc4e191","updated":"2020-03-05 12:26:44.000000000","message":"It means you\u0027re not reinventing the wheel. int() already knows how to parse for integers.\n\n\u003e the other stuff with regexes\n\nI didn\u0027t go look at everything (this is just a drive-by response to something I happened to notice from my email feed) but IMO we should be taking every opportunity to reuse parsing/validation that already exists rather than rolling our own regex. Is a value an IP address? A URL? Please don\u0027t try to write regexes for those.\n\n(NB: when we were considering the yaml-driven design, funneling everything through regex arguably made a bit more sense.)","commit_id":"6a28c82ffa8716ad2966716c3c666d81e32772e7"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6acf48880a94877f4b89632a228897fc21daebe3","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        # ...and do the same for the value"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        value_regex \u003d None"},{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":65,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":66,"context_line":"            # strict mode"}],"source_content_type":"text/x-python","patch_set":14,"id":"1fa4df85_6cc4e191","line":63,"range":{"start_line":62,"start_character":8,"end_line":63,"end_character":32},"in_reply_to":"1fa4df85_8b2cb102","updated":"2020-03-05 11:31:26.000000000","message":"Oh, TIL.\n\nWith that said, we\u0027re doing the other stuff with regexes so it seems nice to be able to do that consistently, no? idk, I can switch but I\u0027m not sure what it gives us","commit_id":"6a28c82ffa8716ad2966716c3c666d81e32772e7"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e5ab99d02420790f4ae9664f950b2fd16a655ca5","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        # ...and do the same for the value"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        value_regex \u003d None"},{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":65,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":66,"context_line":"            # strict mode"}],"source_content_type":"text/x-python","patch_set":14,"id":"1fa4df85_0b99a1c2","line":63,"range":{"start_line":62,"start_character":8,"end_line":63,"end_character":32},"in_reply_to":"1fa4df85_b5833acc","updated":"2020-03-04 17:43:12.000000000","message":"I could, but then I\u0027ll allow things like 0.786. I\u0027m not aware of anywhere where I\u0027m using this format in extra specs where a non-whole number is desirable/allowed.","commit_id":"6a28c82ffa8716ad2966716c3c666d81e32772e7"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"16d7afa9bf5f7c6045867b2581ec52d6d0adb405","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        value_regex \u003d None"},{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":65,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":66,"context_line":"            # strict mode"}],"source_content_type":"text/x-python","patch_set":14,"id":"1fa4df85_1d859a5a","line":63,"range":{"start_line":63,"start_character":26,"end_line":63,"end_character":32},"in_reply_to":"1fa4df85_e23b3fe8","updated":"2020-03-02 09:52:42.000000000","message":"Damn it. Fixed","commit_id":"6a28c82ffa8716ad2966716c3c666d81e32772e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ad4003f8df2896bebdc7c3878d151d792bfee548","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        # ...and do the same for the value"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        value_regex \u003d None"},{"line_number":62,"context_line":"        if self.value[\u0027type\u0027] \u003d\u003d int:"},{"line_number":63,"context_line":"            value_regex \u003d r\u0027\\d+\u0027"},{"line_number":64,"context_line":"        elif self.value[\u0027type\u0027] \u003d\u003d bool:"},{"line_number":65,"context_line":"            # mimic the behavior of oslo_utils.strutils.bool_from_string in"},{"line_number":66,"context_line":"            # strict mode"}],"source_content_type":"text/x-python","patch_set":14,"id":"1fa4df85_58499b2e","line":63,"range":{"start_line":62,"start_character":8,"end_line":63,"end_character":32},"in_reply_to":"1fa4df85_f8e3a732","updated":"2020-03-05 15:13:55.000000000","message":"Yeah, nice.","commit_id":"6a28c82ffa8716ad2966716c3c666d81e32772e7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7ac49bfd293f68b2104cefe12836beb320f1e436","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"@dataclasses.dataclass"},{"line_number":25,"context_line":"class ExtraSpecValidator:"},{"line_number":26,"context_line":"    name: str"},{"line_number":27,"context_line":"    description: str"},{"line_number":28,"context_line":"    value: ty.Dict[str, ty.Any]"}],"source_content_type":"text/x-python","patch_set":21,"id":"df33271e_dc38e03e","line":25,"updated":"2020-04-06 10:26:28.000000000","message":"tbc, this ignored PEP check comes from https://docs.python.org/3/library/dataclasses.html","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46ee20ebf3ea31494dbbb51e057ff87f6542bdac","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _validate_str(self, value):"},{"line_number":63,"context_line":"        if \u0027pattern\u0027 in self.value:"},{"line_number":64,"context_line":"            value_match \u003d re.fullmatch(self.value_regex, value)"},{"line_number":65,"context_line":"            if not value_match:"},{"line_number":66,"context_line":"                raise exception.ValidationError("},{"line_number":67,"context_line":"                    f\"Validation failed; \u0027{value}\u0027 is not of the format \""}],"source_content_type":"text/x-python","patch_set":21,"id":"df33271e_3c110c55","line":64,"updated":"2020-04-06 10:07:56.000000000","message":"I\u0027d have preferred that you compiled the regex value once when initting it, and caching this instead of calling N times the same .fullmatch() module method.\n\nThis being said, fortunately the re package does caching so there is not a huge performance hit by doing this, but I just feel we avoid a bit of unnecessary function calls\n\nhttps://docs.python.org/3/howto/regex.html#module-level-functions","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2d48338dfece22f781c1458428ac7014a7d55d0a","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _validate_str(self, value):"},{"line_number":63,"context_line":"        if \u0027pattern\u0027 in self.value:"},{"line_number":64,"context_line":"            value_match \u003d re.fullmatch(self.value_regex, value)"},{"line_number":65,"context_line":"            if not value_match:"},{"line_number":66,"context_line":"                raise exception.ValidationError("},{"line_number":67,"context_line":"                    f\"Validation failed; \u0027{value}\u0027 is not of the format \""}],"source_content_type":"text/x-python","patch_set":21,"id":"df33271e_fcca049f","line":64,"in_reply_to":"df33271e_3c110c55","updated":"2020-04-06 12:29:32.000000000","message":"FWIW, I prefer the simplicity of this approach here, rather than us trying to implement our own caching.","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"}],"nova/api/validation/extra_specs/capabilities.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f2cdd638b611a24f1f20bcc9664b8afbe0490b7","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"EXTRA_SPEC_VALIDATORS \u003d []"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"# non-nested capabilities (from \u0027nova.objects.compute_node.ComputeNode\u0027 and"},{"line_number":56,"context_line":"# nova.scheduler.host_manager.HostState\u0027)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"for capability in ("},{"line_number":59,"context_line":"    \u0027id\u0027, \u0027uuid\u0027, \u0027service_id\u0027, \u0027host\u0027, \u0027vcpus\u0027, \u0027memory_mb\u0027, \u0027local_gb\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_4d917652","line":56,"range":{"start_line":55,"start_character":0,"end_line":56,"end_character":41},"updated":"2020-02-25 11:39:12.000000000","message":"nit: I would mark the two lists with their respective sources directly below","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"}],"nova/api/validation/extra_specs/hw.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5a67fc520628fcc27083640f94eee3128a0efb3","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":23,"context_line":"    # CPU realtime flags"},{"line_number":24,"context_line":"    base.ExtraSpecValidator("},{"line_number":25,"context_line":"        name\u003d\u0027hw:cpu_realtime\u0027,"},{"line_number":26,"context_line":"        description\u003d("}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_0ab39836","line":23,"updated":"2020-01-28 17:57:29.000000000","message":"I think I\u0027ll split this into multiple lists and just merge them later","commit_id":"58d85e4868f384737fe6a2462968c8aebeeccfc1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5a67fc520628fcc27083640f94eee3128a0efb3","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        ),"},{"line_number":30,"context_line":"        value\u003d{"},{"line_number":31,"context_line":"            \u0027type\u0027: bool,"},{"line_number":32,"context_line":"            \u0027description\u0027: \u0027Whether realtime is enabled or not.\u0027,"},{"line_number":33,"context_line":"        },"},{"line_number":34,"context_line":"    ),"},{"line_number":35,"context_line":"    base.ExtraSpecValidator("}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_cad10058","line":32,"updated":"2020-01-28 17:57:29.000000000","message":"I\u0027m going to remove most of these because they almost almost duplicate what\u0027s in \u0027description\u0027 of the parent (data)class","commit_id":"58d85e4868f384737fe6a2462968c8aebeeccfc1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5a67fc520628fcc27083640f94eee3128a0efb3","unresolved":false,"context_lines":[{"line_number":323,"context_line":"]"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"def register(validators: List[base.ExtraSpecValidator]):"},{"line_number":327,"context_line":"    return validators.extend(EXTRA_SPEC_VALIDATORS)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_ca36e0b3","line":326,"updated":"2020-01-28 17:57:29.000000000","message":"This is kind of unnecessary, but I didn\u0027t like the look of doing this in the \u0027validators\u0027 module","commit_id":"58d85e4868f384737fe6a2462968c8aebeeccfc1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        ),"},{"line_number":30,"context_line":"        value\u003d{"},{"line_number":31,"context_line":"            \u0027type\u0027: bool,"},{"line_number":32,"context_line":"            \u0027description\u0027: \u0027Whether realtime is enabled or not.\u0027,"},{"line_number":33,"context_line":"        },"},{"line_number":34,"context_line":"    ),"},{"line_number":35,"context_line":"    base.ExtraSpecValidator("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_eccded5a","line":32,"range":{"start_line":32,"start_character":28,"end_line":32,"end_character":62},"updated":"2020-01-29 15:02:03.000000000","message":"this feels a little weired.\n\n\"whether realtime priority should be enabled\"\nmight be better.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        ),"},{"line_number":30,"context_line":"        value\u003d{"},{"line_number":31,"context_line":"            \u0027type\u0027: bool,"},{"line_number":32,"context_line":"            \u0027description\u0027: \u0027Whether realtime is enabled or not.\u0027,"},{"line_number":33,"context_line":"        },"},{"line_number":34,"context_line":"    ),"},{"line_number":35,"context_line":"    base.ExtraSpecValidator("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_0b1a9e7f","line":32,"range":{"start_line":32,"start_character":28,"end_line":32,"end_character":62},"in_reply_to":"3fa7e38b_eccded5a","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        ),"},{"line_number":40,"context_line":"        value\u003d{"},{"line_number":41,"context_line":"            \u0027type\u0027: str,"},{"line_number":42,"context_line":"            # NOTE(stephenfin): Yes, these things *have* to start with \u0027^\u0027"},{"line_number":43,"context_line":"            \u0027pattern\u0027: r\u0027\\^\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":44,"context_line":"        },"},{"line_number":45,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_61302655","line":42,"updated":"2020-01-29 14:09:03.000000000","message":"do you mean every regex will start with \u0027^\u0027 ? If yes then we can even add that automatically.\nI\u0027m a bit confused as you use re.match in the impl there I don\u0027t think we need \u0027^\u0027 as re.match always tries to match the whole string (in contrast with re.search)\n\n// later\n\nI see now, \u0027^\u0027 is not the regexp string-start token but the expected input should start with the char ^. facepalm. :D","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        ),"},{"line_number":40,"context_line":"        value\u003d{"},{"line_number":41,"context_line":"            \u0027type\u0027: str,"},{"line_number":42,"context_line":"            # NOTE(stephenfin): Yes, these things *have* to start with \u0027^\u0027"},{"line_number":43,"context_line":"            \u0027pattern\u0027: r\u0027\\^\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":44,"context_line":"        },"},{"line_number":45,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_7980da49","line":42,"in_reply_to":"3fa7e38b_61302655","updated":"2020-01-29 15:02:03.000000000","message":"i would prefer us not to add things to the regex automaticaly it makes figure out what going on harder as it add to the mental load","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        ),"},{"line_number":40,"context_line":"        value\u003d{"},{"line_number":41,"context_line":"            \u0027type\u0027: str,"},{"line_number":42,"context_line":"            # NOTE(stephenfin): Yes, these things *have* to start with \u0027^\u0027"},{"line_number":43,"context_line":"            \u0027pattern\u0027: r\u0027\\^\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":44,"context_line":"        },"},{"line_number":45,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_ef6f1c90","line":42,"in_reply_to":"3fa7e38b_7980da49","updated":"2020-01-30 13:13:40.000000000","message":"\u003e i would prefer us not to add things to the regex automaticaly it\n \u003e makes figure out what going on harder as it add to the mental load\n\nnot an issue since as gibi notes we don\u0027t need to add anything here - the caret is needed by this particular extra spec","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        value\u003d{"},{"line_number":41,"context_line":"            \u0027type\u0027: str,"},{"line_number":42,"context_line":"            # NOTE(stephenfin): Yes, these things *have* to start with \u0027^\u0027"},{"line_number":43,"context_line":"            \u0027pattern\u0027: r\u0027\\^\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":44,"context_line":"        },"},{"line_number":45,"context_line":"    ),"},{"line_number":46,"context_line":"    # CPU policy flags"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e114169b","line":43,"updated":"2020-01-29 14:09:03.000000000","message":"If we have pattern the that is also means we expect a string so adding \u0027type\u0027: str here is a bit redundant.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"440af53994a5a5b244b94e61f315f6e9702bb4b0","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        value\u003d{"},{"line_number":41,"context_line":"            \u0027type\u0027: str,"},{"line_number":42,"context_line":"            # NOTE(stephenfin): Yes, these things *have* to start with \u0027^\u0027"},{"line_number":43,"context_line":"            \u0027pattern\u0027: r\u0027\\^\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":44,"context_line":"        },"},{"line_number":45,"context_line":"    ),"},{"line_number":46,"context_line":"    # CPU policy flags"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_f38cda82","line":43,"in_reply_to":"3fa7e38b_999a76c1","updated":"2020-01-30 09:24:02.000000000","message":"I slept on this and I revert my statement. If we want to allow an unrestricted string as value then having a \u0027.*\u0027 worst than having type: str","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4e38b8667b024c97987231503446992dcce9b297","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        value\u003d{"},{"line_number":41,"context_line":"            \u0027type\u0027: str,"},{"line_number":42,"context_line":"            # NOTE(stephenfin): Yes, these things *have* to start with \u0027^\u0027"},{"line_number":43,"context_line":"            \u0027pattern\u0027: r\u0027\\^\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":44,"context_line":"        },"},{"line_number":45,"context_line":"    ),"},{"line_number":46,"context_line":"    # CPU policy flags"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_999a76c1","line":43,"in_reply_to":"3fa7e38b_e114169b","updated":"2020-01-29 14:40:19.000000000","message":"It is, but I guess I wanted to be explicit. TBH, I could just use regex\u0027s for everything but that didn\u0027t seem very approachable. Need to think on this one","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            \u0027type\u0027: str,"},{"line_number":42,"context_line":"            # NOTE(stephenfin): Yes, these things *have* to start with \u0027^\u0027"},{"line_number":43,"context_line":"            \u0027pattern\u0027: r\u0027\\^\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":44,"context_line":"        },"},{"line_number":45,"context_line":"    ),"},{"line_number":46,"context_line":"    # CPU policy flags"},{"line_number":47,"context_line":"    base.ExtraSpecValidator("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_47ae5aa1","line":44,"updated":"2020-01-29 14:09:03.000000000","message":"I\u0027ve noticed that the top level config is based on kwargs while the second level is based on a dict syntax. I can accept his as a small inconvenience. But then I realized that we will have another way to specify these via a yaml file. And that yaml file syntax will not have this inconvenience. So why not we are using yaml files for the in tree validators as well?","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4e38b8667b024c97987231503446992dcce9b297","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            \u0027type\u0027: str,"},{"line_number":42,"context_line":"            # NOTE(stephenfin): Yes, these things *have* to start with \u0027^\u0027"},{"line_number":43,"context_line":"            \u0027pattern\u0027: r\u0027\\^\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":44,"context_line":"        },"},{"line_number":45,"context_line":"    ),"},{"line_number":46,"context_line":"    # CPU policy flags"},{"line_number":47,"context_line":"    base.ExtraSpecValidator("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_f93ccac0","line":44,"in_reply_to":"3fa7e38b_47ae5aa1","updated":"2020-01-29 14:40:19.000000000","message":"I\u0027m planning to switch from dict to a dataclass but just haven\u0027t had time to do it yet. Initially these were all dicts before I started cleaning things up","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            \u0027type\u0027: str,"},{"line_number":42,"context_line":"            # NOTE(stephenfin): Yes, these things *have* to start with \u0027^\u0027"},{"line_number":43,"context_line":"            \u0027pattern\u0027: r\u0027\\^\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":44,"context_line":"        },"},{"line_number":45,"context_line":"    ),"},{"line_number":46,"context_line":"    # CPU policy flags"},{"line_number":47,"context_line":"    base.ExtraSpecValidator("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_7933fac4","line":44,"in_reply_to":"3fa7e38b_47ae5aa1","updated":"2020-01-29 15:02:03.000000000","message":"i personally hate the idea of doing this in yaml but could live it it.\n\nif we are going to drive this via data files i think we shoudl not do this and instead factor the glance metadefs out into a shared lib and reuse the code they already have which includes validation logic and the ablity to define key value paris across multiple namepaces for image, flavors, volume, host aggreates and i think some thing else.\n\nthey already have a rest api to expose this and it is consomued by horizon and heat to auto generate uis and do validation.\n\nso if we are going a file based route then i think it does not make sense to defien our own incompatele file format or reimplement that code and we should instead work with glance to create a comon lib that we can both share because we are really just reinventing the wheel here. the stevador extentions and python based implemation where the two things that i though where an impovement over what glace already does today.\n\nif we remove both i dont think this is a better approch. we could do automaitc docs generation form the metadefs too.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"440af53994a5a5b244b94e61f315f6e9702bb4b0","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            \u0027type\u0027: str,"},{"line_number":42,"context_line":"            # NOTE(stephenfin): Yes, these things *have* to start with \u0027^\u0027"},{"line_number":43,"context_line":"            \u0027pattern\u0027: r\u0027\\^\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":44,"context_line":"        },"},{"line_number":45,"context_line":"    ),"},{"line_number":46,"context_line":"    # CPU policy flags"},{"line_number":47,"context_line":"    base.ExtraSpecValidator("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_b386625f","line":44,"in_reply_to":"3fa7e38b_f93ccac0","updated":"2020-01-30 09:24:02.000000000","message":"Cool. I\u0027m OK with a consisten kwargs syntax","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        value\u003d{"},{"line_number":57,"context_line":"            \u0027type\u0027: str,"},{"line_number":58,"context_line":"            \u0027description\u0027: \u0027The CPU policy.\u0027,"},{"line_number":59,"context_line":"            \u0027enum\u0027: ["},{"line_number":60,"context_line":"                \u0027dedicated\u0027,"},{"line_number":61,"context_line":"                \u0027shared\u0027"},{"line_number":62,"context_line":"            ],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_815e8276","line":59,"updated":"2020-01-29 14:09:03.000000000","message":"ditto enum values already define that the type is string","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        value\u003d{"},{"line_number":111,"context_line":"            \u0027type\u0027: str,"},{"line_number":112,"context_line":"            \u0027description\u0027: \u0027The size of memory page to allocate\u0027,"},{"line_number":113,"context_line":"            \u0027pattern\u0027: r\u0027(large|small|any|\\d+(G|M|K)B\u0027,"},{"line_number":114,"context_line":"        },"},{"line_number":115,"context_line":"    ),"},{"line_number":116,"context_line":"    # NUMA topology flags"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_ac1375b6","line":113,"range":{"start_line":113,"start_character":44,"end_line":113,"end_character":53},"updated":"2020-01-29 15:02:03.000000000","message":"this regex is not correct.\nwhen its a digit the unit sufix is optional and there cannot be any trailing or leading spaces.\n\nwe parse this with sting_to)bytes\nhttps://github.com/openstack/nova/blob/cc0e1950a0679321a207011f327f79a147cf3758/nova/virt/hardware.py#L1350-L1351\n\nusign it to conver the number into an integre number of KiBs\nusing the IEC defintions where MB is base 2 not base 10\n The units supported are\n        Kb(it), Kib(it), Mb(it), Mib(it), Gb(it), Gib(it), Tb(it), Tib(it), KB, KiB, MB, MiB, GB, GiB, TB, TiB\n\nhttps://github.com/openstack/oslo.utils/blob/44c7c0c0e6265568d3f01a91f087d853064adfdd/oslo_utils/strutils.py#L174-L185\n\nso this regex shoudl actully be\n(large|small|any|^\\d+([kKMGT]i?)?(b|bit|B)?$)","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        value\u003d{"},{"line_number":111,"context_line":"            \u0027type\u0027: str,"},{"line_number":112,"context_line":"            \u0027description\u0027: \u0027The size of memory page to allocate\u0027,"},{"line_number":113,"context_line":"            \u0027pattern\u0027: r\u0027(large|small|any|\\d+(G|M|K)B\u0027,"},{"line_number":114,"context_line":"        },"},{"line_number":115,"context_line":"    ),"},{"line_number":116,"context_line":"    # NUMA topology flags"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_f9191b8b","line":113,"range":{"start_line":113,"start_character":44,"end_line":113,"end_character":53},"in_reply_to":"3fa7e38b_ac1375b6","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            },"},{"line_number":144,"context_line":"        ],"},{"line_number":145,"context_line":"        value\u003d{"},{"line_number":146,"context_line":"            \u0027type\u0027: str,"},{"line_number":147,"context_line":"            \u0027description\u0027: ("},{"line_number":148,"context_line":"                \u0027The guest CPUs, in the form of a CPU map, to allocate to the \u0027"},{"line_number":149,"context_line":"                \u0027guest NUMA node identified by ``{id}``.\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_8c2d59af","line":146,"range":{"start_line":146,"start_character":20,"end_line":146,"end_character":23},"updated":"2020-01-29 15:02:03.000000000","message":"int\n\nthis is not a mask/list like the realtime mask","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"377f4b738d75cbf475a15721f5f3e1363164e23e","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            },"},{"line_number":144,"context_line":"        ],"},{"line_number":145,"context_line":"        value\u003d{"},{"line_number":146,"context_line":"            \u0027type\u0027: str,"},{"line_number":147,"context_line":"            \u0027description\u0027: ("},{"line_number":148,"context_line":"                \u0027The guest CPUs, in the form of a CPU map, to allocate to the \u0027"},{"line_number":149,"context_line":"                \u0027guest NUMA node identified by ``{id}``.\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_1ef8a47b","line":146,"range":{"start_line":146,"start_character":20,"end_line":146,"end_character":23},"in_reply_to":"3fa7e38b_8c2d59af","updated":"2020-01-29 21:37:41.000000000","message":"actully as you pointed out on the spec this actully correct\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/juno/implemented/virt-driver-numa-placement.html","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        value\u003d{"},{"line_number":146,"context_line":"            \u0027type\u0027: str,"},{"line_number":147,"context_line":"            \u0027description\u0027: ("},{"line_number":148,"context_line":"                \u0027The guest CPUs, in the form of a CPU map, to allocate to the \u0027"},{"line_number":149,"context_line":"                \u0027guest NUMA node identified by ``{id}``.\u0027"},{"line_number":150,"context_line":"            ),"},{"line_number":151,"context_line":"            \u0027pattern\u0027: r\u0027\\^?\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":152,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_4c33e112","line":149,"range":{"start_line":148,"start_character":16,"end_line":149,"end_character":57},"updated":"2020-01-29 15:02:03.000000000","message":"the number of gust cpus to emulate on guest the NUMA node\nidentified by ``{id}``.\u0027","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                \u0027The guest CPUs, in the form of a CPU map, to allocate to the \u0027"},{"line_number":149,"context_line":"                \u0027guest NUMA node identified by ``{id}``.\u0027"},{"line_number":150,"context_line":"            ),"},{"line_number":151,"context_line":"            \u0027pattern\u0027: r\u0027\\^?\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":152,"context_line":"        },"},{"line_number":153,"context_line":"    ),"},{"line_number":154,"context_line":"    base.ExtraSpecValidator("},{"line_number":155,"context_line":"        name\u003d\u0027hw:numa_mem.{id}\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_6c36dd03","line":152,"range":{"start_line":151,"start_character":11,"end_line":152,"end_character":10},"updated":"2020-01-29 15:02:03.000000000","message":"remove","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"377f4b738d75cbf475a15721f5f3e1363164e23e","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                \u0027The guest CPUs, in the form of a CPU map, to allocate to the \u0027"},{"line_number":149,"context_line":"                \u0027guest NUMA node identified by ``{id}``.\u0027"},{"line_number":150,"context_line":"            ),"},{"line_number":151,"context_line":"            \u0027pattern\u0027: r\u0027\\^?\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":152,"context_line":"        },"},{"line_number":153,"context_line":"    ),"},{"line_number":154,"context_line":"    base.ExtraSpecValidator("},{"line_number":155,"context_line":"        name\u003d\u0027hw:numa_mem.{id}\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_3efb207a","line":152,"range":{"start_line":151,"start_character":11,"end_line":152,"end_character":10},"in_reply_to":"3fa7e38b_6c36dd03","updated":"2020-01-29 21:37:41.000000000","message":"as above this is correct.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        value\u003d{"},{"line_number":170,"context_line":"            \u0027type\u0027: int,"},{"line_number":171,"context_line":"            \u0027description\u0027: ("},{"line_number":172,"context_line":"                \u0027The guest memory, in MB, to allocate to the guest NUMA node \u0027"},{"line_number":173,"context_line":"                \u0027identified by ``{id}``.\u0027"},{"line_number":174,"context_line":"            ),"},{"line_number":175,"context_line":"            \u0027min\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_2c054515","line":172,"range":{"start_line":172,"start_character":45,"end_line":172,"end_character":53},"updated":"2020-01-29 15:02:03.000000000","message":"here an below i would avoid using the term allocate as in teh cpu toplogy case it could be confused with cpu pinning","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        value\u003d{"},{"line_number":170,"context_line":"            \u0027type\u0027: int,"},{"line_number":171,"context_line":"            \u0027description\u0027: ("},{"line_number":172,"context_line":"                \u0027The guest memory, in MB, to allocate to the guest NUMA node \u0027"},{"line_number":173,"context_line":"                \u0027identified by ``{id}``.\u0027"},{"line_number":174,"context_line":"            ),"},{"line_number":175,"context_line":"            \u0027min\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_190c3743","line":172,"range":{"start_line":172,"start_character":45,"end_line":172,"end_character":53},"in_reply_to":"3fa7e38b_2c054515","updated":"2020-01-30 13:13:40.000000000","message":"Left as-is because I couldn\u0027t think of anything better. Let me know if you have something.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    base.ExtraSpecValidator("},{"line_number":191,"context_line":"        name\u003d\u0027hw:cpu_cores\u0027,"},{"line_number":192,"context_line":"        description\u003d("},{"line_number":193,"context_line":"            \u0027The number of CPU cores to allocate to the virtual CPU \u0027"},{"line_number":194,"context_line":"            \u0027topology of the guest.\u0027"},{"line_number":195,"context_line":"        ),"},{"line_number":196,"context_line":"        value\u003d{"},{"line_number":197,"context_line":"            \u0027type\u0027: int,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_073862d1","line":194,"range":{"start_line":193,"start_character":7,"end_line":194,"end_character":36},"updated":"2020-01-29 15:02:03.000000000","message":"this one in partacalr could be misunderstood as being related to cpu pinning.\n\ni would repharse as \n\u0027The number of virtual CPU  to emulate per socket in the\ngust cpu toplology.\u0027","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    base.ExtraSpecValidator("},{"line_number":191,"context_line":"        name\u003d\u0027hw:cpu_cores\u0027,"},{"line_number":192,"context_line":"        description\u003d("},{"line_number":193,"context_line":"            \u0027The number of CPU cores to allocate to the virtual CPU \u0027"},{"line_number":194,"context_line":"            \u0027topology of the guest.\u0027"},{"line_number":195,"context_line":"        ),"},{"line_number":196,"context_line":"        value\u003d{"},{"line_number":197,"context_line":"            \u0027type\u0027: int,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_0b313eef","line":194,"range":{"start_line":193,"start_character":7,"end_line":194,"end_character":36},"in_reply_to":"3fa7e38b_073862d1","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        ),"},{"line_number":196,"context_line":"        value\u003d{"},{"line_number":197,"context_line":"            \u0027type\u0027: int,"},{"line_number":198,"context_line":"            \u0027description\u0027: \u0027A number of CPU cores to assign\u0027,"},{"line_number":199,"context_line":"            \u0027min\u0027: 1,"},{"line_number":200,"context_line":"        },"},{"line_number":201,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_8749b266","line":198,"range":{"start_line":198,"start_character":53,"end_line":198,"end_character":59},"updated":"2020-01-29 15:02:03.000000000","message":"again assign could be miss interpreted.\n\n\u0027The number of virtual CPU cores per virtual cpu socket\u0027,","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        ),"},{"line_number":196,"context_line":"        value\u003d{"},{"line_number":197,"context_line":"            \u0027type\u0027: int,"},{"line_number":198,"context_line":"            \u0027description\u0027: \u0027A number of CPU cores to assign\u0027,"},{"line_number":199,"context_line":"            \u0027min\u0027: 1,"},{"line_number":200,"context_line":"        },"},{"line_number":201,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_4b1f365a","line":198,"range":{"start_line":198,"start_character":53,"end_line":198,"end_character":59},"in_reply_to":"3fa7e38b_8749b266","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    base.ExtraSpecValidator("},{"line_number":203,"context_line":"        name\u003d\u0027hw:cpu_threads\u0027,"},{"line_number":204,"context_line":"        description\u003d("},{"line_number":205,"context_line":"            \u0027The number of CPU threads to allocate to the virtual CPU \u0027"},{"line_number":206,"context_line":"            \u0027topology of the guest.\u0027"},{"line_number":207,"context_line":"        ),"},{"line_number":208,"context_line":"        value\u003d{"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_67527613","line":205,"range":{"start_line":205,"start_character":42,"end_line":205,"end_character":50},"updated":"2020-01-29 15:02:03.000000000","message":"as above avoid allocate ill skip point this out for the other cases.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    base.ExtraSpecValidator("},{"line_number":203,"context_line":"        name\u003d\u0027hw:cpu_threads\u0027,"},{"line_number":204,"context_line":"        description\u003d("},{"line_number":205,"context_line":"            \u0027The number of CPU threads to allocate to the virtual CPU \u0027"},{"line_number":206,"context_line":"            \u0027topology of the guest.\u0027"},{"line_number":207,"context_line":"        ),"},{"line_number":208,"context_line":"        value\u003d{"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_ab2d8a91","line":205,"range":{"start_line":205,"start_character":42,"end_line":205,"end_character":50},"in_reply_to":"3fa7e38b_67527613","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        name\u003d\u0027hw:max_cpu_sockets\u0027,"},{"line_number":216,"context_line":"        description\u003d("},{"line_number":217,"context_line":"            \u0027The max number of CPU sockets to allocate to the virtual CPU \u0027"},{"line_number":218,"context_line":"            \u0027topology of the guest.\u0027"},{"line_number":219,"context_line":"        ),"},{"line_number":220,"context_line":"        value\u003d{"},{"line_number":221,"context_line":"            \u0027type\u0027: int,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_47689aba","line":218,"range":{"start_line":218,"start_character":28,"end_line":218,"end_character":34},"updated":"2020-01-29 15:02:03.000000000","message":"guest. This is use to limit the toplogies that can be requested by an image and will be used to validate the hw_cpu_sockets image property.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        name\u003d\u0027hw:max_cpu_sockets\u0027,"},{"line_number":216,"context_line":"        description\u003d("},{"line_number":217,"context_line":"            \u0027The max number of CPU sockets to allocate to the virtual CPU \u0027"},{"line_number":218,"context_line":"            \u0027topology of the guest.\u0027"},{"line_number":219,"context_line":"        ),"},{"line_number":220,"context_line":"        value\u003d{"},{"line_number":221,"context_line":"            \u0027type\u0027: int,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_cb3fa6b0","line":218,"range":{"start_line":218,"start_character":28,"end_line":218,"end_character":34},"in_reply_to":"3fa7e38b_47689aba","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            \u0027min\u0027: 1,"},{"line_number":224,"context_line":"        },"},{"line_number":225,"context_line":"    ),"},{"line_number":226,"context_line":"    base.ExtraSpecValidator("},{"line_number":227,"context_line":"        name\u003d\u0027hw:max_cpu_cores\u0027,"},{"line_number":228,"context_line":"        description\u003d("},{"line_number":229,"context_line":"            \u0027The max number of CPU cores to allocate to the virtual CPU \u0027"},{"line_number":230,"context_line":"            \u0027topology of the guest.\u0027"},{"line_number":231,"context_line":"        ),"},{"line_number":232,"context_line":"        value\u003d{"},{"line_number":233,"context_line":"            \u0027type\u0027: int,"},{"line_number":234,"context_line":"            \u0027description\u0027: \u0027A maximum number of CPU cores to assign\u0027,"},{"line_number":235,"context_line":"            \u0027min\u0027: 1,"},{"line_number":236,"context_line":"        },"},{"line_number":237,"context_line":"    ),"},{"line_number":238,"context_line":"    base.ExtraSpecValidator("},{"line_number":239,"context_line":"        name\u003d\u0027hw:max_cpu_threads\u0027,"},{"line_number":240,"context_line":"        description\u003d("},{"line_number":241,"context_line":"            \u0027The max number of CPU threads to allocate to the virtual CPU \u0027"},{"line_number":242,"context_line":"            \u0027topology of the guest.\u0027"},{"line_number":243,"context_line":"        ),"},{"line_number":244,"context_line":"        value\u003d{"},{"line_number":245,"context_line":"            \u0027type\u0027: int,"},{"line_number":246,"context_line":"            \u0027description\u0027: \u0027A maximum number of CPU threads to assign\u0027,"},{"line_number":247,"context_line":"            \u0027min\u0027: 1,"},{"line_number":248,"context_line":"        },"},{"line_number":249,"context_line":"    ),"},{"line_number":250,"context_line":"    # misc feature flags"},{"line_number":251,"context_line":"    base.ExtraSpecValidator("},{"line_number":252,"context_line":"        name\u003d\u0027hw:boot_memu\u0027,"},{"line_number":253,"context_line":"        description\u003d("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e7abc6d0","line":250,"range":{"start_line":226,"start_character":4,"end_line":250,"end_character":24},"updated":"2020-01-29 15:02:03.000000000","message":"note the that this is used mainly to limit the toplogies that can be requested by the image.\n\nit is also technically used when we generate and sort the toplogies we generate by default.\n\nhttps://github.com/openstack/nova/blob/cc0e1950a0679321a207011f327f79a147cf3758/nova/virt/hardware.py#L451-L495\n\nif we are documenting there existene we proably shoudl explain how they are intended to be used.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            \u0027min\u0027: 1,"},{"line_number":224,"context_line":"        },"},{"line_number":225,"context_line":"    ),"},{"line_number":226,"context_line":"    base.ExtraSpecValidator("},{"line_number":227,"context_line":"        name\u003d\u0027hw:max_cpu_cores\u0027,"},{"line_number":228,"context_line":"        description\u003d("},{"line_number":229,"context_line":"            \u0027The max number of CPU cores to allocate to the virtual CPU \u0027"},{"line_number":230,"context_line":"            \u0027topology of the guest.\u0027"},{"line_number":231,"context_line":"        ),"},{"line_number":232,"context_line":"        value\u003d{"},{"line_number":233,"context_line":"            \u0027type\u0027: int,"},{"line_number":234,"context_line":"            \u0027description\u0027: \u0027A maximum number of CPU cores to assign\u0027,"},{"line_number":235,"context_line":"            \u0027min\u0027: 1,"},{"line_number":236,"context_line":"        },"},{"line_number":237,"context_line":"    ),"},{"line_number":238,"context_line":"    base.ExtraSpecValidator("},{"line_number":239,"context_line":"        name\u003d\u0027hw:max_cpu_threads\u0027,"},{"line_number":240,"context_line":"        description\u003d("},{"line_number":241,"context_line":"            \u0027The max number of CPU threads to allocate to the virtual CPU \u0027"},{"line_number":242,"context_line":"            \u0027topology of the guest.\u0027"},{"line_number":243,"context_line":"        ),"},{"line_number":244,"context_line":"        value\u003d{"},{"line_number":245,"context_line":"            \u0027type\u0027: int,"},{"line_number":246,"context_line":"            \u0027description\u0027: \u0027A maximum number of CPU threads to assign\u0027,"},{"line_number":247,"context_line":"            \u0027min\u0027: 1,"},{"line_number":248,"context_line":"        },"},{"line_number":249,"context_line":"    ),"},{"line_number":250,"context_line":"    # misc feature flags"},{"line_number":251,"context_line":"    base.ExtraSpecValidator("},{"line_number":252,"context_line":"        name\u003d\u0027hw:boot_memu\u0027,"},{"line_number":253,"context_line":"        description\u003d("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_eb6142d7","line":250,"range":{"start_line":226,"start_character":4,"end_line":250,"end_character":24},"in_reply_to":"3fa7e38b_e7abc6d0","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        },"},{"line_number":249,"context_line":"    ),"},{"line_number":250,"context_line":"    # misc feature flags"},{"line_number":251,"context_line":"    base.ExtraSpecValidator("},{"line_number":252,"context_line":"        name\u003d\u0027hw:boot_memu\u0027,"},{"line_number":253,"context_line":"        description\u003d("},{"line_number":254,"context_line":"            \u0027Whether to show a boot menu when booting the guest.\u0027"},{"line_number":255,"context_line":"        ),"},{"line_number":256,"context_line":"        value\u003d{"},{"line_number":257,"context_line":"            \u0027type\u0027: bool,"},{"line_number":258,"context_line":"            \u0027description\u0027: \u0027Whether to enable the boot menu\u0027,"},{"line_number":259,"context_line":"        },"},{"line_number":260,"context_line":"    ),"},{"line_number":261,"context_line":"    base.ExtraSpecValidator("},{"line_number":262,"context_line":"        name\u003d\u0027hw:mem_encryption\u0027,"},{"line_number":263,"context_line":"        description\u003d("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_c7bd6ab2","line":260,"range":{"start_line":251,"start_character":3,"end_line":260,"end_character":6},"updated":"2020-01-29 15:02:03.000000000","message":"this should really have been in the os namespace.\nwe shoudl consider moving it in the future.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        },"},{"line_number":249,"context_line":"    ),"},{"line_number":250,"context_line":"    # misc feature flags"},{"line_number":251,"context_line":"    base.ExtraSpecValidator("},{"line_number":252,"context_line":"        name\u003d\u0027hw:boot_memu\u0027,"},{"line_number":253,"context_line":"        description\u003d("},{"line_number":254,"context_line":"            \u0027Whether to show a boot menu when booting the guest.\u0027"},{"line_number":255,"context_line":"        ),"},{"line_number":256,"context_line":"        value\u003d{"},{"line_number":257,"context_line":"            \u0027type\u0027: bool,"},{"line_number":258,"context_line":"            \u0027description\u0027: \u0027Whether to enable the boot menu\u0027,"},{"line_number":259,"context_line":"        },"},{"line_number":260,"context_line":"    ),"},{"line_number":261,"context_line":"    base.ExtraSpecValidator("},{"line_number":262,"context_line":"        name\u003d\u0027hw:mem_encryption\u0027,"},{"line_number":263,"context_line":"        description\u003d("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_4b6df6c9","line":260,"range":{"start_line":251,"start_character":3,"end_line":260,"end_character":6},"in_reply_to":"3fa7e38b_c7bd6ab2","updated":"2020-01-30 13:13:40.000000000","message":"Added a note.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        value\u003d{"},{"line_number":278,"context_line":"            \u0027type\u0027: str,"},{"line_number":279,"context_line":"            \u0027description\u0027: \u0027TODO\u0027,"},{"line_number":280,"context_line":"            \u0027pattern\u0027: \u0027TODO\u0027,"},{"line_number":281,"context_line":"        },"},{"line_number":282,"context_line":"    ),"},{"line_number":283,"context_line":"    base.ExtraSpecValidator("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_87ce92b4","line":280,"range":{"start_line":280,"start_character":24,"end_line":280,"end_character":29},"updated":"2020-01-29 15:02:03.000000000","message":"i think this willl be \u0027.*\u0027 because technically this is a resouce class name that can be set in the config.\n\nwell i guess it would be \u0027^([a-zA-Z0-9_]+(,)?)+$\u0027\nsince it is a comma seperated list of valid resouce class names which can only be alphanumeric or underscore with no leading or trailing white space","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        value\u003d{"},{"line_number":278,"context_line":"            \u0027type\u0027: str,"},{"line_number":279,"context_line":"            \u0027description\u0027: \u0027TODO\u0027,"},{"line_number":280,"context_line":"            \u0027pattern\u0027: \u0027TODO\u0027,"},{"line_number":281,"context_line":"        },"},{"line_number":282,"context_line":"    ),"},{"line_number":283,"context_line":"    base.ExtraSpecValidator("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_8b344ead","line":280,"range":{"start_line":280,"start_character":24,"end_line":280,"end_character":29},"in_reply_to":"3fa7e38b_87ce92b4","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f2cdd638b611a24f1f20bcc9664b8afbe0490b7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        ),"},{"line_number":37,"context_line":"        value\u003d{"},{"line_number":38,"context_line":"            \u0027type\u0027: str,"},{"line_number":39,"context_line":"            # NOTE(stephenfin): Yes, these things *have* to start with \u0027^\u0027"},{"line_number":40,"context_line":"            \u0027pattern\u0027: r\u0027\\^\\d+((-\\d+)?(,\\^?\\d+(-\\d+)?)?)*\u0027,"},{"line_number":41,"context_line":"        },"},{"line_number":42,"context_line":"    ),"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_4d9f3650","line":39,"updated":"2020-02-25 11:39:12.000000000","message":"thanks! :)","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"}],"nova/api/validation/extra_specs/hw_rng.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from nova.api.validation.extra_specs import base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027hw_rng:allowed\u0027,"},{"line_number":25,"context_line":"        description\u003d("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_27f1de96","line":22,"updated":"2020-01-29 15:02:03.000000000","message":"these really should have been in the hw namespace instead of there own namespace. its a sperate thing but i think it would make sense to move these. im also noting other extra specs that we shoudl consider moving in the futrue in the other files but that is a seperate change to this.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027hw_rng:allowed\u0027,"},{"line_number":25,"context_line":"        description\u003d("},{"line_number":26,"context_line":"            \u0027Whether the user is allowed configure a random number \u0027"},{"line_number":27,"context_line":"            \u0027generator in their image.\u0027"},{"line_number":28,"context_line":"        ),"},{"line_number":29,"context_line":"        value\u003d{"},{"line_number":30,"context_line":"            \u0027type\u0027: bool,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_07cce287","line":27,"range":{"start_line":26,"start_character":13,"end_line":27,"end_character":39},"updated":"2020-01-29 15:02:03.000000000","message":"we are kind of changing the meaning of this.\n\nnow that the rng will be enabel by default this will be used to allow the admin to disable the rng if its explcitly set to false.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027hw_rng:allowed\u0027,"},{"line_number":25,"context_line":"        description\u003d("},{"line_number":26,"context_line":"            \u0027Whether the user is allowed configure a random number \u0027"},{"line_number":27,"context_line":"            \u0027generator in their image.\u0027"},{"line_number":28,"context_line":"        ),"},{"line_number":29,"context_line":"        value\u003d{"},{"line_number":30,"context_line":"            \u0027type\u0027: bool,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_0bc5be5d","line":27,"range":{"start_line":26,"start_character":13,"end_line":27,"end_character":39},"in_reply_to":"3fa7e38b_07cce287","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6af579ffa9c979376225408ad55e71397089e05a","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        description\u003d\u0027The duration of a read period in seconds.\u0027,"},{"line_number":48,"context_line":"        value\u003d{"},{"line_number":49,"context_line":"            \u0027type\u0027: int,"},{"line_number":50,"context_line":"            \u0027min\u0027: 0,"},{"line_number":51,"context_line":"        },"},{"line_number":52,"context_line":"    ),"},{"line_number":53,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_cc86ca16","line":50,"updated":"2020-02-18 16:23:33.000000000","message":"1 might be a more sane value, here and above","commit_id":"22e79692356a40492bf8bceac38212f9b614e783"}],"nova/api/validation/extra_specs/hw_video.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027hw_video:ram_max_mb\u0027,"},{"line_number":25,"context_line":"        description\u003d\u0027\u0027,"},{"line_number":26,"context_line":"        value\u003d{"},{"line_number":27,"context_line":"            \u0027type\u0027: int,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_67e276d5","line":24,"range":{"start_line":24,"start_character":13,"end_line":24,"end_character":33},"updated":"2020-01-29 15:02:03.000000000","message":"this should have just been in the hw namespace","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027hw_video:ram_max_mb\u0027,"},{"line_number":25,"context_line":"        description\u003d\u0027\u0027,"},{"line_number":26,"context_line":"        value\u003d{"},{"line_number":27,"context_line":"            \u0027type\u0027: int,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_2b7c3a21","line":24,"range":{"start_line":24,"start_character":13,"end_line":24,"end_character":33},"in_reply_to":"3fa7e38b_67e276d5","updated":"2020-01-30 13:13:40.000000000","message":"Added a note","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027hw_video:ram_max_mb\u0027,"},{"line_number":25,"context_line":"        description\u003d\u0027\u0027,"},{"line_number":26,"context_line":"        value\u003d{"},{"line_number":27,"context_line":"            \u0027type\u0027: int,"},{"line_number":28,"context_line":"            \u0027min\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_a7894e25","line":25,"updated":"2020-01-29 15:02:03.000000000","message":"this is the maxium amount of video memory the use can request using hw_video_ram image property.\n\nhttps://github.com/openstack/glance/blob/26c5c8dff670617ecbcc2b319b25e632fa88cb4a/etc/metadefs/compute-libvirt-image.json#L86-L90\n\nthis is used to configre the amound of vrma that is exposed as bar 2 i think in the vm wich is basicaly the frame buffer/video memory that will be reported to the os by the default grapichs device however it has no effect for vGPUs","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":22,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027hw_video:ram_max_mb\u0027,"},{"line_number":25,"context_line":"        description\u003d\u0027\u0027,"},{"line_number":26,"context_line":"        value\u003d{"},{"line_number":27,"context_line":"            \u0027type\u0027: int,"},{"line_number":28,"context_line":"            \u0027min\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_8b876e12","line":25,"in_reply_to":"3fa7e38b_a7894e25","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"}],"nova/api/validation/extra_specs/null.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5a67fc520628fcc27083640f94eee3128a0efb3","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Validators for ``hw`` namespaced extra specs.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from typing import List"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_8a3c6891","line":15,"range":{"start_line":15,"start_character":20,"end_line":15,"end_character":22},"updated":"2020-01-28 17:57:29.000000000","message":"whoops","commit_id":"58d85e4868f384737fe6a2462968c8aebeeccfc1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3fa7e38b_e1cdf65a","updated":"2020-01-29 14:09:03.000000000","message":"null means without namespace?","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"440af53994a5a5b244b94e61f315f6e9702bb4b0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3fa7e38b_93dec669","in_reply_to":"3fa7e38b_d991ce51","updated":"2020-01-30 09:24:02.000000000","message":"I just wanted to make sure I got it.\n\nIt is fun to say:\n\n    from nova.api.validators.extra_spec import null","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1b1f953b47d79f1f6d2bb303a101f3da417576b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3fa7e38b_d991ce51","in_reply_to":"3fa7e38b_e1cdf65a","updated":"2020-01-29 14:55:06.000000000","message":"Yup, for want of a better name :)","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Validators for ``hw`` namespaced extra specs.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from typing import List"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_81020271","line":15,"range":{"start_line":15,"start_character":19,"end_line":15,"end_character":36},"updated":"2020-01-29 14:09:03.000000000","message":"copy-pasta","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Validators for ``hw`` namespaced extra specs.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from typing import List"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_eb75c235","line":15,"range":{"start_line":15,"start_character":19,"end_line":15,"end_character":36},"in_reply_to":"3fa7e38b_81020271","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027hide_hypervisor_id\u0027,"},{"line_number":25,"context_line":"        description\u003d("},{"line_number":26,"context_line":"            \u0027Determine whether the hypervisor ID should be hidden from the \u0027"},{"line_number":27,"context_line":"            \u0027guest. Only supported by the libvirt driver.\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_27755e33","line":24,"range":{"start_line":24,"start_character":14,"end_line":24,"end_character":32},"updated":"2020-01-29 15:02:03.000000000","message":"this really should have been prefixed when we added it by the way. ideally we would deprecate this and replace it with an os:hide_hypervisor_id or hw:hide_hypervisor_id extra spec instead.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027hide_hypervisor_id\u0027,"},{"line_number":25,"context_line":"        description\u003d("},{"line_number":26,"context_line":"            \u0027Determine whether the hypervisor ID should be hidden from the \u0027"},{"line_number":27,"context_line":"            \u0027guest. Only supported by the libvirt driver.\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_cb6c866d","line":24,"range":{"start_line":24,"start_character":14,"end_line":24,"end_character":32},"in_reply_to":"3fa7e38b_27755e33","updated":"2020-01-30 13:13:40.000000000","message":"Added a note","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            \u0027description\u0027: \u0027Whether to hide the hypervisor ID.\u0027,"},{"line_number":32,"context_line":"        },"},{"line_number":33,"context_line":"    ),"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def register(validators: List[base.ExtraSpecValidator]):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_d90eaed6","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":1},"updated":"2020-01-29 15:02:03.000000000","message":"i think you are missing group_policy here.\n\ne.g. the group_policy to use when using the granuarl resouce request syntax. i dont think that has a prefix although placemet:group_policy proably would have made sense.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            \u0027description\u0027: \u0027Whether to hide the hypervisor ID.\u0027,"},{"line_number":32,"context_line":"        },"},{"line_number":33,"context_line":"    ),"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def register(validators: List[base.ExtraSpecValidator]):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_ebc8624f","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":1},"in_reply_to":"3fa7e38b_d90eaed6","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"}],"nova/api/validation/extra_specs/os.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5a67fc520628fcc27083640f94eee3128a0efb3","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027os:secure_boot\u0027,"},{"line_number":25,"context_line":"        description\u003d("},{"line_number":26,"context_line":"            \u0027Determine whether secure boot is enabled or not. Currently only \u0027"},{"line_number":27,"context_line":"            \u0027supported by the HyperV driver.\u0027"},{"line_number":28,"context_line":"        ),"},{"line_number":29,"context_line":"        value\u003d{"},{"line_number":30,"context_line":"            \u0027type\u0027: str,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_0a487828","line":27,"range":{"start_line":26,"start_character":62,"end_line":27,"end_character":44},"updated":"2020-01-28 17:57:29.000000000","message":"It might be nice to formally encode this somewhere, even though we can\u0027t use it in validation. Maybe:\n\n  support_drivers\u003d[\u0027$driver\u0027],\n\nwhere $driver is a valid value for \u0027compute_driver\u0027, e.g. \u0027libvirt.LibvirtDriver\u0027. Maybe that\u0027s unnecessary though. TBD.","commit_id":"58d85e4868f384737fe6a2462968c8aebeeccfc1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5a67fc520628fcc27083640f94eee3128a0efb3","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                256,"},{"line_number":81,"context_line":"                512,"},{"line_number":82,"context_line":"                1024,"},{"line_number":83,"context_line":"            ],"},{"line_number":84,"context_line":"        },"},{"line_number":85,"context_line":"    ),"},{"line_number":86,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_6a524cdc","line":83,"updated":"2020-01-28 17:57:29.000000000","message":"Oh, I didn\u0027t add support for ints with \u0027enum\u0027. Not even sure it makes sense. I need to fix something anyway","commit_id":"58d85e4868f384737fe6a2462968c8aebeeccfc1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027os:secure_boot\u0027,"},{"line_number":25,"context_line":"        description\u003d("},{"line_number":26,"context_line":"            \u0027Determine whether secure boot is enabled or not. Currently only \u0027"},{"line_number":27,"context_line":"            \u0027supported by the HyperV driver.\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_472dfaf9","line":24,"range":{"start_line":24,"start_character":14,"end_line":24,"end_character":28},"updated":"2020-01-29 15:02:03.000000000","message":"this makes sense i think to be under os but the rest of the option in this namespace shoudl really be under hw: or in a hyperv namespace like the powervm ones.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027os:secure_boot\u0027,"},{"line_number":25,"context_line":"        description\u003d("},{"line_number":26,"context_line":"            \u0027Determine whether secure boot is enabled or not. Currently only \u0027"},{"line_number":27,"context_line":"            \u0027supported by the HyperV driver.\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_4bfdf66b","line":24,"range":{"start_line":24,"start_character":14,"end_line":24,"end_character":28},"in_reply_to":"3fa7e38b_472dfaf9","updated":"2020-01-30 13:13:40.000000000","message":"Added a note","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    base.ExtraSpecValidator("},{"line_number":39,"context_line":"        name\u003d\u0027os:resolution\u0027,"},{"line_number":40,"context_line":"        description\u003d("},{"line_number":41,"context_line":"            \u0027Guest VM screen resolution size. Only supported by the HyperV \u0027"},{"line_number":42,"context_line":"            \u0027driver.\u0027"},{"line_number":43,"context_line":"        ),"},{"line_number":44,"context_line":"        value\u003d{"},{"line_number":45,"context_line":"            \u0027type\u0027: str,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_878bf214","line":42,"range":{"start_line":41,"start_character":46,"end_line":42,"end_character":19},"updated":"2020-01-29 15:02:03.000000000","message":"strangly enough i think this is an option we can define when creating the default grapis device in libvirt too. so we might want to add support for this in the future.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            \u0027max\u0027: 8,"},{"line_number":67,"context_line":"        },"},{"line_number":68,"context_line":"    ),"},{"line_number":69,"context_line":"    base.ExtraSpecValidator("},{"line_number":70,"context_line":"        name\u003d\u0027os:vram\u0027,"},{"line_number":71,"context_line":"        description\u003d("},{"line_number":72,"context_line":"            \u0027Guest VM VRAM amount. Only supported by the HyperV driver.\u0027"},{"line_number":73,"context_line":"        ),"},{"line_number":74,"context_line":"        value\u003d{"},{"line_number":75,"context_line":"            \u0027type\u0027: int,"},{"line_number":76,"context_line":"            \u0027description\u0027: \u0027Amount of VRAM to allocate to instance\u0027,"},{"line_number":77,"context_line":"            \u0027enum\u0027: ["},{"line_number":78,"context_line":"                64,"},{"line_number":79,"context_line":"                128,"},{"line_number":80,"context_line":"                256,"},{"line_number":81,"context_line":"                512,"},{"line_number":82,"context_line":"                1024,"},{"line_number":83,"context_line":"            ],"},{"line_number":84,"context_line":"        },"},{"line_number":85,"context_line":"    ),"},{"line_number":86,"context_line":"]"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e79f464b","line":85,"range":{"start_line":69,"start_character":4,"end_line":85,"end_character":6},"updated":"2020-01-29 15:02:03.000000000","message":"this is basicaly serves the same function as the libvirt the hw_video_ram image property. we should consider converging them at some point. while the admin can set a max vram in the flavor for libvirt the cant actully set the amount to use by default. that is only support in the image.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            \u0027max\u0027: 8,"},{"line_number":67,"context_line":"        },"},{"line_number":68,"context_line":"    ),"},{"line_number":69,"context_line":"    base.ExtraSpecValidator("},{"line_number":70,"context_line":"        name\u003d\u0027os:vram\u0027,"},{"line_number":71,"context_line":"        description\u003d("},{"line_number":72,"context_line":"            \u0027Guest VM VRAM amount. Only supported by the HyperV driver.\u0027"},{"line_number":73,"context_line":"        ),"},{"line_number":74,"context_line":"        value\u003d{"},{"line_number":75,"context_line":"            \u0027type\u0027: int,"},{"line_number":76,"context_line":"            \u0027description\u0027: \u0027Amount of VRAM to allocate to instance\u0027,"},{"line_number":77,"context_line":"            \u0027enum\u0027: ["},{"line_number":78,"context_line":"                64,"},{"line_number":79,"context_line":"                128,"},{"line_number":80,"context_line":"                256,"},{"line_number":81,"context_line":"                512,"},{"line_number":82,"context_line":"                1024,"},{"line_number":83,"context_line":"            ],"},{"line_number":84,"context_line":"        },"},{"line_number":85,"context_line":"    ),"},{"line_number":86,"context_line":"]"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_abeb4aa3","line":85,"range":{"start_line":69,"start_character":4,"end_line":85,"end_character":6},"in_reply_to":"3fa7e38b_e79f464b","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"}],"nova/api/validation/extra_specs/powervm.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Validators for ``powervm`` namespaced extra specs.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from typing import List"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_27a9de23","line":15,"updated":"2020-01-29 15:02:03.000000000","message":"as a general note given that all extra_specs are ment to require a spec i am not sure where most of these came form.\n\nnone of these are in the flavor docs","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":23,"context_line":"    base.ExtraSpecValidator("},{"line_number":24,"context_line":"        name\u003d\u0027powervm:min_mem\u0027,"},{"line_number":25,"context_line":"        description\u003d("},{"line_number":26,"context_line":"            \u0027\u0027"},{"line_number":27,"context_line":"        ),"},{"line_number":28,"context_line":"        value\u003d{"},{"line_number":29,"context_line":"            \u0027type\u0027: int,"},{"line_number":30,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":31,"context_line":"        },"},{"line_number":32,"context_line":"    ),"},{"line_number":33,"context_line":"    base.ExtraSpecValidator("},{"line_number":34,"context_line":"        name\u003d\u0027powervm:max_mem\u0027,"},{"line_number":35,"context_line":"        description\u003d("},{"line_number":36,"context_line":"            \u0027\u0027"},{"line_number":37,"context_line":"        ),"},{"line_number":38,"context_line":"        value\u003d{"},{"line_number":39,"context_line":"            \u0027type\u0027: int,"},{"line_number":40,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":41,"context_line":"        },"},{"line_number":42,"context_line":"    ),"},{"line_number":43,"context_line":"    base.ExtraSpecValidator("},{"line_number":44,"context_line":"        name\u003d\u0027powervm:min_vcpu\u0027,"},{"line_number":45,"context_line":"        description\u003d("},{"line_number":46,"context_line":"            \u0027\u0027"},{"line_number":47,"context_line":"        ),"},{"line_number":48,"context_line":"        value\u003d{"},{"line_number":49,"context_line":"            \u0027type\u0027: int,"},{"line_number":50,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":51,"context_line":"        },"},{"line_number":52,"context_line":"    ),"},{"line_number":53,"context_line":"    base.ExtraSpecValidator("},{"line_number":54,"context_line":"        name\u003d\u0027powervm:max_vcpu\u0027,"},{"line_number":55,"context_line":"        description\u003d("},{"line_number":56,"context_line":"            \u0027\u0027"},{"line_number":57,"context_line":"        ),"},{"line_number":58,"context_line":"        value\u003d{"},{"line_number":59,"context_line":"            \u0027type\u0027: int,"},{"line_number":60,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":61,"context_line":"        },"},{"line_number":62,"context_line":"    ),"},{"line_number":63,"context_line":"    base.ExtraSpecValidator("},{"line_number":64,"context_line":"        name\u003d\u0027powervm:proc_units\u0027,"},{"line_number":65,"context_line":"        description\u003d("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_27647e4c","line":62,"range":{"start_line":23,"start_character":4,"end_line":62,"end_character":6},"updated":"2020-01-29 15:02:03.000000000","message":"im not really sure that these make sense?\nmaybe erric can explain them?\n\nthe number of vcpu and memory is defiend in the falvor object adn we dont allow that to be altered via the image right.\n\nare these qos attibute of some kind to define constriants on oversubsription.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":61,"context_line":"        },"},{"line_number":62,"context_line":"    ),"},{"line_number":63,"context_line":"    base.ExtraSpecValidator("},{"line_number":64,"context_line":"        name\u003d\u0027powervm:proc_units\u0027,"},{"line_number":65,"context_line":"        description\u003d("},{"line_number":66,"context_line":"            \u0027\u0027"},{"line_number":67,"context_line":"        ),"},{"line_number":68,"context_line":"        value\u003d{"},{"line_number":69,"context_line":"            \u0027type\u0027: int,"},{"line_number":70,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":71,"context_line":"        },"},{"line_number":72,"context_line":"    ),"},{"line_number":73,"context_line":"    base.ExtraSpecValidator("},{"line_number":74,"context_line":"        name\u003d\u0027powervm:min_proc_units\u0027,"},{"line_number":75,"context_line":"        description\u003d("},{"line_number":76,"context_line":"            \u0027\u0027"},{"line_number":77,"context_line":"        ),"},{"line_number":78,"context_line":"        value\u003d{"},{"line_number":79,"context_line":"            \u0027type\u0027: int,"},{"line_number":80,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":81,"context_line":"        },"},{"line_number":82,"context_line":"    ),"},{"line_number":83,"context_line":"    base.ExtraSpecValidator("},{"line_number":84,"context_line":"        name\u003d\u0027powervm:max_proc_units\u0027,"},{"line_number":85,"context_line":"        description\u003d("},{"line_number":86,"context_line":"            \u0027\u0027"},{"line_number":87,"context_line":"        ),"},{"line_number":88,"context_line":"        value\u003d{"},{"line_number":89,"context_line":"            \u0027type\u0027: int,"},{"line_number":90,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":91,"context_line":"        },"},{"line_number":92,"context_line":"    ),"},{"line_number":93,"context_line":"    base.ExtraSpecValidator("},{"line_number":94,"context_line":"        name\u003d\u0027powervm:dedicated_proc\u0027,"},{"line_number":95,"context_line":"        description\u003d("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e742e692","line":92,"range":{"start_line":63,"start_character":4,"end_line":92,"end_character":6},"updated":"2020-01-29 15:02:03.000000000","message":"this seams like a non standard way to do cpu quotas\nhttps://docs.openstack.org/nova/latest/user/flavors.html#extra-specs-cpu-limits","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":91,"context_line":"        },"},{"line_number":92,"context_line":"    ),"},{"line_number":93,"context_line":"    base.ExtraSpecValidator("},{"line_number":94,"context_line":"        name\u003d\u0027powervm:dedicated_proc\u0027,"},{"line_number":95,"context_line":"        description\u003d("},{"line_number":96,"context_line":"            \u0027\u0027"},{"line_number":97,"context_line":"        ),"},{"line_number":98,"context_line":"        value\u003d{"},{"line_number":99,"context_line":"            \u0027type\u0027: str,"},{"line_number":100,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":101,"context_line":"        },"},{"line_number":102,"context_line":"    ),"},{"line_number":103,"context_line":"    base.ExtraSpecValidator("},{"line_number":104,"context_line":"        name\u003d\u0027powervm:shared_weight\u0027,"},{"line_number":105,"context_line":"        description\u003d("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_07d702c2","line":102,"range":{"start_line":93,"start_character":4,"end_line":102,"end_character":6},"updated":"2020-01-29 15:02:03.000000000","message":"this presumable is a no standard way to enable cpu pinning\n\nhw:cpu_policy was inteded to be used by all virt drivers for that.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":111,"context_line":"        },"},{"line_number":112,"context_line":"    ),"},{"line_number":113,"context_line":"    base.ExtraSpecValidator("},{"line_number":114,"context_line":"        name\u003d\u0027powervm:availability_priority\u0027,"},{"line_number":115,"context_line":"        description\u003d("},{"line_number":116,"context_line":"            \u0027\u0027"},{"line_number":117,"context_line":"        ),"},{"line_number":118,"context_line":"        value\u003d{"},{"line_number":119,"context_line":"            \u0027type\u0027: str,"},{"line_number":120,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":121,"context_line":"        },"},{"line_number":122,"context_line":"    ),"},{"line_number":123,"context_line":"    base.ExtraSpecValidator("},{"line_number":124,"context_line":"        name\u003d\u0027powervm:uncapped\u0027,"},{"line_number":125,"context_line":"        description\u003d("},{"line_number":126,"context_line":"            \u0027\u0027"},{"line_number":127,"context_line":"        ),"},{"line_number":128,"context_line":"        value\u003d{"},{"line_number":129,"context_line":"            \u0027type\u0027: str,"},{"line_number":130,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":131,"context_line":"        },"},{"line_number":132,"context_line":"    ),"},{"line_number":133,"context_line":"    base.ExtraSpecValidator("},{"line_number":134,"context_line":"        name\u003d\u0027powervm:dedicated_sharing_mode\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_a794eee7","line":131,"range":{"start_line":113,"start_character":3,"end_line":131,"end_character":10},"updated":"2020-01-29 15:02:03.000000000","message":"i have no idea what these are.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":131,"context_line":"        },"},{"line_number":132,"context_line":"    ),"},{"line_number":133,"context_line":"    base.ExtraSpecValidator("},{"line_number":134,"context_line":"        name\u003d\u0027powervm:dedicated_sharing_mode\u0027,"},{"line_number":135,"context_line":"        description\u003d("},{"line_number":136,"context_line":"            \u0027\u0027"},{"line_number":137,"context_line":"        ),"},{"line_number":138,"context_line":"        value\u003d{"},{"line_number":139,"context_line":"            \u0027type\u0027: str,"},{"line_number":140,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":141,"context_line":"        },"},{"line_number":142,"context_line":"    ),"},{"line_number":143,"context_line":"    base.ExtraSpecValidator("},{"line_number":144,"context_line":"        name\u003d\u0027powervm:processor_compatibility\u0027,"},{"line_number":145,"context_line":"        description\u003d("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_679a7612","line":142,"range":{"start_line":133,"start_character":2,"end_line":142,"end_character":6},"updated":"2020-01-29 15:02:03.000000000","message":"again this sound like a non standard way to do cpu thead policies\n\ne.g. hw:cpu_thread_policies","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        },"},{"line_number":142,"context_line":"    ),"},{"line_number":143,"context_line":"    base.ExtraSpecValidator("},{"line_number":144,"context_line":"        name\u003d\u0027powervm:processor_compatibility\u0027,"},{"line_number":145,"context_line":"        description\u003d("},{"line_number":146,"context_line":"            \u0027\u0027"},{"line_number":147,"context_line":"        ),"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_a7bdce67","line":144,"range":{"start_line":144,"start_character":14,"end_line":144,"end_character":45},"updated":"2020-01-29 15:02:03.000000000","message":"this kind of sound like the ablity to specify a cpu model or machine type","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"186dcad0ea7932b0cb2297230f575b2a320474c1","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# TODO(stephenfin): A lot of these seem to overlap with existing \u0027hw:\u0027 extra"},{"line_number":23,"context_line":"# specs and could be deprecated in favour of those."},{"line_number":24,"context_line":"# TODO(stephenfin): Add descriptions."},{"line_number":25,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":26,"context_line":"    base.ExtraSpecValidator("},{"line_number":27,"context_line":"        name\u003d\u0027powervm:min_mem\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_3f3eb0e3","line":24,"range":{"start_line":24,"start_character":20,"end_line":24,"end_character":37},"updated":"2020-01-30 16:20:29.000000000","message":"PowerVC (the $ product that sits on top of nova+powervm) allows you to pass the extra specs through, and has them documented here: https://www.ibm.com/support/knowledgecenter/SSXK2N_1.4.4/com.ibm.powervc.standard.help.doc/powervc_pg_flavorsextraspecs_hmc.html","commit_id":"b755a335e967009e0e7ee60756670beeaae90a14"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"51f6405259eb61bb681f845177e4f44ccdc99e22","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# TODO(stephenfin): A lot of these seem to overlap with existing \u0027hw:\u0027 extra"},{"line_number":23,"context_line":"# specs and could be deprecated in favour of those."},{"line_number":24,"context_line":"# TODO(stephenfin): Add descriptions."},{"line_number":25,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":26,"context_line":"    base.ExtraSpecValidator("},{"line_number":27,"context_line":"        name\u003d\u0027powervm:min_mem\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_f7374dad","line":24,"range":{"start_line":24,"start_character":20,"end_line":24,"end_character":37},"in_reply_to":"3fa7e38b_3f3eb0e3","updated":"2020-02-10 17:24:35.000000000","message":"Done","commit_id":"b755a335e967009e0e7ee60756670beeaae90a14"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"51c9a40daa1ae1a8ca409a4eb4262ecd7de46faa","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# TODO(stephenfin): A lot of these seem to overlap with existing \u0027hw:\u0027 extra"},{"line_number":23,"context_line":"# specs and could be deprecated in favour of those."},{"line_number":24,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":25,"context_line":"    base.ExtraSpecValidator("},{"line_number":26,"context_line":"        name\u003d\u0027powervm:min_mem\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_2cd4b74a","line":23,"updated":"2020-02-10 20:02:31.000000000","message":"I think it would be good to include the link to the reference you used to populate these.","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ae646af06f47fa5d5c180bcc1448cc4b2bf98411","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# TODO(stephenfin): A lot of these seem to overlap with existing \u0027hw:\u0027 extra"},{"line_number":23,"context_line":"# specs and could be deprecated in favour of those."},{"line_number":24,"context_line":"EXTRA_SPEC_VALIDATORS \u003d ["},{"line_number":25,"context_line":"    base.ExtraSpecValidator("},{"line_number":26,"context_line":"        name\u003d\u0027powervm:min_mem\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_0afe7106","line":23,"in_reply_to":"3fa7e38b_2cd4b74a","updated":"2020-02-11 13:15:50.000000000","message":"Done","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"48940db7093c337bb949b1616f2e60503466b1b0","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    base.ExtraSpecValidator("},{"line_number":38,"context_line":"        name\u003d\u0027powervm:max_mem\u0027,"},{"line_number":39,"context_line":"        description\u003d("},{"line_number":40,"context_line":"            \u0027Minimum memory (MB). If you do not specify the value, the value \u0027"},{"line_number":41,"context_line":"            \u0027is defaulted to the value for ``memory_mb``.\u0027"},{"line_number":42,"context_line":"        ),"},{"line_number":43,"context_line":"        value\u003d{"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_4cc7b311","line":40,"range":{"start_line":40,"start_character":13,"end_line":40,"end_character":20},"updated":"2020-02-10 20:59:29.000000000","message":"max not min","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ae646af06f47fa5d5c180bcc1448cc4b2bf98411","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    base.ExtraSpecValidator("},{"line_number":38,"context_line":"        name\u003d\u0027powervm:max_mem\u0027,"},{"line_number":39,"context_line":"        description\u003d("},{"line_number":40,"context_line":"            \u0027Minimum memory (MB). If you do not specify the value, the value \u0027"},{"line_number":41,"context_line":"            \u0027is defaulted to the value for ``memory_mb``.\u0027"},{"line_number":42,"context_line":"        ),"},{"line_number":43,"context_line":"        value\u003d{"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_2afb2d16","line":40,"range":{"start_line":40,"start_character":13,"end_line":40,"end_character":20},"in_reply_to":"3fa7e38b_4cc7b311","updated":"2020-02-11 13:15:50.000000000","message":"Done","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"48940db7093c337bb949b1616f2e60503466b1b0","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            \u0027description\u0027: \u0027Integer \u003e\u003d256 divisible by LMB size of the target\u0027,"},{"line_number":47,"context_line":"        },"},{"line_number":48,"context_line":"    ),"},{"line_number":49,"context_line":"    base.ExtraSpecValidator("},{"line_number":50,"context_line":"        name\u003d\u0027powervm:min_vcpu\u0027,"},{"line_number":51,"context_line":"        description\u003d("},{"line_number":52,"context_line":"            \u0027Minimum virtual processors. Minimum resource that is required \u0027"},{"line_number":53,"context_line":"            \u0027for LPAR to boot is 1. The maximum value can be equal to the \u0027"},{"line_number":54,"context_line":"            \u0027value, which is set to vCPUs. If you specify the value of the \u0027"},{"line_number":55,"context_line":"            \u0027attribute, you must also specify value of powervm:max_vcpu. \u0027"},{"line_number":56,"context_line":"            \u0027Defaults to value set for vCPUs.\u0027"},{"line_number":57,"context_line":"        ),"},{"line_number":58,"context_line":"        value\u003d{"},{"line_number":59,"context_line":"            \u0027type\u0027: int,"},{"line_number":60,"context_line":"            \u0027min\u0027: 1,"},{"line_number":61,"context_line":"        },"},{"line_number":62,"context_line":"    ),"},{"line_number":63,"context_line":"    base.ExtraSpecValidator("},{"line_number":64,"context_line":"        name\u003d\u0027powervm:max_vcpu\u0027,"},{"line_number":65,"context_line":"        description\u003d("},{"line_number":66,"context_line":"            \u0027Minimum virtual processors. Minimum resource that is required \u0027"},{"line_number":67,"context_line":"            \u0027for LPAR to boot is 1. The maximum value can be equal to the \u0027"},{"line_number":68,"context_line":"            \u0027value, which is set to vCPUs. If you specify the value of the \u0027"},{"line_number":69,"context_line":"            \u0027attribute, you must also specify value of powervm:max_vcpu. \u0027"},{"line_number":70,"context_line":"            \u0027Defaults to value set for vCPUs.\u0027"},{"line_number":71,"context_line":"        ),"},{"line_number":72,"context_line":"        value\u003d{"},{"line_number":73,"context_line":"            \u0027type\u0027: int,"},{"line_number":74,"context_line":"            \u0027min\u0027: 1,"},{"line_number":75,"context_line":"        },"},{"line_number":76,"context_line":"    ),"},{"line_number":77,"context_line":"    base.ExtraSpecValidator("},{"line_number":78,"context_line":"        name\u003d\u0027powervm:proc_units\u0027,"},{"line_number":79,"context_line":"        description\u003d("}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_6ce5cfa2","line":76,"range":{"start_line":49,"start_character":4,"end_line":76,"end_character":6},"updated":"2020-02-10 20:59:29.000000000","message":"by the way im not sure how these min/max cpus,ram ectra can work with placement.\n\nyou either need to always claim the max and allow the allocation ratio to contol if over subscription is allowsed or you always claim the min and dissalow over subsrption but i suspect they dont do either and it does not work with placment correctly.","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"}],"nova/api/validation/extra_specs/quota.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"# Disk quotas (libvirt, HyperV)"},{"line_number":65,"context_line":"for stat in (\u0027read\u0027, \u0027write\u0027, \u0027total\u0027):"},{"line_number":66,"context_line":"    for metric in (\u0027bytes\u0027, \u0027iops\u0027):"},{"line_number":67,"context_line":"        EXTRA_SPEC_VALIDATORS.append("},{"line_number":68,"context_line":"            base.ExtraSpecValidator("},{"line_number":69,"context_line":"                name\u003df\u0027quota:disk_{stat}_{metric}_sec\u0027,"},{"line_number":70,"context_line":"                # NOTE(stephenfin): HyperV supports disk_total_{metric}_sec"},{"line_number":71,"context_line":"                # too; update"},{"line_number":72,"context_line":"                description\u003d("},{"line_number":73,"context_line":"                    f\u0027The quota {stat} {metric} for disk. Only supported \u0027"},{"line_number":74,"context_line":"                    f\u0027by the libvirt virt driver\u0027"},{"line_number":75,"context_line":"                ),"},{"line_number":76,"context_line":"                value\u003d{"},{"line_number":77,"context_line":"                    \u0027type\u0027: int,"},{"line_number":78,"context_line":"                    \u0027min\u0027: 0,"},{"line_number":79,"context_line":"                },"},{"line_number":80,"context_line":"            )"},{"line_number":81,"context_line":"        )"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"# VIF quotas (libvirt)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_394fc269","line":81,"range":{"start_line":65,"start_character":0,"end_line":81,"end_character":9},"updated":"2020-01-29 15:02:03.000000000","message":"for non local disk i think we should alos deprecate this in favor of cinder or ceph based qos.\n\nwe would need to keep this for local storage however so maybe its not worth it.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        )"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"# VIF quotas (libvirt)"},{"line_number":85,"context_line":"for stat in (\u0027inbound\u0027, \u0027outbound\u0027):"},{"line_number":86,"context_line":"    for metric in (\u0027average\u0027, \u0027peak\u0027, \u0027burst\u0027):"},{"line_number":87,"context_line":"        EXTRA_SPEC_VALIDATORS.append("},{"line_number":88,"context_line":"            base.ExtraSpecValidator("},{"line_number":89,"context_line":"                name\u003df\u0027quota:vif_{stat}_{metric}\u0027,"},{"line_number":90,"context_line":"                description\u003d("},{"line_number":91,"context_line":"                    f\u0027The quota {stat} {metric} for VIF. Only supported \u0027"},{"line_number":92,"context_line":"                    f\u0027by the libvirt virt driver\u0027"},{"line_number":93,"context_line":"                ),"},{"line_number":94,"context_line":"                value\u003d{"},{"line_number":95,"context_line":"                    \u0027type\u0027: int,"},{"line_number":96,"context_line":"                    \u0027min\u0027: 0,"},{"line_number":97,"context_line":"                },"},{"line_number":98,"context_line":"            )"},{"line_number":99,"context_line":"        )"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def register(validators: List[base.ExtraSpecValidator]):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_f90e0a31","line":99,"range":{"start_line":84,"start_character":0,"end_line":99,"end_character":9},"updated":"2020-01-29 15:02:03.000000000","message":"this should be considerd deprecated with the intoduction of neuton qos policies. we have not formally done that but i think we shoudl consider doing it and remove it in victoria.\nthe main reason we had not done that until now was this was needed for nova networks.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        )"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"# VIF quotas (libvirt)"},{"line_number":85,"context_line":"for stat in (\u0027inbound\u0027, \u0027outbound\u0027):"},{"line_number":86,"context_line":"    for metric in (\u0027average\u0027, \u0027peak\u0027, \u0027burst\u0027):"},{"line_number":87,"context_line":"        EXTRA_SPEC_VALIDATORS.append("},{"line_number":88,"context_line":"            base.ExtraSpecValidator("},{"line_number":89,"context_line":"                name\u003df\u0027quota:vif_{stat}_{metric}\u0027,"},{"line_number":90,"context_line":"                description\u003d("},{"line_number":91,"context_line":"                    f\u0027The quota {stat} {metric} for VIF. Only supported \u0027"},{"line_number":92,"context_line":"                    f\u0027by the libvirt virt driver\u0027"},{"line_number":93,"context_line":"                ),"},{"line_number":94,"context_line":"                value\u003d{"},{"line_number":95,"context_line":"                    \u0027type\u0027: int,"},{"line_number":96,"context_line":"                    \u0027min\u0027: 0,"},{"line_number":97,"context_line":"                },"},{"line_number":98,"context_line":"            )"},{"line_number":99,"context_line":"        )"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def register(validators: List[base.ExtraSpecValidator]):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_6b0c7296","line":99,"range":{"start_line":84,"start_character":0,"end_line":99,"end_character":9},"in_reply_to":"3fa7e38b_f90e0a31","updated":"2020-01-30 13:13:40.000000000","message":"Added a note","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"}],"nova/api/validation/extra_specs/resources.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            parameters\u003d["},{"line_number":35,"context_line":"                {"},{"line_number":36,"context_line":"                    \u0027type\u0027: str,"},{"line_number":37,"context_line":"                    \u0027name\u0027: \u0027group\u0027,"},{"line_number":38,"context_line":"                    \u0027pattern\u0027: r\u0027\\s*\u0027,  # TODO(stephenfin): Is this correct?"},{"line_number":39,"context_line":"                },"},{"line_number":40,"context_line":"            ],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_39d5821a","line":37,"range":{"start_line":37,"start_character":19,"end_line":37,"end_character":36},"updated":"2020-01-29 15:02:03.000000000","message":"this would be an optional parameter.\ne.g. you need this to work with resouces:VCPU\u003d2 or resouces1:VCPU\u003d2\nand i think we now can have named groups so \n\nresouces_my_group_name:VCPU\u003d2 is valide in which case i think it would be \u0027resouces_[a-zA-z0-9_]*\u0027\n\nso the regex for the whole key i think is \u0027resouces(_[a-zA-z0-9_]*|\\d+)?\u0027 so \u0027(_[a-zA-z0-9_]*|\\d+)?\u0027 would be the regex for just the group.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            parameters\u003d["},{"line_number":35,"context_line":"                {"},{"line_number":36,"context_line":"                    \u0027type\u0027: str,"},{"line_number":37,"context_line":"                    \u0027name\u0027: \u0027group\u0027,"},{"line_number":38,"context_line":"                    \u0027pattern\u0027: r\u0027\\s*\u0027,  # TODO(stephenfin): Is this correct?"},{"line_number":39,"context_line":"                },"},{"line_number":40,"context_line":"            ],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_eb1f02b7","line":37,"range":{"start_line":37,"start_character":19,"end_line":37,"end_character":36},"in_reply_to":"3fa7e38b_39d5821a","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"}],"nova/api/validation/extra_specs/traits.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                {"},{"line_number":40,"context_line":"                    \u0027type\u0027: str,"},{"line_number":41,"context_line":"                    \u0027name\u0027: \u0027group\u0027,"},{"line_number":42,"context_line":"                    \u0027pattern\u0027: r\u0027\\s*\u0027,  # TODO(stephenfin): Is this correct?"},{"line_number":43,"context_line":"                },"},{"line_number":44,"context_line":"            ],"},{"line_number":45,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_199a065f","line":42,"range":{"start_line":42,"start_character":31,"end_line":42,"end_character":38},"updated":"2020-01-29 15:02:03.000000000","message":"i think the regex here would be \u0027(_[a-zA-z0-9_]*|\\d+)?\u0027","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                {"},{"line_number":40,"context_line":"                    \u0027type\u0027: str,"},{"line_number":41,"context_line":"                    \u0027name\u0027: \u0027group\u0027,"},{"line_number":42,"context_line":"                    \u0027pattern\u0027: r\u0027\\s*\u0027,  # TODO(stephenfin): Is this correct?"},{"line_number":43,"context_line":"                },"},{"line_number":44,"context_line":"            ],"},{"line_number":45,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_eb64e250","line":42,"range":{"start_line":42,"start_character":31,"end_line":42,"end_character":38},"in_reply_to":"3fa7e38b_199a065f","updated":"2020-01-30 13:13:40.000000000","message":"Done","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f26d7015f6ea609a4d34c921dde6b94d6e54c93d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                    \u0027name\u0027: \u0027group\u0027,"},{"line_number":42,"context_line":"                    \u0027pattern\u0027: r\u0027\\s*\u0027,  # TODO(stephenfin): Is this correct?"},{"line_number":43,"context_line":"                },"},{"line_number":44,"context_line":"            ],"},{"line_number":45,"context_line":"        )"},{"line_number":46,"context_line":"    )"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_f9ccca62","line":44,"updated":"2020-01-29 15:02:03.000000000","message":"{\n                    \u0027type\u0027: str,\n                    \u0027name\u0027: \u0027trait\u0027,\n                    \u0027pattern\u0027: r\u0027[a-zA-z0-9_]+\u0027, \n                },","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                    \u0027name\u0027: \u0027group\u0027,"},{"line_number":42,"context_line":"                    \u0027pattern\u0027: r\u0027\\s*\u0027,  # TODO(stephenfin): Is this correct?"},{"line_number":43,"context_line":"                },"},{"line_number":44,"context_line":"            ],"},{"line_number":45,"context_line":"        )"},{"line_number":46,"context_line":"    )"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_cb16c6a2","line":44,"in_reply_to":"3fa7e38b_f9ccca62","updated":"2020-01-30 13:13:40.000000000","message":"Oh, whoops. Good catch. I\u0027ll need tests for most/all of these.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"}],"nova/api/validation/extra_specs/validators.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":40,"context_line":"quota.register(EXTRA_SPEC_VALIDATORS)"},{"line_number":41,"context_line":"resources.register(EXTRA_SPEC_VALIDATORS)"},{"line_number":42,"context_line":"traits.register(EXTRA_SPEC_VALIDATORS)"},{"line_number":43,"context_line":"vmware.register(EXTRA_SPEC_VALIDATORS)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# TODO(stephenfin): Do this inside the \u0027register\u0027 calls instead"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_616826f2","line":43,"updated":"2020-01-29 14:09:03.000000000","message":"this is almost a circle in the call graph\n\n  validators-\u003e\n  \u003cmodule\u003e.register()-\u003e\n  validators.EXTRA_SPEC_VALIDATORS.extend()\n\nit feels strange but didn\u0027t thin it through","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":46,"context_line":"# TODO(stephenfin): Do this inside the \u0027register\u0027 calls instead"},{"line_number":47,"context_line":"EXTRA_SPEC_VALIDATORS_DICT \u003d {}"},{"line_number":48,"context_line":"for validator in EXTRA_SPEC_VALIDATORS:"},{"line_number":49,"context_line":"    EXTRA_SPEC_VALIDATORS_DICT[validator.name] \u003d validator"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def validate(name: str, value: str):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_2180ee9b","line":49,"range":{"start_line":49,"start_character":4,"end_line":49,"end_character":46},"updated":"2020-01-29 14:09:03.000000000","message":"I would raise an exception if a key already defined to help avoid duplicated validators","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":46,"context_line":"# TODO(stephenfin): Do this inside the \u0027register\u0027 calls instead"},{"line_number":47,"context_line":"EXTRA_SPEC_VALIDATORS_DICT \u003d {}"},{"line_number":48,"context_line":"for validator in EXTRA_SPEC_VALIDATORS:"},{"line_number":49,"context_line":"    EXTRA_SPEC_VALIDATORS_DICT[validator.name] \u003d validator"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def validate(name: str, value: str):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_cb6b261a","line":49,"range":{"start_line":49,"start_character":4,"end_line":49,"end_character":46},"in_reply_to":"3fa7e38b_2180ee9b","updated":"2020-01-30 13:13:40.000000000","message":"Yup, added a TODO to do this. This whole thing is a bit janky at the moment and needs to be shuffled around.","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"}],"nova/tests/functional/test_cross_cell_migrate.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"48940db7093c337bb949b1616f2e60503466b1b0","unresolved":false,"context_lines":[{"line_number":869,"context_line":"            \u0027disk\u0027: old_flavor[\u0027disk\u0027]"},{"line_number":870,"context_line":"        }"},{"line_number":871,"context_line":"        self.admin_api.post_flavor({\u0027flavor\u0027: new_flavor})"},{"line_number":872,"context_line":"        # TODO(stephenfin): What do I do with this???"},{"line_number":873,"context_line":"        self.admin_api.post_extra_spec(new_flavor[\u0027id\u0027],"},{"line_number":874,"context_line":"                                       {\u0027extra_specs\u0027: {\u0027foo\u0027: \u0027bar\u0027}})"},{"line_number":875,"context_line":"        # Enable AggregateInstanceExtraSpecsFilter and restart the scheduler."}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_e70f9829","line":872,"range":{"start_line":872,"start_character":10,"end_line":872,"end_character":53},"updated":"2020-02-10 20:59:29.000000000","message":"you can use the namespaced form\nso aggregate_instance_extra_specs:foo in the flavor\nand in teh validator just treat aggregate_instance_extra_specs:*\u003d* as valid.\n\nits considered bad pratice not to use the namespaced version anyway. using the unnamepsaced version breaks the compute capablity filter i believe in some cases.","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"958b04242acf4dab53565be5a21d435c75bad542","unresolved":false,"context_lines":[{"line_number":869,"context_line":"            \u0027disk\u0027: old_flavor[\u0027disk\u0027]"},{"line_number":870,"context_line":"        }"},{"line_number":871,"context_line":"        self.admin_api.post_flavor({\u0027flavor\u0027: new_flavor})"},{"line_number":872,"context_line":"        # TODO(stephenfin): What do I do with this???"},{"line_number":873,"context_line":"        self.admin_api.post_extra_spec(new_flavor[\u0027id\u0027],"},{"line_number":874,"context_line":"                                       {\u0027extra_specs\u0027: {\u0027foo\u0027: \u0027bar\u0027}})"},{"line_number":875,"context_line":"        # Enable AggregateInstanceExtraSpecsFilter and restart the scheduler."}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_041c2779","line":872,"range":{"start_line":872,"start_character":10,"end_line":872,"end_character":53},"in_reply_to":"3fa7e38b_c72b7c7a","updated":"2020-02-11 13:14:09.000000000","message":"\u003e actully come to think of it you proably need to  look at the filter\n \u003e and see if they use any other namespcaes that are not used in the\n \u003e drivers.\n \u003e \n \u003e e.g. aggregate_instance_extra_specs namespace is used by the\n \u003e AggregateInstanceExtraSpecsFilter\n\nI did this and found that one and \u0027capabilities:\u0027 (by the aforementioned \u0027ComputeCapabilitiesFilter\u0027","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"958b04242acf4dab53565be5a21d435c75bad542","unresolved":false,"context_lines":[{"line_number":869,"context_line":"            \u0027disk\u0027: old_flavor[\u0027disk\u0027]"},{"line_number":870,"context_line":"        }"},{"line_number":871,"context_line":"        self.admin_api.post_flavor({\u0027flavor\u0027: new_flavor})"},{"line_number":872,"context_line":"        # TODO(stephenfin): What do I do with this???"},{"line_number":873,"context_line":"        self.admin_api.post_extra_spec(new_flavor[\u0027id\u0027],"},{"line_number":874,"context_line":"                                       {\u0027extra_specs\u0027: {\u0027foo\u0027: \u0027bar\u0027}})"},{"line_number":875,"context_line":"        # Enable AggregateInstanceExtraSpecsFilter and restart the scheduler."}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_c44ccf98","line":872,"range":{"start_line":872,"start_character":10,"end_line":872,"end_character":53},"in_reply_to":"3fa7e38b_e70f9829","updated":"2020-02-11 13:14:09.000000000","message":"\u003e you can use the namespaced form\n \u003e so aggregate_instance_extra_specs:foo in the flavor\n \u003e and in teh validator just treat aggregate_instance_extra_specs:*\u003d*\n \u003e as valid.\n\nYeah, that\u0027s what I\u0027ve decided. If someone really wants to use the non-namespaced variant, they can disable validation.\n\n \u003e its considered bad pratice not to use the namespaced version\n \u003e anyway. using the unnamepsaced version breaks the compute capablity\n \u003e filter i believe in some cases.","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"05b93bd9c2f3f648ea545d2e371e6312f1a8b6c9","unresolved":false,"context_lines":[{"line_number":869,"context_line":"            \u0027disk\u0027: old_flavor[\u0027disk\u0027]"},{"line_number":870,"context_line":"        }"},{"line_number":871,"context_line":"        self.admin_api.post_flavor({\u0027flavor\u0027: new_flavor})"},{"line_number":872,"context_line":"        # TODO(stephenfin): What do I do with this???"},{"line_number":873,"context_line":"        self.admin_api.post_extra_spec(new_flavor[\u0027id\u0027],"},{"line_number":874,"context_line":"                                       {\u0027extra_specs\u0027: {\u0027foo\u0027: \u0027bar\u0027}})"},{"line_number":875,"context_line":"        # Enable AggregateInstanceExtraSpecsFilter and restart the scheduler."}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_c72b7c7a","line":872,"range":{"start_line":872,"start_character":10,"end_line":872,"end_character":53},"in_reply_to":"3fa7e38b_e70f9829","updated":"2020-02-10 21:00:42.000000000","message":"actully come to think of it you proably need to  look at the filter and see if they use any other namespcaes that are not used in the drivers.\n\ne.g. aggregate_instance_extra_specs namespace is used by the AggregateInstanceExtraSpecsFilter","commit_id":"3b0233f15772f10607caa2261195875222eb76cf"}],"setup.cfg":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b2844b816f8315997d2812847dd9eae444cc5c44","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    # list_rules method into a separate entry point rather than using the"},{"line_number":47,"context_line":"    # aggregate method."},{"line_number":48,"context_line":"    nova \u003d nova.policies:list_rules"},{"line_number":49,"context_line":"nova.api.extra_spec_validators \u003d"},{"line_number":50,"context_line":"    aggregate_instance_extra_specs \u003d nova.api.validation.extra_specs.aggregate_instance_extra_specs"},{"line_number":51,"context_line":"    capabilities \u003d nova.api.validation.extra_specs.capabilities"},{"line_number":52,"context_line":"    hw \u003d nova.api.validation.extra_specs.hw"},{"line_number":53,"context_line":"    hw_rng \u003d nova.api.validation.extra_specs.hw_rng"},{"line_number":54,"context_line":"    hw_video \u003d nova.api.validation.extra_specs.hw_video"},{"line_number":55,"context_line":"    null \u003d nova.api.validation.extra_specs.null"},{"line_number":56,"context_line":"    os \u003d nova.api.validation.extra_specs.os"},{"line_number":57,"context_line":"    pci_passthrough \u003d nova.api.validation.extra_specs.pci_passthrough"},{"line_number":58,"context_line":"    powervm \u003d nova.api.validation.extra_specs.powervm"},{"line_number":59,"context_line":"    quota \u003d nova.api.validation.extra_specs.quota"},{"line_number":60,"context_line":"    resources \u003d nova.api.validation.extra_specs.resources"},{"line_number":61,"context_line":"    traits \u003d nova.api.validation.extra_specs.traits"},{"line_number":62,"context_line":"    vmware \u003d nova.api.validation.extra_specs.vmware"},{"line_number":63,"context_line":"nova.compute.monitors.cpu \u003d"},{"line_number":64,"context_line":"    virt_driver \u003d nova.compute.monitors.cpu.virt_driver:Monitor"},{"line_number":65,"context_line":"nova.scheduler.driver \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":22,"id":"df33271e_9fcac14c","line":62,"range":{"start_line":49,"start_character":0,"end_line":62,"end_character":51},"updated":"2020-04-06 17:35:23.000000000","message":"nit: in the docs we should use this way of doing it as the example IMO","commit_id":"64ea3c4a1685d5cc124243a50793425002061c09"}],"tox.ini":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fa6b87a036c2e2214b552a1c200c0dac04ea2d54","unresolved":false,"context_lines":[{"line_number":238,"context_line":"# E731 temporarily skipped because of the number of"},{"line_number":239,"context_line":"# these that have to be fixed"},{"line_number":240,"context_line":"enable-extensions \u003d H106,H203,H904"},{"line_number":241,"context_line":"ignore \u003d E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E251,H405,W504,E731,H238"},{"line_number":242,"context_line":"exclude \u003d  .venv,.git,.tox,dist,*lib/python*,*egg,build,tools/xenserver*,releasenotes"},{"line_number":243,"context_line":"# To get a list of functions that are more complex than 25, set max-complexity"},{"line_number":244,"context_line":"# to 25 and run \u0027tox -epep8\u0027."}],"source_content_type":"text/x-properties","patch_set":2,"id":"3fa7e38b_2161ced4","line":241,"range":{"start_line":241,"start_character":79,"end_line":241,"end_character":83},"updated":"2020-01-29 14:09:03.000000000","message":"why we need old style classes?","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b5b417606125aaa06e8e3a40f4559b4d229af14","unresolved":false,"context_lines":[{"line_number":238,"context_line":"# E731 temporarily skipped because of the number of"},{"line_number":239,"context_line":"# these that have to be fixed"},{"line_number":240,"context_line":"enable-extensions \u003d H106,H203,H904"},{"line_number":241,"context_line":"ignore \u003d E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E251,H405,W504,E731,H238"},{"line_number":242,"context_line":"exclude \u003d  .venv,.git,.tox,dist,*lib/python*,*egg,build,tools/xenserver*,releasenotes"},{"line_number":243,"context_line":"# To get a list of functions that are more complex than 25, set max-complexity"},{"line_number":244,"context_line":"# to 25 and run \u0027tox -epep8\u0027."}],"source_content_type":"text/x-properties","patch_set":2,"id":"3fa7e38b_4b59768b","line":241,"range":{"start_line":241,"start_character":79,"end_line":241,"end_character":83},"in_reply_to":"3fa7e38b_13c41694","updated":"2020-01-30 13:13:40.000000000","message":":( \n\n  nova/api/validation/extra_specs/base.py:23:1: H238: old style class declaration, use new style (inherit from `object`)\n\nLooks like we need to make hacking Python 3 only and drop this rule, else fix it to do different things in Python 3","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1b1f953b47d79f1f6d2bb303a101f3da417576b2","unresolved":false,"context_lines":[{"line_number":238,"context_line":"# E731 temporarily skipped because of the number of"},{"line_number":239,"context_line":"# these that have to be fixed"},{"line_number":240,"context_line":"enable-extensions \u003d H106,H203,H904"},{"line_number":241,"context_line":"ignore \u003d E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E251,H405,W504,E731,H238"},{"line_number":242,"context_line":"exclude \u003d  .venv,.git,.tox,dist,*lib/python*,*egg,build,tools/xenserver*,releasenotes"},{"line_number":243,"context_line":"# To get a list of functions that are more complex than 25, set max-complexity"},{"line_number":244,"context_line":"# to 25 and run \u0027tox -epep8\u0027."}],"source_content_type":"text/x-properties","patch_set":2,"id":"3fa7e38b_b96f325f","line":241,"range":{"start_line":241,"start_character":79,"end_line":241,"end_character":83},"in_reply_to":"3fa7e38b_2161ced4","updated":"2020-01-29 14:55:06.000000000","message":"This was picking up [1] as what seemed like a false positive. However, maybe it\u0027ll be okay if I drop the brackets. I\u0027ll try that and remove it if so. If not, it means this hacking rule is returning a false positive.\n\n[1] https://review.opendev.org/#/c/704643/2/nova/api/validation/extra_specs/base.py@23","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"440af53994a5a5b244b94e61f315f6e9702bb4b0","unresolved":false,"context_lines":[{"line_number":238,"context_line":"# E731 temporarily skipped because of the number of"},{"line_number":239,"context_line":"# these that have to be fixed"},{"line_number":240,"context_line":"enable-extensions \u003d H106,H203,H904"},{"line_number":241,"context_line":"ignore \u003d E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E251,H405,W504,E731,H238"},{"line_number":242,"context_line":"exclude \u003d  .venv,.git,.tox,dist,*lib/python*,*egg,build,tools/xenserver*,releasenotes"},{"line_number":243,"context_line":"# To get a list of functions that are more complex than 25, set max-complexity"},{"line_number":244,"context_line":"# to 25 and run \u0027tox -epep8\u0027."}],"source_content_type":"text/x-properties","patch_set":2,"id":"3fa7e38b_13c41694","line":241,"range":{"start_line":241,"start_character":79,"end_line":241,"end_character":83},"in_reply_to":"3fa7e38b_b96f325f","updated":"2020-01-30 09:24:02.000000000","message":"ack","commit_id":"4209c2c02a5c7963c457e39120350737391aa5d0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f2cdd638b611a24f1f20bcc9664b8afbe0490b7","unresolved":false,"context_lines":[{"line_number":238,"context_line":"# E731 temporarily skipped because of the number of"},{"line_number":239,"context_line":"# these that have to be fixed"},{"line_number":240,"context_line":"enable-extensions \u003d H106,H203,H904"},{"line_number":241,"context_line":"ignore \u003d E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E251,H405,W504,E731,H238"},{"line_number":242,"context_line":"exclude \u003d  .venv,.git,.tox,dist,*lib/python*,*egg,build,tools/xenserver*,releasenotes"},{"line_number":243,"context_line":"# To get a list of functions that are more complex than 25, set max-complexity"},{"line_number":244,"context_line":"# to 25 and run \u0027tox -epep8\u0027."}],"source_content_type":"text/x-properties","patch_set":11,"id":"1fa4df85_2534654a","line":241,"range":{"start_line":241,"start_character":79,"end_line":241,"end_character":83},"updated":"2020-02-25 11:39:12.000000000","message":"note to myself: hacking is broken in py3","commit_id":"0203ca1b29d54f703bb04b8374aa8a9fdef8d3a0"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"46ee20ebf3ea31494dbbb51e057ff87f6542bdac","unresolved":false,"context_lines":[{"line_number":238,"context_line":"# E731 temporarily skipped because of the number of"},{"line_number":239,"context_line":"# these that have to be fixed"},{"line_number":240,"context_line":"enable-extensions \u003d H106,H203,H904"},{"line_number":241,"context_line":"ignore \u003d E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E251,H405,W504,E731,H238"},{"line_number":242,"context_line":"exclude \u003d  .venv,.git,.tox,dist,*lib/python*,*egg,build,tools/xenserver*,releasenotes"},{"line_number":243,"context_line":"# To get a list of functions that are more complex than 25, set max-complexity"},{"line_number":244,"context_line":"# to 25 and run \u0027tox -epep8\u0027."}],"source_content_type":"text/x-properties","patch_set":21,"id":"df33271e_09ffa867","line":241,"updated":"2020-04-06 10:07:56.000000000","message":"While I understand *why* you want to avoid H238, you should document it at least in the commit msg so that we can easily track (with a git blame) later if we want to un-ignore it.","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"afdda9f777a4c4ca7ce0b3c97b703af9cc0fd9b1","unresolved":false,"context_lines":[{"line_number":238,"context_line":"# E731 temporarily skipped because of the number of"},{"line_number":239,"context_line":"# these that have to be fixed"},{"line_number":240,"context_line":"enable-extensions \u003d H106,H203,H904"},{"line_number":241,"context_line":"ignore \u003d E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E251,H405,W504,E731,H238"},{"line_number":242,"context_line":"exclude \u003d  .venv,.git,.tox,dist,*lib/python*,*egg,build,tools/xenserver*,releasenotes"},{"line_number":243,"context_line":"# To get a list of functions that are more complex than 25, set max-complexity"},{"line_number":244,"context_line":"# to 25 and run \u0027tox -epep8\u0027."}],"source_content_type":"text/x-properties","patch_set":21,"id":"df33271e_5f5fa20d","line":241,"in_reply_to":"df33271e_09ffa867","updated":"2020-04-06 11:07:46.000000000","message":"We won\u0027t want to unignore it. If anything, it\u0027s probably time we removed that from hacking :)","commit_id":"e4c9d496b21cd5cb883b1d63744649698fd2cec4"}]}
