)]}'
{"nova/api/validation/extra_specs/traits.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9a4ffa4ebf49d8fc0dd92b59c2209f1d63169847","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        parameters\u003d["},{"line_number":59,"context_line":"            {"},{"line_number":60,"context_line":"                \u0027name\u0027: \u0027group\u0027,"},{"line_number":61,"context_line":"                \u0027pattern\u0027: r\u0027(_[a-zA-z0-9_]*|\\d+)?\u0027,"},{"line_number":62,"context_line":"            },"},{"line_number":63,"context_line":"            {"},{"line_number":64,"context_line":"                \u0027name\u0027: \u0027trait\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"df33271e_237085dc","line":61,"range":{"start_line":61,"start_character":30,"end_line":61,"end_character":31},"updated":"2020-04-08 14:39:19.000000000","message":"The group does not have to start with \u0027_\u0027 if it is a string\n\nIn microversions 1.25 - 1.32 the suffix is a number.\n\nStarting from microversion 1.33 the suffix is a string that may be 1-64 characters long and consist of numbers, a-z, A-Z, -, and _.","commit_id":"245bfac99c15ee77c1a49f44f2ff313b25cb12d9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"28dc7bf03a9325462e4f2c498e385b48ed08cbc8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        parameters\u003d["},{"line_number":59,"context_line":"            {"},{"line_number":60,"context_line":"                \u0027name\u0027: \u0027group\u0027,"},{"line_number":61,"context_line":"                \u0027pattern\u0027: r\u0027(_[a-zA-z0-9_]*|\\d+)?\u0027,"},{"line_number":62,"context_line":"            },"},{"line_number":63,"context_line":"            {"},{"line_number":64,"context_line":"                \u0027name\u0027: \u0027trait\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"df33271e_1d283932","line":61,"range":{"start_line":61,"start_character":30,"end_line":61,"end_character":31},"in_reply_to":"df33271e_237085dc","updated":"2020-04-08 16:00:05.000000000","message":"Done","commit_id":"245bfac99c15ee77c1a49f44f2ff313b25cb12d9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9a4ffa4ebf49d8fc0dd92b59c2209f1d63169847","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            },"},{"line_number":63,"context_line":"            {"},{"line_number":64,"context_line":"                \u0027name\u0027: \u0027trait\u0027,"},{"line_number":65,"context_line":"                \u0027pattern\u0027: r\u0027.+\u0027,"},{"line_number":66,"context_line":"            },"},{"line_number":67,"context_line":"        ],"},{"line_number":68,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":2,"id":"df33271e_03dd8113","line":65,"range":{"start_line":65,"start_character":27,"end_line":65,"end_character":33},"updated":"2020-04-08 14:39:19.000000000","message":"stack@aio:/opt/stack/nova$ openstack --os-placement-api-version 1.28 trait create CUSTOM_foo\nThe trait is invalid. A valid trait must be no longer than 255 characters, start with the prefix \"CUSTOM_\" and use following characters: \"A\"-\"Z\", \"0\"-\"9\" and \"_\" (HTTP 400)\n\nI guess nova does not restricted this before.\n\nalso for resource classes\n\nstack@aio:/opt/stack/nova$ openstack --os-placement-api-version 1.28 resource class create CUSTOM_foo\nJSON does not validate: \u0027CUSTOM_foo\u0027 does not match \u0027^CUSTOM_[A-Z0-9_]+$\u0027  Failed validating \u0027pattern\u0027 in schema[\u0027properties\u0027][\u0027name\u0027]:     {\u0027maxLength\u0027: 255, \u0027pattern\u0027: \u0027^CUSTOM_[A-Z0-9_]+$\u0027, \u0027type\u0027: \u0027string\u0027}  On instance[\u0027name\u0027]:     \u0027CUSTOM_foo\u0027 (HTTP 400)","commit_id":"245bfac99c15ee77c1a49f44f2ff313b25cb12d9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"28dc7bf03a9325462e4f2c498e385b48ed08cbc8","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            },"},{"line_number":63,"context_line":"            {"},{"line_number":64,"context_line":"                \u0027name\u0027: \u0027trait\u0027,"},{"line_number":65,"context_line":"                \u0027pattern\u0027: r\u0027.+\u0027,"},{"line_number":66,"context_line":"            },"},{"line_number":67,"context_line":"        ],"},{"line_number":68,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":2,"id":"df33271e_fd2ab529","line":65,"range":{"start_line":65,"start_character":27,"end_line":65,"end_character":33},"in_reply_to":"df33271e_03dd8113","updated":"2020-04-08 16:00:05.000000000","message":"Done","commit_id":"245bfac99c15ee77c1a49f44f2ff313b25cb12d9"}],"nova/tests/unit/api/openstack/compute/test_flavors_extra_specs.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9de168cd78ca03d70a4f18e7b2211e6dcf745bb9","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            \u0027trait:bar\u0027: \u0027required\u0027,"},{"line_number":282,"context_line":"            \u0027trait_foo:bar\u0027: \u0027required\u0027,"},{"line_number":283,"context_line":"            \u0027trait:CUSTOM_FOO\u0027: \u0027bar\u0027,"},{"line_number":284,"context_line":"            \u0027trait_foo:CUSTOM_BAR\u0027: \u0027foo\u0027,"},{"line_number":285,"context_line":"        }"},{"line_number":286,"context_line":"        for key, value in invalid_specs.items():"},{"line_number":287,"context_line":"            body \u003d {\u0027extra_specs\u0027: {key: value}}"}],"source_content_type":"text/x-python","patch_set":2,"id":"df33271e_a34f7532","line":284,"range":{"start_line":284,"start_character":11,"end_line":284,"end_character":42},"updated":"2020-04-08 14:24:04.000000000","message":"we consider this invalid because foo in trait_foo is not an int although you could argue that it is an unknow namespace and should pass.\n\ni think this behavior is correct as we are asserting that\ntrait_* namespaces are all owned/knonw namespaces","commit_id":"245bfac99c15ee77c1a49f44f2ff313b25cb12d9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6167d23c98d4872fdd931ecfe7bd243bcdb37629","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            \u0027trait:bar\u0027: \u0027required\u0027,"},{"line_number":282,"context_line":"            \u0027trait_foo:bar\u0027: \u0027required\u0027,"},{"line_number":283,"context_line":"            \u0027trait:CUSTOM_FOO\u0027: \u0027bar\u0027,"},{"line_number":284,"context_line":"            \u0027trait_foo:CUSTOM_BAR\u0027: \u0027foo\u0027,"},{"line_number":285,"context_line":"        }"},{"line_number":286,"context_line":"        for key, value in invalid_specs.items():"},{"line_number":287,"context_line":"            body \u003d {\u0027extra_specs\u0027: {key: value}}"}],"source_content_type":"text/x-python","patch_set":2,"id":"df33271e_1dddd941","line":284,"range":{"start_line":284,"start_character":11,"end_line":284,"end_character":42},"in_reply_to":"df33271e_63f44d88","updated":"2020-04-08 16:00:25.000000000","message":"Done","commit_id":"245bfac99c15ee77c1a49f44f2ff313b25cb12d9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9a4ffa4ebf49d8fc0dd92b59c2209f1d63169847","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            \u0027trait:bar\u0027: \u0027required\u0027,"},{"line_number":282,"context_line":"            \u0027trait_foo:bar\u0027: \u0027required\u0027,"},{"line_number":283,"context_line":"            \u0027trait:CUSTOM_FOO\u0027: \u0027bar\u0027,"},{"line_number":284,"context_line":"            \u0027trait_foo:CUSTOM_BAR\u0027: \u0027foo\u0027,"},{"line_number":285,"context_line":"        }"},{"line_number":286,"context_line":"        for key, value in invalid_specs.items():"},{"line_number":287,"context_line":"            body \u003d {\u0027extra_specs\u0027: {key: value}}"}],"source_content_type":"text/x-python","patch_set":2,"id":"df33271e_63f44d88","line":284,"range":{"start_line":284,"start_character":11,"end_line":284,"end_character":42},"in_reply_to":"df33271e_a34f7532","updated":"2020-04-08 14:39:19.000000000","message":"In placement microversions 1.25 - 1.32 the group suffix is a number.\n\nStarting from microversion 1.33 the suffix is a string that may be 1-64 characters long and consist of numbers, a-z, A-Z, -, and _.\n\nso trait_foo:CUSTOM_BAR is valid key BUT the value should be either \u0027required\u0027 or \u0027forbidden\u0027. So I think this case is a valid negative case","commit_id":"245bfac99c15ee77c1a49f44f2ff313b25cb12d9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9de168cd78ca03d70a4f18e7b2211e6dcf745bb9","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            \u0027trait:STORAGE_DISK_SSD\u0027: \u0027forbidden\u0027,"},{"line_number":321,"context_line":"            \u0027trait_foo:HW_CPU_X86_AVX2\u0027: \u0027required\u0027,"},{"line_number":322,"context_line":"            \u0027trait:CUSTOM_FOO\u0027: \u0027forbidden\u0027,"},{"line_number":323,"context_line":"            \u0027trait_foo:CUSTOM_BAR\u0027: \u0027required\u0027,"},{"line_number":324,"context_line":"        }"},{"line_number":325,"context_line":"        mock_flavor_extra_specs.side_effect \u003d return_create_flavor_extra_specs"},{"line_number":326,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"df33271e_a399357a","line":323,"range":{"start_line":323,"start_character":12,"end_line":323,"end_character":47},"updated":"2020-04-08 14:24:04.000000000","message":"that said im not 100% sure if this makes sense anymore.\n\ntrait_foo cant booth be a knonw and unknonw namespace at the same time.","commit_id":"245bfac99c15ee77c1a49f44f2ff313b25cb12d9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7ade7e05f3a11b3602b185b0031d8b014b9d39d5","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            \u0027trait:STORAGE_DISK_SSD\u0027: \u0027forbidden\u0027,"},{"line_number":321,"context_line":"            \u0027trait_foo:HW_CPU_X86_AVX2\u0027: \u0027required\u0027,"},{"line_number":322,"context_line":"            \u0027trait:CUSTOM_FOO\u0027: \u0027forbidden\u0027,"},{"line_number":323,"context_line":"            \u0027trait_foo:CUSTOM_BAR\u0027: \u0027required\u0027,"},{"line_number":324,"context_line":"        }"},{"line_number":325,"context_line":"        mock_flavor_extra_specs.side_effect \u003d return_create_flavor_extra_specs"},{"line_number":326,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"df33271e_1d99596d","line":323,"range":{"start_line":323,"start_character":12,"end_line":323,"end_character":47},"in_reply_to":"df33271e_1db679fb","updated":"2020-04-08 16:04:00.000000000","message":"sorry missread this i taugh this was part of \ntest_create_invalid_unknown_namespace","commit_id":"245bfac99c15ee77c1a49f44f2ff313b25cb12d9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f951a55954bd0cb9892d81281b716033a4d74a06","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            \u0027trait:STORAGE_DISK_SSD\u0027: \u0027forbidden\u0027,"},{"line_number":321,"context_line":"            \u0027trait_foo:HW_CPU_X86_AVX2\u0027: \u0027required\u0027,"},{"line_number":322,"context_line":"            \u0027trait:CUSTOM_FOO\u0027: \u0027forbidden\u0027,"},{"line_number":323,"context_line":"            \u0027trait_foo:CUSTOM_BAR\u0027: \u0027required\u0027,"},{"line_number":324,"context_line":"        }"},{"line_number":325,"context_line":"        mock_flavor_extra_specs.side_effect \u003d return_create_flavor_extra_specs"},{"line_number":326,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"df33271e_1db679fb","line":323,"range":{"start_line":323,"start_character":12,"end_line":323,"end_character":47},"in_reply_to":"df33271e_a399357a","updated":"2020-04-08 16:01:59.000000000","message":"I consider this a known namespace, so I think this makes sense to have here, right?","commit_id":"245bfac99c15ee77c1a49f44f2ff313b25cb12d9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cb385223b549d41c1d9c65ddaff53b6866e07cb9","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        for key, value in valid_specs.items():"},{"line_number":329,"context_line":"            body \u003d {\"extra_specs\": {key: value}}"},{"line_number":330,"context_line":"            req \u003d self._get_request("},{"line_number":331,"context_line":"                \u00271/os-extra_specs\u0027, use_admin_context\u003dTrue, version\u003d\u00272.86\u0027,"},{"line_number":332,"context_line":"            )"},{"line_number":333,"context_line":"            res_dict \u003d self.controller.create(req, 1, body\u003dbody)"},{"line_number":334,"context_line":"            self.assertEqual(value, res_dict[\u0027extra_specs\u0027][key])"}],"source_content_type":"text/x-python","patch_set":3,"id":"df33271e_3871cbdf","line":331,"range":{"start_line":331,"start_character":59,"end_line":331,"end_character":75},"updated":"2020-04-08 16:47:17.000000000","message":"yep that is important :)","commit_id":"b2ff030a45da9527aee04254c1d19e462188dfea"}],"nova/tests/unit/api/validation/extra_specs/test_validators.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5229207902cea65c3c4e8dbedcb8fef25b8ace63","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            \u0027accel\u0027, \u0027aggregate_instance_extra_specs\u0027, \u0027capabilities\u0027, \u0027hw\u0027,"},{"line_number":31,"context_line":"            \u0027hw_rng\u0027, \u0027hw_video\u0027, \u0027os\u0027, \u0027pci_passthrough\u0027, \u0027powervm\u0027, \u0027quota\u0027,"},{"line_number":32,"context_line":"            \u0027resources(?P\u003cgroup\u003e([a-zA-Z0-9_-]{1,64})?)\u0027,"},{"line_number":33,"context_line":"            \u0027trait(?P\u003cgroup\u003e([a-zA-Z0-9_-]{1,64})?)\u0027, \u0027vmware\u0027,"},{"line_number":34,"context_line":"        }"},{"line_number":35,"context_line":"        self.assertTrue("},{"line_number":36,"context_line":"            namespaces.issubset(validators.NAMESPACES),"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_892fd486","line":33,"range":{"start_line":33,"start_character":40,"end_line":33,"end_character":41},"updated":"2020-04-09 09:24:17.000000000","message":"AFAIK, Placement doesn\u0027t support dashes for trait names. Checking","commit_id":"9b15f347d5f2f19701331e68c116ccc5a0a128d3"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b2892d284e10beab82d1a4cf2478c55b889b7af9","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            \u0027accel\u0027, \u0027aggregate_instance_extra_specs\u0027, \u0027capabilities\u0027, \u0027hw\u0027,"},{"line_number":31,"context_line":"            \u0027hw_rng\u0027, \u0027hw_video\u0027, \u0027os\u0027, \u0027pci_passthrough\u0027, \u0027powervm\u0027, \u0027quota\u0027,"},{"line_number":32,"context_line":"            \u0027resources(?P\u003cgroup\u003e([a-zA-Z0-9_-]{1,64})?)\u0027,"},{"line_number":33,"context_line":"            \u0027trait(?P\u003cgroup\u003e([a-zA-Z0-9_-]{1,64})?)\u0027, \u0027vmware\u0027,"},{"line_number":34,"context_line":"        }"},{"line_number":35,"context_line":"        self.assertTrue("},{"line_number":36,"context_line":"            namespaces.issubset(validators.NAMESPACES),"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_df37ceaf","line":33,"range":{"start_line":33,"start_character":40,"end_line":33,"end_character":41},"in_reply_to":"df33271e_3fc35a8b","updated":"2020-04-09 11:07:12.000000000","message":"This isn\u0027t the trait name - it\u0027s the optional group. Remember - these are namespaces, i.e. the thing on the left of the \u0027:\u0027","commit_id":"9b15f347d5f2f19701331e68c116ccc5a0a128d3"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"2fa9c972599be1acc9da2832a253ac81e81e4cd7","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            \u0027accel\u0027, \u0027aggregate_instance_extra_specs\u0027, \u0027capabilities\u0027, \u0027hw\u0027,"},{"line_number":31,"context_line":"            \u0027hw_rng\u0027, \u0027hw_video\u0027, \u0027os\u0027, \u0027pci_passthrough\u0027, \u0027powervm\u0027, \u0027quota\u0027,"},{"line_number":32,"context_line":"            \u0027resources(?P\u003cgroup\u003e([a-zA-Z0-9_-]{1,64})?)\u0027,"},{"line_number":33,"context_line":"            \u0027trait(?P\u003cgroup\u003e([a-zA-Z0-9_-]{1,64})?)\u0027, \u0027vmware\u0027,"},{"line_number":34,"context_line":"        }"},{"line_number":35,"context_line":"        self.assertTrue("},{"line_number":36,"context_line":"            namespaces.issubset(validators.NAMESPACES),"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_3fc35a8b","line":33,"range":{"start_line":33,"start_character":40,"end_line":33,"end_character":41},"in_reply_to":"df33271e_892fd486","updated":"2020-04-09 11:05:37.000000000","message":"Yup, indeed https://github.com/openstack/placement/blob/d38844e/placement/schemas/common.py#L20\n\nnova can accept anything since it normalizes names *before* calling Placement, but the Placement API refuses to create custom traits with names not matching with the regex above.\nSo, from a flavor perspective, traits are always mentioned using the syntax above (in other words, you can even drop the lowercase)","commit_id":"9b15f347d5f2f19701331e68c116ccc5a0a128d3"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"926b28b1ac12de9cf475fd502ff4d808f5b1f5a3","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            \u0027accel\u0027, \u0027aggregate_instance_extra_specs\u0027, \u0027capabilities\u0027, \u0027hw\u0027,"},{"line_number":31,"context_line":"            \u0027hw_rng\u0027, \u0027hw_video\u0027, \u0027os\u0027, \u0027pci_passthrough\u0027, \u0027powervm\u0027, \u0027quota\u0027,"},{"line_number":32,"context_line":"            \u0027resources(?P\u003cgroup\u003e([a-zA-Z0-9_-]{1,64})?)\u0027,"},{"line_number":33,"context_line":"            \u0027trait(?P\u003cgroup\u003e([a-zA-Z0-9_-]{1,64})?)\u0027, \u0027vmware\u0027,"},{"line_number":34,"context_line":"        }"},{"line_number":35,"context_line":"        self.assertTrue("},{"line_number":36,"context_line":"            namespaces.issubset(validators.NAMESPACES),"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_1f5776cc","line":33,"range":{"start_line":33,"start_character":40,"end_line":33,"end_character":41},"in_reply_to":"df33271e_df37ceaf","updated":"2020-04-09 11:08:30.000000000","message":"You\u0027re crazy right, the regex expresses by itself.","commit_id":"9b15f347d5f2f19701331e68c116ccc5a0a128d3"}]}
