)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"7f6fd40d01eccdc292707ec89e4928c372e6a19b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"a18b0191_b812ec79","updated":"2021-11-23 12:43:54.000000000","message":"run-DellEMC PowerFlex CI","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"d63b3e5772c23c5522c90e435f58ce8ac5dcc483","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"0a2b3b59_8ae74873","updated":"2021-11-29 14:08:44.000000000","message":"Thank you for your review! Should be better now.","commit_id":"5d8dc7d0b7b03d0b99626ad1ae7bfd46bd9a4d15"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ffac4c5417fca1fba526fac4b993e35e6c63e394","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0a1a583c_e21c31e5","updated":"2022-05-03 23:11:51.000000000","message":"almost ready to go, 1 comment on adding one more tests.\n\nAlso, please re-propose this spec for Zed cycle - https://review.opendev.org/c/openstack/nova-specs/+/785674","commit_id":"dec83049138cd856b099f907d2fe58a3695746e2"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"87282f8e5b076c709859ce6d458a55b641283c3d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"1276f71a_297388f2","updated":"2022-07-22 09:08:58.000000000","message":"https://review.opendev.org/c/openstack/nova/+/849133 is superseding this. ","commit_id":"dec83049138cd856b099f907d2fe58a3695746e2"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"776495e26f90e16de379d1709ced65bb2b122cb1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"2cce673b_3960ac8f","updated":"2021-12-10 09:18:14.000000000","message":"recheck","commit_id":"dec83049138cd856b099f907d2fe58a3695746e2"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"019f1744dcb2d8167a5ef5ca5397a06dd048bf36","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"5c4f6d06_46f519b3","updated":"2021-12-20 14:32:32.000000000","message":"recheck","commit_id":"dec83049138cd856b099f907d2fe58a3695746e2"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"c07b2d367c4e94e3f04a8012c71ba685ce7d8f43","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0295a3c3_98904426","updated":"2021-11-30 17:45:26.000000000","message":"run-Cloudbase Nova Hyper-V CI","commit_id":"dec83049138cd856b099f907d2fe58a3695746e2"}],"doc/api_samples/os-keypairs/v2.91/keypairs-post-req.json":[{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"1c311bbffc5eb58f7b49057d296ed298605cad3f","unresolved":true,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"keypair\": {"},{"line_number":3,"context_line":"        \"name\": \"keypair-ab9ff2e6-a6d7-4915-a241-044c369c07f9\","},{"line_number":4,"context_line":"        \"type\": \"ssh\","},{"line_number":5,"context_line":"        \"user_id\": \"fake\""},{"line_number":6,"context_line":"    }"}],"source_content_type":"application/json","patch_set":5,"id":"d6b17869_4a2795a4","line":3,"range":{"start_line":3,"start_character":17,"end_line":3,"end_character":61},"updated":"2021-11-25 09:53:24.000000000","message":"Did you want to include an example here?","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"c07b2d367c4e94e3f04a8012c71ba685ce7d8f43","unresolved":true,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"keypair\": {"},{"line_number":3,"context_line":"        \"name\": \"keypair-ab9ff2e6-a6d7-4915-a241-044c369c07f9\","},{"line_number":4,"context_line":"        \"type\": \"ssh\","},{"line_number":5,"context_line":"        \"user_id\": \"fake\""},{"line_number":6,"context_line":"    }"}],"source_content_type":"application/json","patch_set":5,"id":"d023ce53_0357b8ff","line":3,"range":{"start_line":3,"start_character":17,"end_line":3,"end_character":61},"in_reply_to":"74759a1a_85163e76","updated":"2021-11-30 17:45:26.000000000","message":"Actually, modifying this example means also overriding some regexp used to validate keypair name in functional tests (https://opendev.org/openstack/nova/src/branch/master/nova/tests/functional/api_sample_tests/test_keypairs.py#L267), as my KeyPairsV291SampleJsonTest tests inherits from KeyPairsV235SampleJsonTest.\n\nAnd overriding this `generalize_subs` method makes some tests from previous microversions to fail...\n\nI\u0027d be tempted to think overriding previous tests or not running them by removing inheritance is not worth doing just to display this example in the doc... Especially as the documentation will clearly show the allowed characters (see https://review.opendev.org/c/openstack/nova/+/781076/7/api-ref/source/parameters.yaml).\nThough if you think it is necessary, I can surely do that.\n\nWhat do you think?","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"67e3992c834df10c06bca005674859dea4995675","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"keypair\": {"},{"line_number":3,"context_line":"        \"name\": \"keypair-ab9ff2e6-a6d7-4915-a241-044c369c07f9\","},{"line_number":4,"context_line":"        \"type\": \"ssh\","},{"line_number":5,"context_line":"        \"user_id\": \"fake\""},{"line_number":6,"context_line":"    }"}],"source_content_type":"application/json","patch_set":5,"id":"18359e29_83455bfd","line":3,"range":{"start_line":3,"start_character":17,"end_line":3,"end_character":61},"in_reply_to":"d023ce53_0357b8ff","updated":"2022-02-14 13:52:32.000000000","message":"I resolve this discussion as I don\u0027t think it\u0027s vital for the feature, but feel free to reopen it if you think it is necessary","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"d63b3e5772c23c5522c90e435f58ce8ac5dcc483","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"keypair\": {"},{"line_number":3,"context_line":"        \"name\": \"keypair-ab9ff2e6-a6d7-4915-a241-044c369c07f9\","},{"line_number":4,"context_line":"        \"type\": \"ssh\","},{"line_number":5,"context_line":"        \"user_id\": \"fake\""},{"line_number":6,"context_line":"    }"}],"source_content_type":"application/json","patch_set":5,"id":"74759a1a_85163e76","line":3,"range":{"start_line":3,"start_character":17,"end_line":3,"end_character":61},"in_reply_to":"d6b17869_4a2795a4","updated":"2021-11-29 14:08:44.000000000","message":"I updated the keypair name for this to be an example","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"}],"nova/api/validation/validators.py":[{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"6b2079f33fdd84bfc3fa0c6a3a56bb6f77330c9c","unresolved":true,"context_lines":[{"line_number":171,"context_line":"def _validate_keypair_name(keypair_name, safe_chars):"},{"line_number":172,"context_line":"    clean_value \u003d \"\".join(x for x in keypair_name if x in safe_chars)"},{"line_number":173,"context_line":"    if clean_value !\u003d keypair_name:"},{"line_number":174,"context_line":"        reason \u003d _(\"Only expected characters: [%s]\") % safe_chars"},{"line_number":175,"context_line":"        raise exception.InvalidName(reason\u003dreason)"},{"line_number":176,"context_line":"    return True"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"352d4467_c1405ec8","line":174,"updated":"2021-11-23 13:54:53.000000000","message":"Not sure if/how I need to handle updating some translation files related to this change...","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"67e3992c834df10c06bca005674859dea4995675","unresolved":false,"context_lines":[{"line_number":171,"context_line":"def _validate_keypair_name(keypair_name, safe_chars):"},{"line_number":172,"context_line":"    clean_value \u003d \"\".join(x for x in keypair_name if x in safe_chars)"},{"line_number":173,"context_line":"    if clean_value !\u003d keypair_name:"},{"line_number":174,"context_line":"        reason \u003d _(\"Only expected characters: [%s]\") % safe_chars"},{"line_number":175,"context_line":"        raise exception.InvalidName(reason\u003dreason)"},{"line_number":176,"context_line":"    return True"},{"line_number":177,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bd880754_cedc0004","line":174,"in_reply_to":"352d4467_c1405ec8","updated":"2022-02-14 13:52:32.000000000","message":"I don\u0027t think, but don\u0027t hesitate to tell me if needed","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ffac4c5417fca1fba526fac4b993e35e6c63e394","unresolved":true,"context_lines":[{"line_number":153,"context_line":"        pass"},{"line_number":154,"context_line":"    raise exception.InvalidName(reason\u003dregex.reason)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"@jsonschema.FormatChecker.cls_checks(\u0027keypair_name_20\u0027,"},{"line_number":158,"context_line":"                                     exception.InvalidName)"},{"line_number":159,"context_line":"def _validate_keypair_name_20(keypair_name):"},{"line_number":160,"context_line":"    safe_chars \u003d \"_- \" + string.digits + string.ascii_letters"},{"line_number":161,"context_line":"    return _validate_keypair_name(keypair_name, safe_chars)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"@jsonschema.FormatChecker.cls_checks(\u0027keypair_name_291\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"4150f4a0_afd2ef21","line":161,"range":{"start_line":156,"start_character":0,"end_line":161,"end_character":55},"updated":"2022-05-03 23:11:51.000000000","message":"+1, this is not anything new to old microversion schema but moving the code from api.py to here https://review.opendev.org/c/openstack/nova/+/781076/8/nova/compute/api.py#b6522","commit_id":"dec83049138cd856b099f907d2fe58a3695746e2"}],"nova/compute/api.py":[{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"6b2079f33fdd84bfc3fa0c6a3a56bb6f77330c9c","unresolved":false,"context_lines":[{"line_number":6517,"context_line":"        }"},{"line_number":6518,"context_line":"        self.notifier.info(context, \u0027keypair.%s\u0027 % event_suffix, payload)"},{"line_number":6519,"context_line":""},{"line_number":6520,"context_line":"    def _check_key_pair_quotas(self, context, user_id, key_name, key_type):"},{"line_number":6521,"context_line":"        try:"},{"line_number":6522,"context_line":"            objects.Quotas.check_deltas(context, {\u0027key_pairs\u0027: 1}, user_id)"},{"line_number":6523,"context_line":"        except exception.OverQuota:"}],"source_content_type":"text/x-python","patch_set":5,"id":"8358bc3a_7f3ffbcf","line":6520,"updated":"2021-11-23 13:54:53.000000000","message":"The idea is to move this \"safe_chars\" check as a schema validator, to be able to have a different schema for different microversions","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"}],"nova/tests/unit/api/openstack/compute/test_keypairs.py":[{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"1c311bbffc5eb58f7b49057d296ed298605cad3f","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        self.assertGreater(len(res_dict[\u0027keypair\u0027][\u0027private_key\u0027]), 0)"},{"line_number":113,"context_line":"        self._assert_keypair_type(res_dict)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _test_keypair_create_bad_request_case(self,"},{"line_number":116,"context_line":"                                              body,"},{"line_number":117,"context_line":"                                              exception,"},{"line_number":118,"context_line":"                                              error_msg\u003dNone):"},{"line_number":119,"context_line":"        if error_msg:"},{"line_number":120,"context_line":"            self.assertRaisesRegex(exception, error_msg,"},{"line_number":121,"context_line":"                                   self.controller.create,"}],"source_content_type":"text/x-python","patch_set":5,"id":"4eeb1ff6_e117ca95","line":118,"range":{"start_line":115,"start_character":0,"end_line":118,"end_character":62},"updated":"2021-11-25 09:53:24.000000000","message":"supernit - personal style thing I\u0027ll just say once, feel free to ignore etc but I\u0027d prefer\n\n    def _test_keypair_create_bad_request_case(\n        self, body, exception, error_msg\u003dNone\n    ):\n\nor even\n\n    def _test_keypair_create_bad_request_case(\n        self,\n        body,\n        exception,\n        error_msg\u003dNone\n    ):","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"d63b3e5772c23c5522c90e435f58ce8ac5dcc483","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        self.assertGreater(len(res_dict[\u0027keypair\u0027][\u0027private_key\u0027]), 0)"},{"line_number":113,"context_line":"        self._assert_keypair_type(res_dict)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _test_keypair_create_bad_request_case(self,"},{"line_number":116,"context_line":"                                              body,"},{"line_number":117,"context_line":"                                              exception,"},{"line_number":118,"context_line":"                                              error_msg\u003dNone):"},{"line_number":119,"context_line":"        if error_msg:"},{"line_number":120,"context_line":"            self.assertRaisesRegex(exception, error_msg,"},{"line_number":121,"context_line":"                                   self.controller.create,"}],"source_content_type":"text/x-python","patch_set":5,"id":"b20aa32b_0422307e","line":118,"range":{"start_line":115,"start_character":0,"end_line":118,"end_character":62},"in_reply_to":"4eeb1ff6_e117ca95","updated":"2021-11-29 14:08:44.000000000","message":"Fixed","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"1c311bbffc5eb58f7b49057d296ed298605cad3f","unresolved":true,"context_lines":[{"line_number":550,"context_line":"        super(KeypairsTestV291, self).setUp()"},{"line_number":551,"context_line":"        self.controller \u003d keypairs_v21.KeypairController()"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    def test_keypair_create_with_special_characters("},{"line_number":554,"context_line":"            self):"},{"line_number":555,"context_line":"        body \u003d {\u0027keypair\u0027: {\u0027name\u0027: keypair_name_291_compatible}}"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"        res_dict \u003d self.controller.create(self.req, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fc05ad6_aef88edc","line":554,"range":{"start_line":553,"start_character":0,"end_line":554,"end_character":18},"updated":"2021-11-25 09:53:24.000000000","message":"nit - single line","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"d63b3e5772c23c5522c90e435f58ce8ac5dcc483","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        super(KeypairsTestV291, self).setUp()"},{"line_number":551,"context_line":"        self.controller \u003d keypairs_v21.KeypairController()"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    def test_keypair_create_with_special_characters("},{"line_number":554,"context_line":"            self):"},{"line_number":555,"context_line":"        body \u003d {\u0027keypair\u0027: {\u0027name\u0027: keypair_name_291_compatible}}"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"        res_dict \u003d self.controller.create(self.req, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":5,"id":"14f985b7_49500b9b","line":554,"range":{"start_line":553,"start_character":0,"end_line":554,"end_character":18},"in_reply_to":"9fc05ad6_aef88edc","updated":"2021-11-29 14:08:44.000000000","message":"Done","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"1c311bbffc5eb58f7b49057d296ed298605cad3f","unresolved":true,"context_lines":[{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    def test_keypair_create_with_special_characters("},{"line_number":554,"context_line":"            self):"},{"line_number":555,"context_line":"        body \u003d {\u0027keypair\u0027: {\u0027name\u0027: keypair_name_291_compatible}}"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"        res_dict \u003d self.controller.create(self.req, body\u003dbody)"},{"line_number":558,"context_line":"        self.assertEqual(keypair_name_291_compatible,"}],"source_content_type":"text/x-python","patch_set":5,"id":"61f4a258_313132bf","line":555,"range":{"start_line":555,"start_character":8,"end_line":555,"end_character":65},"updated":"2021-11-25 09:53:24.000000000","message":"supernit - can you spread this over a few lines as you have above?","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"d63b3e5772c23c5522c90e435f58ce8ac5dcc483","unresolved":false,"context_lines":[{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    def test_keypair_create_with_special_characters("},{"line_number":554,"context_line":"            self):"},{"line_number":555,"context_line":"        body \u003d {\u0027keypair\u0027: {\u0027name\u0027: keypair_name_291_compatible}}"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"        res_dict \u003d self.controller.create(self.req, body\u003dbody)"},{"line_number":558,"context_line":"        self.assertEqual(keypair_name_291_compatible,"}],"source_content_type":"text/x-python","patch_set":5,"id":"f232821e_4f457358","line":555,"range":{"start_line":555,"start_character":8,"end_line":555,"end_character":65},"in_reply_to":"61f4a258_313132bf","updated":"2021-11-29 14:08:44.000000000","message":"Done","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ffac4c5417fca1fba526fac4b993e35e6c63e394","unresolved":true,"context_lines":[{"line_number":558,"context_line":""},{"line_number":559,"context_line":"        res_dict \u003d self.controller.create(self.req, body\u003dbody)"},{"line_number":560,"context_line":"        self.assertEqual(keypair_name_291_compatible,"},{"line_number":561,"context_line":"                         res_dict[\u0027keypair\u0027][\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"442e4008_b261405d","line":561,"range":{"start_line":561,"start_character":52,"end_line":561,"end_character":53},"updated":"2022-05-03 23:11:51.000000000","message":"can we add a test to verify that it error with special char fore micrversion 2.90 (immediate previous microversion than change happening) ?\n\nI know you are testing that in existing test for 2.10 or lower microversion but testing with immediate previous will make sure we did not regress between last microversion of keypair API and the last microversion of nova API.","commit_id":"dec83049138cd856b099f907d2fe58a3695746e2"}],"releasenotes/notes/bp-allow-special-characters-in-keypair-name-4036e517d7bc9719.yaml":[{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"1c311bbffc5eb58f7b49057d296ed298605cad3f","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    The 2.91 microversion makes the following changes:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * Add a validator for keypair name on creation/import"},{"line_number":7,"context_line":"    * Allow 2 new special characters: \u0027@\u0027 and \u0027.\u0027 (dot)"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"a98b5b28_0aacb7bc","line":7,"range":{"start_line":7,"start_character":6,"end_line":7,"end_character":55},"updated":"2021-11-25 09:53:24.000000000","message":"nit - would you mind also listing the original requirements, something like ` in addition to the existing constraints of ...` etc?","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":32637,"name":"Nicolas Parquet","email":"nicolas.parquet@gandi.net","username":"Nautik"},"change_message_id":"d63b3e5772c23c5522c90e435f58ce8ac5dcc483","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    The 2.91 microversion makes the following changes:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * Add a validator for keypair name on creation/import"},{"line_number":7,"context_line":"    * Allow 2 new special characters: \u0027@\u0027 and \u0027.\u0027 (dot)"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"1f22430b_6140d983","line":7,"range":{"start_line":7,"start_character":6,"end_line":7,"end_character":55},"in_reply_to":"a98b5b28_0aacb7bc","updated":"2021-11-29 14:08:44.000000000","message":"Done","commit_id":"5a7aa8fce64d3174ece024a1e06588d6d89a9d61"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a6765d4199b35a3e063676d81d10c0a1c27dcff","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    The 2.91 microversion makes the following changes:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * Add a validator for keypair name on creation/import"},{"line_number":7,"context_line":"    * Allow 2 new special characters: \u0027@\u0027 and \u0027.\u0027 (dot),"},{"line_number":8,"context_line":"      in addition to the existing constraints of ``[a-z][A-Z][0-9][_- ]``"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"89b6885b_351d8dd3","line":7,"range":{"start_line":7,"start_character":37,"end_line":7,"end_character":50},"updated":"2022-02-21 19:05:04.000000000","message":"nit: ``@`` and ``.`` (dot)","commit_id":"dec83049138cd856b099f907d2fe58a3695746e2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a6765d4199b35a3e063676d81d10c0a1c27dcff","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    The 2.91 microversion makes the following changes:"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * Add a validator for keypair name on creation/import"},{"line_number":7,"context_line":"    * Allow 2 new special characters: \u0027@\u0027 and \u0027.\u0027 (dot),"},{"line_number":8,"context_line":"      in addition to the existing constraints of ``[a-z][A-Z][0-9][_- ]``"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"317eeec9_1435d710","line":7,"range":{"start_line":7,"start_character":12,"end_line":7,"end_character":13},"updated":"2022-02-21 19:05:04.000000000","message":"two","commit_id":"dec83049138cd856b099f907d2fe58a3695746e2"}]}
