)]}'
{"lower-constraints.txt":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":15,"context_line":"cryptography\u003d\u003d2.7"},{"line_number":16,"context_line":"cursive\u003d\u003d0.2.1"},{"line_number":17,"context_line":"dataclasses\u003d\u003d0.7"},{"line_number":18,"context_line":"ddt\u003d\u003d1.2.1"},{"line_number":19,"context_line":"debtcollector\u003d\u003d1.19.0"},{"line_number":20,"context_line":"decorator\u003d\u003d3.4.0"},{"line_number":21,"context_line":"deprecation\u003d\u003d2.0"}],"source_content_type":"text/plain","patch_set":50,"id":"bf51134e_36dbcd7d","line":18,"updated":"2020-07-22 13:10:17.000000000","message":"Is this necessary? Can you call it out in the commit message, if so?","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":15,"context_line":"cryptography\u003d\u003d2.7"},{"line_number":16,"context_line":"cursive\u003d\u003d0.2.1"},{"line_number":17,"context_line":"dataclasses\u003d\u003d0.7"},{"line_number":18,"context_line":"ddt\u003d\u003d1.2.1"},{"line_number":19,"context_line":"debtcollector\u003d\u003d1.19.0"},{"line_number":20,"context_line":"decorator\u003d\u003d3.4.0"},{"line_number":21,"context_line":"deprecation\u003d\u003d2.0"}],"source_content_type":"text/plain","patch_set":50,"id":"9f560f44_254ab554","line":18,"in_reply_to":"bf51134e_36dbcd7d","updated":"2020-07-27 09:01:08.000000000","message":"Yes, it\u0027s necessary. \nI tried ddt\u003d\u003d1.0.1 and test_provider_config test cases failed. ddt\u003d\u003d1.2.1 is okay to pass the same test cases.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"}],"nova/compute/provider_config.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import yaml"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_SCHEMA_FILE \u003d \u0027provider_config_schema.yaml\u0027"},{"line_number":19,"context_line":"_SCHEMA_DICT \u003d None"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_23e4c40c","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":44},"updated":"2019-07-31 21:42:45.000000000","message":"Hm. I\u0027m thinking the schema file needs to be named according to the major version it supports -- so like provider_config_schema_v1.yaml...","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import yaml"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_SCHEMA_FILE \u003d \u0027provider_config_schema.yaml\u0027"},{"line_number":19,"context_line":"_SCHEMA_DICT \u003d None"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_4e223954","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":44},"in_reply_to":"7faddb67_23e4c40c","updated":"2019-08-01 16:58:43.000000000","message":"That makes sense, I will do that.","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    :raise: jsonschema.exceptions.ValidationError if the specified file does"},{"line_number":41,"context_line":"            not validate against the schema."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":"    yaml_file \u003d _load_yaml_file(path)"},{"line_number":44,"context_line":"    jsonschema.validate(yaml_file, _load_schema())"},{"line_number":45,"context_line":"    return yaml_file"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_e3e9cce2","line":43,"range":{"start_line":43,"start_character":4,"end_line":43,"end_character":37},"updated":"2019-07-31 21:42:45.000000000","message":"...and then we inspect yaml_file for the schema version...","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            not validate against the schema."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":"    yaml_file \u003d _load_yaml_file(path)"},{"line_number":44,"context_line":"    jsonschema.validate(yaml_file, _load_schema())"},{"line_number":45,"context_line":"    return yaml_file"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_83a1f8ab","line":44,"range":{"start_line":44,"start_character":35,"end_line":44,"end_character":49},"updated":"2019-07-31 21:42:45.000000000","message":"...and pass that schema version to _load_schema, which uses it to construct the file name, so we load the appropriate schema for the config.\n\nWhich means _SCHEMA_DICT actually needs to be a dict of schema dicts, keyed by major version.","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7faddb67_0dc2c085","updated":"2019-08-06 21:01:18.000000000","message":"Post-schema checks - like enforcing CUSTOM_ traits and RCs - should also go in this module I think.\n\nBut it makes sense to do those in a separate patch. This one is big enough.","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":21,"context_line":"_SCHEMA_DICT \u003d {}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def _load_schema(schema_version\u003d\u00271.0\u0027):"},{"line_number":25,"context_line":"    global _SCHEMA_DICT"},{"line_number":26,"context_line":"    if schema_version not in _SCHEMA_DICT.keys():"},{"line_number":27,"context_line":"        schema_file_name \u003d _SCHEMA_FILE_BASE.format(version\u003dschema_version)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_598085bf","line":24,"range":{"start_line":24,"start_character":31,"end_line":24,"end_character":37},"updated":"2019-08-06 21:01:18.000000000","message":"Don\u0027t have a default (make it a required arg).\n\nBut document it in the docstring.","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":24,"context_line":"def _load_schema(schema_version\u003d\u00271.0\u0027):"},{"line_number":25,"context_line":"    global _SCHEMA_DICT"},{"line_number":26,"context_line":"    if schema_version not in _SCHEMA_DICT.keys():"},{"line_number":27,"context_line":"        schema_file_name \u003d _SCHEMA_FILE_BASE.format(version\u003dschema_version)"},{"line_number":28,"context_line":"        if not pkg_resources.resource_exists(__name__, schema_file_name):"},{"line_number":29,"context_line":"            raise FileNotFound(\u0027Unable to read schema file: %s\u0027"},{"line_number":30,"context_line":"                               % schema_file_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_9964bd23","line":27,"range":{"start_line":27,"start_character":60,"end_line":27,"end_character":74},"updated":"2019-08-06 21:01:18.000000000","message":"Again, this should *only* be using the major version in the filename.\n\nWhen we come out with a new minor schema rev, we will simply update the contents of the file. Since it is required to be both forward and backward compatible, there is no reason for us to keep the schema file for \u00271.{N-1}\u0027 around.\n\nThat said, we should put the full version into the schema file itself, so that we can do like:\n\n if schema_version \u003c data_version:\n     LOG.warning(\n         \"Provider config file %s is at schema version %s, \"\n         \"but this version of nova only supports %s. Some \"\n         \"fields may be ignored.\",\n         fname, data_version, schema_version)","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    global _SCHEMA_DICT"},{"line_number":26,"context_line":"    if schema_version not in _SCHEMA_DICT.keys():"},{"line_number":27,"context_line":"        schema_file_name \u003d _SCHEMA_FILE_BASE.format(version\u003dschema_version)"},{"line_number":28,"context_line":"        if not pkg_resources.resource_exists(__name__, schema_file_name):"},{"line_number":29,"context_line":"            raise FileNotFound(\u0027Unable to read schema file: %s\u0027"},{"line_number":30,"context_line":"                               % schema_file_name)"},{"line_number":31,"context_line":"        with pkg_resources.resource_stream(__name__, schema_file_name) as f:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_6acc7dba","line":28,"range":{"start_line":28,"start_character":8,"end_line":28,"end_character":73},"updated":"2019-08-06 21:01:18.000000000","message":"Consider adding\n\n TODO(dustinc): Simplify this to just try: and except IOError when we no longer support py2.","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def _load_yaml_file(path):"},{"line_number":37,"context_line":"    if not os.access(path, os.R_OK):"},{"line_number":38,"context_line":"        raise FileNotFound(\u0027Unable to read yaml config file: %s\u0027 % path)"},{"line_number":39,"context_line":"    with open(path) as f:"},{"line_number":40,"context_line":"        return yaml.safe_load(f)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_cabc9107","line":37,"range":{"start_line":37,"start_character":4,"end_line":37,"end_character":36},"updated":"2019-08-06 21:01:18.000000000","message":"ditto","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    \"\"\""},{"line_number":54,"context_line":"    yaml_file \u003d _load_yaml_file(path)"},{"line_number":55,"context_line":"    try:"},{"line_number":56,"context_line":"        schema_version \u003d str(float(yaml_file[\u0027meta\u0027][\u0027schema_version\u0027]))"},{"line_number":57,"context_line":"    except Exception as e:"},{"line_number":58,"context_line":"        raise jsonschema.ValidationError(\u0027Unable to detect schema_version: %s\u0027"},{"line_number":59,"context_line":"                                         % e)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_39526968","line":56,"range":{"start_line":56,"start_character":29,"end_line":56,"end_character":34},"updated":"2019-08-06 21:01:18.000000000","message":"This is bad. We definitely don\u0027t want 1.10 \u003d\u003d 1.1, which is what this will do.\n\nWhy wouldn\u0027t you want to accept the field as is?","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7faddb67_2a47651f","line":62,"updated":"2019-08-06 21:01:18.000000000","message":"nts: looking to the \"master switch\" patch at the end of the series to add the method to search directory based on conf (which would also be added there) and pass found files to parse_provider_yaml.","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d5ccb2537b5cfa0579c1b17572edfcc200406337","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import pkg_resources"},{"line_number":16,"context_line":"import yaml"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from nova.exception import FileNotFound"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"_SCHEMA_FILE_BASE \u003d \u0027provider_config_schema_v{version}.yaml\u0027"},{"line_number":21,"context_line":"_SCHEMA_DICT \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_d9d3ae00","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":39},"updated":"2019-08-12 21:03:05.000000000","message":"import only modules","commit_id":"23012d033ec461005de8b2e723c326b52cbcd851"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d5ccb2537b5cfa0579c1b17572edfcc200406337","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def _load_schema(schema_version):"},{"line_number":25,"context_line":"    \"\"\"Loads, validates, and parses a provider.yaml schema file into a dict to"},{"line_number":26,"context_line":"    be used with jsonschema."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    :param schema_version: String version of the schema to load. Both"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_b9d8321e","line":25,"range":{"start_line":25,"start_character":14,"end_line":25,"end_character":24},"updated":"2019-08-12 21:03:05.000000000","message":"not so much","commit_id":"23012d033ec461005de8b2e723c326b52cbcd851"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d5ccb2537b5cfa0579c1b17572edfcc200406337","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    \"\"\""},{"line_number":34,"context_line":"    global _SCHEMA_DICT"},{"line_number":35,"context_line":"    schema_major \u003d str(schema_version).split(\u0027.\u0027)[0]"},{"line_number":36,"context_line":"    if schema_major not in _SCHEMA_DICT.keys():"},{"line_number":37,"context_line":"        schema_file_name \u003d _SCHEMA_FILE_BASE.format(version\u003dschema_major)"},{"line_number":38,"context_line":"        # NOTE(dustinc): Once py27 support is dropped, this can be simplified"},{"line_number":39,"context_line":"        #   as a try/except IOError."}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_59e81eb2","line":36,"range":{"start_line":36,"start_character":39,"end_line":36,"end_character":46},"updated":"2019-08-12 21:03:05.000000000","message":"redundant","commit_id":"23012d033ec461005de8b2e723c326b52cbcd851"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d5ccb2537b5cfa0579c1b17572edfcc200406337","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def _load_yaml_file(path):"},{"line_number":50,"context_line":"    \"\"\"Loads  and parses a yaml file into a dict."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    :param path: Path to the yaml file to load."},{"line_number":53,"context_line":"    :return Dict representing the yaml file requested."}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_19caa645","line":50,"range":{"start_line":50,"start_character":13,"end_line":50,"end_character":14},"updated":"2019-08-12 21:03:05.000000000","message":"extra space","commit_id":"23012d033ec461005de8b2e723c326b52cbcd851"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1bd918768afe960c8f41fa348e4f74ba16bf9346","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        schema_version \u003d yaml_file[\u0027meta\u0027][\u0027schema_version\u0027]"},{"line_number":86,"context_line":"    except KeyError as e:"},{"line_number":87,"context_line":"        raise jsonschema.ValidationError(\u0027Unable to detect schema_version: %s\u0027"},{"line_number":88,"context_line":"                                         % e)"},{"line_number":89,"context_line":"    major_version, minor_version \u003d schema_version.split(\u0027.\u0027)[0:2]"},{"line_number":90,"context_line":"    if not microversion_parse.Version("},{"line_number":91,"context_line":"            major\u003dmajor_version, minor\u003dminor_version).matches("}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_9d3894d3","line":88,"updated":"2019-08-14 22:34:36.000000000","message":"I think this check should go after the major version check in _load_schema. The warning doesn\u0027t make sense as written, and would be redundant even if you rewrote it.\n\nLooking around, I can see why you did it this way, but a minor refactor ought to make it pretty crisp.\n\nLike:\n\n schema \u003d _load_schema(...)\n do this check\n jsonschema.validate(yaml_file, schema)","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8d3f71624411a4f26a32376753b7d0c9f17a74df","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        schema_version \u003d yaml_file[\u0027meta\u0027][\u0027schema_version\u0027]"},{"line_number":86,"context_line":"    except KeyError as e:"},{"line_number":87,"context_line":"        raise jsonschema.ValidationError(\u0027Unable to detect schema_version: %s\u0027"},{"line_number":88,"context_line":"                                         % e)"},{"line_number":89,"context_line":"    major_version, minor_version \u003d schema_version.split(\u0027.\u0027)[0:2]"},{"line_number":90,"context_line":"    if not microversion_parse.Version("},{"line_number":91,"context_line":"            major\u003dmajor_version, minor\u003dminor_version).matches("}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_a15c3719","line":88,"in_reply_to":"7faddb67_9d3894d3","updated":"2019-08-15 20:02:09.000000000","message":"Done","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1bd918768afe960c8f41fa348e4f74ba16bf9346","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    except KeyError as e:"},{"line_number":87,"context_line":"        raise jsonschema.ValidationError(\u0027Unable to detect schema_version: %s\u0027"},{"line_number":88,"context_line":"                                         % e)"},{"line_number":89,"context_line":"    major_version, minor_version \u003d schema_version.split(\u0027.\u0027)[0:2]"},{"line_number":90,"context_line":"    if not microversion_parse.Version("},{"line_number":91,"context_line":"            major\u003dmajor_version, minor\u003dminor_version).matches("},{"line_number":92,"context_line":"            min_version\u003dMIN_SCHEMA_VERSION, max_version\u003dMAX_SCHEMA_VERSION):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_4b27b5c8","line":89,"range":{"start_line":89,"start_character":4,"end_line":89,"end_character":65},"updated":"2019-08-14 22:34:36.000000000","message":"I think this...","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8d3f71624411a4f26a32376753b7d0c9f17a74df","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    except KeyError as e:"},{"line_number":87,"context_line":"        raise jsonschema.ValidationError(\u0027Unable to detect schema_version: %s\u0027"},{"line_number":88,"context_line":"                                         % e)"},{"line_number":89,"context_line":"    major_version, minor_version \u003d schema_version.split(\u0027.\u0027)[0:2]"},{"line_number":90,"context_line":"    if not microversion_parse.Version("},{"line_number":91,"context_line":"            major\u003dmajor_version, minor\u003dminor_version).matches("},{"line_number":92,"context_line":"            min_version\u003dMIN_SCHEMA_VERSION, max_version\u003dMAX_SCHEMA_VERSION):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_3e0b8b8e","line":89,"range":{"start_line":89,"start_character":4,"end_line":89,"end_character":65},"in_reply_to":"7faddb67_4b27b5c8","updated":"2019-08-15 20:02:09.000000000","message":"Done","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1bd918768afe960c8f41fa348e4f74ba16bf9346","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        raise jsonschema.ValidationError(\u0027Unable to detect schema_version: %s\u0027"},{"line_number":88,"context_line":"                                         % e)"},{"line_number":89,"context_line":"    major_version, minor_version \u003d schema_version.split(\u0027.\u0027)[0:2]"},{"line_number":90,"context_line":"    if not microversion_parse.Version("},{"line_number":91,"context_line":"            major\u003dmajor_version, minor\u003dminor_version).matches("},{"line_number":92,"context_line":"            min_version\u003dMIN_SCHEMA_VERSION, max_version\u003dMAX_SCHEMA_VERSION):"},{"line_number":93,"context_line":"        LOG.warning(\"Provider config file %s is at schema version %s, but the \""},{"line_number":94,"context_line":"                    \"code only understands versions %s to %s. Some fields may \""}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_eb19c187","line":91,"range":{"start_line":90,"start_character":11,"end_line":91,"end_character":53},"updated":"2019-08-14 22:34:36.000000000","message":"...and this can be combined to\n\n microversion_parse.parse_version_string(schema_version)","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8d3f71624411a4f26a32376753b7d0c9f17a74df","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        raise jsonschema.ValidationError(\u0027Unable to detect schema_version: %s\u0027"},{"line_number":88,"context_line":"                                         % e)"},{"line_number":89,"context_line":"    major_version, minor_version \u003d schema_version.split(\u0027.\u0027)[0:2]"},{"line_number":90,"context_line":"    if not microversion_parse.Version("},{"line_number":91,"context_line":"            major\u003dmajor_version, minor\u003dminor_version).matches("},{"line_number":92,"context_line":"            min_version\u003dMIN_SCHEMA_VERSION, max_version\u003dMAX_SCHEMA_VERSION):"},{"line_number":93,"context_line":"        LOG.warning(\"Provider config file %s is at schema version %s, but the \""},{"line_number":94,"context_line":"                    \"code only understands versions %s to %s. Some fields may \""}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_1e06cf87","line":91,"range":{"start_line":90,"start_character":11,"end_line":91,"end_character":53},"in_reply_to":"7faddb67_eb19c187","updated":"2019-08-15 20:02:09.000000000","message":"Done","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1bd918768afe960c8f41fa348e4f74ba16bf9346","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    if not microversion_parse.Version("},{"line_number":91,"context_line":"            major\u003dmajor_version, minor\u003dminor_version).matches("},{"line_number":92,"context_line":"            min_version\u003dMIN_SCHEMA_VERSION, max_version\u003dMAX_SCHEMA_VERSION):"},{"line_number":93,"context_line":"        LOG.warning(\"Provider config file %s is at schema version %s, but the \""},{"line_number":94,"context_line":"                    \"code only understands versions %s to %s. Some fields may \""},{"line_number":95,"context_line":"                    \"be ignored.\", (path, schema_version,"},{"line_number":96,"context_line":"                                    MIN_SCHEMA_VERSION, MAX_SCHEMA_VERSION))"},{"line_number":97,"context_line":"    jsonschema.validate(yaml_file, _load_schema(schema_version))"},{"line_number":98,"context_line":"    return yaml_file"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_cb140550","line":95,"range":{"start_line":93,"start_character":20,"end_line":95,"end_character":33},"updated":"2019-08-14 22:34:36.000000000","message":"✔","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1bd918768afe960c8f41fa348e4f74ba16bf9346","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            min_version\u003dMIN_SCHEMA_VERSION, max_version\u003dMAX_SCHEMA_VERSION):"},{"line_number":93,"context_line":"        LOG.warning(\"Provider config file %s is at schema version %s, but the \""},{"line_number":94,"context_line":"                    \"code only understands versions %s to %s. Some fields may \""},{"line_number":95,"context_line":"                    \"be ignored.\", (path, schema_version,"},{"line_number":96,"context_line":"                                    MIN_SCHEMA_VERSION, MAX_SCHEMA_VERSION))"},{"line_number":97,"context_line":"    jsonschema.validate(yaml_file, _load_schema(schema_version))"},{"line_number":98,"context_line":"    return yaml_file"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_2b035912","line":96,"range":{"start_line":95,"start_character":35,"end_line":96,"end_character":75},"updated":"2019-08-14 22:34:36.000000000","message":"I think you need to un-paren these - the logger expects them flat.","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8d3f71624411a4f26a32376753b7d0c9f17a74df","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            min_version\u003dMIN_SCHEMA_VERSION, max_version\u003dMAX_SCHEMA_VERSION):"},{"line_number":93,"context_line":"        LOG.warning(\"Provider config file %s is at schema version %s, but the \""},{"line_number":94,"context_line":"                    \"code only understands versions %s to %s. Some fields may \""},{"line_number":95,"context_line":"                    \"be ignored.\", (path, schema_version,"},{"line_number":96,"context_line":"                                    MIN_SCHEMA_VERSION, MAX_SCHEMA_VERSION))"},{"line_number":97,"context_line":"    jsonschema.validate(yaml_file, _load_schema(schema_version))"},{"line_number":98,"context_line":"    return yaml_file"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_5ed687f4","line":96,"range":{"start_line":95,"start_character":35,"end_line":96,"end_character":75},"in_reply_to":"7faddb67_2b035912","updated":"2019-08-15 20:02:09.000000000","message":"Done","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cbbeb19ea4762d5673e0a6f23cd84519bede1148","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def _load_schema(schema_version):"},{"line_number":33,"context_line":"    \"\"\"Loads and parses a provider.yaml schema file into a dict."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    :param schema_version: String version of the schema to load. Both"},{"line_number":36,"context_line":"        \u0027{major}.{minor}\u0027 or \u0027{major}\u0027 are supported. Only major will be used."},{"line_number":37,"context_line":"    :return: Dict containing the schema for the major version requested."},{"line_number":38,"context_line":"    :raise: jsonschema.exceptions.ValidationError if the definition for the"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_23db4b7d","line":35,"range":{"start_line":35,"start_character":27,"end_line":35,"end_character":33},"updated":"2019-09-03 21:27:25.000000000","message":"this...","commit_id":"2a589606ef5bf0ef559ea21de66b00ebfa027c99"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cbbeb19ea4762d5673e0a6f23cd84519bede1148","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    \"\"\""},{"line_number":41,"context_line":"    global _SCHEMA_DICT"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    if schema_version.major not in _SCHEMA_DICT:"},{"line_number":44,"context_line":"        schema_file_name \u003d _SCHEMA_FILE_BASE.format("},{"line_number":45,"context_line":"            version\u003dschema_version.major)"},{"line_number":46,"context_line":"        # NOTE(dustinc): Once py27 support is dropped, this can be simplified"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_a3d09b54","line":43,"range":{"start_line":43,"start_character":7,"end_line":43,"end_character":27},"updated":"2019-09-03 21:27:25.000000000","message":"...doesn\u0027t seem to agree with this.\n\nI guess it\u0027s a microversion_parse.Version rather than a string?","commit_id":"2a589606ef5bf0ef559ea21de66b00ebfa027c99"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"60add47f047b4a9f1d0b7f1ff035f801c006125f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    \"\"\""},{"line_number":41,"context_line":"    global _SCHEMA_DICT"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    if schema_version.major not in _SCHEMA_DICT:"},{"line_number":44,"context_line":"        schema_file_name \u003d _SCHEMA_FILE_BASE.format("},{"line_number":45,"context_line":"            version\u003dschema_version.major)"},{"line_number":46,"context_line":"        # NOTE(dustinc): Once py27 support is dropped, this can be simplified"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_de524d12","line":43,"range":{"start_line":43,"start_character":7,"end_line":43,"end_character":27},"in_reply_to":"7faddb67_a3d09b54","updated":"2019-09-04 03:18:32.000000000","message":"Oops, yes that is correct. Fixed.","commit_id":"2a589606ef5bf0ef559ea21de66b00ebfa027c99"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"16e3c26dcecd45347f819f1d511bcb76a7743671","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    \"\"\"Loads and parses a provider.yaml schema file into a dict."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    :param schema_version: An instance of microversion_parse.Version for the"},{"line_number":36,"context_line":"        version number of the schema to use load."},{"line_number":37,"context_line":"    :return: Dict containing the schema for the major version requested."},{"line_number":38,"context_line":"    :raise: jsonschema.exceptions.ValidationError if the definition for the"},{"line_number":39,"context_line":"        schema version cannot be found."}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_b80d213f","line":36,"range":{"start_line":36,"start_character":40,"end_line":36,"end_character":48},"updated":"2019-09-04 11:35:30.000000000","message":"pick one","commit_id":"deefb43d3f92b40ad7c5e75ec8acdb0e38aed717"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    global _SCHEMA_DICT"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    if schema_version.major not in _SCHEMA_DICT:"},{"line_number":54,"context_line":"        schema_file_name \u003d _SCHEMA_FILE_BASE.format("},{"line_number":55,"context_line":"            version\u003dschema_version.major)"},{"line_number":56,"context_line":"        # NOTE(dustinc): Once py27 support is dropped, this can be simplified"},{"line_number":57,"context_line":"        #   as a try/except IOError."},{"line_number":58,"context_line":"        if not pkg_resources.resource_exists(__name__, schema_file_name):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_cdc15d31","line":55,"range":{"start_line":54,"start_character":0,"end_line":55,"end_character":41},"updated":"2019-10-11 08:41:23.000000000","message":"Why aren\u0027t we considering minor version as well since we would ideally also want to validate optional fields introduced in minor versions?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    global _SCHEMA_DICT"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    if schema_version.major not in _SCHEMA_DICT:"},{"line_number":54,"context_line":"        schema_file_name \u003d _SCHEMA_FILE_BASE.format("},{"line_number":55,"context_line":"            version\u003dschema_version.major)"},{"line_number":56,"context_line":"        # NOTE(dustinc): Once py27 support is dropped, this can be simplified"},{"line_number":57,"context_line":"        #   as a try/except IOError."},{"line_number":58,"context_line":"        if not pkg_resources.resource_exists(__name__, schema_file_name):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_0a4511b4","line":55,"range":{"start_line":54,"start_character":0,"end_line":55,"end_character":41},"in_reply_to":"3fa7e38b_cdc15d31","updated":"2019-10-14 18:18:45.000000000","message":"This part of the code only checks major version because schema files are stored per major version. See code around line 100 for how it checks major/minor versions together.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            raise ProviderConfigException(message)"},{"line_number":62,"context_line":"        with pkg_resources.resource_stream(__name__, schema_file_name) as f:"},{"line_number":63,"context_line":"            _SCHEMA_DICT[schema_version.major] \u003d yaml.safe_load(f)"},{"line_number":64,"context_line":"    return _SCHEMA_DICT[schema_version.major]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"def _load_yaml_file(path):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_c96e51ff","line":64,"updated":"2019-10-10 18:04:39.000000000","message":"_SCHEMA_DICT is global, no need to return here. Or if is not going to be used directly in another method then don\u0027t make the _SCHEMA_DICT variable global and wrap it on the function to just be called as in line 96","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            raise ProviderConfigException(message)"},{"line_number":62,"context_line":"        with pkg_resources.resource_stream(__name__, schema_file_name) as f:"},{"line_number":63,"context_line":"            _SCHEMA_DICT[schema_version.major] \u003d yaml.safe_load(f)"},{"line_number":64,"context_line":"    return _SCHEMA_DICT[schema_version.major]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"def _load_yaml_file(path):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_4a28e9e0","line":64,"in_reply_to":"3fa7e38b_c96e51ff","updated":"2019-10-14 18:18:45.000000000","message":"I am not returning the global but rather the specified schema from the global. I could just return the index and then access it from the caller but I thought this was a little cleaner since it keeps the guts contained and just returns the thing the caller needs.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        against the schema, the schema version is not supported, or if unable"},{"line_number":90,"context_line":"        to read configuration or schema files."},{"line_number":91,"context_line":"    \"\"\""},{"line_number":92,"context_line":"    yaml_file \u003d _load_yaml_file(path)"},{"line_number":93,"context_line":"    try:"},{"line_number":94,"context_line":"        schema_version \u003d microversion_parse.parse_version_string("},{"line_number":95,"context_line":"            yaml_file[\u0027meta\u0027][\u0027schema_version\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_3f84d4d2","line":92,"range":{"start_line":92,"start_character":2,"end_line":92,"end_character":37},"updated":"2019-10-11 08:41:23.000000000","message":"in try catch?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        against the schema, the schema version is not supported, or if unable"},{"line_number":90,"context_line":"        to read configuration or schema files."},{"line_number":91,"context_line":"    \"\"\""},{"line_number":92,"context_line":"    yaml_file \u003d _load_yaml_file(path)"},{"line_number":93,"context_line":"    try:"},{"line_number":94,"context_line":"        schema_version \u003d microversion_parse.parse_version_string("},{"line_number":95,"context_line":"            yaml_file[\u0027meta\u0027][\u0027schema_version\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_992e248a","line":92,"range":{"start_line":92,"start_character":2,"end_line":92,"end_character":37},"in_reply_to":"3fa7e38b_3f84d4d2","updated":"2019-10-14 18:18:45.000000000","message":"There is exception handling within the code called. If that code still raises an exception, it would be an unhandled error and intentionally not caught.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    \"\"\""},{"line_number":92,"context_line":"    yaml_file \u003d _load_yaml_file(path)"},{"line_number":93,"context_line":"    try:"},{"line_number":94,"context_line":"        schema_version \u003d microversion_parse.parse_version_string("},{"line_number":95,"context_line":"            yaml_file[\u0027meta\u0027][\u0027schema_version\u0027])"},{"line_number":96,"context_line":"        schema \u003d _load_schema(schema_version)"},{"line_number":97,"context_line":"    except (KeyError, TypeError):"},{"line_number":98,"context_line":"        message \u003d _(\"Unable to detect schema version: %s\") % yaml_file"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_2dcef159","line":95,"range":{"start_line":94,"start_character":0,"end_line":95,"end_character":48},"updated":"2019-10-11 08:41:23.000000000","message":"I\u0027m assuming the schema version is of format major.minor","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    \"\"\""},{"line_number":92,"context_line":"    yaml_file \u003d _load_yaml_file(path)"},{"line_number":93,"context_line":"    try:"},{"line_number":94,"context_line":"        schema_version \u003d microversion_parse.parse_version_string("},{"line_number":95,"context_line":"            yaml_file[\u0027meta\u0027][\u0027schema_version\u0027])"},{"line_number":96,"context_line":"        schema \u003d _load_schema(schema_version)"},{"line_number":97,"context_line":"    except (KeyError, TypeError):"},{"line_number":98,"context_line":"        message \u003d _(\"Unable to detect schema version: %s\") % yaml_file"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_7948085b","line":95,"range":{"start_line":94,"start_character":0,"end_line":95,"end_character":48},"in_reply_to":"3fa7e38b_2dcef159","updated":"2019-10-14 18:18:45.000000000","message":"Yes, microversion_parse gives us a major.minor version in an object that includes helper functions for comparing versions.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    except (KeyError, TypeError):"},{"line_number":98,"context_line":"        message \u003d _(\"Unable to detect schema version: %s\") % yaml_file"},{"line_number":99,"context_line":"        raise ProviderConfigException(message)"},{"line_number":100,"context_line":"    if not schema_version.matches(min_version\u003dMIN_SCHEMA_VERSION,"},{"line_number":101,"context_line":"                                  max_version\u003dMAX_SCHEMA_VERSION):"},{"line_number":102,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":103,"context_line":"                    \"%(schema_version)s, but Nova only understands versions \""},{"line_number":104,"context_line":"                    \"%(min_v)s to %(max_v)s. Some fields may be ignored.\""}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_edd3f9ff","line":101,"range":{"start_line":100,"start_character":4,"end_line":101,"end_character":66},"updated":"2019-10-11 08:41:23.000000000","message":"I think this can be the first if condition before attempting to load any schema file. \n\nWe would most likely fail to load 1.4 if 1.3 is the latest supported version\n\nAlso not sure what this condition means, are we expecting the latest major and minor, if so it should be major\u003dlatest major but minor\u003c\u003dlatest minor","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"2ab9baea9b7e81afbdb63820c57571eda99df53c","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    except (KeyError, TypeError):"},{"line_number":98,"context_line":"        message \u003d _(\"Unable to detect schema version: %s\") % yaml_file"},{"line_number":99,"context_line":"        raise ProviderConfigException(message)"},{"line_number":100,"context_line":"    if not schema_version.matches(min_version\u003dMIN_SCHEMA_VERSION,"},{"line_number":101,"context_line":"                                  max_version\u003dMAX_SCHEMA_VERSION):"},{"line_number":102,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":103,"context_line":"                    \"%(schema_version)s, but Nova only understands versions \""},{"line_number":104,"context_line":"                    \"%(min_v)s to %(max_v)s. Some fields may be ignored.\""}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_6edef96d","line":101,"range":{"start_line":100,"start_character":4,"end_line":101,"end_character":66},"in_reply_to":"3fa7e38b_99c2a452","updated":"2019-10-14 22:49:13.000000000","message":"Done","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    except (KeyError, TypeError):"},{"line_number":98,"context_line":"        message \u003d _(\"Unable to detect schema version: %s\") % yaml_file"},{"line_number":99,"context_line":"        raise ProviderConfigException(message)"},{"line_number":100,"context_line":"    if not schema_version.matches(min_version\u003dMIN_SCHEMA_VERSION,"},{"line_number":101,"context_line":"                                  max_version\u003dMAX_SCHEMA_VERSION):"},{"line_number":102,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":103,"context_line":"                    \"%(schema_version)s, but Nova only understands versions \""},{"line_number":104,"context_line":"                    \"%(min_v)s to %(max_v)s. Some fields may be ignored.\""}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_99c2a452","line":101,"range":{"start_line":100,"start_character":4,"end_line":101,"end_character":66},"in_reply_to":"3fa7e38b_edd3f9ff","updated":"2019-10-14 18:18:45.000000000","message":"Schema files are stored for major versions only, in your scenario a schema file (1) would be loaded. This is to catch scenarios where the major version is known, but the minor version is outside the range we know. What it does not do is catch unsupported intermediate minor versions (say we support [1.0, 1.1, 2.0] - then 1.2 will pass this check since 1.2 is between 1.0 and 2.0). I can add a comment for that, or look into storing supported major.minor versions explicitly, but that may result in a very long list of supported versions in the future.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    if not schema_version.matches(min_version\u003dMIN_SCHEMA_VERSION,"},{"line_number":101,"context_line":"                                  max_version\u003dMAX_SCHEMA_VERSION):"},{"line_number":102,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":103,"context_line":"                    \"%(schema_version)s, but Nova only understands versions \""},{"line_number":104,"context_line":"                    \"%(min_v)s to %(max_v)s. Some fields may be ignored.\""},{"line_number":105,"context_line":"                    ) % {\"path\": path,"},{"line_number":106,"context_line":"                         \"schema_version\": schema_version,"},{"line_number":107,"context_line":"                         \"min_v\": MIN_SCHEMA_VERSION,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_1fe6b8b1","line":104,"range":{"start_line":103,"start_character":41,"end_line":104,"end_character":45},"updated":"2019-10-11 08:41:23.000000000","message":"This statement is confusing to me. I\u0027m assuming if nova supports say 1.3 and user tries to test 1.1, we give the message that additional fields between 1.1 and 1.3 are ignored? \n\nAlso, how can we differentiate between invalid minor versions and valid minor versions - is it by the availability of schema file - as in the load_schema step.\n\nI think we should maintain a current major and minor but allow minor values \u003c\u003d current minor. Next independent step load the schema file.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    if not schema_version.matches(min_version\u003dMIN_SCHEMA_VERSION,"},{"line_number":101,"context_line":"                                  max_version\u003dMAX_SCHEMA_VERSION):"},{"line_number":102,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":103,"context_line":"                    \"%(schema_version)s, but Nova only understands versions \""},{"line_number":104,"context_line":"                    \"%(min_v)s to %(max_v)s. Some fields may be ignored.\""},{"line_number":105,"context_line":"                    ) % {\"path\": path,"},{"line_number":106,"context_line":"                         \"schema_version\": schema_version,"},{"line_number":107,"context_line":"                         \"min_v\": MIN_SCHEMA_VERSION,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_59e2ecd6","line":104,"range":{"start_line":103,"start_character":41,"end_line":104,"end_character":45},"in_reply_to":"3fa7e38b_1fe6b8b1","updated":"2019-10-14 18:18:45.000000000","message":"The supported versions stored in the globals are a range, not single minor and major versions. In your example MIN_SCHEMA_VERSION would be 1.0 and MAX_SCHEMA_VERSION would be 1.3, therefore 1.2 would not trigger this as it falls within that range.\n\nAs far as unsupported major versions, they are caught above when we try to load the schema for the major version. This is only really to catch major/minor version combinations.\n\nAlso, we are continuing to load supported major versions with unknown minor versions but will only process fields known by our latest minor version. This should be OK because if a change in the schema breaks this, we should increment the major version.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c36c9222f4e77a6c11bbaccf4302e1fd59264f04","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    if not schema_version.matches(min_version\u003dMIN_SCHEMA_VERSION,"},{"line_number":101,"context_line":"                                  max_version\u003dMAX_SCHEMA_VERSION):"},{"line_number":102,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":103,"context_line":"                    \"%(schema_version)s, but Nova only understands versions \""},{"line_number":104,"context_line":"                    \"%(min_v)s to %(max_v)s. Some fields may be ignored.\""},{"line_number":105,"context_line":"                    ) % {\"path\": path,"},{"line_number":106,"context_line":"                         \"schema_version\": schema_version,"},{"line_number":107,"context_line":"                         \"min_v\": MIN_SCHEMA_VERSION,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_231a48c5","line":104,"range":{"start_line":103,"start_character":41,"end_line":104,"end_character":45},"in_reply_to":"3fa7e38b_59e2ecd6","updated":"2019-10-15 20:17:49.000000000","message":"I updated this to use an explicit list of versions, let me know what you think about that. It will still load the matching major version and warn but continue with unknown minor.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"63540cc3d2ef4c2570619e9afbcad7b63e4eaef1","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"_SCHEMA_FILE_BASE \u003d \u0027provider_config_schemas/\u0027\\"},{"line_number":27,"context_line":"                    \u0027provider_config_schema_v{version}.yaml\u0027"},{"line_number":28,"context_line":"_SCHEMA_DICT \u003d {}"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3fa7e38b_6047d61e","line":26,"updated":"2019-10-15 18:23:12.000000000","message":"I have already fixed this locally :)","commit_id":"197ad3dbc3163d446dbfabb9ae037609589d6ed6"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":33,"context_line":"]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class ProviderConfigException(exception.NovaException):"},{"line_number":37,"context_line":"    \"\"\"Exception indicating an error occurred processing provider config files."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    This class is used to avoid a raised exception inadvertently being caught"}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_5e4a955b","line":36,"range":{"start_line":36,"start_character":6,"end_line":36,"end_character":29},"updated":"2019-10-18 20:24:03.000000000","message":"I get why you put this here, but it should go in nova.exceptions. I don\u0027t think we have a precedent for exceptions defined outside of that module.","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c551f4e470684d12a0013dc2e14a03d55e44abd8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class ProviderConfigException(exception.NovaException):"},{"line_number":37,"context_line":"    \"\"\"Exception indicating an error occurred processing provider config files."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    This class is used to avoid a raised exception inadvertently being caught"}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_71e44de1","line":36,"range":{"start_line":36,"start_character":6,"end_line":36,"end_character":29},"in_reply_to":"3fa7e38b_5e4a955b","updated":"2019-10-18 22:48:49.000000000","message":"Done","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    \"\"\"Loads and parses a provider.yaml schema file into a dict."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    :param schema_version: An instance of microversion_parse.Version for the"},{"line_number":49,"context_line":"        version number of the schema to use load."},{"line_number":50,"context_line":"    :return: Dict containing the schema for the major version requested."},{"line_number":51,"context_line":"    :raise: ProviderConfigException if the definition for the schema version"},{"line_number":52,"context_line":"        cannot be found."}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_d63977a3","line":49,"range":{"start_line":49,"start_character":40,"end_line":49,"end_character":43},"updated":"2019-10-18 20:24:03.000000000","message":"strike","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c551f4e470684d12a0013dc2e14a03d55e44abd8","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    \"\"\"Loads and parses a provider.yaml schema file into a dict."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    :param schema_version: An instance of microversion_parse.Version for the"},{"line_number":49,"context_line":"        version number of the schema to use load."},{"line_number":50,"context_line":"    :return: Dict containing the schema for the major version requested."},{"line_number":51,"context_line":"    :raise: ProviderConfigException if the definition for the schema version"},{"line_number":52,"context_line":"        cannot be found."}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_91e9c9b8","line":49,"range":{"start_line":49,"start_character":40,"end_line":49,"end_character":43},"in_reply_to":"3fa7e38b_d63977a3","updated":"2019-10-18 22:48:49.000000000","message":"Done","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"def _parse_provider_yaml(path):"},{"line_number":87,"context_line":"    \"\"\"Loads, validates, and parses a provider.yaml file into a dict."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    :param path: File system path to the file to parse."},{"line_number":90,"context_line":"    :return: dict representing the contents of the file."}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_56458714","line":87,"range":{"start_line":87,"start_character":14,"end_line":87,"end_character":23},"updated":"2019-10-18 20:24:03.000000000","message":"(schema only)","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c551f4e470684d12a0013dc2e14a03d55e44abd8","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"def _parse_provider_yaml(path):"},{"line_number":87,"context_line":"    \"\"\"Loads, validates, and parses a provider.yaml file into a dict."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    :param path: File system path to the file to parse."},{"line_number":90,"context_line":"    :return: dict representing the contents of the file."}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_b103a576","line":87,"range":{"start_line":87,"start_character":14,"end_line":87,"end_character":23},"in_reply_to":"3fa7e38b_56458714","updated":"2019-10-18 22:48:49.000000000","message":"Done","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        raise ProviderConfigException(message)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    if schema_version not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":105,"context_line":"        if schema_version.major in {ver.major for ver in"},{"line_number":106,"context_line":"                                    SUPPORTED_SCHEMA_VERSIONS}:"},{"line_number":107,"context_line":"            message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":108,"context_line":"                        \"%(schema_version)s. Nova supports the major version, \""},{"line_number":109,"context_line":"                        \"but not the minor. Some fields may be ignored.\""}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_9611bf07","line":106,"range":{"start_line":105,"start_character":35,"end_line":106,"end_character":62},"updated":"2019-10-18 20:24:03.000000000","message":"micronit: If you made SUPPORTED_SCHEMA_VERSIONS a dict, keyed by major, of sets of minors, you could avoid doing this comp once per file. (And do the major check up front.)\n\nThat just miiiight be overengineering though :P","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c551f4e470684d12a0013dc2e14a03d55e44abd8","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        raise ProviderConfigException(message)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    if schema_version not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":105,"context_line":"        if schema_version.major in {ver.major for ver in"},{"line_number":106,"context_line":"                                    SUPPORTED_SCHEMA_VERSIONS}:"},{"line_number":107,"context_line":"            message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":108,"context_line":"                        \"%(schema_version)s. Nova supports the major version, \""},{"line_number":109,"context_line":"                        \"but not the minor. Some fields may be ignored.\""}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_1171590d","line":106,"range":{"start_line":105,"start_character":35,"end_line":106,"end_character":62},"in_reply_to":"3fa7e38b_9611bf07","updated":"2019-10-18 22:48:49.000000000","message":"Maybe so but I did it anyway :)","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                        ) % {\"path\": path,"},{"line_number":111,"context_line":"                             \"schema_version\": schema_version}"},{"line_number":112,"context_line":"            LOG.warning(message)"},{"line_number":113,"context_line":"        else:"},{"line_number":114,"context_line":"            message \u003d _(\"Unsupported schema major version: %s\""},{"line_number":115,"context_line":"                        ) % schema_version.major"},{"line_number":116,"context_line":"            raise ProviderConfigException(message)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_962a1f2a","line":113,"range":{"start_line":113,"start_character":8,"end_line":113,"end_character":12},"updated":"2019-10-18 20:24:03.000000000","message":"nit: personal preference, but I like to swap these around so I can kill the `else` and unindent the warning clause.","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c551f4e470684d12a0013dc2e14a03d55e44abd8","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                        ) % {\"path\": path,"},{"line_number":111,"context_line":"                             \"schema_version\": schema_version}"},{"line_number":112,"context_line":"            LOG.warning(message)"},{"line_number":113,"context_line":"        else:"},{"line_number":114,"context_line":"            message \u003d _(\"Unsupported schema major version: %s\""},{"line_number":115,"context_line":"                        ) % schema_version.major"},{"line_number":116,"context_line":"            raise ProviderConfigException(message)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_9116a955","line":113,"range":{"start_line":113,"start_character":8,"end_line":113,"end_character":12},"in_reply_to":"3fa7e38b_962a1f2a","updated":"2019-10-18 22:48:49.000000000","message":"Done","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"36669945c0be81b4db1ccc9ff2760859ce5343ca","unresolved":false,"context_lines":[{"line_number":32,"context_line":"# A dictionary with keys for all supported major versions with lists of"},{"line_number":33,"context_line":"# corresponding minor versions as values."},{"line_number":34,"context_line":"SUPPORTED_SCHEMA_VERSIONS \u003d {"},{"line_number":35,"context_line":"    1: [0]"},{"line_number":36,"context_line":"}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_ae68bbf3","line":35,"range":{"start_line":35,"start_character":7,"end_line":35,"end_character":10},"updated":"2019-10-25 19:31:54.000000000","message":"nit: this could be a set for \"faster\" lookup","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"ec8721933af4c24e6aaf58a0593e31780282beae","unresolved":false,"context_lines":[{"line_number":32,"context_line":"# A dictionary with keys for all supported major versions with lists of"},{"line_number":33,"context_line":"# corresponding minor versions as values."},{"line_number":34,"context_line":"SUPPORTED_SCHEMA_VERSIONS \u003d {"},{"line_number":35,"context_line":"    1: [0]"},{"line_number":36,"context_line":"}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_2dd215d3","line":35,"range":{"start_line":35,"start_character":7,"end_line":35,"end_character":10},"in_reply_to":"3fa7e38b_ae68bbf3","updated":"2019-11-05 19:05:29.000000000","message":"Done","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"36669945c0be81b4db1ccc9ff2760859ce5343ca","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        if not pkg_resources.resource_exists(__name__, schema_file_name):"},{"line_number":56,"context_line":"            raise nova_exc.ProviderConfigException("},{"line_number":57,"context_line":"                error\u003d\"Unable to find schema file for supported major \""},{"line_number":58,"context_line":"                       \"version: %s\" % schema_version.major)"},{"line_number":59,"context_line":"        with pkg_resources.resource_stream(__name__, schema_file_name) as f:"},{"line_number":60,"context_line":"            _SCHEMA_DICT[schema_version.major] \u003d yaml.safe_load(f)"},{"line_number":61,"context_line":"    return _SCHEMA_DICT[schema_version.major]"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_ce6df703","line":58,"range":{"start_line":58,"start_character":34,"end_line":58,"end_character":35},"updated":"2019-10-25 19:31:54.000000000","message":"d","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"ec8721933af4c24e6aaf58a0593e31780282beae","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        if not pkg_resources.resource_exists(__name__, schema_file_name):"},{"line_number":56,"context_line":"            raise nova_exc.ProviderConfigException("},{"line_number":57,"context_line":"                error\u003d\"Unable to find schema file for supported major \""},{"line_number":58,"context_line":"                       \"version: %s\" % schema_version.major)"},{"line_number":59,"context_line":"        with pkg_resources.resource_stream(__name__, schema_file_name) as f:"},{"line_number":60,"context_line":"            _SCHEMA_DICT[schema_version.major] \u003d yaml.safe_load(f)"},{"line_number":61,"context_line":"    return _SCHEMA_DICT[schema_version.major]"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_cdd6e1c5","line":58,"range":{"start_line":58,"start_character":34,"end_line":58,"end_character":35},"in_reply_to":"3fa7e38b_ce6df703","updated":"2019-11-05 19:05:29.000000000","message":"Done","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"36669945c0be81b4db1ccc9ff2760859ce5343ca","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":99,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":100,"context_line":"            error\u003d\"Unsupported schema major version: %s\""},{"line_number":101,"context_line":"                   % schema_version.major)"},{"line_number":102,"context_line":"    if schema_version.minor not in \\"},{"line_number":103,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_0e51cf36","line":100,"range":{"start_line":100,"start_character":54,"end_line":100,"end_character":55},"updated":"2019-10-25 19:31:54.000000000","message":"d","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"ec8721933af4c24e6aaf58a0593e31780282beae","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":99,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":100,"context_line":"            error\u003d\"Unsupported schema major version: %s\""},{"line_number":101,"context_line":"                   % schema_version.major)"},{"line_number":102,"context_line":"    if schema_version.minor not in \\"},{"line_number":103,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_edd39dd2","line":100,"range":{"start_line":100,"start_character":54,"end_line":100,"end_character":55},"in_reply_to":"3fa7e38b_0e51cf36","updated":"2019-11-05 19:05:29.000000000","message":"Done","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import microversion_parse"},{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":"import pkg_resources"},{"line_number":18,"context_line":"import yaml"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from nova import exception as nova_exc"},{"line_number":21,"context_line":"from nova.i18n import _"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_1e1a887f","line":18,"updated":"2020-01-17 13:49:58.000000000","message":"there tend to be two separate blocks of imports for stdlibs and 3rd party libs","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import microversion_parse"},{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":"import pkg_resources"},{"line_number":18,"context_line":"import yaml"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from nova import exception as nova_exc"},{"line_number":21,"context_line":"from nova.i18n import _"}],"source_content_type":"text/x-python","patch_set":37,"id":"1fa4df85_05d6dbc6","line":18,"in_reply_to":"3fa7e38b_1e1a887f","updated":"2020-02-26 20:05:35.000000000","message":"Done","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                                 \u0027provider_config_schema_v{version}.yaml\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# Dict to cache schema instances"},{"line_number":30,"context_line":"_SCHEMA_DICT \u003d {}"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# A dictionary with keys for all supported major versions with lists of"},{"line_number":33,"context_line":"# corresponding minor versions as values."}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_f991c69c","line":30,"updated":"2020-01-17 13:49:58.000000000","message":"I understand the need of caching but module global smells bad (especially from testing perspective). I suggest to wrap this module in a class ProviderConfig (bikeshed the name!) and let the compute service instantiate one object of it and let the object do the caching of the schema.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f07f5b43753505f8aea606ab6d95f3802c449e5f","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                                 \u0027provider_config_schema_v{version}.yaml\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# Dict to cache schema instances"},{"line_number":30,"context_line":"_SCHEMA_DICT \u003d {}"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# A dictionary with keys for all supported major versions with lists of"},{"line_number":33,"context_line":"# corresponding minor versions as values."}],"source_content_type":"text/x-python","patch_set":37,"id":"1fa4df85_4d252408","line":30,"in_reply_to":"1fa4df85_2bdb3d7c","updated":"2020-03-10 12:03:08.000000000","message":"we are now in python 3 so we can actully now start using the functool.lru_cache decorator\n\nhttps://docs.python.org/3/library/functools.html#functools.lru_cache\n\nso i think ill refactor it to use that on _load_schema and remove this.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a290a66c7cf097153fb004468c22cbd1b0fbed0c","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                                 \u0027provider_config_schema_v{version}.yaml\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# Dict to cache schema instances"},{"line_number":30,"context_line":"_SCHEMA_DICT \u003d {}"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# A dictionary with keys for all supported major versions with lists of"},{"line_number":33,"context_line":"# corresponding minor versions as values."}],"source_content_type":"text/x-python","patch_set":37,"id":"1fa4df85_2bdb3d7c","line":30,"in_reply_to":"1fa4df85_45f5b356","updated":"2020-03-04 18:16:08.000000000","message":"I can live with the module level cache here for now. Could be enhanced later.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                                 \u0027provider_config_schema_v{version}.yaml\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# Dict to cache schema instances"},{"line_number":30,"context_line":"_SCHEMA_DICT \u003d {}"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# A dictionary with keys for all supported major versions with lists of"},{"line_number":33,"context_line":"# corresponding minor versions as values."}],"source_content_type":"text/x-python","patch_set":37,"id":"1fa4df85_45f5b356","line":30,"in_reply_to":"3fa7e38b_e0fc7772","updated":"2020-02-26 20:05:35.000000000","message":"ill take a look at this after i address the other comments\n\nwe have done both in the past and usign a model level cache is what i have seen more often but i do get the testing aspect. that said you can just use the mock dict patching support to mock it pretty simpley in tests. i find that people just dont know how to use that correctly and tend to over look it.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"6bdbcafb12f6e50f402cd55302df0bf9f55b995a","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                                 \u0027provider_config_schema_v{version}.yaml\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# Dict to cache schema instances"},{"line_number":30,"context_line":"_SCHEMA_DICT \u003d {}"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# A dictionary with keys for all supported major versions with lists of"},{"line_number":33,"context_line":"# corresponding minor versions as values."}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_e0fc7772","line":30,"in_reply_to":"3fa7e38b_f991c69c","updated":"2020-01-21 20:17:01.000000000","message":"I will look into this, thanks.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        schema_file_name \u003d _SCHEMA_FILE_BASE.format("},{"line_number":52,"context_line":"            version\u003dschema_version.major)"},{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            with pkg_resources.resource_stream(__name__,"},{"line_number":55,"context_line":"                                               schema_file_name) as open_file:"},{"line_number":56,"context_line":"                _SCHEMA_DICT[schema_version.major] \u003d yaml.safe_load(open_file)"},{"line_number":57,"context_line":"        except OSError:"},{"line_number":58,"context_line":"            raise nova_exc.ProviderConfigException("}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_3903de0e","line":55,"range":{"start_line":54,"start_character":1,"end_line":55,"end_character":78},"updated":"2020-01-17 13:49:58.000000000","message":"\u003copinion\u003e\nI would prefer this kind of formatting\n\n    with pkg_resources.resource_stream(\n        __name__, schema_file_name) as open_file:","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        schema_file_name \u003d _SCHEMA_FILE_BASE.format("},{"line_number":52,"context_line":"            version\u003dschema_version.major)"},{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            with pkg_resources.resource_stream(__name__,"},{"line_number":55,"context_line":"                                               schema_file_name) as open_file:"},{"line_number":56,"context_line":"                _SCHEMA_DICT[schema_version.major] \u003d yaml.safe_load(open_file)"},{"line_number":57,"context_line":"        except OSError:"},{"line_number":58,"context_line":"            raise nova_exc.ProviderConfigException("}],"source_content_type":"text/x-python","patch_set":37,"id":"1fa4df85_85e16b9d","line":55,"range":{"start_line":54,"start_character":1,"end_line":55,"end_character":78},"in_reply_to":"3fa7e38b_3903de0e","updated":"2020-02-26 20:05:35.000000000","message":"yes when you need to split arcoss more then 1 line you should move all args to the next line.\n\ndone","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            with pkg_resources.resource_stream(__name__,"},{"line_number":55,"context_line":"                                               schema_file_name) as open_file:"},{"line_number":56,"context_line":"                _SCHEMA_DICT[schema_version.major] \u003d yaml.safe_load(open_file)"},{"line_number":57,"context_line":"        except OSError:"},{"line_number":58,"context_line":"            raise nova_exc.ProviderConfigException("},{"line_number":59,"context_line":"                error\u003d\"Unable to find schema file for supported \""}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_391c3e65","line":56,"range":{"start_line":56,"start_character":58,"end_line":56,"end_character":67},"updated":"2020-01-17 13:49:58.000000000","message":"can it raise exceptions other than OSError descendants? Do we want to document that?","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"6bdbcafb12f6e50f402cd55302df0bf9f55b995a","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            with pkg_resources.resource_stream(__name__,"},{"line_number":55,"context_line":"                                               schema_file_name) as open_file:"},{"line_number":56,"context_line":"                _SCHEMA_DICT[schema_version.major] \u003d yaml.safe_load(open_file)"},{"line_number":57,"context_line":"        except OSError:"},{"line_number":58,"context_line":"            raise nova_exc.ProviderConfigException("},{"line_number":59,"context_line":"                error\u003d\"Unable to find schema file for supported \""}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_a0f2ff99","line":56,"range":{"start_line":56,"start_character":58,"end_line":56,"end_character":67},"in_reply_to":"3fa7e38b_391c3e65","updated":"2020-01-21 20:17:01.000000000","message":"I don\u0027t think so, but I will double check and fix/document as needed.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            with pkg_resources.resource_stream(__name__,"},{"line_number":55,"context_line":"                                               schema_file_name) as open_file:"},{"line_number":56,"context_line":"                _SCHEMA_DICT[schema_version.major] \u003d yaml.safe_load(open_file)"},{"line_number":57,"context_line":"        except OSError:"},{"line_number":58,"context_line":"            raise nova_exc.ProviderConfigException("},{"line_number":59,"context_line":"                error\u003d\"Unable to find schema file for supported \""}],"source_content_type":"text/x-python","patch_set":37,"id":"1fa4df85_451ff36b","line":56,"range":{"start_line":56,"start_character":58,"end_line":56,"end_character":67},"in_reply_to":"3fa7e38b_a0f2ff99","updated":"2020-02-26 20:05:35.000000000","message":"it can raise yaml.YAMLError or one of its subclasses if there is a parser error.\nhttps://pyyaml.org/wiki/PyYAMLDocumentation#yamlerror\n\ni will rework this to share code with _load_yaml_file below since that code should be the same.\n\ni will catch yaml.YAMLError explicitly and convert it to a ProviderConfigException and update the error message with the yaml error.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"\"\""},{"line_number":71,"context_line":"    try:"},{"line_number":72,"context_line":"        with open(path) as open_file:"},{"line_number":73,"context_line":"            return yaml.safe_load(open_file)"},{"line_number":74,"context_line":"    except OSError:"},{"line_number":75,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":76,"context_line":"            error\u003d\"Unable to read yaml config file: [%s]\" % path)"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_f93546dd","line":73,"range":{"start_line":73,"start_character":24,"end_line":73,"end_character":33},"updated":"2020-01-17 13:49:58.000000000","message":"ditto","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def _parse_provider_yaml(path):"},{"line_number":80,"context_line":"    \"\"\"Loads, schema-validates, and parses a provider.yaml file into a dict."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    :param path: File system path to the file to parse."},{"line_number":83,"context_line":"    :return: dict representing the contents of the file."}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_195f0211","line":80,"range":{"start_line":80,"start_character":14,"end_line":80,"end_character":42},"updated":"2020-01-17 13:49:58.000000000","message":"nit: reorder it to reflect reality","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a36f6879ada31d6fc9ad9baf18042f35862298f","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                   % schema_version.major)"},{"line_number":101,"context_line":"    if schema_version.minor not in \\"},{"line_number":102,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"},{"line_number":103,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":104,"context_line":"                    \"%(schema_version)s. Nova supports the major version, \""},{"line_number":105,"context_line":"                    \"but not the minor. Some fields may be ignored.\""},{"line_number":106,"context_line":"                    ) % {\"path\": path,"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_c5cbb448","line":103,"range":{"start_line":103,"start_character":18,"end_line":103,"end_character":19},"updated":"2020-01-18 14:25:22.000000000","message":"Do we still translate LOG messages?","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"6bdbcafb12f6e50f402cd55302df0bf9f55b995a","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                   % schema_version.major)"},{"line_number":101,"context_line":"    if schema_version.minor not in \\"},{"line_number":102,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"},{"line_number":103,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":104,"context_line":"                    \"%(schema_version)s. Nova supports the major version, \""},{"line_number":105,"context_line":"                    \"but not the minor. Some fields may be ignored.\""},{"line_number":106,"context_line":"                    ) % {\"path\": path,"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_e031d759","line":103,"range":{"start_line":103,"start_character":18,"end_line":103,"end_character":19},"in_reply_to":"3fa7e38b_c5cbb448","updated":"2020-01-21 20:17:01.000000000","message":"IIRC, I did it here because it was called out in a previous review, I will look into it.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c4695c9b9fcc7dfddf374e591794f82a7fc3f5e5","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                   % schema_version.major)"},{"line_number":101,"context_line":"    if schema_version.minor not in \\"},{"line_number":102,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"},{"line_number":103,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":104,"context_line":"                    \"%(schema_version)s. Nova supports the major version, \""},{"line_number":105,"context_line":"                    \"but not the minor. Some fields may be ignored.\""},{"line_number":106,"context_line":"                    ) % {\"path\": path,"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_4938179e","line":103,"range":{"start_line":103,"start_character":18,"end_line":103,"end_character":19},"in_reply_to":"3fa7e38b_e031d759","updated":"2020-01-21 21:47:09.000000000","message":"Oo, oo, I can answer this one.\n\nNo.\n\n(We do still translate exception messages though.)","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                   % schema_version.major)"},{"line_number":101,"context_line":"    if schema_version.minor not in \\"},{"line_number":102,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"},{"line_number":103,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":104,"context_line":"                    \"%(schema_version)s. Nova supports the major version, \""},{"line_number":105,"context_line":"                    \"but not the minor. Some fields may be ignored.\""},{"line_number":106,"context_line":"                    ) % {\"path\": path,"},{"line_number":107,"context_line":"                         \"schema_version\": schema_version}"},{"line_number":108,"context_line":"        LOG.warning(message)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    schema \u003d _load_schema(schema_version)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_797e366e","line":108,"range":{"start_line":103,"start_character":0,"end_line":108,"end_character":28},"updated":"2020-01-17 13:49:58.000000000","message":"I think we need more specific error message. Like listing the fields we ignore to avoid confusion. I\u0027m OK to add it as a separate improvement later.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a290a66c7cf097153fb004468c22cbd1b0fbed0c","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                   % schema_version.major)"},{"line_number":101,"context_line":"    if schema_version.minor not in \\"},{"line_number":102,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"},{"line_number":103,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":104,"context_line":"                    \"%(schema_version)s. Nova supports the major version, \""},{"line_number":105,"context_line":"                    \"but not the minor. Some fields may be ignored.\""},{"line_number":106,"context_line":"                    ) % {\"path\": path,"},{"line_number":107,"context_line":"                         \"schema_version\": schema_version}"},{"line_number":108,"context_line":"        LOG.warning(message)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    schema \u003d _load_schema(schema_version)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"1fa4df85_8b6111ac","line":108,"range":{"start_line":103,"start_character":0,"end_line":108,"end_character":28},"in_reply_to":"1fa4df85_18b87ec6","updated":"2020-03-04 18:16:08.000000000","message":"TODO works for me. Thanks.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f3932877e8283413c0903fd86ed8d7893fd26afc","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                   % schema_version.major)"},{"line_number":101,"context_line":"    if schema_version.minor not in \\"},{"line_number":102,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"},{"line_number":103,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":104,"context_line":"                    \"%(schema_version)s. Nova supports the major version, \""},{"line_number":105,"context_line":"                    \"but not the minor. Some fields may be ignored.\""},{"line_number":106,"context_line":"                    ) % {\"path\": path,"},{"line_number":107,"context_line":"                         \"schema_version\": schema_version}"},{"line_number":108,"context_line":"        LOG.warning(message)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    schema \u003d _load_schema(schema_version)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_8517fc46","line":108,"range":{"start_line":103,"start_character":0,"end_line":108,"end_character":28},"in_reply_to":"3fa7e38b_50c54808","updated":"2020-01-18 10:45:14.000000000","message":"Alternatively we can have a strict version of the schema (e.g. programatically set additionalProperties false in the current) and allow the admin to run that schema against his configs to see what are the ignored fields. This could be a separate CLI tool to catch typos and prevent the troubleshooting pain when the admin has a \"additonal\" key in the config instead of \"additional\" and she does not understand why to config is not applied by nova.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c60f9c17feb0c6f7e9a773e8237b53fa69f1b9b2","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                   % schema_version.major)"},{"line_number":101,"context_line":"    if schema_version.minor not in \\"},{"line_number":102,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"},{"line_number":103,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":104,"context_line":"                    \"%(schema_version)s. Nova supports the major version, \""},{"line_number":105,"context_line":"                    \"but not the minor. Some fields may be ignored.\""},{"line_number":106,"context_line":"                    ) % {\"path\": path,"},{"line_number":107,"context_line":"                         \"schema_version\": schema_version}"},{"line_number":108,"context_line":"        LOG.warning(message)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    schema \u003d _load_schema(schema_version)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_50c54808","line":108,"range":{"start_line":103,"start_character":0,"end_line":108,"end_character":28},"in_reply_to":"3fa7e38b_797e366e","updated":"2020-01-17 18:12:36.000000000","message":"I think that will be really hard to do. We would have to dissect the schema.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                   % schema_version.major)"},{"line_number":101,"context_line":"    if schema_version.minor not in \\"},{"line_number":102,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"},{"line_number":103,"context_line":"        message \u003d _(\"Provider config file [%(path)s] is at schema version \""},{"line_number":104,"context_line":"                    \"%(schema_version)s. Nova supports the major version, \""},{"line_number":105,"context_line":"                    \"but not the minor. Some fields may be ignored.\""},{"line_number":106,"context_line":"                    ) % {\"path\": path,"},{"line_number":107,"context_line":"                         \"schema_version\": schema_version}"},{"line_number":108,"context_line":"        LOG.warning(message)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    schema \u003d _load_schema(schema_version)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"1fa4df85_18b87ec6","line":108,"range":{"start_line":103,"start_character":0,"end_line":108,"end_character":28},"in_reply_to":"3fa7e38b_8517fc46","updated":"2020-02-26 20:05:35.000000000","message":"for now im not going to adress this as i think it can be changed in a follow up patch but i will put a TODO in the code.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4d57e1af73398bd81c9798c2cc9b52b1fe670d5c","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    schema \u003d _load_schema(schema_version)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    print(\"schema:\", schema)"},{"line_number":137,"context_line":"    print(\"yaml:\", yaml_file)"},{"line_number":138,"context_line":"    try:"},{"line_number":139,"context_line":"        jsonschema.validate(yaml_file, schema)"},{"line_number":140,"context_line":"    except jsonschema.exceptions.ValidationError as e:"},{"line_number":141,"context_line":"        raise nova_exc.ProviderConfigException("}],"source_content_type":"text/x-python","patch_set":38,"id":"1fa4df85_7a05c6c1","line":138,"range":{"start_line":136,"start_character":4,"end_line":138,"end_character":8},"updated":"2020-02-28 15:11:59.000000000","message":"forgot to remove this\nill fix it in the next version","commit_id":"7aaf2cd5130fdfc01a57957fe1cd351d433d0bb5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a290a66c7cf097153fb004468c22cbd1b0fbed0c","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"def _parse_provider_yaml(path):"},{"line_number":101,"context_line":"    \"\"\"Loads schema, parses a provider.yaml file and validtes the content."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    :param path: File system path to the file to parse."},{"line_number":104,"context_line":"    :return: dict representing the contents of the file."}],"source_content_type":"text/x-python","patch_set":39,"id":"1fa4df85_6b437514","line":101,"range":{"start_line":101,"start_character":53,"end_line":101,"end_character":61},"updated":"2020-03-04 18:16:08.000000000","message":"validates","commit_id":"b9e84c14cbb4401168609b9aadc37f2e97e3e26e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"978b462d9871234a285ab5d0e765a4144fa2df44","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        cannot be found or the schema is not valid yaml."},{"line_number":46,"context_line":"    \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    schema_file_name \u003d _SCHEMA_FILE_BASE.format("},{"line_number":50,"context_line":"        version\u003dschema_version.major)"},{"line_number":51,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":42,"id":"1fa4df85_90ca199f","line":48,"updated":"2020-03-13 01:57:24.000000000","message":"this is the pep8 issue ill fix that tommorow","commit_id":"90b62729be8d66e1612c2a2817b9e5c90f7f554f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":30,"context_line":"# A dictionary with keys for all supported major versions with lists of"},{"line_number":31,"context_line":"# corresponding minor versions as values."},{"line_number":32,"context_line":"SUPPORTED_SCHEMA_VERSIONS \u003d {"},{"line_number":33,"context_line":"    1: {0}"},{"line_number":34,"context_line":"}"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_967739a0","line":33,"range":{"start_line":33,"start_character":7,"end_line":33,"end_character":10},"updated":"2020-07-22 13:10:17.000000000","message":"This seems unnecessary. Are we ever going to drop support for older minor versions? Assuming not, could we just use e.g.\n\n  MIN_SCHEMA_VERSION \u003d (1, 0)\n  MAX_SCHEMA_VERSION \u003d (1, 0)\n\nand just check that things are inside the range?","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":30,"context_line":"# A dictionary with keys for all supported major versions with lists of"},{"line_number":31,"context_line":"# corresponding minor versions as values."},{"line_number":32,"context_line":"SUPPORTED_SCHEMA_VERSIONS \u003d {"},{"line_number":33,"context_line":"    1: {0}"},{"line_number":34,"context_line":"}"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_c93af3e5","line":33,"range":{"start_line":33,"start_character":7,"end_line":33,"end_character":10},"in_reply_to":"bf51134e_967739a0","updated":"2020-07-27 09:01:08.000000000","message":"I tried this new way. but it\u0027s quite hard to detect unsupported minor version. for example, say the current code supports 1.0, 1,1, 1.2 and 2.0, 2.1; per spec, code should be able to read v1.3 and give a warning of ignoring unknown fields. \n\nSo I have to keep the existing old way.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"328f6825fdee06f928ea5cc911cb767e2550a452","unresolved":false,"context_lines":[{"line_number":34,"context_line":"}"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"@functools.lru_cache(maxsize\u003d42)"},{"line_number":38,"context_line":"def _load_schema(schema_version):"},{"line_number":39,"context_line":"    \"\"\"Loads and parses a provider.yaml schema file into a dict."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_9ac9375c","line":37,"range":{"start_line":37,"start_character":21,"end_line":37,"end_character":31},"updated":"2020-07-21 12:56:41.000000000","message":"since we have one schema version today this 42 will never be hit. We could even keep the default (128) and simply use @functools.lru_cache as a decorator","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"16d15b493815997abf2f3cc70ae818d2868ae388","unresolved":false,"context_lines":[{"line_number":34,"context_line":"}"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"@functools.lru_cache(maxsize\u003d42)"},{"line_number":38,"context_line":"def _load_schema(schema_version):"},{"line_number":39,"context_line":"    \"\"\"Loads and parses a provider.yaml schema file into a dict."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_691bb57f","line":37,"range":{"start_line":37,"start_character":21,"end_line":37,"end_character":31},"in_reply_to":"bf51134e_9ac9375c","updated":"2020-07-22 04:10:22.000000000","message":"I will simply use lru_cache as our decorator.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    schema_file_name \u003d _SCHEMA_FILE_BASE.format("},{"line_number":48,"context_line":"        version\u003dschema_version.major)"},{"line_number":49,"context_line":"    try:"},{"line_number":50,"context_line":"        with pkg_resources.resource_stream("},{"line_number":51,"context_line":"                __name__, schema_file_name) as stream:"},{"line_number":52,"context_line":"            return _load_yaml_stream(stream)"},{"line_number":53,"context_line":"    except OSError:"}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_9b1be47e","line":50,"range":{"start_line":50,"start_character":13,"end_line":50,"end_character":26},"updated":"2020-07-22 13:10:17.000000000","message":"Use of pkg_resources implies a not-insignificant performance penalty. It would be much easier keep this schema in-code IMO","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    schema_file_name \u003d _SCHEMA_FILE_BASE.format("},{"line_number":48,"context_line":"        version\u003dschema_version.major)"},{"line_number":49,"context_line":"    try:"},{"line_number":50,"context_line":"        with pkg_resources.resource_stream("},{"line_number":51,"context_line":"                __name__, schema_file_name) as stream:"},{"line_number":52,"context_line":"            return _load_yaml_stream(stream)"},{"line_number":53,"context_line":"    except OSError:"}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_059b3172","line":50,"range":{"start_line":50,"start_character":13,"end_line":50,"end_character":26},"in_reply_to":"bf51134e_9b1be47e","updated":"2020-07-27 09:01:08.000000000","message":"yes. no longer needed.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                __name__, schema_file_name) as stream:"},{"line_number":52,"context_line":"            return _load_yaml_stream(stream)"},{"line_number":53,"context_line":"    except OSError:"},{"line_number":54,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":55,"context_line":"            error\u003d\"Unable to find schema file for supported \""},{"line_number":56,"context_line":"            \"major version: %d\" % schema_version.major)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_7b06d022","line":54,"range":{"start_line":54,"start_character":23,"end_line":54,"end_character":46},"updated":"2020-07-22 13:10:17.000000000","message":"It would also avoid the need for this new exception","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                __name__, schema_file_name) as stream:"},{"line_number":52,"context_line":"            return _load_yaml_stream(stream)"},{"line_number":53,"context_line":"    except OSError:"},{"line_number":54,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":55,"context_line":"            error\u003d\"Unable to find schema file for supported \""},{"line_number":56,"context_line":"            \"major version: %d\" % schema_version.major)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_e5939d5b","line":54,"range":{"start_line":54,"start_character":23,"end_line":54,"end_character":46},"in_reply_to":"bf51134e_7b06d022","updated":"2020-07-27 09:01:08.000000000","message":"yes. no longer needed.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    try:"},{"line_number":67,"context_line":"        return yaml.safe_load(stream)"},{"line_number":68,"context_line":"    except yaml.YAMLError as ex:"},{"line_number":69,"context_line":"        message \u003d ("},{"line_number":70,"context_line":"            \"Unable to load yaml file, an error has occurred. \""},{"line_number":71,"context_line":"            \"message: %s\" % ex)"},{"line_number":72,"context_line":"        if hasattr(ex, \u0027problem_mark\u0027):"},{"line_number":73,"context_line":"            pos \u003d ex.problem_mark"},{"line_number":74,"context_line":"            message +\u003d \"File: %s \" % stream.name"}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_f6079517","line":71,"range":{"start_line":69,"start_character":18,"end_line":71,"end_character":31},"updated":"2020-07-22 13:10:17.000000000","message":"Exceptions should be translated:\n\n  message \u003d _(\n      \u0027Unable to load YAML file, an error has occured: %s\u0027\n  )","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    try:"},{"line_number":67,"context_line":"        return yaml.safe_load(stream)"},{"line_number":68,"context_line":"    except yaml.YAMLError as ex:"},{"line_number":69,"context_line":"        message \u003d ("},{"line_number":70,"context_line":"            \"Unable to load yaml file, an error has occurred. \""},{"line_number":71,"context_line":"            \"message: %s\" % ex)"},{"line_number":72,"context_line":"        if hasattr(ex, \u0027problem_mark\u0027):"},{"line_number":73,"context_line":"            pos \u003d ex.problem_mark"},{"line_number":74,"context_line":"            message +\u003d \"File: %s \" % stream.name"}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_65894d25","line":71,"range":{"start_line":69,"start_character":18,"end_line":71,"end_character":31},"in_reply_to":"bf51134e_f6079517","updated":"2020-07-27 09:01:08.000000000","message":"yes, will fix.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        message \u003d ("},{"line_number":70,"context_line":"            \"Unable to load yaml file, an error has occurred. \""},{"line_number":71,"context_line":"            \"message: %s\" % ex)"},{"line_number":72,"context_line":"        if hasattr(ex, \u0027problem_mark\u0027):"},{"line_number":73,"context_line":"            pos \u003d ex.problem_mark"},{"line_number":74,"context_line":"            message +\u003d \"File: %s \" % stream.name"},{"line_number":75,"context_line":"            message +\u003d \"Error position: (%s:%s)\" % ("}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_b626bdb9","line":72,"range":{"start_line":72,"start_character":0,"end_line":72,"end_character":39},"updated":"2020-07-22 13:10:17.000000000","message":"Could you give an explanation on why you\u0027re doing this? I assume it\u0027s for extra context? A pointer to PyYAML docs on this attribute [1] would be helpful too\n\n[1] https://pyyaml.org/wiki/PyYAMLDocumentation#yamlerror","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        message \u003d ("},{"line_number":70,"context_line":"            \"Unable to load yaml file, an error has occurred. \""},{"line_number":71,"context_line":"            \"message: %s\" % ex)"},{"line_number":72,"context_line":"        if hasattr(ex, \u0027problem_mark\u0027):"},{"line_number":73,"context_line":"            pos \u003d ex.problem_mark"},{"line_number":74,"context_line":"            message +\u003d \"File: %s \" % stream.name"},{"line_number":75,"context_line":"            message +\u003d \"Error position: (%s:%s)\" % ("}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_0c407935","line":72,"range":{"start_line":72,"start_character":0,"end_line":72,"end_character":39},"in_reply_to":"bf51134e_b626bdb9","updated":"2020-07-27 09:01:08.000000000","message":"agree， keep this no change for extra context.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            message +\u003d \"File: %s \" % stream.name"},{"line_number":75,"context_line":"            message +\u003d \"Error position: (%s:%s)\" % ("},{"line_number":76,"context_line":"                pos.line + 1, pos.column + 1)"},{"line_number":77,"context_line":"        raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def _load_yaml_file(path):"}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_d60a511e","line":77,"range":{"start_line":77,"start_character":14,"end_line":77,"end_character":61},"updated":"2020-07-22 13:10:17.000000000","message":"then\n\n  error\u003dmessage % ex","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"6fd21f37b36d06a3815a2d628a655e967bf5122a","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            message +\u003d \"File: %s \" % stream.name"},{"line_number":75,"context_line":"            message +\u003d \"Error position: (%s:%s)\" % ("},{"line_number":76,"context_line":"                pos.line + 1, pos.column + 1)"},{"line_number":77,"context_line":"        raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def _load_yaml_file(path):"}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_8718d21d","line":77,"range":{"start_line":77,"start_character":14,"end_line":77,"end_character":61},"in_reply_to":"9f560f44_4f6d4397","updated":"2020-07-28 02:25:19.000000000","message":"understood. will change it to\nmessage \u003d _(\"Unable to load yaml file, an error has occurred. \")\nmessage +\u003d \"Message: %s\" % ex","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def1a0f82ba47208ba3d0803c4b4b34b040d50db","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            message +\u003d \"File: %s \" % stream.name"},{"line_number":75,"context_line":"            message +\u003d \"Error position: (%s:%s)\" % ("},{"line_number":76,"context_line":"                pos.line + 1, pos.column + 1)"},{"line_number":77,"context_line":"        raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def _load_yaml_file(path):"}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_4f6d4397","line":77,"range":{"start_line":77,"start_character":14,"end_line":77,"end_character":61},"in_reply_to":"9f560f44_ec9385a2","updated":"2020-07-27 09:32:23.000000000","message":"See comments in next patchset. You shouldn\u0027t translate variables like ex. You should only translate strings","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            message +\u003d \"File: %s \" % stream.name"},{"line_number":75,"context_line":"            message +\u003d \"Error position: (%s:%s)\" % ("},{"line_number":76,"context_line":"                pos.line + 1, pos.column + 1)"},{"line_number":77,"context_line":"        raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def _load_yaml_file(path):"}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_ec9385a2","line":77,"range":{"start_line":77,"start_character":14,"end_line":77,"end_character":61},"in_reply_to":"bf51134e_d60a511e","updated":"2020-07-27 09:01:08.000000000","message":"it looks like message has already saved ex on Line 71, if my understanding is correct.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            return _load_yaml_stream(open_file)"},{"line_number":91,"context_line":"    except OSError:"},{"line_number":92,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":93,"context_line":"            error\u003d\"Unable to read yaml config file: [%s]\" % path)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def _parse_provider_yaml(path):"}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_b6e7dd46","line":93,"range":{"start_line":93,"start_character":18,"end_line":93,"end_character":57},"updated":"2020-07-22 13:10:17.000000000","message":"This needs to be translated. Also, why is path is brackets? Nothing else is in brackets","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            return _load_yaml_stream(open_file)"},{"line_number":91,"context_line":"    except OSError:"},{"line_number":92,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":93,"context_line":"            error\u003d\"Unable to read yaml config file: [%s]\" % path)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def _parse_provider_yaml(path):"}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_8588e11f","line":93,"range":{"start_line":93,"start_character":18,"end_line":93,"end_character":57},"in_reply_to":"bf51134e_b6e7dd46","updated":"2020-07-27 09:01:08.000000000","message":"yes. will fix - translation and remove brackets.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"328f6825fdee06f928ea5cc911cb767e2550a452","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def _parse_provider_yaml(path):"},{"line_number":97,"context_line":"    \"\"\"Loads schema, parses a provider.yaml file and validtes the content."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    :param path: File system path to the file to parse."},{"line_number":100,"context_line":"    :return: dict representing the contents of the file."}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_da9c4f6c","line":97,"range":{"start_line":97,"start_character":53,"end_line":97,"end_character":61},"updated":"2020-07-21 12:56:41.000000000","message":"validates","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"16d15b493815997abf2f3cc70ae818d2868ae388","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def _parse_provider_yaml(path):"},{"line_number":97,"context_line":"    \"\"\"Loads schema, parses a provider.yaml file and validtes the content."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    :param path: File system path to the file to parse."},{"line_number":100,"context_line":"    :return: dict representing the contents of the file."}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_e906a521","line":97,"range":{"start_line":97,"start_character":53,"end_line":97,"end_character":61},"in_reply_to":"bf51134e_da9c4f6c","updated":"2020-07-22 04:10:22.000000000","message":"Thanks for the catch. will fix.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            yaml_file[\u0027meta\u0027][\u0027schema_version\u0027])"},{"line_number":110,"context_line":"    except (KeyError, TypeError):"},{"line_number":111,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":112,"context_line":"            error\u003d\"Unable to detect schema version: %s\" % yaml_file)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":115,"context_line":"        raise nova_exc.ProviderConfigException("}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_f67cb573","line":112,"range":{"start_line":112,"start_character":18,"end_line":112,"end_character":55},"updated":"2020-07-22 13:10:17.000000000","message":"This needs to be translated","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            yaml_file[\u0027meta\u0027][\u0027schema_version\u0027])"},{"line_number":110,"context_line":"    except (KeyError, TypeError):"},{"line_number":111,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":112,"context_line":"            error\u003d\"Unable to detect schema version: %s\" % yaml_file)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":115,"context_line":"        raise nova_exc.ProviderConfigException("}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_e57c3d22","line":112,"range":{"start_line":112,"start_character":18,"end_line":112,"end_character":55},"in_reply_to":"bf51134e_f67cb573","updated":"2020-07-27 09:01:08.000000000","message":"yes. will fix - translation.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":112,"context_line":"            error\u003d\"Unable to detect schema version: %s\" % yaml_file)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":115,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":116,"context_line":"            error\u003d\"Unsupported schema major version: %d\""},{"line_number":117,"context_line":"                   % schema_version.major)"}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_36ad8dea","line":114,"updated":"2020-07-22 13:10:17.000000000","message":"See above comment about doing a simple range check","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":112,"context_line":"            error\u003d\"Unable to detect schema version: %s\" % yaml_file)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":115,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":116,"context_line":"            error\u003d\"Unsupported schema major version: %d\""},{"line_number":117,"context_line":"                   % schema_version.major)"}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_4c9271f8","line":114,"in_reply_to":"bf51134e_36ad8dea","updated":"2020-07-27 09:01:08.000000000","message":"keep original code - reason see above answer.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            \"Provider config file [%(path)s] is at schema version \""},{"line_number":125,"context_line":"            \"%(schema_version)s. Nova supports the major version, \""},{"line_number":126,"context_line":"            \"but not the minor. Some fields may be ignored.\""},{"line_number":127,"context_line":"            % {\"path\": path, \"schema_version\": schema_version})"},{"line_number":128,"context_line":"        LOG.warning(message)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    schema \u003d _load_schema(schema_version)"}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_969c59c0","line":127,"updated":"2020-07-22 13:10:17.000000000","message":"This seems like more detail than we\u0027ll ever need. Realistically, this schema probably isn\u0027t going to go through a significant amount of iterations. If it did, we could easily revisit","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            \"Provider config file [%(path)s] is at schema version \""},{"line_number":125,"context_line":"            \"%(schema_version)s. Nova supports the major version, \""},{"line_number":126,"context_line":"            \"but not the minor. Some fields may be ignored.\""},{"line_number":127,"context_line":"            % {\"path\": path, \"schema_version\": schema_version})"},{"line_number":128,"context_line":"        LOG.warning(message)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    schema \u003d _load_schema(schema_version)"}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_aca34d4f","line":127,"in_reply_to":"bf51134e_969c59c0","updated":"2020-07-27 09:01:08.000000000","message":"agree. improve it as a follow-up","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        jsonschema.validate(yaml_file, schema)"},{"line_number":134,"context_line":"    except jsonschema.exceptions.ValidationError as e:"},{"line_number":135,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":136,"context_line":"            error\u003d\"The provider config file %(path)s did not pass validation \""},{"line_number":137,"context_line":"                   \"for schema version %(schema_version)s: %(reason)s\""},{"line_number":138,"context_line":"                   % {\"path\": path,"},{"line_number":139,"context_line":"                      \"schema_version\": schema_version,"},{"line_number":140,"context_line":"                      \"reason\": e})"}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_36962d96","line":137,"range":{"start_line":136,"start_character":18,"end_line":137,"end_character":70},"updated":"2020-07-22 13:10:17.000000000","message":"This needs to be translated","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        jsonschema.validate(yaml_file, schema)"},{"line_number":134,"context_line":"    except jsonschema.exceptions.ValidationError as e:"},{"line_number":135,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":136,"context_line":"            error\u003d\"The provider config file %(path)s did not pass validation \""},{"line_number":137,"context_line":"                   \"for schema version %(schema_version)s: %(reason)s\""},{"line_number":138,"context_line":"                   % {\"path\": path,"},{"line_number":139,"context_line":"                      \"schema_version\": schema_version,"},{"line_number":140,"context_line":"                      \"reason\": e})"}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_c5793930","line":137,"range":{"start_line":136,"start_character":18,"end_line":137,"end_character":70},"in_reply_to":"bf51134e_36962d96","updated":"2020-07-27 09:01:08.000000000","message":"yes. will fix - translation.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def1a0f82ba47208ba3d0803c4b4b34b040d50db","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                }"},{"line_number":157,"context_line":"            }"},{"line_number":158,"context_line":"        }"},{"line_number":159,"context_line":"    }"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    try:"},{"line_number":162,"context_line":"        schema \u003d ALL_SUPPORTED_SCHEMAS[\"v\" + str(schema_version.major)]"}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_0f698bbd","line":159,"updated":"2020-07-27 09:32:23.000000000","message":"Could we make this schema a global variable? There\u0027s no reason to make it local to the function, fwict. I also don\u0027t know if we need to key off the major version, as noted below. A simple if-else will do the trick for now\n\n  SCHEMA_V1 \u003d {\n      \u0027type\u0027: \u0027object\u0027,\n      ...\n  }","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"6fd21f37b36d06a3815a2d628a655e967bf5122a","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                }"},{"line_number":157,"context_line":"            }"},{"line_number":158,"context_line":"        }"},{"line_number":159,"context_line":"    }"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    try:"},{"line_number":162,"context_line":"        schema \u003d ALL_SUPPORTED_SCHEMAS[\"v\" + str(schema_version.major)]"}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_2799066e","line":159,"in_reply_to":"9f560f44_0f698bbd","updated":"2020-07-28 02:25:19.000000000","message":"agree. will update it. \n\nI thought about using global variable in python code. only my C background made me hate global things.","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def1a0f82ba47208ba3d0803c4b4b34b040d50db","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    }"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    try:"},{"line_number":162,"context_line":"        schema \u003d ALL_SUPPORTED_SCHEMAS[\"v\" + str(schema_version.major)]"},{"line_number":163,"context_line":"    except KeyError:"},{"line_number":164,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":165,"context_line":"            error\u003d\"Unable to find schema for supported \""}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_efc1b782","line":162,"updated":"2020-07-27 09:32:23.000000000","message":"Rather than keying off this, couldn\u0027t we just have a simple check like so:\n\n  if schema_version.major \u003d\u003d 1:\n      return SCHEMA_V1\n\n  raise nova_exc...\n\nsince we don\u0027t support any other version now (and might not ever support anything else). Principle of KISS","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"6fd21f37b36d06a3815a2d628a655e967bf5122a","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    }"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    try:"},{"line_number":162,"context_line":"        schema \u003d ALL_SUPPORTED_SCHEMAS[\"v\" + str(schema_version.major)]"},{"line_number":163,"context_line":"    except KeyError:"},{"line_number":164,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":165,"context_line":"            error\u003d\"Unable to find schema for supported \""}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_07896222","line":162,"in_reply_to":"9f560f44_efc1b782","updated":"2020-07-28 02:25:19.000000000","message":"Agree. Your code logic is in fact much clear and efficient. \nwill change it per your comment.\n\nmy original code logic tends to be friendly for adding new version schemas as you only update data part and do not have to change algorithm part.","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def1a0f82ba47208ba3d0803c4b4b34b040d50db","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        schema \u003d ALL_SUPPORTED_SCHEMAS[\"v\" + str(schema_version.major)]"},{"line_number":163,"context_line":"    except KeyError:"},{"line_number":164,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":165,"context_line":"            error\u003d\"Unable to find schema for supported \""},{"line_number":166,"context_line":"            \"major version: %d\" % schema_version.major)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    return schema"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_4f6383dd","line":166,"range":{"start_line":165,"start_character":18,"end_line":166,"end_character":31},"updated":"2020-07-27 09:32:23.000000000","message":"This needs translation","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"6fd21f37b36d06a3815a2d628a655e967bf5122a","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        schema \u003d ALL_SUPPORTED_SCHEMAS[\"v\" + str(schema_version.major)]"},{"line_number":163,"context_line":"    except KeyError:"},{"line_number":164,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":165,"context_line":"            error\u003d\"Unable to find schema for supported \""},{"line_number":166,"context_line":"            \"major version: %d\" % schema_version.major)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    return schema"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_c7d76a23","line":166,"range":{"start_line":165,"start_character":18,"end_line":166,"end_character":31},"in_reply_to":"9f560f44_4f6383dd","updated":"2020-07-28 02:25:19.000000000","message":"yes. will fix.","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def1a0f82ba47208ba3d0803c4b4b34b040d50db","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    return schema"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"def _load_yaml_stream(stream):"},{"line_number":172,"context_line":"    \"\"\"Loads and parses a provider.yaml config file into a dict."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    :param stream: a valid input stream."}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_af5e9fe3","line":171,"updated":"2020-07-27 09:32:23.000000000","message":"nit: think I said this in the previous PS, but is there any reason not to fold this into \u0027_load_yaml_file\u0027","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"6fd21f37b36d06a3815a2d628a655e967bf5122a","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    return schema"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"def _load_yaml_stream(stream):"},{"line_number":172,"context_line":"    \"\"\"Loads and parses a provider.yaml config file into a dict."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    :param stream: a valid input stream."}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_07d682c6","line":171,"in_reply_to":"9f560f44_af5e9fe3","updated":"2020-07-28 02:25:19.000000000","message":"I must misunderstand your comment. I think it\u0027s quite okay to merge it into _load_yaml_file() function.","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def1a0f82ba47208ba3d0803c4b4b34b040d50db","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    except yaml.YAMLError as ex:"},{"line_number":181,"context_line":"        message \u003d _("},{"line_number":182,"context_line":"            \"Unable to load yaml file, an error has occurred. \""},{"line_number":183,"context_line":"            \"message: %s\" % ex)"},{"line_number":184,"context_line":"        if hasattr(ex, \u0027problem_mark\u0027):"},{"line_number":185,"context_line":"            pos \u003d ex.problem_mark"},{"line_number":186,"context_line":"            message +\u003d \"File: %s \" % stream.name"}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_8f9abbc2","line":183,"range":{"start_line":183,"start_character":25,"end_line":183,"end_character":30},"updated":"2020-07-27 09:32:23.000000000","message":"This shouldn\u0027t be translated","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"6fd21f37b36d06a3815a2d628a655e967bf5122a","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    except yaml.YAMLError as ex:"},{"line_number":181,"context_line":"        message \u003d _("},{"line_number":182,"context_line":"            \"Unable to load yaml file, an error has occurred. \""},{"line_number":183,"context_line":"            \"message: %s\" % ex)"},{"line_number":184,"context_line":"        if hasattr(ex, \u0027problem_mark\u0027):"},{"line_number":185,"context_line":"            pos \u003d ex.problem_mark"},{"line_number":186,"context_line":"            message +\u003d \"File: %s \" % stream.name"}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_e7c6ee16","line":183,"range":{"start_line":183,"start_character":25,"end_line":183,"end_character":30},"in_reply_to":"9f560f44_8f9abbc2","updated":"2020-07-28 02:25:19.000000000","message":"understood. will fix it.","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def1a0f82ba47208ba3d0803c4b4b34b040d50db","unresolved":false,"context_lines":[{"line_number":202,"context_line":"            return _load_yaml_stream(open_file)"},{"line_number":203,"context_line":"    except OSError:"},{"line_number":204,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":205,"context_line":"            error\u003d_(\"Unable to read yaml config file: %s\" % path))"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"def _parse_provider_yaml(path):"}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_af5b3f2c","line":205,"range":{"start_line":205,"start_character":12,"end_line":205,"end_character":66},"updated":"2020-07-27 09:32:23.000000000","message":"I think this still isn\u0027t correct, unfortunately. You shouldn\u0027t translate the variables. This should read e.g.\n\n  msg \u003d _(\u0027Unable to read yaml config file: %s\u0027)\n  raise nova_exc.ProviderConfigException(msg % path)","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"6fd21f37b36d06a3815a2d628a655e967bf5122a","unresolved":false,"context_lines":[{"line_number":202,"context_line":"            return _load_yaml_stream(open_file)"},{"line_number":203,"context_line":"    except OSError:"},{"line_number":204,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":205,"context_line":"            error\u003d_(\"Unable to read yaml config file: %s\" % path))"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"def _parse_provider_yaml(path):"}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_673e5e2a","line":205,"range":{"start_line":205,"start_character":12,"end_line":205,"end_character":66},"in_reply_to":"9f560f44_af5b3f2c","updated":"2020-07-28 02:25:19.000000000","message":"understood. will fix it.","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def1a0f82ba47208ba3d0803c4b4b34b040d50db","unresolved":false,"context_lines":[{"line_number":221,"context_line":"            yaml_file[\u0027meta\u0027][\u0027schema_version\u0027])"},{"line_number":222,"context_line":"    except (KeyError, TypeError):"},{"line_number":223,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":224,"context_line":"            error\u003d_(\"Unable to detect schema version: %s\" % yaml_file))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":227,"context_line":"        raise nova_exc.ProviderConfigException("}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_0f406b35","line":224,"updated":"2020-07-27 09:32:23.000000000","message":"ditto","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"6fd21f37b36d06a3815a2d628a655e967bf5122a","unresolved":false,"context_lines":[{"line_number":221,"context_line":"            yaml_file[\u0027meta\u0027][\u0027schema_version\u0027])"},{"line_number":222,"context_line":"    except (KeyError, TypeError):"},{"line_number":223,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":224,"context_line":"            error\u003d_(\"Unable to detect schema version: %s\" % yaml_file))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":227,"context_line":"        raise nova_exc.ProviderConfigException("}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_871e12b8","line":224,"in_reply_to":"9f560f44_0f406b35","updated":"2020-07-28 02:25:19.000000000","message":"will fix it.","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def1a0f82ba47208ba3d0803c4b4b34b040d50db","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":227,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":228,"context_line":"            error\u003d_(\"Unsupported schema major version: %d\""},{"line_number":229,"context_line":"                   % schema_version.major))"},{"line_number":230,"context_line":"    if schema_version.minor not in \\"},{"line_number":231,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"},{"line_number":232,"context_line":"        # TODO(sean-k-mooney): We should try to provide a better"}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_ef3c17c1","line":229,"updated":"2020-07-27 09:32:23.000000000","message":"ditto","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"6fd21f37b36d06a3815a2d628a655e967bf5122a","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":227,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":228,"context_line":"            error\u003d_(\"Unsupported schema major version: %d\""},{"line_number":229,"context_line":"                   % schema_version.major))"},{"line_number":230,"context_line":"    if schema_version.minor not in \\"},{"line_number":231,"context_line":"            SUPPORTED_SCHEMA_VERSIONS[schema_version.major]:"},{"line_number":232,"context_line":"        # TODO(sean-k-mooney): We should try to provide a better"}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_2783c6ce","line":229,"in_reply_to":"9f560f44_ef3c17c1","updated":"2020-07-28 02:25:19.000000000","message":"will fix it.","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def1a0f82ba47208ba3d0803c4b4b34b040d50db","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        jsonschema.validate(yaml_file, schema)"},{"line_number":246,"context_line":"    except jsonschema.exceptions.ValidationError as e:"},{"line_number":247,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":248,"context_line":"            error\u003d\"The provider config file %(path)s did not pass validation \""},{"line_number":249,"context_line":"                   \"for schema version %(schema_version)s: %(reason)s\""},{"line_number":250,"context_line":"                   % {\"path\": path,"},{"line_number":251,"context_line":"                      \"schema_version\": schema_version,"},{"line_number":252,"context_line":"                      \"reason\": e})"}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_2f472f4e","line":249,"range":{"start_line":248,"start_character":18,"end_line":249,"end_character":70},"updated":"2020-07-27 09:32:23.000000000","message":"Needs translation","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"6fd21f37b36d06a3815a2d628a655e967bf5122a","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        jsonschema.validate(yaml_file, schema)"},{"line_number":246,"context_line":"    except jsonschema.exceptions.ValidationError as e:"},{"line_number":247,"context_line":"        raise nova_exc.ProviderConfigException("},{"line_number":248,"context_line":"            error\u003d\"The provider config file %(path)s did not pass validation \""},{"line_number":249,"context_line":"                   \"for schema version %(schema_version)s: %(reason)s\""},{"line_number":250,"context_line":"                   % {\"path\": path,"},{"line_number":251,"context_line":"                      \"schema_version\": schema_version,"},{"line_number":252,"context_line":"                      \"reason\": e})"}],"source_content_type":"text/x-python","patch_set":51,"id":"9f560f44_a74fd6bb","line":249,"range":{"start_line":248,"start_character":18,"end_line":249,"end_character":70},"in_reply_to":"9f560f44_2f472f4e","updated":"2020-07-28 02:25:19.000000000","message":"will fix it.","commit_id":"a657c253a85540ddc4f3683f94920a0b6b656e3d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                }"},{"line_number":42,"context_line":"            },"},{"line_number":43,"context_line":"            \u0027required\u0027: [\u0027schema_version\u0027],"},{"line_number":44,"context_line":"            \u0027additionalProperties\u0027: True"},{"line_number":45,"context_line":"        },"},{"line_number":46,"context_line":"        \u0027providers\u0027: {"},{"line_number":47,"context_line":"            \u0027type\u0027: \u0027array\u0027,"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_7fe6de46","line":44,"updated":"2020-07-28 09:50:05.000000000","message":"Do we actually want to allow additional properties?","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"92dfaa61cd27ff7d02063bc011ac7289ae0dd4a7","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                }"},{"line_number":42,"context_line":"            },"},{"line_number":43,"context_line":"            \u0027required\u0027: [\u0027schema_version\u0027],"},{"line_number":44,"context_line":"            \u0027additionalProperties\u0027: True"},{"line_number":45,"context_line":"        },"},{"line_number":46,"context_line":"        \u0027providers\u0027: {"},{"line_number":47,"context_line":"            \u0027type\u0027: \u0027array\u0027,"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_e6454719","line":44,"in_reply_to":"9f560f44_7fe6de46","updated":"2020-07-28 13:42:54.000000000","message":"The reason for this was forward compatibility. Big discussions at design time about it.\n\nOr are you specifically questioning whether we want it here in the `meta` section?","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c24ef9e8b49335875f1b2a10b4ec36747b4876c2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                }"},{"line_number":42,"context_line":"            },"},{"line_number":43,"context_line":"            \u0027required\u0027: [\u0027schema_version\u0027],"},{"line_number":44,"context_line":"            \u0027additionalProperties\u0027: True"},{"line_number":45,"context_line":"        },"},{"line_number":46,"context_line":"        \u0027providers\u0027: {"},{"line_number":47,"context_line":"            \u0027type\u0027: \u0027array\u0027,"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_3383edce","line":44,"in_reply_to":"9f560f44_e6454719","updated":"2020-07-29 09:20:35.000000000","message":"\u003e Or are you specifically questioning whether we want it here in the\n \u003e `meta` section?\n\nI was specifically questioning whether we want it here, though it\u0027s good to have the context on why it exists elsewhere. I\u0027m not sure we need it here but hey, who knows what we\u0027ll decide to do in the future","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                }"},{"line_number":42,"context_line":"            },"},{"line_number":43,"context_line":"            \u0027required\u0027: [\u0027schema_version\u0027],"},{"line_number":44,"context_line":"            \u0027additionalProperties\u0027: True"},{"line_number":45,"context_line":"        },"},{"line_number":46,"context_line":"        \u0027providers\u0027: {"},{"line_number":47,"context_line":"            \u0027type\u0027: \u0027array\u0027,"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_31a48d57","line":44,"in_reply_to":"9f560f44_e6454719","updated":"2020-07-29 01:55:41.000000000","message":"So far, I still leave the original design as is and keep no change to the code.","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    },"},{"line_number":69,"context_line":"    \u0027required\u0027: [\u0027meta\u0027],"},{"line_number":70,"context_line":"    \u0027additionalProperties\u0027: True,"},{"line_number":71,"context_line":"    \u0027provider_definitions\u0027: {"},{"line_number":72,"context_line":"        \u0027provider_identification\u0027: {"},{"line_number":73,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":74,"context_line":"            \u0027properties\u0027: {"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_3fe62618","line":71,"range":{"start_line":71,"start_character":5,"end_line":71,"end_character":25},"updated":"2020-07-28 09:50:05.000000000","message":"Based on the spec and examples, this should simply read \u0027definitions\u0027 [1] or \u0027$defs\u0027 [2], depending on the version of the schema in use. The examples suggest the same thing [3]\n\n[1] https://tools.ietf.org/html/draft-handrews-json-schema-01#section-8.2.4\n[2] https://json-schema.org/draft/2019-09/json-schema-core.html#defs\n[3] https://json-schema.org/learn/miscellaneous-examples.html#arrays-of-things","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    },"},{"line_number":69,"context_line":"    \u0027required\u0027: [\u0027meta\u0027],"},{"line_number":70,"context_line":"    \u0027additionalProperties\u0027: True,"},{"line_number":71,"context_line":"    \u0027provider_definitions\u0027: {"},{"line_number":72,"context_line":"        \u0027provider_identification\u0027: {"},{"line_number":73,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":74,"context_line":"            \u0027properties\u0027: {"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_d19271f6","line":71,"range":{"start_line":71,"start_character":5,"end_line":71,"end_character":25},"in_reply_to":"9f560f44_3fe62618","updated":"2020-07-29 01:55:41.000000000","message":"In fact, I prefer to use $defs as it gives me a hint for schema re-use. will fix it.","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    \u0027required\u0027: [\u0027meta\u0027],"},{"line_number":70,"context_line":"    \u0027additionalProperties\u0027: True,"},{"line_number":71,"context_line":"    \u0027provider_definitions\u0027: {"},{"line_number":72,"context_line":"        \u0027provider_identification\u0027: {"},{"line_number":73,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":74,"context_line":"            \u0027properties\u0027: {"},{"line_number":75,"context_line":"                \u0027uuid\u0027: {"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_7ff09eca","line":72,"range":{"start_line":72,"start_character":9,"end_line":72,"end_character":32},"updated":"2020-07-28 09:50:05.000000000","message":"These should be camelCase, right? providerIdentification (or just \u0027identification\u0027)","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    \u0027required\u0027: [\u0027meta\u0027],"},{"line_number":70,"context_line":"    \u0027additionalProperties\u0027: True,"},{"line_number":71,"context_line":"    \u0027provider_definitions\u0027: {"},{"line_number":72,"context_line":"        \u0027provider_identification\u0027: {"},{"line_number":73,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":74,"context_line":"            \u0027properties\u0027: {"},{"line_number":75,"context_line":"                \u0027uuid\u0027: {"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_513b01ea","line":72,"range":{"start_line":72,"start_character":9,"end_line":72,"end_character":32},"in_reply_to":"9f560f44_7ff09eca","updated":"2020-07-29 01:55:41.000000000","message":"let\u0027s use camelCase as this is a schema after all.","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                            \u0027[0-9A-Fa-f]{12}$\u0027"},{"line_number":82,"context_line":"                    }, {"},{"line_number":83,"context_line":"                        \u0027type\u0027: \u0027string\u0027,"},{"line_number":84,"context_line":"                        \u0027const\u0027: \u0027$COMPUTE_NODE\u0027}]"},{"line_number":85,"context_line":"                },"},{"line_number":86,"context_line":"                \u0027name\u0027: {"},{"line_number":87,"context_line":"                    \u0027type\u0027: \u0027string\u0027,"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_9fc01253","line":84,"updated":"2020-07-28 09:50:05.000000000","message":"nit: the wrapping for this looks wrong. We\u0027re missing indentation, right?","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                            \u0027[0-9A-Fa-f]{12}$\u0027"},{"line_number":82,"context_line":"                    }, {"},{"line_number":83,"context_line":"                        \u0027type\u0027: \u0027string\u0027,"},{"line_number":84,"context_line":"                        \u0027const\u0027: \u0027$COMPUTE_NODE\u0027}]"},{"line_number":85,"context_line":"                },"},{"line_number":86,"context_line":"                \u0027name\u0027: {"},{"line_number":87,"context_line":"                    \u0027type\u0027: \u0027string\u0027,"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_b1041d19","line":84,"in_reply_to":"9f560f44_9fc01253","updated":"2020-07-29 01:55:41.000000000","message":"yes. will fix.","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                \u0027maxProperties\u0027: 1,"},{"line_number":93,"context_line":"                \u0027additionalProperties\u0027: False"},{"line_number":94,"context_line":"            },"},{"line_number":95,"context_line":"        \u0027provider_inventories\u0027: {"},{"line_number":96,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":97,"context_line":"            \u0027properties\u0027: {"},{"line_number":98,"context_line":"                \u0027additional\u0027: {"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_7fc9be76","line":95,"range":{"start_line":95,"start_character":9,"end_line":95,"end_character":29},"updated":"2020-07-28 09:50:05.000000000","message":"providerInventories (or just \u0027inventories\u0027)","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                \u0027maxProperties\u0027: 1,"},{"line_number":93,"context_line":"                \u0027additionalProperties\u0027: False"},{"line_number":94,"context_line":"            },"},{"line_number":95,"context_line":"        \u0027provider_inventories\u0027: {"},{"line_number":96,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":97,"context_line":"            \u0027properties\u0027: {"},{"line_number":98,"context_line":"                \u0027additional\u0027: {"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_e403750c","line":95,"range":{"start_line":95,"start_character":9,"end_line":95,"end_character":29},"in_reply_to":"9f560f44_7fc9be76","updated":"2020-07-29 01:55:41.000000000","message":"fix with camelCase","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                                },"},{"line_number":124,"context_line":"                                \u0027required\u0027: [\u0027total\u0027],"},{"line_number":125,"context_line":"                                \u0027additionalProperties\u0027: False"},{"line_number":126,"context_line":"                            }},"},{"line_number":127,"context_line":"                        \u0027additionalProperties\u0027: False"},{"line_number":128,"context_line":"                    }"},{"line_number":129,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_3fcf4680","line":126,"range":{"start_line":126,"start_character":29,"end_line":126,"end_character":31},"updated":"2020-07-28 09:50:05.000000000","message":"nit: drag this down","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                                },"},{"line_number":124,"context_line":"                                \u0027required\u0027: [\u0027total\u0027],"},{"line_number":125,"context_line":"                                \u0027additionalProperties\u0027: False"},{"line_number":126,"context_line":"                            }},"},{"line_number":127,"context_line":"                        \u0027additionalProperties\u0027: False"},{"line_number":128,"context_line":"                    }"},{"line_number":129,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_c44ab153","line":126,"range":{"start_line":126,"start_character":29,"end_line":126,"end_character":31},"in_reply_to":"9f560f44_3fcf4680","updated":"2020-07-29 01:55:41.000000000","message":"will fix.","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            },"},{"line_number":131,"context_line":"            \u0027additionalProperties\u0027: True"},{"line_number":132,"context_line":"        },"},{"line_number":133,"context_line":"        \u0027provider_traits\u0027: {"},{"line_number":134,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":135,"context_line":"            \u0027properties\u0027: {"},{"line_number":136,"context_line":"                \u0027additional\u0027: {"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_9fa5b2b8","line":133,"range":{"start_line":133,"start_character":9,"end_line":133,"end_character":24},"updated":"2020-07-28 09:50:05.000000000","message":"providerTraits (or just \u0027traits\u0027)","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            },"},{"line_number":131,"context_line":"            \u0027additionalProperties\u0027: True"},{"line_number":132,"context_line":"        },"},{"line_number":133,"context_line":"        \u0027provider_traits\u0027: {"},{"line_number":134,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":135,"context_line":"            \u0027properties\u0027: {"},{"line_number":136,"context_line":"                \u0027additional\u0027: {"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_a447bd4b","line":133,"range":{"start_line":133,"start_character":9,"end_line":133,"end_character":24},"in_reply_to":"9f560f44_9fa5b2b8","updated":"2020-07-29 01:55:41.000000000","message":"camelCase.","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        return SCHEMA_V1"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    message \u003d _(\"Unable to find schema for supported \""},{"line_number":164,"context_line":"            \"major version: %d\") % schema_version.major"},{"line_number":165,"context_line":"    raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_9f7ad285","line":164,"range":{"start_line":164,"start_character":10,"end_line":164,"end_character":12},"updated":"2020-07-28 09:50:05.000000000","message":"nit: missing indent","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        return SCHEMA_V1"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    message \u003d _(\"Unable to find schema for supported \""},{"line_number":164,"context_line":"            \"major version: %d\") % schema_version.major"},{"line_number":165,"context_line":"    raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_447061a6","line":164,"range":{"start_line":164,"start_character":10,"end_line":164,"end_character":12},"in_reply_to":"9f560f44_9f7ad285","updated":"2020-07-29 01:55:41.000000000","message":"remove this code never hit.","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    if schema_version.major \u003d\u003d 1:"},{"line_number":161,"context_line":"        return SCHEMA_V1"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    message \u003d _(\"Unable to find schema for supported \""},{"line_number":164,"context_line":"            \"major version: %d\") % schema_version.major"},{"line_number":165,"context_line":"    raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"def _load_yaml_file(path):"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_5fb5da30","line":165,"range":{"start_line":163,"start_character":0,"end_line":165,"end_character":57},"updated":"2020-07-28 09:50:05.000000000","message":"Actually, this code will never be executed. You do the version checks in \u0027_parse_provider_yaml\u0027 and this is a private function, which means people shouldn\u0027t be calling it. Would it make sense to just get rid of this function and only introduce it if/when we need it in the future?","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    if schema_version.major \u003d\u003d 1:"},{"line_number":161,"context_line":"        return SCHEMA_V1"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    message \u003d _(\"Unable to find schema for supported \""},{"line_number":164,"context_line":"            \"major version: %d\") % schema_version.major"},{"line_number":165,"context_line":"    raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"def _load_yaml_file(path):"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_646645f0","line":165,"range":{"start_line":163,"start_character":0,"end_line":165,"end_character":57},"in_reply_to":"9f560f44_5fb5da30","updated":"2020-07-29 01:55:41.000000000","message":"yes. agree. remove code never hit.","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            try:"},{"line_number":179,"context_line":"                return yaml.safe_load(open_file)"},{"line_number":180,"context_line":"            except yaml.YAMLError as ex:"},{"line_number":181,"context_line":"                message \u003d \\"},{"line_number":182,"context_line":"                    _(\"Unable to load yaml file, an error has occurred. \")"},{"line_number":183,"context_line":"                message +\u003d _(\"Message: %s \") % ex"},{"line_number":184,"context_line":"                if hasattr(ex, \u0027problem_mark\u0027):"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_df744a9c","line":181,"range":{"start_line":181,"start_character":26,"end_line":181,"end_character":27},"updated":"2020-07-28 09:50:05.000000000","message":"nit:\n\n  message \u003d _(\n      \"Unable to load yaml file, an error has occurred. \")","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            try:"},{"line_number":179,"context_line":"                return yaml.safe_load(open_file)"},{"line_number":180,"context_line":"            except yaml.YAMLError as ex:"},{"line_number":181,"context_line":"                message \u003d \\"},{"line_number":182,"context_line":"                    _(\"Unable to load yaml file, an error has occurred. \")"},{"line_number":183,"context_line":"                message +\u003d _(\"Message: %s \") % ex"},{"line_number":184,"context_line":"                if hasattr(ex, \u0027problem_mark\u0027):"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_c463d1db","line":181,"range":{"start_line":181,"start_character":26,"end_line":181,"end_character":27},"in_reply_to":"9f560f44_df744a9c","updated":"2020-07-29 01:55:41.000000000","message":"will fix.","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":214,"context_line":"        message \u003d \\"},{"line_number":215,"context_line":"            _(\"Unsupported schema major version: %d\") % schema_version.major"},{"line_number":216,"context_line":"        raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    if schema_version.minor not in \\"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_3f6906be","line":215,"range":{"start_line":214,"start_character":18,"end_line":215,"end_character":14},"updated":"2020-07-28 09:50:05.000000000","message":"nit:\n\n  message \u003d _(\n      \"Unsupported schema major version: %d\") % schema_version.major","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    if schema_version.major not in SUPPORTED_SCHEMA_VERSIONS:"},{"line_number":214,"context_line":"        message \u003d \\"},{"line_number":215,"context_line":"            _(\"Unsupported schema major version: %d\") % schema_version.major"},{"line_number":216,"context_line":"        raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    if schema_version.minor not in \\"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_447ea16b","line":215,"range":{"start_line":214,"start_character":18,"end_line":215,"end_character":14},"in_reply_to":"9f560f44_3f6906be","updated":"2020-07-29 01:55:41.000000000","message":"will fix.","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            % {\"path\": path, \"schema_version\": schema_version})"},{"line_number":228,"context_line":"        LOG.warning(message)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    schema \u003d _load_schema(schema_version)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    try:"},{"line_number":233,"context_line":"        jsonschema.validate(yaml_file, schema)"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_9f8e522c","line":230,"updated":"2020-07-28 09:50:05.000000000","message":"As above, this seems like overkill. Just do:\n\n  try:\n      jsonschema.validate(yaml_file, SCHEMA_V1)\n  except ...\n\nfor now, since we don\u0027t support other versions and can add all this logic in the future *if* we need to","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            % {\"path\": path, \"schema_version\": schema_version})"},{"line_number":228,"context_line":"        LOG.warning(message)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    schema \u003d _load_schema(schema_version)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    try:"},{"line_number":233,"context_line":"        jsonschema.validate(yaml_file, schema)"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_a48e9d75","line":230,"in_reply_to":"9f560f44_9f8e522c","updated":"2020-07-29 01:55:41.000000000","message":"agree. will fix.","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1e0b96c58c8b4696bc580dc05f7fdfee47d27813","unresolved":false,"context_lines":[{"line_number":234,"context_line":"    except jsonschema.exceptions.ValidationError as e:"},{"line_number":235,"context_line":"        message \u003d _("},{"line_number":236,"context_line":"            \"The provider config file %(path)s did not pass validation \""},{"line_number":237,"context_line":"            \"for schema version %(schema_version)s: %(reason)s\") \\"},{"line_number":238,"context_line":"            % {\"path\": path, \"schema_version\": schema_version, \"reason\": e}"},{"line_number":239,"context_line":"        raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":240,"context_line":"    return yaml_file"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_5f8e7a78","line":237,"range":{"start_line":237,"start_character":65,"end_line":237,"end_character":66},"updated":"2020-07-28 09:50:05.000000000","message":"nit:\n\n  % {","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"96acb7cc6c69d466f80b85502371c26cbc02418a","unresolved":false,"context_lines":[{"line_number":234,"context_line":"    except jsonschema.exceptions.ValidationError as e:"},{"line_number":235,"context_line":"        message \u003d _("},{"line_number":236,"context_line":"            \"The provider config file %(path)s did not pass validation \""},{"line_number":237,"context_line":"            \"for schema version %(schema_version)s: %(reason)s\") \\"},{"line_number":238,"context_line":"            % {\"path\": path, \"schema_version\": schema_version, \"reason\": e}"},{"line_number":239,"context_line":"        raise nova_exc.ProviderConfigException(error\u003dmessage)"},{"line_number":240,"context_line":"    return yaml_file"}],"source_content_type":"text/x-python","patch_set":53,"id":"9f560f44_64c2c587","line":237,"range":{"start_line":237,"start_character":65,"end_line":237,"end_character":66},"in_reply_to":"9f560f44_5f8e7a78","updated":"2020-07-29 01:55:41.000000000","message":"will fix","commit_id":"0a29faab874c646ddbe6529e0b0ee770ca5dd8ba"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c24ef9e8b49335875f1b2a10b4ec36747b4876c2","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":70,"context_line":"            \u0027properties\u0027: {"},{"line_number":71,"context_line":"                \u0027uuid\u0027: {"},{"line_number":72,"context_line":"                    \u0027oneOf\u0027: [{"},{"line_number":73,"context_line":"                        \u0027type\u0027: \u0027string\u0027,"},{"line_number":74,"context_line":"                        \u0027pattern\u0027:"},{"line_number":75,"context_line":"                            \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-\u0027"},{"line_number":76,"context_line":"                            \u0027[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-\u0027"},{"line_number":77,"context_line":"                            \u0027[0-9A-Fa-f]{12}$\u0027"},{"line_number":78,"context_line":"                    }, {"},{"line_number":79,"context_line":"                        \u0027type\u0027: \u0027string\u0027,"},{"line_number":80,"context_line":"                        \u0027const\u0027: \u0027$COMPUTE_NODE\u0027"},{"line_number":81,"context_line":"                    }]"},{"line_number":82,"context_line":"                },"},{"line_number":83,"context_line":"                \u0027name\u0027: {"},{"line_number":84,"context_line":"                    \u0027type\u0027: \u0027string\u0027,"}],"source_content_type":"text/x-python","patch_set":54,"id":"9f560f44_f361753b","line":81,"range":{"start_line":72,"start_character":0,"end_line":81,"end_character":22},"updated":"2020-07-29 09:20:35.000000000","message":"style nit:\n\n  \u0027oneOf\u0027: [\n      {\n          \u0027type\u0027: \u0027string\u0027,\n          ...\n      },\n      {\n          ...\n      },\n  ],","commit_id":"aa64fc50bbcb606409585a49c3ed886b524281b1"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"f10ac6bd9e283745534a67b888e3aed3bdb8c0f9","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            \u0027type\u0027: \u0027object\u0027,"},{"line_number":70,"context_line":"            \u0027properties\u0027: {"},{"line_number":71,"context_line":"                \u0027uuid\u0027: {"},{"line_number":72,"context_line":"                    \u0027oneOf\u0027: [{"},{"line_number":73,"context_line":"                        \u0027type\u0027: \u0027string\u0027,"},{"line_number":74,"context_line":"                        \u0027pattern\u0027:"},{"line_number":75,"context_line":"                            \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-\u0027"},{"line_number":76,"context_line":"                            \u0027[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-\u0027"},{"line_number":77,"context_line":"                            \u0027[0-9A-Fa-f]{12}$\u0027"},{"line_number":78,"context_line":"                    }, {"},{"line_number":79,"context_line":"                        \u0027type\u0027: \u0027string\u0027,"},{"line_number":80,"context_line":"                        \u0027const\u0027: \u0027$COMPUTE_NODE\u0027"},{"line_number":81,"context_line":"                    }]"},{"line_number":82,"context_line":"                },"},{"line_number":83,"context_line":"                \u0027name\u0027: {"},{"line_number":84,"context_line":"                    \u0027type\u0027: \u0027string\u0027,"}],"source_content_type":"text/x-python","patch_set":54,"id":"9f560f44_4dc1902e","line":81,"range":{"start_line":72,"start_character":0,"end_line":81,"end_character":22},"in_reply_to":"9f560f44_f361753b","updated":"2020-07-30 01:20:47.000000000","message":"will fix it.\nNow I begin to hate my C trick to save space. :-) and get used to Python style.","commit_id":"aa64fc50bbcb606409585a49c3ed886b524281b1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c24ef9e8b49335875f1b2a10b4ec36747b4876c2","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                    \u0027maxLength\u0027: 200"},{"line_number":87,"context_line":"                }"},{"line_number":88,"context_line":"            },"},{"line_number":89,"context_line":"            \u0027minProperties\u0027: 1,"},{"line_number":90,"context_line":"            \u0027maxProperties\u0027: 1,"},{"line_number":91,"context_line":"            \u0027additionalProperties\u0027: False"},{"line_number":92,"context_line":"        },"},{"line_number":93,"context_line":"        \u0027providerInventories\u0027: {"}],"source_content_type":"text/x-python","patch_set":54,"id":"9f560f44_5352e168","line":90,"range":{"start_line":89,"start_character":0,"end_line":90,"end_character":31},"updated":"2020-07-29 09:20:35.000000000","message":"I was going to say you can\u0027t specify either uuid or name twice, so this is redundant. However, I assume what you\u0027re trying to do is say the user can specify uuid or specify name, but they can\u0027t specify both. If so, makes sense","commit_id":"aa64fc50bbcb606409585a49c3ed886b524281b1"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"f10ac6bd9e283745534a67b888e3aed3bdb8c0f9","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                    \u0027maxLength\u0027: 200"},{"line_number":87,"context_line":"                }"},{"line_number":88,"context_line":"            },"},{"line_number":89,"context_line":"            \u0027minProperties\u0027: 1,"},{"line_number":90,"context_line":"            \u0027maxProperties\u0027: 1,"},{"line_number":91,"context_line":"            \u0027additionalProperties\u0027: False"},{"line_number":92,"context_line":"        },"},{"line_number":93,"context_line":"        \u0027providerInventories\u0027: {"}],"source_content_type":"text/x-python","patch_set":54,"id":"9f560f44_4dd6b0f3","line":90,"range":{"start_line":89,"start_character":0,"end_line":90,"end_character":31},"in_reply_to":"9f560f44_5352e168","updated":"2020-07-30 01:20:47.000000000","message":"This means mutually exclusive \u0027name\u0027 or \u0027uuid\u0027. \nNO code change.","commit_id":"aa64fc50bbcb606409585a49c3ed886b524281b1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c24ef9e8b49335875f1b2a10b4ec36747b4876c2","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                    \u0027type\u0027: \u0027array\u0027,"},{"line_number":98,"context_line":"                    \u0027items\u0027: {"},{"line_number":99,"context_line":"                        \u0027patternProperties\u0027: {"},{"line_number":100,"context_line":"                            \u0027^[A-Z0-9_]{1,255}$\u0027: {"},{"line_number":101,"context_line":"                                \u0027type\u0027: \u0027object\u0027,"},{"line_number":102,"context_line":"                                \u0027properties\u0027: {"},{"line_number":103,"context_line":"                                    \u0027total\u0027: {"}],"source_content_type":"text/x-python","patch_set":54,"id":"9f560f44_1dd19855","line":100,"updated":"2020-07-29 09:20:35.000000000","message":"Is this definitely valid? For example, are we allowed created provider names that start with an underscore or number? Is there a link to the placement API reference or docs that we could use here?","commit_id":"aa64fc50bbcb606409585a49c3ed886b524281b1"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"f10ac6bd9e283745534a67b888e3aed3bdb8c0f9","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                    \u0027type\u0027: \u0027array\u0027,"},{"line_number":98,"context_line":"                    \u0027items\u0027: {"},{"line_number":99,"context_line":"                        \u0027patternProperties\u0027: {"},{"line_number":100,"context_line":"                            \u0027^[A-Z0-9_]{1,255}$\u0027: {"},{"line_number":101,"context_line":"                                \u0027type\u0027: \u0027object\u0027,"},{"line_number":102,"context_line":"                                \u0027properties\u0027: {"},{"line_number":103,"context_line":"                                    \u0027total\u0027: {"}],"source_content_type":"text/x-python","patch_set":54,"id":"9f560f44_8d660829","line":100,"in_reply_to":"9f560f44_1dd19855","updated":"2020-07-30 01:20:47.000000000","message":"I am not sure what I found below is suitable for answer the comment as I am so naive to nova/placement.\n\nFrom placement repository - common.py\nhttps://github.com/openstack/placement/blob/55635d918ce32667352fb94e4ae3e388069dd9c1/placement/schemas/common.py\n\n_RC_TRAIT_CHAR \u003d \"[A-Z0-9_]\"\n_RC_TRAIT_PATTERN \u003d \"^%s+$\" % _RC_TRAIT_CHAR\nRC_PATTERN \u003d _RC_TRAIT_PATTERN\n\nand - inventory.py \nhttps://github.com/openstack/placement/blob/55635d918ce32667352fb94e4ae3e388069dd9c1/placement/schemas/inventory.py\nPOST_INVENTORY_SCHEMA[\u0027properties\u0027][\u0027resource_class\u0027] \u003d {\n    \"type\": \"string\",\n    \"pattern\": common.RC_PATTERN,\n}","commit_id":"aa64fc50bbcb606409585a49c3ed886b524281b1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c24ef9e8b49335875f1b2a10b4ec36747b4876c2","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            try:"},{"line_number":160,"context_line":"                return yaml.safe_load(open_file)"},{"line_number":161,"context_line":"            except yaml.YAMLError as ex:"},{"line_number":162,"context_line":"                message \u003d _("},{"line_number":163,"context_line":"                    \"Unable to load yaml file, an error has occurred. \")"},{"line_number":164,"context_line":"                message +\u003d _(\"Message: %s \") % ex"},{"line_number":165,"context_line":"                if hasattr(ex, \u0027problem_mark\u0027):"},{"line_number":166,"context_line":"                    pos \u003d ex.problem_mark"},{"line_number":167,"context_line":"                    message +\u003d _(\"File: %s \") % open_file.name"}],"source_content_type":"text/x-python","patch_set":54,"id":"9f560f44_d3cb911b","line":164,"range":{"start_line":162,"start_character":0,"end_line":164,"end_character":49},"updated":"2020-07-29 09:20:35.000000000","message":"nit: these can be combined (and possibly simplified) now, I guess?\n\n  message \u003d _(\"Unable to load yaml file: %s) % ex","commit_id":"aa64fc50bbcb606409585a49c3ed886b524281b1"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"f10ac6bd9e283745534a67b888e3aed3bdb8c0f9","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            try:"},{"line_number":160,"context_line":"                return yaml.safe_load(open_file)"},{"line_number":161,"context_line":"            except yaml.YAMLError as ex:"},{"line_number":162,"context_line":"                message \u003d _("},{"line_number":163,"context_line":"                    \"Unable to load yaml file, an error has occurred. \")"},{"line_number":164,"context_line":"                message +\u003d _(\"Message: %s \") % ex"},{"line_number":165,"context_line":"                if hasattr(ex, \u0027problem_mark\u0027):"},{"line_number":166,"context_line":"                    pos \u003d ex.problem_mark"},{"line_number":167,"context_line":"                    message +\u003d _(\"File: %s \") % open_file.name"}],"source_content_type":"text/x-python","patch_set":54,"id":"9f560f44_2d3ffc25","line":164,"range":{"start_line":162,"start_character":0,"end_line":164,"end_character":49},"in_reply_to":"9f560f44_d3cb911b","updated":"2020-07-30 01:20:47.000000000","message":"will combine two lines into one.","commit_id":"aa64fc50bbcb606409585a49c3ed886b524281b1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"844902a6178d7e69dd54a0843cfdf97f663f86f9","unresolved":false,"context_lines":[{"line_number":27,"context_line":"}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# Supported provider config file schema"},{"line_number":30,"context_line":"SCHEMA_V1 \u003d {"},{"line_number":31,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":32,"context_line":"    \u0027properties\u0027: {"},{"line_number":33,"context_line":"        \u0027__source_file\u0027: {\u0027not\u0027: {}},"}],"source_content_type":"text/x-python","patch_set":55,"id":"9f560f44_775d3ee8","line":30,"updated":"2020-07-30 06:23:24.000000000","message":"in the future we can put it into separated file just as API schema. But for now, we only have one version, so it is ok","commit_id":"bbe762965952a9e84d0653cad1b1817c2fcccc02"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"844902a6178d7e69dd54a0843cfdf97f663f86f9","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            \u0027additionalProperties\u0027: True"},{"line_number":147,"context_line":"        }"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":"}"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"def _load_yaml_file(path):"}],"source_content_type":"text/x-python","patch_set":55,"id":"9f560f44_970f32e0","line":149,"updated":"2020-07-30 06:23:24.000000000","message":"can we keep those comments in the original yaml file https://review.opendev.org/#/c/673341/48/nova/compute/provider_config_schemas/provider_config_schema_v1.yaml, that is helpful for understand the design.","commit_id":"bbe762965952a9e84d0653cad1b1817c2fcccc02"}],"nova/compute/provider_config_schema.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":16,"context_line":"    type: object"},{"line_number":17,"context_line":"    properties:"},{"line_number":18,"context_line":"      # Version ($Major, $minor) of the schema must successfully parse"},{"line_number":19,"context_line":"      # documents conforming to ($Major, 0..$minor). Any breaking schema change"},{"line_number":20,"context_line":"      # (e.g. removing fields, adding new required fields, imposing a stricter"},{"line_number":21,"context_line":"      # pattern on a value, etc.) must bump $Major."},{"line_number":22,"context_line":"      schema_version:"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_2e102b4e","line":19,"range":{"start_line":19,"start_character":44,"end_line":19,"end_character":50},"updated":"2019-07-31 21:42:45.000000000","message":"N -- see latest rev of the spec","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[{"line_number":16,"context_line":"    type: object"},{"line_number":17,"context_line":"    properties:"},{"line_number":18,"context_line":"      # Version ($Major, $minor) of the schema must successfully parse"},{"line_number":19,"context_line":"      # documents conforming to ($Major, 0..$minor). Any breaking schema change"},{"line_number":20,"context_line":"      # (e.g. removing fields, adding new required fields, imposing a stricter"},{"line_number":21,"context_line":"      # pattern on a value, etc.) must bump $Major."},{"line_number":22,"context_line":"      schema_version:"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_2e157de5","line":19,"range":{"start_line":19,"start_character":44,"end_line":19,"end_character":50},"in_reply_to":"7faddb67_2e102b4e","updated":"2019-08-01 16:58:43.000000000","message":"Done","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":22,"context_line":"      schema_version:"},{"line_number":23,"context_line":"        type: string"},{"line_number":24,"context_line":"        # Using an enum here allows us to be explicit about which versions are"},{"line_number":25,"context_line":"        # supported, including allowing us to easily blacklist certain versions"},{"line_number":26,"context_line":"        enum:"},{"line_number":27,"context_line":"          - \"1.0\""},{"line_number":28,"context_line":"    required:"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_ce3157ef","line":25,"updated":"2019-07-31 21:42:45.000000000","message":"Except it doesn\u0027t allow us to support new minor versions we don\u0027t know about. So I reckon this should be more like\n\n pattern: \u00271\\.\\d+\u0027","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[{"line_number":22,"context_line":"      schema_version:"},{"line_number":23,"context_line":"        type: string"},{"line_number":24,"context_line":"        # Using an enum here allows us to be explicit about which versions are"},{"line_number":25,"context_line":"        # supported, including allowing us to easily blacklist certain versions"},{"line_number":26,"context_line":"        enum:"},{"line_number":27,"context_line":"          - \"1.0\""},{"line_number":28,"context_line":"    required:"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_eed8c553","line":25,"in_reply_to":"7faddb67_ce3157ef","updated":"2019-08-01 16:58:43.000000000","message":"Done","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":40,"context_line":"          $ref: \u0027#/provider_definitions/provider_traits\u0027"},{"line_number":41,"context_line":"      required:"},{"line_number":42,"context_line":"        - identification"},{"line_number":43,"context_line":"      additionalProperties: false"},{"line_number":44,"context_line":"required:"},{"line_number":45,"context_line":"  - meta"},{"line_number":46,"context_line":"additionalProperties: false"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_237b6428","line":43,"range":{"start_line":43,"start_character":6,"end_line":43,"end_character":33},"updated":"2019-07-31 21:42:45.000000000","message":"Per the spec [1], we need to allow additionalProperties everywhere, so that schemas are forward compatible within a major version.\n\n[1] http://specs.openstack.org/openstack/nova-specs/specs/train/approved/provider-config-file.html#provider-config-file-schema -- see block comment under \u0027meta:\u0027 in the pseudo-schema","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[{"line_number":40,"context_line":"          $ref: \u0027#/provider_definitions/provider_traits\u0027"},{"line_number":41,"context_line":"      required:"},{"line_number":42,"context_line":"        - identification"},{"line_number":43,"context_line":"      additionalProperties: false"},{"line_number":44,"context_line":"required:"},{"line_number":45,"context_line":"  - meta"},{"line_number":46,"context_line":"additionalProperties: false"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_aede4d3b","line":43,"range":{"start_line":43,"start_character":6,"end_line":43,"end_character":33},"in_reply_to":"7faddb67_237b6428","updated":"2019-08-01 16:58:43.000000000","message":"Done","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":57,"context_line":"      uuid:"},{"line_number":58,"context_line":"        oneOf:"},{"line_number":59,"context_line":"          - type: string"},{"line_number":60,"context_line":"            pattern: \u0027[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\u0027"},{"line_number":61,"context_line":"          - type: string"},{"line_number":62,"context_line":"            enum:"},{"line_number":63,"context_line":"              - \"$COMPUTE_NODE\""}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_e3a54ca0","line":60,"range":{"start_line":60,"start_character":26,"end_line":60,"end_character":29},"updated":"2019-07-31 21:42:45.000000000","message":"I wonder if we should allow uppercase UUIDs","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[{"line_number":57,"context_line":"      uuid:"},{"line_number":58,"context_line":"        oneOf:"},{"line_number":59,"context_line":"          - type: string"},{"line_number":60,"context_line":"            pattern: \u0027[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\u0027"},{"line_number":61,"context_line":"          - type: string"},{"line_number":62,"context_line":"            enum:"},{"line_number":63,"context_line":"              - \"$COMPUTE_NODE\""}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_6e48552c","line":60,"range":{"start_line":60,"start_character":26,"end_line":60,"end_character":29},"in_reply_to":"7faddb67_e3a54ca0","updated":"2019-08-01 16:58:43.000000000","message":"Done","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":64,"context_line":"      name:"},{"line_number":65,"context_line":"        type: string"},{"line_number":66,"context_line":"        minLength: 1"},{"line_number":67,"context_line":"    oneOf:"},{"line_number":68,"context_line":"      - required:"},{"line_number":69,"context_line":"        - uuid"},{"line_number":70,"context_line":"      - required:"},{"line_number":71,"context_line":"        - name"},{"line_number":72,"context_line":"    maxProperties: 1"},{"line_number":73,"context_line":"  provider_inventories:"},{"line_number":74,"context_line":"    # Allows the admin to specify various adjectives to create and manage"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_a31994d7","line":71,"range":{"start_line":67,"start_character":0,"end_line":71,"end_character":14},"updated":"2019-07-31 21:42:45.000000000","message":"Hm.\n\nI was going to say for forward compatibility, in case we add another identification mechanism, we should get rid of this and just have minProperties:1 (as well as maxProperties:1 below).\n\nBut if additionalProperties:true (which we would need for forward compatibility, as noted above) then they could just put a random key here and satisfy the schema.\n\nSo it\u0027s kind of a catch-22. But I think we have to do the latter and enforce the \"either name or UUID\" in code. Because otherwise we\u0027re definitely stuck forward-compat-wise.","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[{"line_number":64,"context_line":"      name:"},{"line_number":65,"context_line":"        type: string"},{"line_number":66,"context_line":"        minLength: 1"},{"line_number":67,"context_line":"    oneOf:"},{"line_number":68,"context_line":"      - required:"},{"line_number":69,"context_line":"        - uuid"},{"line_number":70,"context_line":"      - required:"},{"line_number":71,"context_line":"        - name"},{"line_number":72,"context_line":"    maxProperties: 1"},{"line_number":73,"context_line":"  provider_inventories:"},{"line_number":74,"context_line":"    # Allows the admin to specify various adjectives to create and manage"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_0ed761f0","line":71,"range":{"start_line":67,"start_character":0,"end_line":71,"end_character":14},"in_reply_to":"7faddb67_a31994d7","updated":"2019-08-01 16:58:43.000000000","message":"That makes sense, I will change it as suggested and check it in code.","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        type: array"},{"line_number":82,"context_line":"        items:"},{"line_number":83,"context_line":"          patternProperties:"},{"line_number":84,"context_line":"            # Allows any key name here, comparison against Nova standard"},{"line_number":85,"context_line":"            # resource classes (which cannot be used) will be handled in"},{"line_number":86,"context_line":"            # Placement. Total is required but other properties will be"},{"line_number":87,"context_line":"            # defaulted in Placement."},{"line_number":88,"context_line":"            ^.*$:"},{"line_number":89,"context_line":"              type: object"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_c38e10d0","line":86,"range":{"start_line":84,"start_character":40,"end_line":86,"end_character":24},"updated":"2019-07-31 21:42:45.000000000","message":"Well, not quite.\n\nRestriction to custom resource classes is an artificial constraint we\u0027re imposing to reduce the support surface. It\u0027ll be enforced in code here on the nova side, in a post-schema validation method that we clearly need for multiple reasons (see also above).\n\nBecause again, for forward compatibility, we need to allow any value here as you\u0027ve done (though technically we could restrict it to the pattern for resource classes, [A-Z0-9_]{1,255}).","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        type: array"},{"line_number":82,"context_line":"        items:"},{"line_number":83,"context_line":"          patternProperties:"},{"line_number":84,"context_line":"            # Allows any key name here, comparison against Nova standard"},{"line_number":85,"context_line":"            # resource classes (which cannot be used) will be handled in"},{"line_number":86,"context_line":"            # Placement. Total is required but other properties will be"},{"line_number":87,"context_line":"            # defaulted in Placement."},{"line_number":88,"context_line":"            ^.*$:"},{"line_number":89,"context_line":"              type: object"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_ee944539","line":86,"range":{"start_line":84,"start_character":40,"end_line":86,"end_character":24},"in_reply_to":"7faddb67_c38e10d0","updated":"2019-08-01 16:58:43.000000000","message":"Done","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                  type: integer"},{"line_number":93,"context_line":"              required:"},{"line_number":94,"context_line":"                - total"},{"line_number":95,"context_line":"              additionalProperties: true"},{"line_number":96,"context_line":"      additionalProperties: false"},{"line_number":97,"context_line":"    additionalProperties: false"},{"line_number":98,"context_line":"  provider_traits:"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_a3f51459","line":95,"range":{"start_line":95,"start_character":14,"end_line":95,"end_character":40},"updated":"2019-07-31 21:42:45.000000000","message":"We should explicitly enumerate the other inventory sub-fields in placement:\n\n                reserved: $int\n                min_unit: $int\n                max_unit: $int\n                step_size: $int\n                allocation_ratio: $float\n\nI\u0027m going out on a limb and saying there\u0027s no need to support additionalProperties in this case.","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                  type: integer"},{"line_number":93,"context_line":"              required:"},{"line_number":94,"context_line":"                - total"},{"line_number":95,"context_line":"              additionalProperties: true"},{"line_number":96,"context_line":"      additionalProperties: false"},{"line_number":97,"context_line":"    additionalProperties: false"},{"line_number":98,"context_line":"  provider_traits:"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_a97bb589","line":95,"range":{"start_line":95,"start_character":14,"end_line":95,"end_character":40},"in_reply_to":"7faddb67_a3f51459","updated":"2019-08-01 16:58:43.000000000","message":"If we don\u0027t support additional properties, is there a risk of not being forward compatible?","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a58973dc935181a95797ad565895811753b33a2d","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                  type: integer"},{"line_number":93,"context_line":"              required:"},{"line_number":94,"context_line":"                - total"},{"line_number":95,"context_line":"              additionalProperties: true"},{"line_number":96,"context_line":"      additionalProperties: false"},{"line_number":97,"context_line":"    additionalProperties: false"},{"line_number":98,"context_line":"  provider_traits:"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_f13c2894","line":95,"range":{"start_line":95,"start_character":14,"end_line":95,"end_character":40},"in_reply_to":"7faddb67_a97bb589","updated":"2019-08-01 17:16:24.000000000","message":"You are correct in principle, but here I\u0027m willing to accept that as a limitation, and here\u0027s why (and you can summarize/paraphrase this in a code comment here if you like):\n\nThis is a straight reflection of the placement data model. The likelihood of fields being added to that any time soon is negligible, and if it did happen, it would mean large changes are afoot that would be likely to warrant a major bump anyway. Weighed against the risk of an operator fat-fingering a field name and having it silently ignored, IMO it\u0027s worth imposing the restriction in this case.","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":105,"context_line":"      additional:"},{"line_number":106,"context_line":"        type: array"},{"line_number":107,"context_line":"        items:"},{"line_number":108,"context_line":"          # Only custom traits are allowed, but comparison against standard"},{"line_number":109,"context_line":"          # traits will be handled in Placement."},{"line_number":110,"context_line":"          type: string"},{"line_number":111,"context_line":"    additionalProperties: false"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"7faddb67_636e3c01","line":109,"range":{"start_line":108,"start_character":48,"end_line":109,"end_character":48},"updated":"2019-07-31 21:42:45.000000000","message":"as above (and the trait pattern is the same as the RC pattern in case you want to narrow that down)","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"}],"nova/compute/provider_config_schema_v1.0.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7faddb67_6ab6bdfb","updated":"2019-08-06 21:01:18.000000000","message":"As noted, this file should be named ..._v1.yaml. We\u0027re not going to add a new file for 1.1 etc. ...v{M}.yaml will always be \"the latest minor version of major version {M} supported by this process\", which by definition will successfully parse M.*","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":21,"context_line":"      # pattern on a value, etc.) must bump $Major."},{"line_number":22,"context_line":"      schema_version:"},{"line_number":23,"context_line":"        type: string"},{"line_number":24,"context_line":"        # Using an enum here allows us to be explicit about which major"},{"line_number":25,"context_line":"        # versions are supported, as well as allowing us to easily blacklist"},{"line_number":26,"context_line":"        # certain versions."},{"line_number":27,"context_line":"        oneOf:"},{"line_number":28,"context_line":"          - type: string"},{"line_number":29,"context_line":"            pattern: \u0027^1\\.[0-9]+$\u0027"},{"line_number":30,"context_line":"    required:"},{"line_number":31,"context_line":"      - schema_version"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"7faddb67_fa3fdc21","line":28,"range":{"start_line":24,"start_character":0,"end_line":28,"end_character":24},"updated":"2019-08-06 21:01:18.000000000","message":"I think this is stale (and L29 should be dedented to line up with L23)","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        # certain versions."},{"line_number":27,"context_line":"        oneOf:"},{"line_number":28,"context_line":"          - type: string"},{"line_number":29,"context_line":"            pattern: \u0027^1\\.[0-9]+$\u0027"},{"line_number":30,"context_line":"    required:"},{"line_number":31,"context_line":"      - schema_version"},{"line_number":32,"context_line":"  providers:"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"7faddb67_ca18111f","line":29,"range":{"start_line":29,"start_character":26,"end_line":29,"end_character":32},"updated":"2019-08-06 21:01:18.000000000","message":"If you wanted to get nitpicky here, this could be\n\n \u0027^1\\.(0|[1-9][0-9]+)$\u0027\n\nOtherwise you\u0027re allowing e.g. 1.01.\n\nBut I think I\u0027m fine with this.","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    # This introduces the possibility of an unsupported key name being used to"},{"line_number":71,"context_line":"    # get by schema validation, but is necessary to support forward"},{"line_number":72,"context_line":"    # compatibility with new identification methods. This should be checked"},{"line_number":73,"context_line":"    # after schema validation."},{"line_number":74,"context_line":"    minProperties: 1"},{"line_number":75,"context_line":"    maxProperties: 1"},{"line_number":76,"context_line":"    additionalProperties: true"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"7faddb67_c5bc8207","line":73,"updated":"2019-08-06 21:01:18.000000000","message":"✔","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":110,"context_line":"              # version if they change, that is likely to be part of a large"},{"line_number":111,"context_line":"              # change that may have other impacts anyway. The benefit of"},{"line_number":112,"context_line":"              # stricter validation of property names outweighs the (small)"},{"line_number":113,"context_line":"              # chance of having to bump the schema version as described above."},{"line_number":114,"context_line":"              additionalProperties: false"},{"line_number":115,"context_line":"          # This ensures only keys matching the pattern above are allowed"},{"line_number":116,"context_line":"          additionalProperties: false"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"7faddb67_05d13a23","line":113,"updated":"2019-08-06 21:01:18.000000000","message":"✔","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"}],"nova/compute/provider_config_schema_v1.yaml":[{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"712476cf42d11d8e77c89e1b4c1b95cf4ef49806","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"3fa7e38b_fb6bfe1b","updated":"2019-10-07 16:23:10.000000000","message":"Recommendation not to add \"_Vx\" to the file name.\nThe version can be kept in the \"schema_version:\" entry","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c36c9222f4e77a6c11bbaccf4302e1fd59264f04","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"3fa7e38b_e688be71","in_reply_to":"3fa7e38b_0d3f7525","updated":"2019-10-15 20:17:49.000000000","message":"@Dakshina: The path to load them from is fixed in code.\n\n@Ivens: I poked around but couldn\u0027t really find anywhere I thought seemed right to put them. For now I created a subdirectory in compute but I agree with you that it seems like maybe they should be somewhere else. If anyone has a specific recommendation for that it would be great.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"3fa7e38b_0d3f7525","in_reply_to":"3fa7e38b_3ade49da","updated":"2019-10-11 08:41:23.000000000","message":"Might be tangential here, do we intend to keep the schema files always in this path or is the location configurable?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"3fa7e38b_3ade49da","in_reply_to":"3fa7e38b_b45353e2","updated":"2019-10-10 18:04:39.000000000","message":"oks. Then consider taking out of this path the schema and keep it\u0027s own \"data schema\" path... under compute seems wrong. \nThese group of files will be part of the Nova API (using API as the software construction term and not as in \"REST API\") so it shall be part of the API Schema definition somewhere. -There is a schema definition path missing in general though-","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1986b54f12d607350a173b435327784eab5713e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"3fa7e38b_b45353e2","in_reply_to":"3fa7e38b_fb6bfe1b","updated":"2019-10-07 18:32:44.000000000","message":"It\u0027s in the file name because at some point we\u0027re going to need a schema for v2 and it would collide.\n\n(Could keep them in the same file, but would rather not.)","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"712476cf42d11d8e77c89e1b4c1b95cf4ef49806","unresolved":false,"context_lines":[{"line_number":9,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"type: object"},{"line_number":14,"context_line":"schema_version: \u00271.0\u0027"},{"line_number":15,"context_line":"properties:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_7bef0e87","line":12,"updated":"2019-10-07 16:23:10.000000000","message":"What is the schema type? what standard is it based on?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c36c9222f4e77a6c11bbaccf4302e1fd59264f04","unresolved":false,"context_lines":[{"line_number":9,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"type: object"},{"line_number":14,"context_line":"schema_version: \u00271.0\u0027"},{"line_number":15,"context_line":"properties:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_867b0a79","line":12,"in_reply_to":"3fa7e38b_7bef0e87","updated":"2019-10-15 20:17:49.000000000","message":"Done","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1986b54f12d607350a173b435327784eab5713e9","unresolved":false,"context_lines":[{"line_number":9,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"type: object"},{"line_number":14,"context_line":"schema_version: \u00271.0\u0027"},{"line_number":15,"context_line":"properties:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_d44e0f37","line":12,"in_reply_to":"3fa7e38b_7bef0e87","updated":"2019-10-07 18:32:44.000000000","message":"Good call, should include a comment that it\u0027s jsonschema (version ...?)","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"      additionalProperties: true"},{"line_number":42,"context_line":"required:"},{"line_number":43,"context_line":"  - meta"},{"line_number":44,"context_line":"additionalProperties: true"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"provider_definitions:"},{"line_number":47,"context_line":"  provider_identification:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_2dafd12a","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":26},"updated":"2019-10-11 08:41:23.000000000","message":"Are we prepared for any optional changes at the parent level or is it a safety net to avoid major bumps?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":41,"context_line":"      additionalProperties: true"},{"line_number":42,"context_line":"required:"},{"line_number":43,"context_line":"  - meta"},{"line_number":44,"context_line":"additionalProperties: true"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"provider_definitions:"},{"line_number":47,"context_line":"  provider_identification:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_59198cd4","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":26},"in_reply_to":"3fa7e38b_2dafd12a","updated":"2019-10-14 18:18:45.000000000","message":"Exactly, it is so we can add new fields in a minor bump.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    # cause the consuming compute service to apply the configuration in this"},{"line_number":53,"context_line":"    # provider to all nodes it manages."},{"line_number":54,"context_line":"    type: object"},{"line_number":55,"context_line":"    properties:"},{"line_number":56,"context_line":"      uuid:"},{"line_number":57,"context_line":"        oneOf:"},{"line_number":58,"context_line":"          - type: string"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_dbf4d4f3","line":55,"updated":"2019-10-10 18:04:39.000000000","message":"you need to indicate that you can use the uuid XOR the name to identify the RP. Right now is not clear if both are mandatory or both are optional or if just one will suffice","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    # cause the consuming compute service to apply the configuration in this"},{"line_number":53,"context_line":"    # provider to all nodes it manages."},{"line_number":54,"context_line":"    type: object"},{"line_number":55,"context_line":"    properties:"},{"line_number":56,"context_line":"      uuid:"},{"line_number":57,"context_line":"        oneOf:"},{"line_number":58,"context_line":"          - type: string"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_b96e802c","line":55,"in_reply_to":"3fa7e38b_dbf4d4f3","updated":"2019-10-14 18:18:45.000000000","message":"Is this not clear enough?\n\n\u003eExactly one identification method should be used.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"          - type: string"},{"line_number":59,"context_line":"            pattern: \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027"},{"line_number":60,"context_line":"          - type: string"},{"line_number":61,"context_line":"            enum:"},{"line_number":62,"context_line":"              - \u0027$COMPUTE_NODE\u0027"},{"line_number":63,"context_line":"      name:"},{"line_number":64,"context_line":"        type: string"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_68563b5f","line":61,"updated":"2019-10-10 18:04:39.000000000","message":"Are you planning to have more possibilities for uuid? if the answer is no, then this should not be \"enum\" but \"const\"","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c36c9222f4e77a6c11bbaccf4302e1fd59264f04","unresolved":false,"context_lines":[{"line_number":58,"context_line":"          - type: string"},{"line_number":59,"context_line":"            pattern: \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027"},{"line_number":60,"context_line":"          - type: string"},{"line_number":61,"context_line":"            enum:"},{"line_number":62,"context_line":"              - \u0027$COMPUTE_NODE\u0027"},{"line_number":63,"context_line":"      name:"},{"line_number":64,"context_line":"        type: string"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_c6d3425f","line":61,"in_reply_to":"3fa7e38b_68563b5f","updated":"2019-10-15 20:17:49.000000000","message":"Done","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":58,"context_line":"          - type: string"},{"line_number":59,"context_line":"            pattern: \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027"},{"line_number":60,"context_line":"          - type: string"},{"line_number":61,"context_line":"            enum:"},{"line_number":62,"context_line":"              - \u0027$COMPUTE_NODE\u0027"},{"line_number":63,"context_line":"      name:"},{"line_number":64,"context_line":"        type: string"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_195d5478","line":61,"in_reply_to":"3fa7e38b_68563b5f","updated":"2019-10-14 18:18:45.000000000","message":"We could potentially add more values, but I don\u0027t see any reason it can\u0027t be set to const now and we can change it to enum in  the future if we add new magic values.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    # get by schema validation, but is necessary to support forward"},{"line_number":68,"context_line":"    # compatibility with new identification methods. This should be checked"},{"line_number":69,"context_line":"    # after schema validation."},{"line_number":70,"context_line":"    minProperties: 1"},{"line_number":71,"context_line":"    maxProperties: 1"},{"line_number":72,"context_line":"    additionalProperties: true"},{"line_number":73,"context_line":"  provider_inventories:"},{"line_number":74,"context_line":"    # Allows the admin to specify various adjectives to create and manage"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_6d5dc977","line":71,"range":{"start_line":70,"start_character":0,"end_line":71,"end_character":20},"updated":"2019-10-11 08:41:23.000000000","message":"Does this imply that either uuid or name must be provided or does it simply count?\n\nWouldn\u0027t adding a new identification be a major change?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    # get by schema validation, but is necessary to support forward"},{"line_number":68,"context_line":"    # compatibility with new identification methods. This should be checked"},{"line_number":69,"context_line":"    # after schema validation."},{"line_number":70,"context_line":"    minProperties: 1"},{"line_number":71,"context_line":"    maxProperties: 1"},{"line_number":72,"context_line":"    additionalProperties: true"},{"line_number":73,"context_line":"  provider_inventories:"},{"line_number":74,"context_line":"    # Allows the admin to specify various adjectives to create and manage"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_79fb2846","line":71,"range":{"start_line":70,"start_character":0,"end_line":71,"end_character":20},"in_reply_to":"3fa7e38b_6d5dc977","updated":"2019-10-14 18:18:45.000000000","message":"I think that comment is incorrect. I think the min/max of one coupled with the defined name/uuid properties would prevent the use of an unknown key name being used here. I will test and update.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c36c9222f4e77a6c11bbaccf4302e1fd59264f04","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    # get by schema validation, but is necessary to support forward"},{"line_number":68,"context_line":"    # compatibility with new identification methods. This should be checked"},{"line_number":69,"context_line":"    # after schema validation."},{"line_number":70,"context_line":"    minProperties: 1"},{"line_number":71,"context_line":"    maxProperties: 1"},{"line_number":72,"context_line":"    additionalProperties: true"},{"line_number":73,"context_line":"  provider_inventories:"},{"line_number":74,"context_line":"    # Allows the admin to specify various adjectives to create and manage"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_a641660c","line":71,"range":{"start_line":70,"start_character":0,"end_line":71,"end_character":20},"in_reply_to":"3fa7e38b_79fb2846","updated":"2019-10-15 20:17:49.000000000","message":"@Dakshina Actually after looking at it again, it is correct. Right now we validate those two keys if they are used, but we don\u0027t prevent the use of a completely different key here. There is actually supposed to be a check in the next patch in the series but it is missing (you commented on that, actually.) I will fix it there.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":83,"context_line":"          patternProperties:"},{"line_number":84,"context_line":"            # Allows any key name matching the resource class pattern,"},{"line_number":85,"context_line":"            # check to prevent conflicts will be done after schema validation."},{"line_number":86,"context_line":"            ^[A-Z0-9_]{1,255}$:"},{"line_number":87,"context_line":"              type: object"},{"line_number":88,"context_line":"              properties:"},{"line_number":89,"context_line":"                total:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_83c9185a","line":86,"updated":"2019-10-10 18:04:39.000000000","message":"why use the property name as a pattern instead of using an object with a fixed name and include a \"name\" property?\ni.e.\nadditionals:\n  type: array\n  items:\n    additional:\n    type: object\n    properties:\n       name:\n         type: string","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":83,"context_line":"          patternProperties:"},{"line_number":84,"context_line":"            # Allows any key name matching the resource class pattern,"},{"line_number":85,"context_line":"            # check to prevent conflicts will be done after schema validation."},{"line_number":86,"context_line":"            ^[A-Z0-9_]{1,255}$:"},{"line_number":87,"context_line":"              type: object"},{"line_number":88,"context_line":"              properties:"},{"line_number":89,"context_line":"                total:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_39c050e1","line":86,"in_reply_to":"3fa7e38b_83c9185a","updated":"2019-10-14 18:18:45.000000000","message":"I don\u0027t see a big advantage one way or the other, this is just the way I ended up doing it because it reduced the number of fields. Is there an advantage to using a name property?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":110,"context_line":"              additionalProperties: false"},{"line_number":111,"context_line":"          # This ensures only keys matching the pattern above are allowed"},{"line_number":112,"context_line":"          additionalProperties: false"},{"line_number":113,"context_line":"    additionalProperties: true"},{"line_number":114,"context_line":"  provider_traits:"},{"line_number":115,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":116,"context_line":"    # providers\u0027 traits. This list of adjectives can be extended in the"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_636adcb3","line":113,"updated":"2019-10-10 18:04:39.000000000","message":"should be false to be aligned aligned to your comment in line 76 and 77\n`For now, only one # adjective, `additional`, is supported`","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c36c9222f4e77a6c11bbaccf4302e1fd59264f04","unresolved":false,"context_lines":[{"line_number":110,"context_line":"              additionalProperties: false"},{"line_number":111,"context_line":"          # This ensures only keys matching the pattern above are allowed"},{"line_number":112,"context_line":"          additionalProperties: false"},{"line_number":113,"context_line":"    additionalProperties: true"},{"line_number":114,"context_line":"  provider_traits:"},{"line_number":115,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":116,"context_line":"    # providers\u0027 traits. This list of adjectives can be extended in the"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_26c25654","line":113,"in_reply_to":"3fa7e38b_5c041a15","updated":"2019-10-15 20:17:49.000000000","message":"Done","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":110,"context_line":"              additionalProperties: false"},{"line_number":111,"context_line":"          # This ensures only keys matching the pattern above are allowed"},{"line_number":112,"context_line":"          additionalProperties: false"},{"line_number":113,"context_line":"    additionalProperties: true"},{"line_number":114,"context_line":"  provider_traits:"},{"line_number":115,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":116,"context_line":"    # providers\u0027 traits. This list of adjectives can be extended in the"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_ad9ae110","line":113,"in_reply_to":"3fa7e38b_636adcb3","updated":"2019-10-11 08:41:23.000000000","message":"Correct, as this would let people add properties and bump minor version","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":110,"context_line":"              additionalProperties: false"},{"line_number":111,"context_line":"          # This ensures only keys matching the pattern above are allowed"},{"line_number":112,"context_line":"          additionalProperties: false"},{"line_number":113,"context_line":"    additionalProperties: true"},{"line_number":114,"context_line":"  provider_traits:"},{"line_number":115,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":116,"context_line":"    # providers\u0027 traits. This list of adjectives can be extended in the"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_5c041a15","line":113,"in_reply_to":"3fa7e38b_636adcb3","updated":"2019-10-14 18:18:45.000000000","message":"I will update the comment to indicate \"as of version 1.0...\" This is allowing additional properties in case we add a new adjective in a newer minor version.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    # adjective, `additional`, is supported."},{"line_number":119,"context_line":"    type: object"},{"line_number":120,"context_line":"    properties:"},{"line_number":121,"context_line":"      additional:"},{"line_number":122,"context_line":"        type: array"},{"line_number":123,"context_line":"        items:"},{"line_number":124,"context_line":"          # Allows any value matching the trait pattern here, check to prevent"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_c384f0d5","line":121,"updated":"2019-10-10 18:04:39.000000000","message":"suggestion to use plural for arrays and collections","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c36c9222f4e77a6c11bbaccf4302e1fd59264f04","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    # adjective, `additional`, is supported."},{"line_number":119,"context_line":"    type: object"},{"line_number":120,"context_line":"    properties:"},{"line_number":121,"context_line":"      additional:"},{"line_number":122,"context_line":"        type: array"},{"line_number":123,"context_line":"        items:"},{"line_number":124,"context_line":"          # Allows any value matching the trait pattern here, check to prevent"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_467f5214","line":121,"in_reply_to":"3fa7e38b_c384f0d5","updated":"2019-10-15 20:17:49.000000000","message":"Since inventories is already plural, I am not sure changing this makes sense.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":125,"context_line":"          # conflicts will be done after schema validation."},{"line_number":126,"context_line":"          type: string"},{"line_number":127,"context_line":"          pattern: \u0027^[A-Z0-9_]{1,255}$\u0027"},{"line_number":128,"context_line":"    additionalProperties: true"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_4d69edf5","line":128,"range":{"start_line":128,"start_character":0,"end_line":128,"end_character":30},"updated":"2019-10-11 08:41:23.000000000","message":"Same question as line 113","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":125,"context_line":"          # conflicts will be done after schema validation."},{"line_number":126,"context_line":"          type: string"},{"line_number":127,"context_line":"          pattern: \u0027^[A-Z0-9_]{1,255}$\u0027"},{"line_number":128,"context_line":"    additionalProperties: true"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_dc948a8d","line":128,"range":{"start_line":128,"start_character":0,"end_line":128,"end_character":30},"in_reply_to":"3fa7e38b_4d69edf5","updated":"2019-10-14 18:18:45.000000000","message":"Same answer as above, I will update comment to \"as of version 1.0...\" since this is to allow adding a new adjective in a new minor version.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c36c9222f4e77a6c11bbaccf4302e1fd59264f04","unresolved":false,"context_lines":[{"line_number":125,"context_line":"          # conflicts will be done after schema validation."},{"line_number":126,"context_line":"          type: string"},{"line_number":127,"context_line":"          pattern: \u0027^[A-Z0-9_]{1,255}$\u0027"},{"line_number":128,"context_line":"    additionalProperties: true"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_c6a262ae","line":128,"range":{"start_line":128,"start_character":0,"end_line":128,"end_character":30},"in_reply_to":"3fa7e38b_dc948a8d","updated":"2019-10-15 20:17:49.000000000","message":"Done","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"}],"nova/compute/provider_config_schemas/provider_config_schema_v1.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# https://json-schema.org/draft-07/json-schema-release-notes.html"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"type: object"},{"line_number":17,"context_line":"schema_version: \u00271.0\u0027"},{"line_number":18,"context_line":"properties:"},{"line_number":19,"context_line":"  meta:"},{"line_number":20,"context_line":"    type: object"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_b6d07b2d","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":21},"updated":"2019-10-18 20:24:03.000000000","message":"nts: what is this used for?\n\n[Later] I think it\u0027s not. In which case it\u0027s just confusing, and should go away. Musings:\n- The major version is hardcoded into the file name, as it should be.\n- The minor version shouldn\u0027t be here, because by definition this schema has to work for any minor, and therefore can\u0027t actually change (I think).","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c551f4e470684d12a0013dc2e14a03d55e44abd8","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# https://json-schema.org/draft-07/json-schema-release-notes.html"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"type: object"},{"line_number":17,"context_line":"schema_version: \u00271.0\u0027"},{"line_number":18,"context_line":"properties:"},{"line_number":19,"context_line":"  meta:"},{"line_number":20,"context_line":"    type: object"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_2c10be4f","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":21},"in_reply_to":"3fa7e38b_b6d07b2d","updated":"2019-10-18 22:48:49.000000000","message":"Done","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":25,"context_line":"      # pattern on a value, etc.) must bump $Major."},{"line_number":26,"context_line":"      schema_version:"},{"line_number":27,"context_line":"        type: string"},{"line_number":28,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":29,"context_line":"    required:"},{"line_number":30,"context_line":"      - schema_version"},{"line_number":31,"context_line":"  providers:"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_f6a83321","line":28,"range":{"start_line":28,"start_character":17,"end_line":28,"end_character":18},"updated":"2019-10-18 20:24:03.000000000","message":"I think this should be r\u0027\u0027 so you don\u0027t have to double the \\ \n\nPython figures out what you meant anyway, but I think it warns. And in fact I thought we had enacted a hacking or pep rule to make that warn fatal?\n\n[Later] Yeah, [1], why isn\u0027t pep kicking this out??\n\n[Later later] I\u0027m a doofus, this isn\u0027t a python file.\n\n[Later later later] I confirmed that this loads up into python properly (with \\\\).\n\nIgnore me.\n\n[1] https://review.opendev.org/#/c/652104/","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        items:"},{"line_number":85,"context_line":"          patternProperties:"},{"line_number":86,"context_line":"            # Allows any key name matching the resource class pattern,"},{"line_number":87,"context_line":"            # check to prevent conflicts will be done after schema validation."},{"line_number":88,"context_line":"            ^[A-Z0-9_]{1,255}$:"},{"line_number":89,"context_line":"              type: object"},{"line_number":90,"context_line":"              properties:"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_f6c6f368","line":87,"updated":"2019-10-18 20:24:03.000000000","message":"It may be worth noting in the comment that this replaces the entire inventory for the specified resource class; so e.g. omitting max_unit means you get the (placement) default; it does *not* mean you leave alone whatever was there before (if there was something there before)","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c551f4e470684d12a0013dc2e14a03d55e44abd8","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        items:"},{"line_number":85,"context_line":"          patternProperties:"},{"line_number":86,"context_line":"            # Allows any key name matching the resource class pattern,"},{"line_number":87,"context_line":"            # check to prevent conflicts will be done after schema validation."},{"line_number":88,"context_line":"            ^[A-Z0-9_]{1,255}$:"},{"line_number":89,"context_line":"              type: object"},{"line_number":90,"context_line":"              properties:"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_0c3062e8","line":87,"in_reply_to":"3fa7e38b_f6c6f368","updated":"2019-10-18 22:48:49.000000000","message":"Done","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":123,"context_line":"      additional:"},{"line_number":124,"context_line":"        type: array"},{"line_number":125,"context_line":"        items:"},{"line_number":126,"context_line":"          # Allows any value matching the trait pattern here, check to prevent"},{"line_number":127,"context_line":"          # conflicts will be done after schema validation."},{"line_number":128,"context_line":"          type: string"},{"line_number":129,"context_line":"          pattern: \u0027^[A-Z0-9_]{1,255}$\u0027"},{"line_number":130,"context_line":"    additionalProperties: true"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_36924b5a","line":127,"range":{"start_line":126,"start_character":62,"end_line":127,"end_character":21},"updated":"2019-10-18 20:24:03.000000000","message":"\"conflicts\" is a little weird in the context of traits, maybe just say \"additional validation\"?","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c551f4e470684d12a0013dc2e14a03d55e44abd8","unresolved":false,"context_lines":[{"line_number":123,"context_line":"      additional:"},{"line_number":124,"context_line":"        type: array"},{"line_number":125,"context_line":"        items:"},{"line_number":126,"context_line":"          # Allows any value matching the trait pattern here, check to prevent"},{"line_number":127,"context_line":"          # conflicts will be done after schema validation."},{"line_number":128,"context_line":"          type: string"},{"line_number":129,"context_line":"          pattern: \u0027^[A-Z0-9_]{1,255}$\u0027"},{"line_number":130,"context_line":"    additionalProperties: true"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_6c5476ff","line":127,"range":{"start_line":126,"start_character":62,"end_line":127,"end_character":21},"in_reply_to":"3fa7e38b_36924b5a","updated":"2019-10-18 22:48:49.000000000","message":"Done","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"36669945c0be81b4db1ccc9ff2760859ce5343ca","unresolved":false,"context_lines":[{"line_number":18,"context_line":"  # This property is used to track where the provider.yaml file originated."},{"line_number":19,"context_line":"  __source_file:"},{"line_number":20,"context_line":"    # By not allowing it to match an empty schema, the presence of the key"},{"line_number":21,"context_line":"    #  with any value is invalid."},{"line_number":22,"context_line":"    not: {}"},{"line_number":23,"context_line":"  meta:"},{"line_number":24,"context_line":"    type: object"}],"source_content_type":"text/x-yaml","patch_set":31,"id":"3fa7e38b_4e27c7c8","line":21,"updated":"2019-10-25 19:31:54.000000000","message":"neat","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"36669945c0be81b4db1ccc9ff2760859ce5343ca","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            ^[A-Z0-9_]{1,255}$:"},{"line_number":93,"context_line":"              type: object"},{"line_number":94,"context_line":"              properties:"},{"line_number":95,"context_line":"                # Any properties not populated will be given the Nova-default"},{"line_number":96,"context_line":"                # value, even if another value already exists on the provider."},{"line_number":97,"context_line":"                total:"},{"line_number":98,"context_line":"                  type: integer"}],"source_content_type":"text/x-yaml","patch_set":31,"id":"3fa7e38b_ae0f5b37","line":95,"range":{"start_line":95,"start_character":65,"end_line":95,"end_character":69},"updated":"2019-10-25 19:31:54.000000000","message":"placement, not nova","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"ec8721933af4c24e6aaf58a0593e31780282beae","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            ^[A-Z0-9_]{1,255}$:"},{"line_number":93,"context_line":"              type: object"},{"line_number":94,"context_line":"              properties:"},{"line_number":95,"context_line":"                # Any properties not populated will be given the Nova-default"},{"line_number":96,"context_line":"                # value, even if another value already exists on the provider."},{"line_number":97,"context_line":"                total:"},{"line_number":98,"context_line":"                  type: integer"}],"source_content_type":"text/x-yaml","patch_set":31,"id":"3fa7e38b_6dc80d21","line":95,"range":{"start_line":95,"start_character":65,"end_line":95,"end_character":69},"in_reply_to":"3fa7e38b_ae0f5b37","updated":"2019-11-05 19:05:29.000000000","message":"Done","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"properties:"},{"line_number":18,"context_line":"  # This property is used to track where the provider.yaml file originated."},{"line_number":19,"context_line":"  __source_file:"},{"line_number":20,"context_line":"    # By not allowing it to match an empty schema, the presence of the key"},{"line_number":21,"context_line":"    #  with any value is invalid."},{"line_number":22,"context_line":"    not: {}"},{"line_number":23,"context_line":"  meta:"},{"line_number":24,"context_line":"    type: object"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_dd02c4b9","line":21,"range":{"start_line":20,"start_character":0,"end_line":21,"end_character":33},"updated":"2020-01-17 13:49:58.000000000","message":"I don\u0027t get what we want to achieve here. As far as I understand every input document that has a key \u0027__source_file\u0027 is invalid. But why we need this? Do we want to reserve the key \u0027__source_file\u0027 for internal, implementation specific usage?","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":18,"context_line":"  # This property is used to track where the provider.yaml file originated."},{"line_number":19,"context_line":"  __source_file:"},{"line_number":20,"context_line":"    # By not allowing it to match an empty schema, the presence of the key"},{"line_number":21,"context_line":"    #  with any value is invalid."},{"line_number":22,"context_line":"    not: {}"},{"line_number":23,"context_line":"  meta:"},{"line_number":24,"context_line":"    type: object"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_3da998dd","line":21,"range":{"start_line":21,"start_character":4,"end_line":21,"end_character":7},"updated":"2020-01-17 13:49:58.000000000","message":"nit: remove double space","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a290a66c7cf097153fb004468c22cbd1b0fbed0c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"properties:"},{"line_number":18,"context_line":"  # This property is used to track where the provider.yaml file originated."},{"line_number":19,"context_line":"  __source_file:"},{"line_number":20,"context_line":"    # By not allowing it to match an empty schema, the presence of the key"},{"line_number":21,"context_line":"    #  with any value is invalid."},{"line_number":22,"context_line":"    not: {}"},{"line_number":23,"context_line":"  meta:"},{"line_number":24,"context_line":"    type: object"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_0bfa01bc","line":21,"range":{"start_line":20,"start_character":0,"end_line":21,"end_character":33},"in_reply_to":"1fa4df85_db98a06b","updated":"2020-03-04 18:16:08.000000000","message":"thanks","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":17,"context_line":"properties:"},{"line_number":18,"context_line":"  # This property is used to track where the provider.yaml file originated."},{"line_number":19,"context_line":"  __source_file:"},{"line_number":20,"context_line":"    # By not allowing it to match an empty schema, the presence of the key"},{"line_number":21,"context_line":"    #  with any value is invalid."},{"line_number":22,"context_line":"    not: {}"},{"line_number":23,"context_line":"  meta:"},{"line_number":24,"context_line":"    type: object"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_db98a06b","line":21,"range":{"start_line":20,"start_character":0,"end_line":21,"end_character":33},"in_reply_to":"3fa7e38b_c0005b02","updated":"2020-02-26 20:05:35.000000000","message":"i reworded this.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"6bdbcafb12f6e50f402cd55302df0bf9f55b995a","unresolved":false,"context_lines":[{"line_number":17,"context_line":"properties:"},{"line_number":18,"context_line":"  # This property is used to track where the provider.yaml file originated."},{"line_number":19,"context_line":"  __source_file:"},{"line_number":20,"context_line":"    # By not allowing it to match an empty schema, the presence of the key"},{"line_number":21,"context_line":"    #  with any value is invalid."},{"line_number":22,"context_line":"    not: {}"},{"line_number":23,"context_line":"  meta:"},{"line_number":24,"context_line":"    type: object"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_c0005b02","line":21,"range":{"start_line":20,"start_character":0,"end_line":21,"end_character":33},"in_reply_to":"3fa7e38b_ca1f436f","updated":"2020-01-21 20:17:01.000000000","message":"In hindsight I should probably have worded that comment towards the end user and left the implementation comment for Gerrit..I will update in next PS","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c60f9c17feb0c6f7e9a773e8237b53fa69f1b9b2","unresolved":false,"context_lines":[{"line_number":17,"context_line":"properties:"},{"line_number":18,"context_line":"  # This property is used to track where the provider.yaml file originated."},{"line_number":19,"context_line":"  __source_file:"},{"line_number":20,"context_line":"    # By not allowing it to match an empty schema, the presence of the key"},{"line_number":21,"context_line":"    #  with any value is invalid."},{"line_number":22,"context_line":"    not: {}"},{"line_number":23,"context_line":"  meta:"},{"line_number":24,"context_line":"    type: object"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_f0e474aa","line":21,"range":{"start_line":20,"start_character":0,"end_line":21,"end_character":33},"in_reply_to":"3fa7e38b_dd02c4b9","updated":"2020-01-17 18:12:36.000000000","message":"\u003e Do we want to reserve the key \u0027__source_file\u0027 for\n \u003e internal, implementation specific usage?\n\nThis. We add the filename in the __source_file key for logging purposes. We have some consistency checks that happen long after we load the file, and if those checks fail, we want to be able to let the user know which file(s) had the problem.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f3932877e8283413c0903fd86ed8d7893fd26afc","unresolved":false,"context_lines":[{"line_number":17,"context_line":"properties:"},{"line_number":18,"context_line":"  # This property is used to track where the provider.yaml file originated."},{"line_number":19,"context_line":"  __source_file:"},{"line_number":20,"context_line":"    # By not allowing it to match an empty schema, the presence of the key"},{"line_number":21,"context_line":"    #  with any value is invalid."},{"line_number":22,"context_line":"    not: {}"},{"line_number":23,"context_line":"  meta:"},{"line_number":24,"context_line":"    type: object"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_ca1f436f","line":21,"range":{"start_line":20,"start_character":0,"end_line":21,"end_character":33},"in_reply_to":"3fa7e38b_f0e474aa","updated":"2020-01-18 10:45:14.000000000","message":"so by this we are basically state that there wont\u0027 be ever a schema version that introduces __source_file as a valid key at top level. +1 for the explicitness. -1 for the implementation detail leaking out. As it is not an end user interface I\u0027m OK with this.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"      # pattern on a value, etc.) must bump $Major."},{"line_number":30,"context_line":"      schema_version:"},{"line_number":31,"context_line":"        type: string"},{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"  providers:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_3d675855","line":32,"range":{"start_line":32,"start_character":22,"end_line":32,"end_character":23},"updated":"2020-01-17 13:49:58.000000000","message":"Just curious, do we use this grouping later in the implementation?","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"      # pattern on a value, etc.) must bump $Major."},{"line_number":30,"context_line":"      schema_version:"},{"line_number":31,"context_line":"        type: string"},{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"  providers:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_5dc6d443","line":32,"range":{"start_line":32,"start_character":18,"end_line":32,"end_character":20},"updated":"2020-01-17 13:49:58.000000000","message":"what a self referencing mayor bump enforcer :) nice.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":29,"context_line":"      # pattern on a value, etc.) must bump $Major."},{"line_number":30,"context_line":"      schema_version:"},{"line_number":31,"context_line":"        type: string"},{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"  providers:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_1b8f1824","line":32,"range":{"start_line":32,"start_character":22,"end_line":32,"end_character":23},"in_reply_to":"3fa7e38b_090c5fe9","updated":"2020-02-26 20:05:35.000000000","message":"honest it could have been \"^1\\.[0-9]+$\" and it proably would have been fine \n\nThe only thing this is preventing is leading 0 in the minor version.\n\nbut it sound like the concencous is this is fine and just leave it as it is so im not going to change it.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c4695c9b9fcc7dfddf374e591794f82a7fc3f5e5","unresolved":false,"context_lines":[{"line_number":29,"context_line":"      # pattern on a value, etc.) must bump $Major."},{"line_number":30,"context_line":"      schema_version:"},{"line_number":31,"context_line":"        type: string"},{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"  providers:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_090c5fe9","line":32,"range":{"start_line":32,"start_character":22,"end_line":32,"end_character":23},"in_reply_to":"3fa7e38b_0a0f9b39","updated":"2020-01-21 21:47:09.000000000","message":"\u003e It seems the grouping is unused and if removed the regexp would\n \u003e mean the same\n\nWell, no, the | needs the parens, otherwise it would mean ([0-9]|[1-9])[0-9]+\n\n \u003e So let\u0027s keep it. I don\u0027t think it will ever be a significant\n \u003e performance loss.\n\nThis.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c60f9c17feb0c6f7e9a773e8237b53fa69f1b9b2","unresolved":false,"context_lines":[{"line_number":29,"context_line":"      # pattern on a value, etc.) must bump $Major."},{"line_number":30,"context_line":"      schema_version:"},{"line_number":31,"context_line":"        type: string"},{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"  providers:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_708de4d2","line":32,"range":{"start_line":32,"start_character":22,"end_line":32,"end_character":23},"in_reply_to":"3fa7e38b_3d675855","updated":"2020-01-17 18:12:36.000000000","message":"\u003e Just curious, do we use this grouping later in the implementation?\n\nIs that even possible? I think the only place in jsonschema it would be possible to use a backreference would be within the regex itself.\n\nAnyway, if you\u0027re suggesting this could have the non-capture flag, I agree it could, though possibly not worth the additional syntactic sugar for negligible gain.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f3932877e8283413c0903fd86ed8d7893fd26afc","unresolved":false,"context_lines":[{"line_number":29,"context_line":"      # pattern on a value, etc.) must bump $Major."},{"line_number":30,"context_line":"      schema_version:"},{"line_number":31,"context_line":"        type: string"},{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"  providers:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_0a0f9b39","line":32,"range":{"start_line":32,"start_character":22,"end_line":32,"end_character":23},"in_reply_to":"3fa7e38b_708de4d2","updated":"2020-01-18 10:45:14.000000000","message":"It seems the grouping is unused and if removed the regexp would mean the same (as we are not referencing the capture group). Yesterday I might asked for to remove it but now looking again I feel it helps the schema reader to identify the major.minor format. So let\u0027s keep it. I don\u0027t think it will ever be a significant performance loss.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        type: string"},{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"  providers:"},{"line_number":36,"context_line":"    type: array"},{"line_number":37,"context_line":"    items:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_1d24dcc2","line":34,"updated":"2020-01-17 13:49:58.000000000","message":"We are adding additionalProperties: true everywhere explicitly, except here. As far as I know additionalProperties is true by default so we could add it here as well to make the file consistent regarding the explicitness.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        type: string"},{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"  providers:"},{"line_number":36,"context_line":"    type: array"},{"line_number":37,"context_line":"    items:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_5bc5903b","line":34,"in_reply_to":"3fa7e38b_1d24dcc2","updated":"2020-02-26 20:05:35.000000000","message":"i dont know what that does but if you say its the same then sure ill add it","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    # future versions may support others."},{"line_number":58,"context_line":"    # The uuid can be set to the specialized string `$COMPUTE_NODE` which will"},{"line_number":59,"context_line":"    # cause the consuming compute service to apply the configuration in this"},{"line_number":60,"context_line":"    # provider to all nodes it manages."},{"line_number":61,"context_line":"    type: object"},{"line_number":62,"context_line":"    properties:"},{"line_number":63,"context_line":"      uuid:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_b82276a5","line":60,"range":{"start_line":60,"start_character":18,"end_line":60,"end_character":28},"updated":"2020-01-17 13:49:58.000000000","message":"I think you mean all compute node root providers. In contrast with all providers under all compute nodes the service manages (which would be bad). I think the extra clarification would help the reader.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4a48771cf5b0eb6bf8df6108fe0c86e10a726fad","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    # future versions may support others."},{"line_number":58,"context_line":"    # The uuid can be set to the specialized string `$COMPUTE_NODE` which will"},{"line_number":59,"context_line":"    # cause the consuming compute service to apply the configuration in this"},{"line_number":60,"context_line":"    # provider to all nodes it manages."},{"line_number":61,"context_line":"    type: object"},{"line_number":62,"context_line":"    properties:"},{"line_number":63,"context_line":"      uuid:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_795e2f14","line":60,"range":{"start_line":60,"start_character":18,"end_line":60,"end_character":28},"in_reply_to":"3fa7e38b_5974939b","updated":"2020-01-17 20:25:58.000000000","message":"Is it only the same file or every file in the directory?","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"6bdbcafb12f6e50f402cd55302df0bf9f55b995a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    # future versions may support others."},{"line_number":58,"context_line":"    # The uuid can be set to the specialized string `$COMPUTE_NODE` which will"},{"line_number":59,"context_line":"    # cause the consuming compute service to apply the configuration in this"},{"line_number":60,"context_line":"    # provider to all nodes it manages."},{"line_number":61,"context_line":"    type: object"},{"line_number":62,"context_line":"    properties:"},{"line_number":63,"context_line":"      uuid:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_c04e1b6c","line":60,"range":{"start_line":60,"start_character":18,"end_line":60,"end_character":28},"in_reply_to":"3fa7e38b_795e2f14","updated":"2020-01-21 20:17:01.000000000","message":"The behavior of having $COMPUTE_NODE and explicit ID for same node changed during the course of implementation (see c/693414 for details) and I think this comment did not get update to clarify, I will do so in next PS.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"211b0b6282a7f4b912c5e812b72e927721b11cc3","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    # future versions may support others."},{"line_number":58,"context_line":"    # The uuid can be set to the specialized string `$COMPUTE_NODE` which will"},{"line_number":59,"context_line":"    # cause the consuming compute service to apply the configuration in this"},{"line_number":60,"context_line":"    # provider to all nodes it manages."},{"line_number":61,"context_line":"    type: object"},{"line_number":62,"context_line":"    properties:"},{"line_number":63,"context_line":"      uuid:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_5974939b","line":60,"range":{"start_line":60,"start_character":18,"end_line":60,"end_character":28},"in_reply_to":"3fa7e38b_b82276a5","updated":"2020-01-17 20:23:56.000000000","message":"Also the actual semantic is different. Only those RPs are updated that are not explicitly mentioned in the same file.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    # future versions may support others."},{"line_number":58,"context_line":"    # The uuid can be set to the specialized string `$COMPUTE_NODE` which will"},{"line_number":59,"context_line":"    # cause the consuming compute service to apply the configuration in this"},{"line_number":60,"context_line":"    # provider to all nodes it manages."},{"line_number":61,"context_line":"    type: object"},{"line_number":62,"context_line":"    properties:"},{"line_number":63,"context_line":"      uuid:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_1b14f89f","line":60,"range":{"start_line":60,"start_character":18,"end_line":60,"end_character":28},"in_reply_to":"3fa7e38b_c04e1b6c","updated":"2020-02-26 20:05:35.000000000","message":"i think i have updated this correctly but others need to confirm.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"      uuid:"},{"line_number":64,"context_line":"        oneOf:"},{"line_number":65,"context_line":"          - type: string"},{"line_number":66,"context_line":"            pattern: \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027"},{"line_number":67,"context_line":"          - type: string"},{"line_number":68,"context_line":"            const: \u0027$COMPUTE_NODE\u0027"},{"line_number":69,"context_line":"      name:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_983e9a88","line":66,"updated":"2020-01-17 13:49:58.000000000","message":"could we use \n    format: uuid \nhere?\n\nhttps://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.7.3.5","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a290a66c7cf097153fb004468c22cbd1b0fbed0c","unresolved":false,"context_lines":[{"line_number":63,"context_line":"      uuid:"},{"line_number":64,"context_line":"        oneOf:"},{"line_number":65,"context_line":"          - type: string"},{"line_number":66,"context_line":"            pattern: \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027"},{"line_number":67,"context_line":"          - type: string"},{"line_number":68,"context_line":"            const: \u0027$COMPUTE_NODE\u0027"},{"line_number":69,"context_line":"      name:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_6b861516","line":66,"in_reply_to":"1fa4df85_3bcc5434","updated":"2020-03-04 18:16:08.000000000","message":"thanks, TODO work for me","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":63,"context_line":"      uuid:"},{"line_number":64,"context_line":"        oneOf:"},{"line_number":65,"context_line":"          - type: string"},{"line_number":66,"context_line":"            pattern: \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027"},{"line_number":67,"context_line":"          - type: string"},{"line_number":68,"context_line":"            const: \u0027$COMPUTE_NODE\u0027"},{"line_number":69,"context_line":"      name:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_3bcc5434","line":66,"in_reply_to":"3fa7e38b_2085af59","updated":"2020-02-26 20:05:35.000000000","message":"i will add a TODO comment to track using the uuid format in a future versions.\n\ni was also debating if we should make the - optional\nbut for now i will leave the regex unchanged","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"6bdbcafb12f6e50f402cd55302df0bf9f55b995a","unresolved":false,"context_lines":[{"line_number":63,"context_line":"      uuid:"},{"line_number":64,"context_line":"        oneOf:"},{"line_number":65,"context_line":"          - type: string"},{"line_number":66,"context_line":"            pattern: \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027"},{"line_number":67,"context_line":"          - type: string"},{"line_number":68,"context_line":"            const: \u0027$COMPUTE_NODE\u0027"},{"line_number":69,"context_line":"      name:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_2085af59","line":66,"in_reply_to":"3fa7e38b_983e9a88","updated":"2020-01-21 20:17:01.000000000","message":"At the time this was implemented, support for that in was not included in the jsonschema library. I will check again when updating the PS and can bump versions/switch to that if it is.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f3932877e8283413c0903fd86ed8d7893fd26afc","unresolved":false,"context_lines":[{"line_number":65,"context_line":"          - type: string"},{"line_number":66,"context_line":"            pattern: \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027"},{"line_number":67,"context_line":"          - type: string"},{"line_number":68,"context_line":"            const: \u0027$COMPUTE_NODE\u0027"},{"line_number":69,"context_line":"      name:"},{"line_number":70,"context_line":"        type: string"},{"line_number":71,"context_line":"        minLength: 1"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_ca08a32f","line":68,"updated":"2020-01-18 10:45:14.000000000","message":"I did dream about this last night. What is the semantic if more than on provider_definition refers to $COMPUTE_NODE ? Are the commands both of them executed? Or the second overwrites the first? Or Error?","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"82aacf88ccfb72e3d99418f50310c3437a0c10e1","unresolved":false,"context_lines":[{"line_number":65,"context_line":"          - type: string"},{"line_number":66,"context_line":"            pattern: \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027"},{"line_number":67,"context_line":"          - type: string"},{"line_number":68,"context_line":"            const: \u0027$COMPUTE_NODE\u0027"},{"line_number":69,"context_line":"      name:"},{"line_number":70,"context_line":"        type: string"},{"line_number":71,"context_line":"        minLength: 1"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_f6d88fed","line":68,"in_reply_to":"3fa7e38b_694cf33f","updated":"2020-01-24 15:11:06.000000000","message":"I see. Thanks.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c4695c9b9fcc7dfddf374e591794f82a7fc3f5e5","unresolved":false,"context_lines":[{"line_number":65,"context_line":"          - type: string"},{"line_number":66,"context_line":"            pattern: \u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027"},{"line_number":67,"context_line":"          - type: string"},{"line_number":68,"context_line":"            const: \u0027$COMPUTE_NODE\u0027"},{"line_number":69,"context_line":"      name:"},{"line_number":70,"context_line":"        type: string"},{"line_number":71,"context_line":"        minLength: 1"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_694cf33f","line":68,"in_reply_to":"3fa7e38b_ca08a32f","updated":"2020-01-21 21:47:09.000000000","message":"Error. That\u0027s a dup that should be caught by the early universal check at https://review.opendev.org/#/c/676029/34/nova/compute/provider_config.py@219","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":69,"context_line":"      name:"},{"line_number":70,"context_line":"        type: string"},{"line_number":71,"context_line":"        minLength: 1"},{"line_number":72,"context_line":"    # This introduces the possibility of an unsupported key name being used to"},{"line_number":73,"context_line":"    # get by schema validation, but is necessary to support forward"},{"line_number":74,"context_line":"    # compatibility with new identification methods. This should be checked"},{"line_number":75,"context_line":"    # after schema validation."},{"line_number":76,"context_line":"    minProperties: 1"},{"line_number":77,"context_line":"    maxProperties: 1"},{"line_number":78,"context_line":"    additionalProperties: true"},{"line_number":79,"context_line":"  provider_inventories:"},{"line_number":80,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":81,"context_line":"    # providers\u0027 inventories. This list of adjectives can be extended in the"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_78edde22","line":78,"range":{"start_line":72,"start_character":0,"end_line":78,"end_character":30},"updated":"2020-01-17 13:49:58.000000000","message":"Good point, but assume schema_version 1.1 adds new identification method \"foo\". Then take the following cases:\n\n1) input 1.0, schema 1.1: input will never contain \"foo\"\n\n2) input 1.1 with \"foo\", but schema 1.0 as implementation is 1.0. If input contains \"foo\" then the schema accepts it BUT the implementation cannot handle the \"foo\" identification method and no other method can be provided in the input along with \"foo\" (due to min/maxProperties) so the post check fails.\n\nI think in this case it is totally OK to only accept identification methods in the schema that are known by the implementation. So here we can say additionalProperties: false without loosing compatibility as that compatibility is already lost on the implementation level.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":69,"context_line":"      name:"},{"line_number":70,"context_line":"        type: string"},{"line_number":71,"context_line":"        minLength: 1"},{"line_number":72,"context_line":"    # This introduces the possibility of an unsupported key name being used to"},{"line_number":73,"context_line":"    # get by schema validation, but is necessary to support forward"},{"line_number":74,"context_line":"    # compatibility with new identification methods. This should be checked"},{"line_number":75,"context_line":"    # after schema validation."},{"line_number":76,"context_line":"    minProperties: 1"},{"line_number":77,"context_line":"    maxProperties: 1"},{"line_number":78,"context_line":"    additionalProperties: true"},{"line_number":79,"context_line":"  provider_inventories:"},{"line_number":80,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":81,"context_line":"    # providers\u0027 inventories. This list of adjectives can be extended in the"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_56f007ca","line":78,"range":{"start_line":72,"start_character":0,"end_line":78,"end_character":30},"in_reply_to":"3fa7e38b_78edde22","updated":"2020-02-26 20:05:35.000000000","message":"Done","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    minProperties: 1"},{"line_number":77,"context_line":"    maxProperties: 1"},{"line_number":78,"context_line":"    additionalProperties: true"},{"line_number":79,"context_line":"  provider_inventories:"},{"line_number":80,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":81,"context_line":"    # providers\u0027 inventories. This list of adjectives can be extended in the"},{"line_number":82,"context_line":"    # future as the schema evolves to meet new use cases. As of v1.0, only one"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_3e08a47e","line":79,"updated":"2020-01-17 13:49:58.000000000","message":"\u003cstricter schema to help the user\u003e\nThis now allows an empty inventories object. But if no inventory changes are needed then the inventories key should not be in the input.\n\n{\n  \"meta\": {\n    \"schema_version\": \"1.0\"\n  },\n  \"providers\": [\n    {\n      \"identification\": {\n        \"uuid\": \"$COMPUTE_NODE\"\n      },\n      \"inventories\": {}\n    }\n  ]\n}","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a290a66c7cf097153fb004468c22cbd1b0fbed0c","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    minProperties: 1"},{"line_number":77,"context_line":"    maxProperties: 1"},{"line_number":78,"context_line":"    additionalProperties: true"},{"line_number":79,"context_line":"  provider_inventories:"},{"line_number":80,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":81,"context_line":"    # providers\u0027 inventories. This list of adjectives can be extended in the"},{"line_number":82,"context_line":"    # future as the schema evolves to meet new use cases. As of v1.0, only one"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_6bb4d5d1","line":79,"in_reply_to":"1fa4df85_b6913b55","updated":"2020-03-04 18:16:08.000000000","message":"Why would the creator of the file ever want to add\n\n    \"inventories\": {} \n\nto the config? It means no-op for the interpreter, so it is noise in the config. It could even hide a user error when the user forgot to finish the definition of the inventory change request.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    minProperties: 1"},{"line_number":77,"context_line":"    maxProperties: 1"},{"line_number":78,"context_line":"    additionalProperties: true"},{"line_number":79,"context_line":"  provider_inventories:"},{"line_number":80,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":81,"context_line":"    # providers\u0027 inventories. This list of adjectives can be extended in the"},{"line_number":82,"context_line":"    # future as the schema evolves to meet new use cases. As of v1.0, only one"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_b6913b55","line":79,"in_reply_to":"3fa7e38b_3e08a47e","updated":"2020-02-26 20:05:35.000000000","message":"im not sure what you ment by this so im going to ignore it for now.\n\nlater\n-----\nbased on your other comment below i think you were suggesting we block the abplity to specify an empyt dict of inventories but i think that would hurt the user expericne not help it.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    additionalProperties: true"},{"line_number":79,"context_line":"  provider_inventories:"},{"line_number":80,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":81,"context_line":"    # providers\u0027 inventories. This list of adjectives can be extended in the"},{"line_number":82,"context_line":"    # future as the schema evolves to meet new use cases. As of v1.0, only one"},{"line_number":83,"context_line":"    # adjective, `additional`, is supported."},{"line_number":84,"context_line":"    type: object"},{"line_number":85,"context_line":"    properties:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_fefd2c3c","line":82,"range":{"start_line":81,"start_character":29,"end_line":82,"end_character":57},"updated":"2020-01-17 13:49:58.000000000","message":"Is such extension a minor schema change? What will be the behavior of the older code when see a newer (so unknown) adjective? Will ignore it? Will ignore it silently? \n\nI feel we at least need to emit a fat warning when we ignore some command (e.g. remove inventories) from the yaml to avoid misleading the admin. \nOr alternatively we can have a way to tell the nova-compute (e.g. config) to use the input strictly and fail to start if there are command that is not understood by the service.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a290a66c7cf097153fb004468c22cbd1b0fbed0c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    additionalProperties: true"},{"line_number":79,"context_line":"  provider_inventories:"},{"line_number":80,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":81,"context_line":"    # providers\u0027 inventories. This list of adjectives can be extended in the"},{"line_number":82,"context_line":"    # future as the schema evolves to meet new use cases. As of v1.0, only one"},{"line_number":83,"context_line":"    # adjective, `additional`, is supported."},{"line_number":84,"context_line":"    type: object"},{"line_number":85,"context_line":"    properties:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_ebbf65a7","line":82,"range":{"start_line":81,"start_character":29,"end_line":82,"end_character":57},"in_reply_to":"1fa4df85_96b19f92","updated":"2020-03-04 18:16:08.000000000","message":"yepp","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    additionalProperties: true"},{"line_number":79,"context_line":"  provider_inventories:"},{"line_number":80,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":81,"context_line":"    # providers\u0027 inventories. This list of adjectives can be extended in the"},{"line_number":82,"context_line":"    # future as the schema evolves to meet new use cases. As of v1.0, only one"},{"line_number":83,"context_line":"    # adjective, `additional`, is supported."},{"line_number":84,"context_line":"    type: object"},{"line_number":85,"context_line":"    properties:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_96b19f92","line":82,"range":{"start_line":81,"start_character":29,"end_line":82,"end_character":57},"in_reply_to":"3fa7e38b_8a02ab0b","updated":"2020-02-26 20:05:35.000000000","message":"ok so there is no action here bar defer till we extend this.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f3932877e8283413c0903fd86ed8d7893fd26afc","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    additionalProperties: true"},{"line_number":79,"context_line":"  provider_inventories:"},{"line_number":80,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":81,"context_line":"    # providers\u0027 inventories. This list of adjectives can be extended in the"},{"line_number":82,"context_line":"    # future as the schema evolves to meet new use cases. As of v1.0, only one"},{"line_number":83,"context_line":"    # adjective, `additional`, is supported."},{"line_number":84,"context_line":"    type: object"},{"line_number":85,"context_line":"    properties:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_8a02ab0b","line":82,"range":{"start_line":81,"start_character":29,"end_line":82,"end_character":57},"in_reply_to":"3fa7e38b_90a1803d","updated":"2020-01-18 10:45:14.000000000","message":"OK, let\u0027s decide about this when we introduce the next adjective. I feel I will be on the side of making that a major bump to avoid confusion what commands are applied by the compute and what are not.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c60f9c17feb0c6f7e9a773e8237b53fa69f1b9b2","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    additionalProperties: true"},{"line_number":79,"context_line":"  provider_inventories:"},{"line_number":80,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":81,"context_line":"    # providers\u0027 inventories. This list of adjectives can be extended in the"},{"line_number":82,"context_line":"    # future as the schema evolves to meet new use cases. As of v1.0, only one"},{"line_number":83,"context_line":"    # adjective, `additional`, is supported."},{"line_number":84,"context_line":"    type: object"},{"line_number":85,"context_line":"    properties:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_90a1803d","line":82,"range":{"start_line":81,"start_character":29,"end_line":82,"end_character":57},"in_reply_to":"3fa7e38b_fefd2c3c","updated":"2020-01-17 18:12:36.000000000","message":"\u003e Is such extension a minor schema change? What will be the behavior\n \u003e of the older code when see a newer (so unknown) adjective? Will\n \u003e ignore it? Will ignore it silently?\n\nNot silently; that\u0027s what the warning in the previous file is for.\n\n \u003e I feel we at least need to emit a fat warning when we ignore some\n \u003e command (e.g. remove inventories) from the yaml to avoid misleading\n \u003e the admin.\n \u003e Or alternatively we can have a way to tell the nova-compute (e.g.\n \u003e config) to use the input strictly and fail to start if there are\n \u003e command that is not understood by the service.\n\nWe could do that by making any change a major schema bump. But this way allows us the flexibility to extend with a minor bump if we feel we need to.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    properties:"},{"line_number":86,"context_line":"      additional:"},{"line_number":87,"context_line":"        type: array"},{"line_number":88,"context_line":"        items:"},{"line_number":89,"context_line":"          patternProperties:"},{"line_number":90,"context_line":"            # Allows any key name matching the resource class pattern,"},{"line_number":91,"context_line":"            # check to prevent conflicts will be done after schema validation."}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_9e1198b1","line":88,"updated":"2020-01-17 13:49:58.000000000","message":"\u003cstricter schema to help the user\u003e\nThis now allows an empty addition array but that seems useless.\n\n{\n  \"meta\": {\n    \"schema_version\": \"1.0\"\n  },\n  \"providers\": [\n    {\n      \"identification\": {\n        \"uuid\": \"$COMPUTE_NODE\"\n      },\n      \"inventories\": {\n        \"additional\": []\n      }\n    }\n  ]\n}","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a290a66c7cf097153fb004468c22cbd1b0fbed0c","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    properties:"},{"line_number":86,"context_line":"      additional:"},{"line_number":87,"context_line":"        type: array"},{"line_number":88,"context_line":"        items:"},{"line_number":89,"context_line":"          patternProperties:"},{"line_number":90,"context_line":"            # Allows any key name matching the resource class pattern,"},{"line_number":91,"context_line":"            # check to prevent conflicts will be done after schema validation."}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_6b37f54e","line":88,"in_reply_to":"1fa4df85_3651cb37","updated":"2020-03-04 18:16:08.000000000","message":"I disagree here and the \"inventory\": {} case above. But meh. I don\u0027t have time to make this better and I appreciate you effort to push this feature through. So I rest my case.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    properties:"},{"line_number":86,"context_line":"      additional:"},{"line_number":87,"context_line":"        type: array"},{"line_number":88,"context_line":"        items:"},{"line_number":89,"context_line":"          patternProperties:"},{"line_number":90,"context_line":"            # Allows any key name matching the resource class pattern,"},{"line_number":91,"context_line":"            # check to prevent conflicts will be done after schema validation."}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_3651cb37","line":88,"in_reply_to":"3fa7e38b_9e1198b1","updated":"2020-02-26 20:05:35.000000000","message":"ya i think that is fine.\nallowing an empty array does not really hurt and it actuly makes it eaiser to rember the format as i can just fill in the array later. if we never allow the key to be specified i cant easly generate a sample config and example.\n\nso a stricter schema would hurt not help the user in this case.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        items:"},{"line_number":89,"context_line":"          patternProperties:"},{"line_number":90,"context_line":"            # Allows any key name matching the resource class pattern,"},{"line_number":91,"context_line":"            # check to prevent conflicts will be done after schema validation."},{"line_number":92,"context_line":"            ^[A-Z0-9_]{1,255}$:"},{"line_number":93,"context_line":"              type: object"},{"line_number":94,"context_line":"              properties:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_1e1da8be","line":91,"range":{"start_line":91,"start_character":31,"end_line":91,"end_character":40},"updated":"2020-01-17 13:49:58.000000000","message":"conflicts with what?","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":89,"context_line":"          patternProperties:"},{"line_number":90,"context_line":"            # Allows any key name matching the resource class pattern,"},{"line_number":91,"context_line":"            # check to prevent conflicts will be done after schema validation."},{"line_number":92,"context_line":"            ^[A-Z0-9_]{1,255}$:"},{"line_number":93,"context_line":"              type: object"},{"line_number":94,"context_line":"              properties:"},{"line_number":95,"context_line":"                # Any properties not populated will be given a default value by"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_be7a54b8","line":92,"range":{"start_line":92,"start_character":12,"end_line":92,"end_character":31},"updated":"2020-01-17 13:49:58.000000000","message":"First I thought placement is stricter but not. So this is OK.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            ^[A-Z0-9_]{1,255}$:"},{"line_number":93,"context_line":"              type: object"},{"line_number":94,"context_line":"              properties:"},{"line_number":95,"context_line":"                # Any properties not populated will be given a default value by"},{"line_number":96,"context_line":"                # placement, even if a value already exists on the provider."},{"line_number":97,"context_line":"                total:"},{"line_number":98,"context_line":"                  type: integer"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_9e76780b","line":95,"range":{"start_line":95,"start_character":18,"end_line":95,"end_character":76},"updated":"2020-01-17 13:49:58.000000000","message":"Even total is defaulted by placement?","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c60f9c17feb0c6f7e9a773e8237b53fa69f1b9b2","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            ^[A-Z0-9_]{1,255}$:"},{"line_number":93,"context_line":"              type: object"},{"line_number":94,"context_line":"              properties:"},{"line_number":95,"context_line":"                # Any properties not populated will be given a default value by"},{"line_number":96,"context_line":"                # placement, even if a value already exists on the provider."},{"line_number":97,"context_line":"                total:"},{"line_number":98,"context_line":"                  type: integer"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_b0711ce2","line":95,"range":{"start_line":95,"start_character":18,"end_line":95,"end_character":76},"in_reply_to":"3fa7e38b_9e76780b","updated":"2020-01-17 18:12:36.000000000","message":"no, total should be required","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"6bdbcafb12f6e50f402cd55302df0bf9f55b995a","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            ^[A-Z0-9_]{1,255}$:"},{"line_number":93,"context_line":"              type: object"},{"line_number":94,"context_line":"              properties:"},{"line_number":95,"context_line":"                # Any properties not populated will be given a default value by"},{"line_number":96,"context_line":"                # placement, even if a value already exists on the provider."},{"line_number":97,"context_line":"                total:"},{"line_number":98,"context_line":"                  type: integer"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_e0ef9719","line":95,"range":{"start_line":95,"start_character":18,"end_line":95,"end_character":76},"in_reply_to":"3fa7e38b_b0711ce2","updated":"2020-01-21 20:17:01.000000000","message":"Total is required (see L110). I will make the comment clearer in next PS.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":93,"context_line":"              type: object"},{"line_number":94,"context_line":"              properties:"},{"line_number":95,"context_line":"                # Any properties not populated will be given a default value by"},{"line_number":96,"context_line":"                # placement, even if a value already exists on the provider."},{"line_number":97,"context_line":"                total:"},{"line_number":98,"context_line":"                  type: integer"},{"line_number":99,"context_line":"                reserved:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_7e737c1d","line":96,"range":{"start_line":96,"start_character":29,"end_line":96,"end_character":76},"updated":"2020-01-17 13:49:58.000000000","message":"I don\u0027t get this. Does placement overwrite existing value with default value?","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f3932877e8283413c0903fd86ed8d7893fd26afc","unresolved":false,"context_lines":[{"line_number":93,"context_line":"              type: object"},{"line_number":94,"context_line":"              properties:"},{"line_number":95,"context_line":"                # Any properties not populated will be given a default value by"},{"line_number":96,"context_line":"                # placement, even if a value already exists on the provider."},{"line_number":97,"context_line":"                total:"},{"line_number":98,"context_line":"                  type: integer"},{"line_number":99,"context_line":"                reserved:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_65fd2006","line":96,"range":{"start_line":96,"start_character":29,"end_line":96,"end_character":76},"in_reply_to":"3fa7e38b_302c4cb1","updated":"2020-01-18 10:45:14.000000000","message":"OK, now I got it. I suggest to reword the above comment based on your definition.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c60f9c17feb0c6f7e9a773e8237b53fa69f1b9b2","unresolved":false,"context_lines":[{"line_number":93,"context_line":"              type: object"},{"line_number":94,"context_line":"              properties:"},{"line_number":95,"context_line":"                # Any properties not populated will be given a default value by"},{"line_number":96,"context_line":"                # placement, even if a value already exists on the provider."},{"line_number":97,"context_line":"                total:"},{"line_number":98,"context_line":"                  type: integer"},{"line_number":99,"context_line":"                reserved:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_302c4cb1","line":96,"range":{"start_line":96,"start_character":29,"end_line":96,"end_character":76},"in_reply_to":"3fa7e38b_7e737c1d","updated":"2020-01-17 18:12:36.000000000","message":"The nova code will overwrite the entire inventory entry for this resource class if it already existed. But omitting e.g. min_unit means you get the placement default min_unit, *not* whatever min_unit was on the pre-existing record.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                  type: number"},{"line_number":109,"context_line":"              required:"},{"line_number":110,"context_line":"                - total"},{"line_number":111,"context_line":"              # The defined properties reflect the current placement data"},{"line_number":112,"context_line":"              # model. While defining those in the schema and not allowing"},{"line_number":113,"context_line":"              # additional properties means we will need to bump the schema"},{"line_number":114,"context_line":"              # version if they change, that is likely to be part of a large"},{"line_number":115,"context_line":"              # change that may have other impacts anyway. The benefit of"},{"line_number":116,"context_line":"              # stricter validation of property names outweighs the (small)"},{"line_number":117,"context_line":"              # chance of having to bump the schema version as described above."},{"line_number":118,"context_line":"              additionalProperties: false"},{"line_number":119,"context_line":"          # This ensures only keys matching the pattern above are allowed"},{"line_number":120,"context_line":"          additionalProperties: false"},{"line_number":121,"context_line":"    additionalProperties: true"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_fe668c56","line":118,"range":{"start_line":111,"start_character":0,"end_line":118,"end_character":1},"updated":"2020-01-17 13:49:58.000000000","message":"+1","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":119,"context_line":"          # This ensures only keys matching the pattern above are allowed"},{"line_number":120,"context_line":"          additionalProperties: false"},{"line_number":121,"context_line":"    additionalProperties: true"},{"line_number":122,"context_line":"  provider_traits:"},{"line_number":123,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":124,"context_line":"    # providers\u0027 traits. This list of adjectives can be extended in the"},{"line_number":125,"context_line":"    # future as the schema evolves to meet new use cases. As of v1.0, only one"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_9e5f5873","line":122,"updated":"2020-01-17 13:49:58.000000000","message":"\u003cstricter schema to help the user\u003e\n* empty traits object is allowed\n* empty additions array is allowed","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":119,"context_line":"          # This ensures only keys matching the pattern above are allowed"},{"line_number":120,"context_line":"          additionalProperties: false"},{"line_number":121,"context_line":"    additionalProperties: true"},{"line_number":122,"context_line":"  provider_traits:"},{"line_number":123,"context_line":"    # Allows the admin to specify various adjectives to create and manage"},{"line_number":124,"context_line":"    # providers\u0027 traits. This list of adjectives can be extended in the"},{"line_number":125,"context_line":"    # future as the schema evolves to meet new use cases. As of v1.0, only one"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_516331dd","line":122,"in_reply_to":"3fa7e38b_9e5f5873","updated":"2020-02-26 20:05:35.000000000","message":"yes i think both of those should be allowed provided they have no effect when set.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":132,"context_line":"          # Allows any value matching the trait pattern here, additional"},{"line_number":133,"context_line":"          # validation will be done after schema validation."},{"line_number":134,"context_line":"          type: string"},{"line_number":135,"context_line":"          pattern: \u0027^[A-Z0-9_]{1,255}$\u0027"},{"line_number":136,"context_line":"    additionalProperties: true"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_1184d95d","line":135,"range":{"start_line":135,"start_character":8,"end_line":135,"end_character":39},"updated":"2020-02-26 20:05:35.000000000","message":"by the way im not going to change this but i tought we were only going to allow CUSTOM_ traits and resouces classes at one point did we decide to relax that. i have not checked the spec in a while so just said i would ask.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a290a66c7cf097153fb004468c22cbd1b0fbed0c","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    # future versions may support others."},{"line_number":59,"context_line":"    # The uuid can be set to the sentinel value `$COMPUTE_NODE` which will"},{"line_number":60,"context_line":"    # cause the consuming compute service to apply the configuration to"},{"line_number":61,"context_line":"    # to all compute node root providers it manages."},{"line_number":62,"context_line":"    type: object"},{"line_number":63,"context_line":"    properties:"},{"line_number":64,"context_line":"      uuid:"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"1fa4df85_2b933d5d","line":61,"range":{"start_line":61,"start_character":9,"end_line":61,"end_character":40},"updated":"2020-03-04 18:16:08.000000000","message":"I lost most of the context here but base on my past comments there is some exception from \"all\" here. I feel that if $COMPUTE_NODE is used then it means every compute node root provider except those that are otherwise explicitly mentioned in the configuration.","commit_id":"b9e84c14cbb4401168609b9aadc37f2e97e3e26e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5e6825773e0047832fa8da758adf9ec41bccc3a6","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    type: object"},{"line_number":90,"context_line":"    properties:"},{"line_number":91,"context_line":"      additional:"},{"line_number":92,"context_line":"        type: array"},{"line_number":93,"context_line":"        items:"},{"line_number":94,"context_line":"          patternProperties:"},{"line_number":95,"context_line":"            # Allows any key name matching the resource class pattern,"}],"source_content_type":"text/x-yaml","patch_set":41,"id":"1fa4df85_1064eeb8","line":92,"range":{"start_line":92,"start_character":14,"end_line":92,"end_character":19},"updated":"2020-03-12 18:41:14.000000000","message":"this feels wrong as it force you to do \n\nadtional:[{RC1:{...}},{RC2:{...}},...]\ninstead of\nadtional:{ RC1:{}, RC2:{}}\n\ne.g. its forcing an extra layer of nesting","commit_id":"125d75c77391b0d9c84e10cbf4385f8ce77c6c51"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"09216a522443f7057f2c0ebc482d0f72bdaeb1f9","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    type: object"},{"line_number":90,"context_line":"    properties:"},{"line_number":91,"context_line":"      additional:"},{"line_number":92,"context_line":"        type: array"},{"line_number":93,"context_line":"        items:"},{"line_number":94,"context_line":"          patternProperties:"},{"line_number":95,"context_line":"            # Allows any key name matching the resource class pattern,"}],"source_content_type":"text/x-yaml","patch_set":41,"id":"df33271e_dc727349","line":92,"range":{"start_line":92,"start_character":14,"end_line":92,"end_character":19},"in_reply_to":"1fa4df85_1064eeb8","updated":"2020-03-26 12:53:15.000000000","message":"good point. I support dropping the extra nesting","commit_id":"125d75c77391b0d9c84e10cbf4385f8ce77c6c51"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ac63118d75f879a75c782596935d2d5df98ea9f2","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"    additionalProperties: true"},{"line_number":36,"context_line":"  providers:"},{"line_number":37,"context_line":"    type: array"},{"line_number":38,"context_line":"    items:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"ff570b3c_febe0b63","line":35,"updated":"2020-06-01 12:23:15.000000000","message":"I am late to the party here, but I expected this to be false. Only so its clear when people typo something that is optional, but we don\u0027t error out, we just silently ignore. This would match what we (now) do in the API.","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"d9428554c9a018e04293b40c82bd8bd5e5111b2b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"    additionalProperties: true"},{"line_number":36,"context_line":"  providers:"},{"line_number":37,"context_line":"    type: array"},{"line_number":38,"context_line":"    items:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"ff570b3c_e53eef89","line":35,"in_reply_to":"ff570b3c_572dd8fb","updated":"2020-06-09 08:29:34.000000000","message":"I concur with Alex/Eric. Also, additionalProperties is required to be false when we are well aware that changes introduced will require a major bump.","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"e1820d3c1c8578deabf2a0f49cc23837aef60460","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"    additionalProperties: true"},{"line_number":36,"context_line":"  providers:"},{"line_number":37,"context_line":"    type: array"},{"line_number":38,"context_line":"    items:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"ff570b3c_da122158","line":35,"in_reply_to":"ff570b3c_6c852307","updated":"2020-06-02 07:12:32.000000000","message":"According to the spec https://specs.openstack.org/openstack/nova-specs/specs/victoria/approved/provider-config-file.html#provider-config-file-schema\n\"\"\"\n  # Version ($Major, $minor) of the schema must successfully parse documents\n  # conforming to ($Major, *). I.e. additionalProperties must be allowed at\n  # all levels;\n\"\"\"\n\nAs my understand, due to we want to support compatible change with minor version, we should allow the additionalProperties. For example, we add new optional property in newer version, but in the older nova, it should be able parse the full document.","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"1af8eb7ba442ac09b08393b155ea2b9675a3bb98","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"    additionalProperties: true"},{"line_number":36,"context_line":"  providers:"},{"line_number":37,"context_line":"    type: array"},{"line_number":38,"context_line":"    items:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"ff570b3c_572dd8fb","line":35,"in_reply_to":"ff570b3c_6d7a3a77","updated":"2020-06-09 00:43:35.000000000","message":"Hi @Dan, could you add a few more words about the reason or consideration for taking additionalProperties: true by default? Thanks.","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"484841c9999b9d89cdea19531539f590105d3485","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"    additionalProperties: true"},{"line_number":36,"context_line":"  providers:"},{"line_number":37,"context_line":"    type: array"},{"line_number":38,"context_line":"    items:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"ff570b3c_6d7a3a77","line":35,"in_reply_to":"ff570b3c_da122158","updated":"2020-06-02 12:11:52.000000000","message":"Correct. Dan would be able to speak more to this if necessary.","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"56cfaa190d0d75eafc3629188f986c3274f28fcf","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        pattern: \u0027^1\\.([0-9]|[1-9][0-9]+)$\u0027"},{"line_number":33,"context_line":"    required:"},{"line_number":34,"context_line":"      - schema_version"},{"line_number":35,"context_line":"    additionalProperties: true"},{"line_number":36,"context_line":"  providers:"},{"line_number":37,"context_line":"    type: array"},{"line_number":38,"context_line":"    items:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"ff570b3c_6c852307","line":35,"in_reply_to":"ff570b3c_febe0b63","updated":"2020-06-02 01:15:13.000000000","message":"@john I am with you about this. but I just take these patches over and it will takes me a few days to digest them and discuss with experts before I can make any change. please stay tuned. thanks.","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":50,"id":"bf51134e_5ba5cc46","updated":"2020-07-22 13:10:17.000000000","message":"Can we please keep this in code like we do API schemas? I see no reason to keep it in a separate file on disk and I\u0027m concerned that people might take the opportunity to modify the file","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":50,"id":"9f560f44_09734b82","in_reply_to":"bf51134e_5ba5cc46","updated":"2020-07-27 09:01:08.000000000","message":"agree. move and transform this into a python file.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"01e22248f73797e210c5468720a7b738ff361f08","unresolved":false,"context_lines":[{"line_number":49,"context_line":"      additionalProperties: true"},{"line_number":50,"context_line":"required:"},{"line_number":51,"context_line":"  - meta"},{"line_number":52,"context_line":"additionalProperties: true"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"provider_definitions:"},{"line_number":55,"context_line":"  provider_identification:"}],"source_content_type":"text/x-yaml","patch_set":50,"id":"bf51134e_a0acccee","line":52,"range":{"start_line":52,"start_character":0,"end_line":52,"end_character":26},"updated":"2020-07-21 13:22:14.000000000","message":"the downside to allowing additionalProperties is there won\u0027t be a error if the user spell the properties wrong, but I guess this is the only way to support compatible minor version.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"16d15b493815997abf2f3cc70ae818d2868ae388","unresolved":false,"context_lines":[{"line_number":49,"context_line":"      additionalProperties: true"},{"line_number":50,"context_line":"required:"},{"line_number":51,"context_line":"  - meta"},{"line_number":52,"context_line":"additionalProperties: true"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"provider_definitions:"},{"line_number":55,"context_line":"  provider_identification:"}],"source_content_type":"text/x-yaml","patch_set":50,"id":"bf51134e_b40a401d","line":52,"range":{"start_line":52,"start_character":0,"end_line":52,"end_character":26},"in_reply_to":"bf51134e_a0acccee","updated":"2020-07-22 04:10:22.000000000","message":"for now, let\u0027s just leave it as is.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"328f6825fdee06f928ea5cc911cb767e2550a452","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    # method should be used. Currently `uuid` or `name` are supported, but"},{"line_number":58,"context_line":"    # future versions may support others."},{"line_number":59,"context_line":"    # The uuid can be set to the sentinel value `$COMPUTE_NODE` which will"},{"line_number":60,"context_line":"    # cause the consuming compute service to apply the configuration to"},{"line_number":61,"context_line":"    # to all compute node root providers it manages that are not otherwise"},{"line_number":62,"context_line":"    # specified using a uuid or name."},{"line_number":63,"context_line":"    type: object"},{"line_number":64,"context_line":"    properties:"}],"source_content_type":"text/x-yaml","patch_set":50,"id":"bf51134e_9a25b70d","line":61,"range":{"start_line":60,"start_character":69,"end_line":61,"end_character":8},"updated":"2020-07-21 12:56:41.000000000","message":"double \u0027to\u0027","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"16d15b493815997abf2f3cc70ae818d2868ae388","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    # method should be used. Currently `uuid` or `name` are supported, but"},{"line_number":58,"context_line":"    # future versions may support others."},{"line_number":59,"context_line":"    # The uuid can be set to the sentinel value `$COMPUTE_NODE` which will"},{"line_number":60,"context_line":"    # cause the consuming compute service to apply the configuration to"},{"line_number":61,"context_line":"    # to all compute node root providers it manages that are not otherwise"},{"line_number":62,"context_line":"    # specified using a uuid or name."},{"line_number":63,"context_line":"    type: object"},{"line_number":64,"context_line":"    properties:"}],"source_content_type":"text/x-yaml","patch_set":50,"id":"bf51134e_541be471","line":61,"range":{"start_line":60,"start_character":69,"end_line":61,"end_character":8},"in_reply_to":"bf51134e_9a25b70d","updated":"2020-07-22 04:10:22.000000000","message":"Good catch. will fix.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"01e22248f73797e210c5468720a7b738ff361f08","unresolved":false,"context_lines":[{"line_number":72,"context_line":"          - type: string"},{"line_number":73,"context_line":"            const: \u0027$COMPUTE_NODE\u0027"},{"line_number":74,"context_line":"      name:"},{"line_number":75,"context_line":"        type: string"},{"line_number":76,"context_line":"        minLength: 1"},{"line_number":77,"context_line":"    # This introduces the possibility of an unsupported key name being used to"},{"line_number":78,"context_line":"    # get by schema validation, but is necessary to support forward"},{"line_number":79,"context_line":"    # compatibility with new identification methods. This should be checked"}],"source_content_type":"text/x-yaml","patch_set":50,"id":"bf51134e_35bbdc72","line":76,"range":{"start_line":75,"start_character":8,"end_line":76,"end_character":20},"updated":"2020-07-21 13:22:14.000000000","message":"We can have a pattern for name, that follows the placement one. But it is also ok, since placement will validate it.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"16d15b493815997abf2f3cc70ae818d2868ae388","unresolved":false,"context_lines":[{"line_number":72,"context_line":"          - type: string"},{"line_number":73,"context_line":"            const: \u0027$COMPUTE_NODE\u0027"},{"line_number":74,"context_line":"      name:"},{"line_number":75,"context_line":"        type: string"},{"line_number":76,"context_line":"        minLength: 1"},{"line_number":77,"context_line":"    # This introduces the possibility of an unsupported key name being used to"},{"line_number":78,"context_line":"    # get by schema validation, but is necessary to support forward"},{"line_number":79,"context_line":"    # compatibility with new identification methods. This should be checked"}],"source_content_type":"text/x-yaml","patch_set":50,"id":"bf51134e_9499fcd1","line":76,"range":{"start_line":75,"start_character":8,"end_line":76,"end_character":20},"in_reply_to":"bf51134e_35bbdc72","updated":"2020-07-22 04:10:22.000000000","message":"confirmed that placement has no pattern for resource name, but has the maxLength: 200 checking. So I will add maxLength: 200 here.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"}],"nova/conf/compute.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":303,"context_line":"* usbtablet must be configured with VNC enabled or SPICE enabled and SPICE"},{"line_number":304,"context_line":"  agent disabled. When used with libvirt the instance mode should be"},{"line_number":305,"context_line":"  configured as HVM."},{"line_number":306,"context_line":" \"\"\"),"},{"line_number":307,"context_line":"    cfg.StrOpt(\u0027provider_config\u0027,"},{"line_number":308,"context_line":"        default\u003d\u0027/etc/nova/provider_config/\u0027,"},{"line_number":309,"context_line":"        help\u003d\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_c317f0ed","line":306,"updated":"2019-07-31 21:42:45.000000000","message":"This conf option shouldn\u0027t be in this patch, for a couple of reasons:\n- It\u0027s not used yet\n- It needs to be introduced as the \"master switch\" that enables the feature - i.e. in the last patch in the series","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[{"line_number":303,"context_line":"* usbtablet must be configured with VNC enabled or SPICE enabled and SPICE"},{"line_number":304,"context_line":"  agent disabled. When used with libvirt the instance mode should be"},{"line_number":305,"context_line":"  configured as HVM."},{"line_number":306,"context_line":" \"\"\"),"},{"line_number":307,"context_line":"    cfg.StrOpt(\u0027provider_config\u0027,"},{"line_number":308,"context_line":"        default\u003d\u0027/etc/nova/provider_config/\u0027,"},{"line_number":309,"context_line":"        help\u003d\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_8e24b161","line":306,"in_reply_to":"7faddb67_c317f0ed","updated":"2019-08-01 16:58:43.000000000","message":"Fixed","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"}],"nova/exception.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[{"line_number":2336,"context_line":""},{"line_number":2337,"context_line":"    This class is used to avoid a raised exception inadvertently being caught"},{"line_number":2338,"context_line":"    and mishandled by the resource tracker."},{"line_number":2339,"context_line":""},{"line_number":2340,"context_line":"    \"\"\""},{"line_number":2341,"context_line":"    msg_fmt \u003d _(\"An error occurred while processing \""},{"line_number":2342,"context_line":"                \"a provider config file: %(error)s\")"}],"source_content_type":"text/x-python","patch_set":50,"id":"bf51134e_fb6b00ee","line":2339,"updated":"2020-07-22 13:10:17.000000000","message":"nit: extra line","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"116cfa8d1c0a9c58e0761d119ec348cd139ed6c3","unresolved":false,"context_lines":[{"line_number":2336,"context_line":""},{"line_number":2337,"context_line":"    This class is used to avoid a raised exception inadvertently being caught"},{"line_number":2338,"context_line":"    and mishandled by the resource tracker."},{"line_number":2339,"context_line":""},{"line_number":2340,"context_line":"    \"\"\""},{"line_number":2341,"context_line":"    msg_fmt \u003d _(\"An error occurred while processing \""},{"line_number":2342,"context_line":"                \"a provider config file: %(error)s\")"}],"source_content_type":"text/x-python","patch_set":50,"id":"9f560f44_296a8f7f","line":2339,"in_reply_to":"bf51134e_fb6b00ee","updated":"2020-07-27 09:01:08.000000000","message":"Will fix - remove the extra line","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"}],"nova/tests/unit/compute/provider_config_data/example_provider.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"7faddb67_2e3eebb7","line":18,"updated":"2019-07-31 21:42:45.000000000","message":"should consider extending this example a bit","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"7faddb67_8e7fd1dd","line":18,"in_reply_to":"7faddb67_2e3eebb7","updated":"2019-08-01 16:58:43.000000000","message":"Done","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":16,"context_line":"  - identification:"},{"line_number":17,"context_line":"      name: \u0027EXAMPLE_RESOURCE_PROVIDER\u0027"},{"line_number":18,"context_line":"      # Additional valid identification examples:"},{"line_number":19,"context_line":"      #  uuid: \u0027$COMPUTE\u0027"},{"line_number":20,"context_line":"      #  uuid: \u00275213b75d-9260-42a6-b236-f39b0fd10561\u0027"},{"line_number":21,"context_line":"    inventories:"},{"line_number":22,"context_line":"      additional:"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"7faddb67_1a24380c","line":19,"range":{"start_line":19,"start_character":15,"end_line":19,"end_character":25},"updated":"2019-08-06 21:01:18.000000000","message":"\u0027$COMPUTE_NODE\u0027","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":20,"context_line":"      #  uuid: \u00275213b75d-9260-42a6-b236-f39b0fd10561\u0027"},{"line_number":21,"context_line":"    inventories:"},{"line_number":22,"context_line":"      additional:"},{"line_number":23,"context_line":"        - EXAMPLE_RESOURCE_CLASS:"},{"line_number":24,"context_line":"            total: 100"},{"line_number":25,"context_line":"            reserved: 0"},{"line_number":26,"context_line":"            min_unit: 1"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"7faddb67_9a66e850","line":23,"range":{"start_line":23,"start_character":10,"end_line":23,"end_character":32},"updated":"2019-08-06 21:01:18.000000000","message":"Humor me here and use\n\n CUSTOM_EXAMPLE_RESOURCE_CLASS","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":29,"context_line":"            allocation_ratio: 1.0"},{"line_number":30,"context_line":"    traits:"},{"line_number":31,"context_line":"      additional:"},{"line_number":32,"context_line":"        - \u0027TRAIT_ONE\u0027"},{"line_number":33,"context_line":"        - \u0027TRAIT2\u0027"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"7faddb67_3a59f48c","line":33,"range":{"start_line":32,"start_character":10,"end_line":33,"end_character":18},"updated":"2019-08-06 21:01:18.000000000","message":"similarly, prefix these with CUSTOM_ please","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"}],"nova/tests/unit/compute/provider_config_data/v1/example_provider.yaml":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ac63118d75f879a75c782596935d2d5df98ea9f2","unresolved":false,"context_lines":[{"line_number":16,"context_line":"  - identification:"},{"line_number":17,"context_line":"      name: \u0027EXAMPLE_RESOURCE_PROVIDER\u0027"},{"line_number":18,"context_line":"      # Additional valid identification examples:"},{"line_number":19,"context_line":"      #  uuid: \u0027$COMPUTE_NODE\u0027"},{"line_number":20,"context_line":"      #  uuid: \u00275213b75d-9260-42a6-b236-f39b0fd10561\u0027"},{"line_number":21,"context_line":"    inventories:"},{"line_number":22,"context_line":"      additional:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"ff570b3c_9e70af0a","line":19,"updated":"2020-06-01 12:23:15.000000000","message":"Ah, sweet, so this is really the only once I was looking for.","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"56cfaa190d0d75eafc3629188f986c3274f28fcf","unresolved":false,"context_lines":[{"line_number":16,"context_line":"  - identification:"},{"line_number":17,"context_line":"      name: \u0027EXAMPLE_RESOURCE_PROVIDER\u0027"},{"line_number":18,"context_line":"      # Additional valid identification examples:"},{"line_number":19,"context_line":"      #  uuid: \u0027$COMPUTE_NODE\u0027"},{"line_number":20,"context_line":"      #  uuid: \u00275213b75d-9260-42a6-b236-f39b0fd10561\u0027"},{"line_number":21,"context_line":"    inventories:"},{"line_number":22,"context_line":"      additional:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"ff570b3c_cc7d4f1d","line":19,"in_reply_to":"ff570b3c_9e70af0a","updated":"2020-06-02 01:15:13.000000000","message":"@john I am with you about this. but I just take these patches over and it will takes me a few days to digest them and discuss with experts before I can make any change. please stay tuned. thanks.","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"e37a2440ae7c96d4b30d5afaed3aa3a1d21101a2","unresolved":false,"context_lines":[{"line_number":16,"context_line":"  - identification:"},{"line_number":17,"context_line":"      name: \u0027EXAMPLE_RESOURCE_PROVIDER\u0027"},{"line_number":18,"context_line":"      # Additional valid identification examples:"},{"line_number":19,"context_line":"      #  uuid: \u0027$COMPUTE_NODE\u0027"},{"line_number":20,"context_line":"      #  uuid: \u00275213b75d-9260-42a6-b236-f39b0fd10561\u0027"},{"line_number":21,"context_line":"    inventories:"},{"line_number":22,"context_line":"      additional:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"bf51134e_02a96b7a","line":19,"in_reply_to":"ff570b3c_9e70af0a","updated":"2020-06-15 08:27:49.000000000","message":"Done","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"e37a2440ae7c96d4b30d5afaed3aa3a1d21101a2","unresolved":false,"context_lines":[{"line_number":16,"context_line":"  - identification:"},{"line_number":17,"context_line":"      name: \u0027EXAMPLE_RESOURCE_PROVIDER\u0027"},{"line_number":18,"context_line":"      # Additional valid identification examples:"},{"line_number":19,"context_line":"      #  uuid: \u0027$COMPUTE_NODE\u0027"},{"line_number":20,"context_line":"      #  uuid: \u00275213b75d-9260-42a6-b236-f39b0fd10561\u0027"},{"line_number":21,"context_line":"    inventories:"},{"line_number":22,"context_line":"      additional:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"bf51134e_62b787da","line":19,"in_reply_to":"ff570b3c_cc7d4f1d","updated":"2020-06-15 08:27:49.000000000","message":"Done","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5ec6c54daaf4b6820fb7d1d6865d6cc494a5fdbd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":50,"id":"bf51134e_bb2fc8a5","updated":"2020-07-22 13:10:17.000000000","message":"Same comment RE: keeping this in code. I don\u0027t think we need to test that PyYAML works.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"}],"nova/tests/unit/compute/provider_config_data/v1/validation_error_test_data.yaml":[{"author":{"_account_id":28063,"name":"VEDA","email":"va00121481@techmahindra.com","username":"VedaAnnayappa"},"change_message_id":"eeda9f7f8a2689d773682557a16d6cff1a8495e7","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"no_metadata:"},{"line_number":17,"context_line":"  config: {}"},{"line_number":18,"context_line":"  expected_messages: [\u0027Unable to detect schema version:\u0027]"},{"line_number":19,"context_line":"no_schema_version:"},{"line_number":20,"context_line":"  config:"},{"line_number":21,"context_line":"    meta: {}"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_29bfdb61","line":18,"updated":"2019-10-10 07:17:50.000000000","message":"should not it be no metadata configured?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"no_metadata:"},{"line_number":17,"context_line":"  config: {}"},{"line_number":18,"context_line":"  expected_messages: [\u0027Unable to detect schema version:\u0027]"},{"line_number":19,"context_line":"no_schema_version:"},{"line_number":20,"context_line":"  config:"},{"line_number":21,"context_line":"    meta: {}"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_7c6b1684","line":18,"in_reply_to":"3fa7e38b_29bfdb61","updated":"2019-10-14 18:18:45.000000000","message":"There are a few cases that trigger the same exception so it has a more generic message.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":23,"context_line":"invalid_schema_version:"},{"line_number":24,"context_line":"  config:"},{"line_number":25,"context_line":"    meta:"},{"line_number":26,"context_line":"      schema_version: \u002799.99\u0027"},{"line_number":27,"context_line":"  expected_messages: [\u0027Unsupported schema major version: 99\u0027]"},{"line_number":28,"context_line":"provider_invalid_uuid:"},{"line_number":29,"context_line":"  config:"},{"line_number":30,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_ed2779c6","line":27,"range":{"start_line":26,"start_character":0,"end_line":27,"end_character":61},"updated":"2019-10-11 08:41:23.000000000","message":"Do we expect a schema file per major.minor version? Same question as before since we do not want to ignore the validation of fields introduced in minor bumps.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":23,"context_line":"invalid_schema_version:"},{"line_number":24,"context_line":"  config:"},{"line_number":25,"context_line":"    meta:"},{"line_number":26,"context_line":"      schema_version: \u002799.99\u0027"},{"line_number":27,"context_line":"  expected_messages: [\u0027Unsupported schema major version: 99\u0027]"},{"line_number":28,"context_line":"provider_invalid_uuid:"},{"line_number":29,"context_line":"  config:"},{"line_number":30,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_3c627eaf","line":27,"range":{"start_line":26,"start_character":0,"end_line":27,"end_character":61},"in_reply_to":"3fa7e38b_ed2779c6","updated":"2019-10-14 18:18:45.000000000","message":"No, one schema file per major version.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":35,"context_line":"  expected_messages:"},{"line_number":36,"context_line":"      - \"\u0027not quite a uuid\u0027\""},{"line_number":37,"context_line":"      - \"Failed validating\""},{"line_number":38,"context_line":"      - \"\u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027\""},{"line_number":39,"context_line":"provider_null_name:"},{"line_number":40,"context_line":"  config:"},{"line_number":41,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_ef69c3f7","line":38,"updated":"2019-10-10 18:04:39.000000000","message":"\"... or  $COMPUTE_NODE\"","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"2ab9baea9b7e81afbdb63820c57571eda99df53c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"  expected_messages:"},{"line_number":36,"context_line":"      - \"\u0027not quite a uuid\u0027\""},{"line_number":37,"context_line":"      - \"Failed validating\""},{"line_number":38,"context_line":"      - \"\u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027\""},{"line_number":39,"context_line":"provider_null_name:"},{"line_number":40,"context_line":"  config:"},{"line_number":41,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_4e79bdc2","line":38,"in_reply_to":"3fa7e38b_3c303e9f","updated":"2019-10-14 22:49:13.000000000","message":"So i tested this and unfortunately the message generated by jsonschema only includes one pattern even though both are checked. Do you think it is worth the added complexity and effort to replace this error message? It will be a fair amount of work to inspect and modify the message generated by jsonschema.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":35,"context_line":"  expected_messages:"},{"line_number":36,"context_line":"      - \"\u0027not quite a uuid\u0027\""},{"line_number":37,"context_line":"      - \"Failed validating\""},{"line_number":38,"context_line":"      - \"\u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027\""},{"line_number":39,"context_line":"provider_null_name:"},{"line_number":40,"context_line":"  config:"},{"line_number":41,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_3c303e9f","line":38,"in_reply_to":"3fa7e38b_ef69c3f7","updated":"2019-10-14 18:18:45.000000000","message":"I will double check the jsonschema output and will add that message if it is included.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":36,"context_line":"      - \"\u0027not quite a uuid\u0027\""},{"line_number":37,"context_line":"      - \"Failed validating\""},{"line_number":38,"context_line":"      - \"\u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027\""},{"line_number":39,"context_line":"provider_null_name:"},{"line_number":40,"context_line":"  config:"},{"line_number":41,"context_line":"    meta:"},{"line_number":42,"context_line":"      schema_version: \u00271.0\u0027"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_af774bd4","line":39,"updated":"2019-10-10 18:04:39.000000000","message":"empty string !\u003d null","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":36,"context_line":"      - \"\u0027not quite a uuid\u0027\""},{"line_number":37,"context_line":"      - \"Failed validating\""},{"line_number":38,"context_line":"      - \"\u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027\""},{"line_number":39,"context_line":"provider_null_name:"},{"line_number":40,"context_line":"  config:"},{"line_number":41,"context_line":"    meta:"},{"line_number":42,"context_line":"      schema_version: \u00271.0\u0027"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_bcfaeeb9","line":39,"in_reply_to":"3fa7e38b_af774bd4","updated":"2019-10-14 18:18:45.000000000","message":"Thanks, I will update test name","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c36c9222f4e77a6c11bbaccf4302e1fd59264f04","unresolved":false,"context_lines":[{"line_number":36,"context_line":"      - \"\u0027not quite a uuid\u0027\""},{"line_number":37,"context_line":"      - \"Failed validating\""},{"line_number":38,"context_line":"      - \"\u0027^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\u0027\""},{"line_number":39,"context_line":"provider_null_name:"},{"line_number":40,"context_line":"  config:"},{"line_number":41,"context_line":"    meta:"},{"line_number":42,"context_line":"      schema_version: \u00271.0\u0027"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_a38398ca","line":39,"in_reply_to":"3fa7e38b_bcfaeeb9","updated":"2019-10-15 20:17:49.000000000","message":"I updated the name and created a separate test for null.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":44,"context_line":"      - identification:"},{"line_number":45,"context_line":"          name: \u0027\u0027"},{"line_number":46,"context_line":"  expected_messages: [\"\u0027\u0027 is too short\"]"},{"line_number":47,"context_line":"provider_uuid_and_name:"},{"line_number":48,"context_line":"  config:"},{"line_number":49,"context_line":"    meta:"},{"line_number":50,"context_line":"      schema_version: \u00271.0\u0027"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_4f52573d","line":47,"updated":"2019-10-10 18:04:39.000000000","message":"ok, this test is aligned to my comment in provider_config_schema_v1.yaml on line 55","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  expected_messages:"},{"line_number":56,"context_line":"    - \"\u0027name\u0027: \u0027custom_provider\u0027\""},{"line_number":57,"context_line":"    - \"\u0027uuid\u0027: \u0027aa884151-b4e2-4e82-9fd4-81cfcd01abb9\u0027\""},{"line_number":58,"context_line":"    - \"has too many properties\""},{"line_number":59,"context_line":"provider_no_identification:"},{"line_number":60,"context_line":"  config:"},{"line_number":61,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_5f9bd0c7","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":31},"updated":"2019-10-11 08:41:23.000000000","message":"What about a property besides uuid or name, is it flagged later?\n\nWhen is this file consumed?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  expected_messages:"},{"line_number":56,"context_line":"    - \"\u0027name\u0027: \u0027custom_provider\u0027\""},{"line_number":57,"context_line":"    - \"\u0027uuid\u0027: \u0027aa884151-b4e2-4e82-9fd4-81cfcd01abb9\u0027\""},{"line_number":58,"context_line":"    - \"has too many properties\""},{"line_number":59,"context_line":"provider_no_identification:"},{"line_number":60,"context_line":"  config:"},{"line_number":61,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_0f3d3fdc","line":58,"updated":"2019-10-10 18:04:39.000000000","message":"make the output message for the test clearer, \"too many properties...can\u0027t use uuid and name in the same provider object\"","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  expected_messages:"},{"line_number":56,"context_line":"    - \"\u0027name\u0027: \u0027custom_provider\u0027\""},{"line_number":57,"context_line":"    - \"\u0027uuid\u0027: \u0027aa884151-b4e2-4e82-9fd4-81cfcd01abb9\u0027\""},{"line_number":58,"context_line":"    - \"has too many properties\""},{"line_number":59,"context_line":"provider_no_identification:"},{"line_number":60,"context_line":"  config:"},{"line_number":61,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_dccc8a8a","line":58,"in_reply_to":"3fa7e38b_0f3d3fdc","updated":"2019-10-14 18:18:45.000000000","message":"I would need to catch the jsonschema message and raise a new exception with a newly built message to do this. It would be quite complicated and imo not worth the effort. Let me know if you believe otherwise.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":62,"context_line":"      schema_version: \u00271.0\u0027"},{"line_number":63,"context_line":"    providers:"},{"line_number":64,"context_line":"      - {}"},{"line_number":65,"context_line":"  expected_messages: [\"\u0027identification\u0027 is a required property\"]"},{"line_number":66,"context_line":"inventories_additional_resource_class_no_total:"},{"line_number":67,"context_line":"  config:"},{"line_number":68,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_3f2374a9","line":65,"updated":"2019-10-11 08:41:23.000000000","message":"Are duplicate providers outside the scope of this file?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":62,"context_line":"      schema_version: \u00271.0\u0027"},{"line_number":63,"context_line":"    providers:"},{"line_number":64,"context_line":"      - {}"},{"line_number":65,"context_line":"  expected_messages: [\"\u0027identification\u0027 is a required property\"]"},{"line_number":66,"context_line":"inventories_additional_resource_class_no_total:"},{"line_number":67,"context_line":"  config:"},{"line_number":68,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_fcdaa648","line":65,"in_reply_to":"3fa7e38b_3f2374a9","updated":"2019-10-14 18:18:45.000000000","message":"Yes","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                total: 1"},{"line_number":100,"context_line":"                additional_property: 2"},{"line_number":101,"context_line":"  expected_messages: [\"Additional properties are not allowed (\u0027additional_property\u0027 was unexpected)\"]"},{"line_number":102,"context_line":"inventories_one_invalid_additional_resource_class:"},{"line_number":103,"context_line":"  config:"},{"line_number":104,"context_line":"    meta:"},{"line_number":105,"context_line":"      schema_version: \u00271.0\u0027"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_1fef981d","line":102,"range":{"start_line":102,"start_character":0,"end_line":102,"end_character":50},"updated":"2019-10-11 08:41:23.000000000","message":"To include: Additional resource class name with an invalid pattern","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c36c9222f4e77a6c11bbaccf4302e1fd59264f04","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                total: 1"},{"line_number":100,"context_line":"                additional_property: 2"},{"line_number":101,"context_line":"  expected_messages: [\"Additional properties are not allowed (\u0027additional_property\u0027 was unexpected)\"]"},{"line_number":102,"context_line":"inventories_one_invalid_additional_resource_class:"},{"line_number":103,"context_line":"  config:"},{"line_number":104,"context_line":"    meta:"},{"line_number":105,"context_line":"      schema_version: \u00271.0\u0027"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_034dccc2","line":102,"range":{"start_line":102,"start_character":0,"end_line":102,"end_character":50},"in_reply_to":"3fa7e38b_1fef981d","updated":"2019-10-15 20:17:49.000000000","message":"Done","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":28063,"name":"VEDA","email":"va00121481@techmahindra.com","username":"VedaAnnayappa"},"change_message_id":"eeda9f7f8a2689d773682557a16d6cff1a8495e7","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            - RESOURCE1:"},{"line_number":112,"context_line":"                total: 1"},{"line_number":113,"context_line":"            - RESOURCE2: {}"},{"line_number":114,"context_line":"  expected_messages: [\"\u0027total\u0027 is a required property\"]"},{"line_number":115,"context_line":"traits_one_additional_trait_invalid:"},{"line_number":116,"context_line":"  config:"},{"line_number":117,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_c97407d2","line":114,"updated":"2019-10-10 07:17:50.000000000","message":"here it need  to mention which resource it is referring to, probably the message where it is getting generated need to have this data printed","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"1ed6cf701ce7d2babb181d1448c28677304bc992","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            - RESOURCE1:"},{"line_number":112,"context_line":"                total: 1"},{"line_number":113,"context_line":"            - RESOURCE2: {}"},{"line_number":114,"context_line":"  expected_messages: [\"\u0027total\u0027 is a required property\"]"},{"line_number":115,"context_line":"traits_one_additional_trait_invalid:"},{"line_number":116,"context_line":"  config:"},{"line_number":117,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_1cb302eb","line":114,"in_reply_to":"3fa7e38b_c97407d2","updated":"2019-10-14 18:18:45.000000000","message":"These expected messages are just a substring of the entire message. The reason that I am only using a substring in the test is because the jsonschema messages are quite different between python2 and python3. These strings I am using here are the smallest substring I could find that exists in both and is sufficient to ensure the expected failure is occuring.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":28063,"name":"VEDA","email":"va00121481@techmahindra.com","username":"VedaAnnayappa"},"change_message_id":"eeda9f7f8a2689d773682557a16d6cff1a8495e7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"3fa7e38b_0948df84","line":138,"updated":"2019-10-10 07:17:50.000000000","message":"there are few more combination of negative scenarios that can be added here..relook","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"3fa7e38b_1f531818","line":138,"in_reply_to":"3fa7e38b_0948df84","updated":"2019-10-11 08:41:23.000000000","message":"Could we report the subset of invalid traits from the list? Scenario - 1 and 3 trait are invalid and 2 is valid.\n\nAlso from line 41 in schema, we could allow any other property besides inventories and traits, the question is if they are ignored","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c36c9222f4e77a6c11bbaccf4302e1fd59264f04","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"3fa7e38b_43b3c498","line":138,"in_reply_to":"3fa7e38b_1f531818","updated":"2019-10-15 20:17:49.000000000","message":"I updated the test to include invalid/valid/invalid traits. Unfortunately changes the wording of these messages is not simple as they are generated by jsonschema.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            - TRAIT1: invalid"},{"line_number":170,"context_line":"            - TRAIT2"},{"line_number":171,"context_line":"            - TRAIT3: invalid"},{"line_number":172,"context_line":"  expected_messages: [\"{\u0027TRAIT1\u0027: \u0027invalid\u0027} is not of type \u0027string\u0027\"]"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_b68cfb2e","line":172,"updated":"2019-10-18 20:24:03.000000000","message":"Test for invalid trait name (akin to L146)","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c551f4e470684d12a0013dc2e14a03d55e44abd8","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            - TRAIT1: invalid"},{"line_number":170,"context_line":"            - TRAIT2"},{"line_number":171,"context_line":"            - TRAIT3: invalid"},{"line_number":172,"context_line":"  expected_messages: [\"{\u0027TRAIT1\u0027: \u0027invalid\u0027} is not of type \u0027string\u0027\"]"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_0ce1422b","line":172,"in_reply_to":"3fa7e38b_b68cfb2e","updated":"2019-10-18 22:48:49.000000000","message":"Done","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"# expected_messages is a list of matches. If the test matches _all_ of the"},{"line_number":14,"context_line":"# values in the list, it will pass. In some cases the same validation error"},{"line_number":15,"context_line":"# may produce vastly different messages in py27 and py37 to describe the"},{"line_number":16,"context_line":"# mismatch which must be accounted for in the expected_messages."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"no_metadata:"},{"line_number":19,"context_line":"  config: {}"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_3e40a45f","line":16,"range":{"start_line":15,"start_character":2,"end_line":16,"end_character":64},"updated":"2020-01-17 13:49:58.000000000","message":"We don\u0027t support 2.7 any more. Can we simplify this now?","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c60f9c17feb0c6f7e9a773e8237b53fa69f1b9b2","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"# expected_messages is a list of matches. If the test matches _all_ of the"},{"line_number":14,"context_line":"# values in the list, it will pass. In some cases the same validation error"},{"line_number":15,"context_line":"# may produce vastly different messages in py27 and py37 to describe the"},{"line_number":16,"context_line":"# mismatch which must be accounted for in the expected_messages."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"no_metadata:"},{"line_number":19,"context_line":"  config: {}"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_53fd5205","line":16,"range":{"start_line":15,"start_character":2,"end_line":16,"end_character":64},"in_reply_to":"3fa7e38b_3e40a45f","updated":"2020-01-17 18:12:36.000000000","message":"++\n\nI called this out (and Dustin fixed it) in the code, but missed this one. If it lets us simplify the `expected_messages` below, great. If not, we should at least axe this comment.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"6bdbcafb12f6e50f402cd55302df0bf9f55b995a","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"# expected_messages is a list of matches. If the test matches _all_ of the"},{"line_number":14,"context_line":"# values in the list, it will pass. In some cases the same validation error"},{"line_number":15,"context_line":"# may produce vastly different messages in py27 and py37 to describe the"},{"line_number":16,"context_line":"# mismatch which must be accounted for in the expected_messages."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"no_metadata:"},{"line_number":19,"context_line":"  config: {}"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_60a16792","line":16,"range":{"start_line":15,"start_character":2,"end_line":16,"end_character":64},"in_reply_to":"3fa7e38b_53fd5205","updated":"2020-01-21 20:17:01.000000000","message":"I will look into both options with next PS.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"# expected_messages is a list of matches. If the test matches _all_ of the"},{"line_number":14,"context_line":"# values in the list, it will pass. In some cases the same validation error"},{"line_number":15,"context_line":"# may produce vastly different messages in py27 and py37 to describe the"},{"line_number":16,"context_line":"# mismatch which must be accounted for in the expected_messages."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"no_metadata:"},{"line_number":19,"context_line":"  config: {}"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"1fa4df85_116059a5","line":16,"range":{"start_line":15,"start_character":2,"end_line":16,"end_character":64},"in_reply_to":"3fa7e38b_60a16792","updated":"2020-02-26 20:05:35.000000000","message":"im just going to remove this comment for now.\nsince it no longer relevant.\n\nim not really sure i like how these test are constuted as tehy are not like any of the other test we have.\n\ni can guess how this works but i its totally alien to the rest of our unit tests so im not convices we should do it this way.\n\nthat said im not going to change them for now i like ddt but i think this is the first time we have use a sperate data file with it. using a spearete data file makes it supper easy to extend just by adding date but quite hard to determin what is tested without knowing how to parse the data format.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":173,"context_line":"          additional:"},{"line_number":174,"context_line":"            - TRAIT1: invalid_trait"},{"line_number":175,"context_line":"  expected_messages: [\"{\u0027TRAIT1\u0027: \u0027invalid_trait\u0027} is not of type \u0027string\u0027\"]"},{"line_number":176,"context_line":"traits_multiple_additional_traits_one_invalid:"},{"line_number":177,"context_line":"  config:"},{"line_number":178,"context_line":"    meta:"},{"line_number":179,"context_line":"      schema_version: \u00271.0\u0027"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_de4e308f","line":176,"range":{"start_line":176,"start_character":34,"end_line":176,"end_character":45},"updated":"2020-01-17 13:49:58.000000000","message":"there are two invalid traits in the config :)","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"6bdbcafb12f6e50f402cd55302df0bf9f55b995a","unresolved":false,"context_lines":[{"line_number":173,"context_line":"          additional:"},{"line_number":174,"context_line":"            - TRAIT1: invalid_trait"},{"line_number":175,"context_line":"  expected_messages: [\"{\u0027TRAIT1\u0027: \u0027invalid_trait\u0027} is not of type \u0027string\u0027\"]"},{"line_number":176,"context_line":"traits_multiple_additional_traits_one_invalid:"},{"line_number":177,"context_line":"  config:"},{"line_number":178,"context_line":"    meta:"},{"line_number":179,"context_line":"      schema_version: \u00271.0\u0027"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3fa7e38b_c0a93b78","line":176,"range":{"start_line":176,"start_character":34,"end_line":176,"end_character":45},"in_reply_to":"3fa7e38b_de4e308f","updated":"2020-01-21 20:17:01.000000000","message":"So there are...whoops. I will fix.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a290a66c7cf097153fb004468c22cbd1b0fbed0c","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        traits:"},{"line_number":195,"context_line":"          additional:"},{"line_number":196,"context_line":"            - INVALID_TRAIT_NAME_!@#$%^\u0026*()_+"},{"line_number":197,"context_line":"  expected_messages: [\"\u0027INVALID_TRAIT_NAME_!@#$%^\u0026*()_+\u0027 does not match \u0027^[A-Z0-9_]{1,255}$\u0027\"]"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"1fa4df85_8b635142","line":197,"updated":"2020-03-04 18:16:08.000000000","message":"What a hell is changed here? My eyes fail me.","commit_id":"b9e84c14cbb4401168609b9aadc37f2e97e3e26e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"aff9339c05bc4855e6620f76a2c1780fe28b6e60","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        traits:"},{"line_number":195,"context_line":"          additional:"},{"line_number":196,"context_line":"            - INVALID_TRAIT_NAME_!@#$%^\u0026*()_+"},{"line_number":197,"context_line":"  expected_messages: [\"\u0027INVALID_TRAIT_NAME_!@#$%^\u0026*()_+\u0027 does not match \u0027^[A-Z0-9_]{1,255}$\u0027\"]"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"1fa4df85_adf2986e","line":197,"in_reply_to":"1fa4df85_8b635142","updated":"2020-03-10 12:10:25.000000000","message":"i have no idea.\ni did not intentionally change this so beats me.","commit_id":"b9e84c14cbb4401168609b9aadc37f2e97e3e26e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"15ed2d6b88903300768aa9cbb7184201f3a73b1b","unresolved":false,"context_lines":[{"line_number":72,"context_line":"      - identification:"},{"line_number":73,"context_line":"          name: \u0027\u0027"},{"line_number":74,"context_line":"  expected_messages: [\"\u0027\u0027 is too short\"]"},{"line_number":75,"context_line":"provider_null_name:"},{"line_number":76,"context_line":"  config:"},{"line_number":77,"context_line":"    meta:"},{"line_number":78,"context_line":"      schema_version: \u00271.0\u0027"},{"line_number":79,"context_line":"    providers:"},{"line_number":80,"context_line":"      - identification:"},{"line_number":81,"context_line":"          name: null"},{"line_number":82,"context_line":"  expected_messages: [\"None is not of type \u0027string\u0027\"]"},{"line_number":83,"context_line":"provider_uuid_and_name:"},{"line_number":84,"context_line":"  config:"}],"source_content_type":"text/x-yaml","patch_set":50,"id":"bf51134e_a0c96c5b","line":81,"range":{"start_line":75,"start_character":0,"end_line":81,"end_character":20},"updated":"2020-07-21 13:46:59.000000000","message":"better to have a case for empty under identification.","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"16d15b493815997abf2f3cc70ae818d2868ae388","unresolved":false,"context_lines":[{"line_number":72,"context_line":"      - identification:"},{"line_number":73,"context_line":"          name: \u0027\u0027"},{"line_number":74,"context_line":"  expected_messages: [\"\u0027\u0027 is too short\"]"},{"line_number":75,"context_line":"provider_null_name:"},{"line_number":76,"context_line":"  config:"},{"line_number":77,"context_line":"    meta:"},{"line_number":78,"context_line":"      schema_version: \u00271.0\u0027"},{"line_number":79,"context_line":"    providers:"},{"line_number":80,"context_line":"      - identification:"},{"line_number":81,"context_line":"          name: null"},{"line_number":82,"context_line":"  expected_messages: [\"None is not of type \u0027string\u0027\"]"},{"line_number":83,"context_line":"provider_uuid_and_name:"},{"line_number":84,"context_line":"  config:"}],"source_content_type":"text/x-yaml","patch_set":50,"id":"bf51134e_b47fe064","line":81,"range":{"start_line":75,"start_character":0,"end_line":81,"end_character":20},"in_reply_to":"bf51134e_a0c96c5b","updated":"2020-07-22 04:10:22.000000000","message":"will add one more case with empty identification, like below:\n\n 83 provider_no_name_or_uuid:\n 84   config:\n 85     meta:\n 86       schema_version: \u00271.0\u0027\n 87     providers:\n 88       - identification:\n 89   expected_messages: [\"\u0027name\u0027 or \u0027uuid\u0027 is a required property\"]","commit_id":"f10e40e9d77dae2377411c505d69aeed5e133d27"}],"nova/tests/unit/compute/provider_config_data/v1/validation_success_test_data.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d5ccb2537b5cfa0579c1b17572edfcc200406337","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, reference_msgVersion 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"7faddb67_19f386a1","line":1,"range":{"start_line":1,"start_character":40,"end_line":1,"end_character":53},"updated":"2019-08-12 21:03:05.000000000","message":"x","commit_id":"23012d033ec461005de8b2e723c326b52cbcd851"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d5ccb2537b5cfa0579c1b17572edfcc200406337","unresolved":false,"context_lines":[{"line_number":40,"context_line":"          uuid: aa884151-b4e2-4e82-9fd4-81cfcd01abb9"},{"line_number":41,"context_line":"        inventories:"},{"line_number":42,"context_line":"          additional:"},{"line_number":43,"context_line":"            - RESOURCE1:"},{"line_number":44,"context_line":"                total: 1"},{"line_number":45,"context_line":"inventories_unknown_adjective:"},{"line_number":46,"context_line":"  config:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"7faddb67_992c5602","line":43,"range":{"start_line":43,"start_character":14,"end_line":43,"end_character":23},"updated":"2019-08-12 21:03:05.000000000","message":"again, it would make me feel better if these were CUSTOM_ resource classes","commit_id":"23012d033ec461005de8b2e723c326b52cbcd851"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d5ccb2537b5cfa0579c1b17572edfcc200406337","unresolved":false,"context_lines":[{"line_number":75,"context_line":"          uuid: aa884151-b4e2-4e82-9fd4-81cfcd01abb9"},{"line_number":76,"context_line":"        traits:"},{"line_number":77,"context_line":"          additional:"},{"line_number":78,"context_line":"            - TRAIT1"},{"line_number":79,"context_line":"traits_multiple_additional_traits:"},{"line_number":80,"context_line":"  config:"},{"line_number":81,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"7faddb67_3933e264","line":78,"range":{"start_line":78,"start_character":14,"end_line":78,"end_character":20},"updated":"2019-08-12 21:03:05.000000000","message":"...and CUSTOM_ traits","commit_id":"23012d033ec461005de8b2e723c326b52cbcd851"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d5ccb2537b5cfa0579c1b17572edfcc200406337","unresolved":false,"context_lines":[{"line_number":79,"context_line":"traits_multiple_additional_traits:"},{"line_number":80,"context_line":"  config:"},{"line_number":81,"context_line":"    meta:"},{"line_number":82,"context_line":"      schema_version: \u00271.0\u0027"},{"line_number":83,"context_line":"    providers:"},{"line_number":84,"context_line":"      - identification:"},{"line_number":85,"context_line":"          uuid: aa884151-b4e2-4e82-9fd4-81cfcd01abb9"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"7faddb67_d9416ea8","line":82,"range":{"start_line":82,"start_character":22,"end_line":82,"end_character":27},"updated":"2019-08-12 21:03:05.000000000","message":"could make some of these 1.something-other-than-0 to prove the major-only-loading and forward compat of the schema_version.","commit_id":"23012d033ec461005de8b2e723c326b52cbcd851"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":42,"context_line":"          additional:"},{"line_number":43,"context_line":"            - CUSTOM_RESOURCE1:"},{"line_number":44,"context_line":"                total: 1"},{"line_number":45,"context_line":"inventories_unknown_adjective:"},{"line_number":46,"context_line":"  config:"},{"line_number":47,"context_line":"    meta:"},{"line_number":48,"context_line":"      schema_version: \u00271.7\u0027"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_01b3cb0b","line":45,"updated":"2019-10-10 18:04:39.000000000","message":"Are the invalid cases not set in the file validation_error_test_data.yaml?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29334,"name":"Dakshina Ilangovan","email":"dakshina.ilangovan@intel.com","username":"dakshinai"},"change_message_id":"f5d99c4024f430586d38043268e8a5d54f74c5b2","unresolved":false,"context_lines":[{"line_number":42,"context_line":"          additional:"},{"line_number":43,"context_line":"            - CUSTOM_RESOURCE1:"},{"line_number":44,"context_line":"                total: 1"},{"line_number":45,"context_line":"inventories_unknown_adjective:"},{"line_number":46,"context_line":"  config:"},{"line_number":47,"context_line":"    meta:"},{"line_number":48,"context_line":"      schema_version: \u00271.7\u0027"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_3f429410","line":45,"in_reply_to":"3fa7e38b_01b3cb0b","updated":"2019-10-11 08:41:23.000000000","message":"@Dustin Yes, I think this should go there, please see my comment on line 102 in error_test_data\n\nOn second thoughts, is it because additional_properties has been set to true and you plan to pass this off, to be validated later?","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"2ab9baea9b7e81afbdb63820c57571eda99df53c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"          additional:"},{"line_number":43,"context_line":"            - CUSTOM_RESOURCE1:"},{"line_number":44,"context_line":"                total: 1"},{"line_number":45,"context_line":"inventories_unknown_adjective:"},{"line_number":46,"context_line":"  config:"},{"line_number":47,"context_line":"    meta:"},{"line_number":48,"context_line":"      schema_version: \u00271.7\u0027"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_51b87c0f","line":45,"in_reply_to":"3fa7e38b_3f429410","updated":"2019-10-14 22:49:13.000000000","message":"Unknown adjectives are ignored because a newer minor version may include new ones. We try not to break when processing a schema with a newer minor version that we know, see the handling and warning in provider_config.py:104.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[{"line_number":87,"context_line":"          additional:"},{"line_number":88,"context_line":"            - CUSTOM_TRAIT1"},{"line_number":89,"context_line":"            - CUSTOM_TRAIT2"},{"line_number":90,"context_line":"traits_unknown_adjective:"},{"line_number":91,"context_line":"  config:"},{"line_number":92,"context_line":"    meta:"},{"line_number":93,"context_line":"      schema_version: \u00271.19\u0027"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_418b031e","line":90,"updated":"2019-10-10 18:04:39.000000000","message":"same comment about invalid use cases in this file. thought those were going to validation_error_test_data.yaml","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"2ab9baea9b7e81afbdb63820c57571eda99df53c","unresolved":false,"context_lines":[{"line_number":87,"context_line":"          additional:"},{"line_number":88,"context_line":"            - CUSTOM_TRAIT1"},{"line_number":89,"context_line":"            - CUSTOM_TRAIT2"},{"line_number":90,"context_line":"traits_unknown_adjective:"},{"line_number":91,"context_line":"  config:"},{"line_number":92,"context_line":"    meta:"},{"line_number":93,"context_line":"      schema_version: \u00271.19\u0027"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_113c4491","line":90,"in_reply_to":"3fa7e38b_418b031e","updated":"2019-10-14 22:49:13.000000000","message":"See same comment above.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":9,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"provider_by_uuid:"},{"line_number":14,"context_line":"  config:"},{"line_number":15,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_16c06f2a","line":12,"updated":"2019-10-18 20:24:03.000000000","message":"nts: These first three examples show that we don\u0027t require you to *do* anything with an identified provider, at least not at the schema level. That feels a little weird, but is probably fine for future compat where this feature could conceivably be used to create a new, empty provider.","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":51,"context_line":"          uuid: aa884151-b4e2-4e82-9fd4-81cfcd01abb9"},{"line_number":52,"context_line":"        inventories:"},{"line_number":53,"context_line":"          invalid_adjective:"},{"line_number":54,"context_line":"            - CUSTOM_RESOURCE1:"},{"line_number":55,"context_line":"                total: 1"},{"line_number":56,"context_line":"inventories_multiple_additional_resource_classes:"},{"line_number":57,"context_line":"  config:"},{"line_number":58,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_76e443e1","line":55,"range":{"start_line":54,"start_character":0,"end_line":55,"end_character":24},"updated":"2019-10-18 20:24:03.000000000","message":"And in fact this needn\u0027t conform to the inventory-ish schema, right? Could be anything at all here?","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c551f4e470684d12a0013dc2e14a03d55e44abd8","unresolved":false,"context_lines":[{"line_number":51,"context_line":"          uuid: aa884151-b4e2-4e82-9fd4-81cfcd01abb9"},{"line_number":52,"context_line":"        inventories:"},{"line_number":53,"context_line":"          invalid_adjective:"},{"line_number":54,"context_line":"            - CUSTOM_RESOURCE1:"},{"line_number":55,"context_line":"                total: 1"},{"line_number":56,"context_line":"inventories_multiple_additional_resource_classes:"},{"line_number":57,"context_line":"  config:"},{"line_number":58,"context_line":"    meta:"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_2c719e78","line":55,"range":{"start_line":54,"start_character":0,"end_line":55,"end_character":24},"in_reply_to":"3fa7e38b_76e443e1","updated":"2019-10-18 22:48:49.000000000","message":"Since invalid_adjective has no schema, nothing needs to exist here at all. I mostly kept a minimal compliant inventory throughout the tests to avoid issues where one failure may be detected before the other. It doesn\u0027t really apply in this case but was part of my template at this point.","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"3fa7e38b_f6d7d3ed","line":100,"updated":"2019-10-18 20:24:03.000000000","message":"Might as well throw in one that has both inventories and traits.","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"c551f4e470684d12a0013dc2e14a03d55e44abd8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"3fa7e38b_8c11b207","line":100,"in_reply_to":"3fa7e38b_f6d7d3ed","updated":"2019-10-18 22:48:49.000000000","message":"Done","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"}],"nova/tests/unit/compute/provider_config_data/validation_error_test_data.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7faddb67_6d4ed46f","updated":"2019-08-06 21:01:18.000000000","message":"These data files should be versioned somehow. I\u0027m thinking a subdirectory like v1/","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    providers:"},{"line_number":31,"context_line":"    - identification:"},{"line_number":32,"context_line":"        name: \u0027\u0027"},{"line_number":33,"context_line":"  expected_messages: [\"\u0027\u0027 is too short\"]"},{"line_number":34,"context_line":"provider_uuid_and_name:"},{"line_number":35,"context_line":"  config:"},{"line_number":36,"context_line":"    providers:"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"7faddb67_fa56fc5b","line":33,"range":{"start_line":33,"start_character":21,"end_line":33,"end_character":40},"updated":"2019-08-06 21:01:18.000000000","message":"This syntax is cool to save vertical space when there\u0027s just one...","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    - identification:"},{"line_number":38,"context_line":"        name: custom_provider"},{"line_number":39,"context_line":"        uuid: aa884151-b4e2-4e82-9fd4-81cfcd01abb9"},{"line_number":40,"context_line":"  expected_messages: [\"\u0027name\u0027: \u0027custom_provider\u0027\","},{"line_number":41,"context_line":"                      \"\u0027uuid\u0027: \u0027aa884151-b4e2-4e82-9fd4-81cfcd01abb9\u0027\","},{"line_number":42,"context_line":"                      \"has too many properties\"]"},{"line_number":43,"context_line":"provider_no_identification:"},{"line_number":44,"context_line":"  config:"},{"line_number":45,"context_line":"    providers:"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"7faddb67_3aced42c","line":42,"range":{"start_line":40,"start_character":0,"end_line":42,"end_character":48},"updated":"2019-08-06 21:01:18.000000000","message":"...but this should use yaml array syntax:\n\n  expected_messages:\n  - \"\u0027name\u0027: \u0027custom_provider\u0027\"\n  - \"\u0027uuid\u0027: \u0027aa884151-b4e2-4e82-9fd4-81cfcd01abb9\u0027\"\n  - has too many properties","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"}],"nova/tests/unit/compute/provider_config_data/validation_success_test_data.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":9,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"provider_by_uuid:"},{"line_number":14,"context_line":"  config:"},{"line_number":15,"context_line":"    providers:"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"7faddb67_9ac268e8","line":12,"updated":"2019-08-06 21:01:18.000000000","message":"These should all have meta.schema_version, no?\n\n[Later] Mm, I see you\u0027re adding it in the test harness. Not sure about that... but if you\u0027re gonna do it, you should put a prominent comment here.","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"}],"nova/tests/unit/compute/test_provider_config.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def test_no_metadata(self):"},{"line_number":64,"context_line":"        self.mock_load_yaml.return_value \u003d {}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        self.assertRaises(ValidationError,"},{"line_number":67,"context_line":"                          provider_config.parse_provider_yaml, None)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_no_schema_version(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_aea09bf5","line":66,"range":{"start_line":66,"start_character":26,"end_line":66,"end_character":41},"updated":"2019-07-31 21:42:45.000000000","message":"Hate to do this to you, but I reckon we should introspect the message in these exceptions to make sure they\u0027re failing on what we expect them to fail on.\n\nFYI, self.assertRaises returns the exception, so you can do things like:\n\n ex \u003d self.assertRaises(...)\n self.assertIn(\"schema_version is required\", six.text_type(ex))","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def test_no_metadata(self):"},{"line_number":64,"context_line":"        self.mock_load_yaml.return_value \u003d {}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        self.assertRaises(ValidationError,"},{"line_number":67,"context_line":"                          provider_config.parse_provider_yaml, None)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_no_schema_version(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_ce62a93e","line":66,"range":{"start_line":66,"start_character":26,"end_line":66,"end_character":41},"in_reply_to":"7faddb67_aea09bf5","updated":"2019-08-01 16:58:43.000000000","message":"I was thinking the same thing and was planning on doing that when I moved it to DDT, I will add that to my TODO comment for now.","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7faddb67_eddde46f","updated":"2019-08-06 21:01:18.000000000","message":"...and this should be versioned as well.\n\nSo I\u0027m thinking maybe most of what you\u0027ve got in SchemaValidationTestCases goes into an abc mixin that looks for self.SCHEMA_VERSION to build the path to the data files, and then you can just add a subclass like\n\n SchemaValidationTestCaseV1(base.BaseTestCase, _SchemaValidationTestCaseMixin):\n     SCHEMA_VERSION \u003d \u00271\u0027\n\n...any time we make a new major version.","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"@ddt.ddt"},{"line_number":79,"context_line":"class SchemaValidationTestCases(base.BaseTestCase):"},{"line_number":80,"context_line":"    def setUp(self):"},{"line_number":81,"context_line":"        super(SchemaValidationTestCases, self).setUp()"},{"line_number":82,"context_line":"        self.mock_load_yaml \u003d self.useFixture("}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_8d03100d","line":79,"range":{"start_line":79,"start_character":6,"end_line":79,"end_character":31},"updated":"2019-08-06 21:01:18.000000000","message":"Love this test harness.","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.assertRaises(FileNotFound,"},{"line_number":101,"context_line":"                          provider_config.parse_provider_yaml, None)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @ddt.unpack"},{"line_number":104,"context_line":"    @ddt.file_data(\u0027provider_config_data/validation_error_test_data.yaml\u0027)"},{"line_number":105,"context_line":"    def test_validation_errors(self, config, expected_messages):"},{"line_number":106,"context_line":"        self.set_config(config)"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_2d069c1d","line":104,"range":{"start_line":103,"start_character":0,"end_line":104,"end_character":74},"updated":"2019-08-06 21:01:18.000000000","message":"++","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    @ddt.unpack"},{"line_number":104,"context_line":"    @ddt.file_data(\u0027provider_config_data/validation_error_test_data.yaml\u0027)"},{"line_number":105,"context_line":"    def test_validation_errors(self, config, expected_messages):"},{"line_number":106,"context_line":"        self.set_config(config)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        # NOTE(dustinc): The string replacement here is because the message"},{"line_number":109,"context_line":"        #   returned by the exception has unicode markers in py27. This can"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_7a4d2c98","line":106,"range":{"start_line":106,"start_character":24,"end_line":106,"end_character":30},"updated":"2019-08-06 21:01:18.000000000","message":"name kwargs","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48bc3d3e5c8faf60f58b1b9d195b7c8df0b45719","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    @ddt.unpack"},{"line_number":122,"context_line":"    @ddt.file_data(\u0027provider_config_data/validation_success_test_data.yaml\u0027)"},{"line_number":123,"context_line":"    def test_validation_success(self, config):"},{"line_number":124,"context_line":"        reference \u003d self.set_config(config)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        actual \u003d provider_config.parse_provider_yaml(None)"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_3a43346e","line":124,"range":{"start_line":124,"start_character":36,"end_line":124,"end_character":42},"updated":"2019-08-06 21:01:18.000000000","message":"name kwargs","commit_id":"03ee3bb6cca3f5edf4bc22bd7064f9f52b739f67"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1bd918768afe960c8f41fa348e4f74ba16bf9346","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            \"Provider config file %s is at schema version %s, but the \""},{"line_number":129,"context_line":"            \"code only understands versions %s to %s. Some fields may \""},{"line_number":130,"context_line":"            \"be ignored.\","},{"line_number":131,"context_line":"            mock.ANY)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        # test exactly min and max versions are supported"},{"line_number":134,"context_line":"        self.set_config({\u0027meta\u0027: {\u0027schema_version\u0027: min_schema_version}})"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_fd2748b5","line":131,"range":{"start_line":131,"start_character":12,"end_line":131,"end_character":20},"updated":"2019-08-14 22:34:36.000000000","message":"You need to blow this out anyway, and you already have three of the four values. Worst case you can mock.ANY the second one - but even that would be easy enough to swap in.","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8d3f71624411a4f26a32376753b7d0c9f17a74df","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            \"Provider config file %s is at schema version %s, but the \""},{"line_number":129,"context_line":"            \"code only understands versions %s to %s. Some fields may \""},{"line_number":130,"context_line":"            \"be ignored.\","},{"line_number":131,"context_line":"            mock.ANY)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        # test exactly min and max versions are supported"},{"line_number":134,"context_line":"        self.set_config({\u0027meta\u0027: {\u0027schema_version\u0027: min_schema_version}})"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_21a60711","line":131,"range":{"start_line":131,"start_character":12,"end_line":131,"end_character":20},"in_reply_to":"7faddb67_fd2748b5","updated":"2019-08-15 20:02:09.000000000","message":"Done","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1bd918768afe960c8f41fa348e4f74ba16bf9346","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        provider_config._parse_provider_yaml(\u0027test_path\u0027)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        self.mock_LOG.warning.assert_not_called()"},{"line_number":140,"context_line":"        self.mock_LOG.reset_mock()"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        # test max major+1 raises"},{"line_number":143,"context_line":"        higher_major_version \u003d \u0027%s.%s\u0027 % \\"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_bd1d5063","line":140,"range":{"start_line":140,"start_character":8,"end_line":140,"end_character":34},"updated":"2019-08-14 22:34:36.000000000","message":"not necessary when the mock isn\u0027t called","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8d3f71624411a4f26a32376753b7d0c9f17a74df","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        provider_config._parse_provider_yaml(\u0027test_path\u0027)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        self.mock_LOG.warning.assert_not_called()"},{"line_number":140,"context_line":"        self.mock_LOG.reset_mock()"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        # test max major+1 raises"},{"line_number":143,"context_line":"        higher_major_version \u003d \u0027%s.%s\u0027 % \\"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_be0a1b23","line":140,"range":{"start_line":140,"start_character":8,"end_line":140,"end_character":34},"in_reply_to":"7faddb67_bd1d5063","updated":"2019-08-15 20:02:09.000000000","message":"Done","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1bd918768afe960c8f41fa348e4f74ba16bf9346","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        self.assertRaises(ValidationError,"},{"line_number":148,"context_line":"                          provider_config._parse_provider_yaml, \u0027test_path\u0027)"},{"line_number":149,"context_line":"        self.mock_LOG.warning.assert_called_once_with(*expected_warning_call)"},{"line_number":150,"context_line":"        self.mock_LOG.reset_mock()"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        # test max major with max minor+1 is logged"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_1d7b448c","line":149,"range":{"start_line":149,"start_character":8,"end_line":149,"end_character":77},"updated":"2019-08-14 22:34:36.000000000","message":"as noted, I don\u0027t think this warning makes sense when we\u0027re blowing up on major version","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8d3f71624411a4f26a32376753b7d0c9f17a74df","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        self.assertRaises(ValidationError,"},{"line_number":148,"context_line":"                          provider_config._parse_provider_yaml, \u0027test_path\u0027)"},{"line_number":149,"context_line":"        self.mock_LOG.warning.assert_called_once_with(*expected_warning_call)"},{"line_number":150,"context_line":"        self.mock_LOG.reset_mock()"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        # test max major with max minor+1 is logged"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_01a18bf7","line":149,"range":{"start_line":149,"start_character":8,"end_line":149,"end_character":77},"in_reply_to":"7faddb67_1d7b448c","updated":"2019-08-15 20:02:09.000000000","message":"Done","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1bd918768afe960c8f41fa348e4f74ba16bf9346","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        provider_config._parse_provider_yaml(\u0027test_path\u0027)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        self.mock_LOG.warning.assert_called_once_with(*expected_warning_call)"},{"line_number":160,"context_line":"        self.mock_LOG.reset_mock()"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"@ddt.ddt"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_bd6b10b7","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":34},"updated":"2019-08-14 22:34:36.000000000","message":"not necessary since we\u0027re done","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8d3f71624411a4f26a32376753b7d0c9f17a74df","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        provider_config._parse_provider_yaml(\u0027test_path\u0027)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        self.mock_LOG.warning.assert_called_once_with(*expected_warning_call)"},{"line_number":160,"context_line":"        self.mock_LOG.reset_mock()"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"@ddt.ddt"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_9e0ddf3f","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":34},"in_reply_to":"7faddb67_bd6b10b7","updated":"2019-08-15 20:02:09.000000000","message":"Done","commit_id":"8d77e6ae043ffc960cb6034a94bb7e8f1a28a997"},{"author":{"_account_id":30001,"name":"Ivens Zambrano","email":"ivens.zambrano@intel.com","username":"IvensZambrano"},"change_message_id":"f839fee894c551406ea7459a2fbfe7b7751881f4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"3fa7e38b_f7318d5a","updated":"2019-10-10 18:04:39.000000000","message":"Yo need to test multiple provider.yaml files loading as well. Different sources could provide multiple files.","commit_id":"a44025f84fb961bae45584823f10a4db7dbbec37"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"3fa7e38b_56d587b6","updated":"2019-10-18 20:24:03.000000000","message":"I think I\u0027ve said it before, but this test harness is a thing of beauty. ++","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            fixtures.MockPatchObject("},{"line_number":89,"context_line":"                provider_config, \u0027LOG\u0027)).mock"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def set_config(self, update\u003dNone):"},{"line_number":92,"context_line":"        config \u003d {}"},{"line_number":93,"context_line":"        if update:"},{"line_number":94,"context_line":"            config.update(update)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_16438fb1","line":91,"range":{"start_line":91,"start_character":25,"end_line":91,"end_character":36},"updated":"2019-10-18 20:24:03.000000000","message":"afaict this is never unset.\n\nIf that\u0027s true, this method devolves to just\n\n self.mock_load_yaml.return_value \u003d config\n\nwhich can be inlined, and this method goes away.","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8ed36b4ef7edbd9c79d9f1467f4f3e2cf80cb03","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        self.set_config({\u0027meta\u0027: {\u0027schema_version\u0027: str(higher_major)}})"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        self.assertRaises(provider_config.ProviderConfigException,"},{"line_number":139,"context_line":"                          provider_config._parse_provider_yaml, path)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        # test max major with max minor+1 is logged"},{"line_number":142,"context_line":"        higher_minor \u003d microversion_parse.Version("}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_76ce832e","line":139,"updated":"2019-10-18 20:24:03.000000000","message":"assert error message","commit_id":"b540a0b6f882307fe17fa0340bfe1ab03c87595e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"36669945c0be81b4db1ccc9ff2760859ce5343ca","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            fixtures.MockPatchObject("},{"line_number":90,"context_line":"                provider_config, \u0027LOG\u0027)).mock"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def set_config(self, update\u003dNone):"},{"line_number":93,"context_line":"        config \u003d {}"},{"line_number":94,"context_line":"        if update:"},{"line_number":95,"context_line":"            config.update(update)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_69407d36","line":92,"range":{"start_line":92,"start_character":25,"end_line":92,"end_character":36},"updated":"2019-10-25 19:31:54.000000000","message":"from PS27:\n\n \u003e afaict this is never unset.\n \u003e \n \u003e If that\u0027s true, this method devolves to just\n \u003e \n \u003e self.mock_load_yaml.return_value \u003d config\n \u003e \n \u003e which can be inlined, and this method goes away.","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"ec8721933af4c24e6aaf58a0593e31780282beae","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            fixtures.MockPatchObject("},{"line_number":90,"context_line":"                provider_config, \u0027LOG\u0027)).mock"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def set_config(self, update\u003dNone):"},{"line_number":93,"context_line":"        config \u003d {}"},{"line_number":94,"context_line":"        if update:"},{"line_number":95,"context_line":"            config.update(update)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_6d632d43","line":92,"range":{"start_line":92,"start_character":25,"end_line":92,"end_character":36},"in_reply_to":"3fa7e38b_69407d36","updated":"2019-11-05 19:05:29.000000000","message":"Initially we needed it, but that changed somewhere along the way. I left it only because someone could add a test to `validation_error_test_data.yaml` with a null value that would be parsed to None.","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"36669945c0be81b4db1ccc9ff2760859ce5343ca","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        self.set_config({\u0027meta\u0027: {\u0027schema_version\u0027: str(higher_major)}})"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        self.assertRaises(nova_exc.ProviderConfigException,"},{"line_number":140,"context_line":"                          provider_config._parse_provider_yaml, path)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        # test max major with max minor+1 is logged"},{"line_number":143,"context_line":"        higher_minor \u003d microversion_parse.Version("}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_49434140","line":140,"updated":"2019-10-25 19:31:54.000000000","message":"from PS27:\n\n \u003e assert error message","commit_id":"b095f9d2ace474ffc5cf49a4fb3804d0363b26df"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def set_config(self, update\u003dNone):"},{"line_number":93,"context_line":"        config \u003d {}"},{"line_number":94,"context_line":"        if update:"},{"line_number":95,"context_line":"            config.update(update)"},{"line_number":96,"context_line":"        self.mock_load_yaml.return_value \u003d config"},{"line_number":97,"context_line":"        return config"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_19c5c25d","line":95,"range":{"start_line":95,"start_character":19,"end_line":95,"end_character":25},"updated":"2020-01-17 13:49:58.000000000","message":"Do we use update here to make a copy of what passed in the update param? If yes then I would do an explicit copy instead. If not then this code can be simplified to \n\n    def set_config(self, config\u003dNone):\n        if config is None:\n            config \u003d {}\n        self.mock_load_yaml.return_value \u003d config\n        return config","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ca90f88cd05583e8508250c09c7d0f036b1c0e9","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def set_config(self, update\u003dNone):"},{"line_number":93,"context_line":"        config \u003d {}"},{"line_number":94,"context_line":"        if update:"},{"line_number":95,"context_line":"            config.update(update)"},{"line_number":96,"context_line":"        self.mock_load_yaml.return_value \u003d config"},{"line_number":97,"context_line":"        return config"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"1fa4df85_917d291e","line":95,"range":{"start_line":95,"start_character":19,"end_line":95,"end_character":25},"in_reply_to":"3fa7e38b_19c5c25d","updated":"2020-02-26 20:05:35.000000000","message":"i think this is just working around the fact that you should not use  mutable contianer in the default of kwargs.\n\nin all cases i have looked at we are either constucting the input data in the call site or using it form a file so il refactor.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def run_test_validation_success(self, config):"},{"line_number":110,"context_line":"        reference \u003d self.set_config(update\u003dconfig)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        actual \u003d provider_config._parse_provider_yaml(\u0027test_path\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self.assertEqual(reference, actual)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_99877212","line":112,"range":{"start_line":112,"start_character":54,"end_line":112,"end_character":65},"updated":"2020-01-17 13:49:58.000000000","message":"What is this test path?\n\n// later\n\nAhh this is unused as _load_yaml_file is mocked.","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self.assertEqual(reference, actual)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def run_schema_version_matching(self, min_schema_version,"},{"line_number":117,"context_line":"                                    max_schema_version):"},{"line_number":118,"context_line":"        path \u003d \u0027test_path\u0027"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        # test exactly min and max versions are supported"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_79b2b6ea","line":117,"range":{"start_line":116,"start_character":0,"end_line":117,"end_character":56},"updated":"2020-01-17 13:49:58.000000000","message":"\u003copinion\u003e\nI would indent it differently\n\n    def run_schema_version_matching(\n        self, min_schema_version, max_schema_version):","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def run_schema_version_matching(self, min_schema_version,"},{"line_number":117,"context_line":"                                    max_schema_version):"},{"line_number":118,"context_line":"        path \u003d \u0027test_path\u0027"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        # test exactly min and max versions are supported"},{"line_number":121,"context_line":"        self.set_config({\u0027meta\u0027: {\u0027schema_version\u0027: str(min_schema_version)}})"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_99da121a","line":118,"updated":"2020-01-17 13:49:58.000000000","message":"I would add a comment here that test_path is unused as _load_yaml_file is mocked","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ce79f3b37020cfd1c6e1dac2efe2ebd5d71be4d","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        # test max major with max minor+1 is logged"},{"line_number":137,"context_line":"        higher_minor \u003d microversion_parse.Version("},{"line_number":138,"context_line":"            major\u003dmax_schema_version.major, minor\u003dmax_schema_version.minor + 1)"},{"line_number":139,"context_line":"        expected_log_call \u003d (\"Provider config file [%(path)s] is \""},{"line_number":140,"context_line":"                             \"at schema version %(schema_version)s. \""},{"line_number":141,"context_line":"                             \"Nova supports the major version, but \""},{"line_number":142,"context_line":"                             \"not the minor. Some fields may be ignored.\" % {"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_f9f3069f","line":139,"updated":"2020-01-17 13:49:58.000000000","message":"\u003copinion\u003e\nI would insert an enter after \u0027(\u0027 and reflow the string","commit_id":"f0fecad7187c13a261d8e24c401da15bf27c239b"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ac63118d75f879a75c782596935d2d5df98ea9f2","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        \"providers\": ["},{"line_number":28,"context_line":"            {"},{"line_number":29,"context_line":"                \"identification\": {"},{"line_number":30,"context_line":"                    \"name\": \"EXAMPLE_RESOURCE_PROVIDER\""},{"line_number":31,"context_line":"                },"},{"line_number":32,"context_line":"                \"inventories\": {"},{"line_number":33,"context_line":"                    \"additional\": ["}],"source_content_type":"text/x-python","patch_set":45,"id":"ff570b3c_7e6ddb30","line":30,"updated":"2020-06-01 12:23:15.000000000","message":"Nit: I quite like the idea of us testing $COMPUTE_NAME here as this (in my view) will be the most widely used.","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"e37a2440ae7c96d4b30d5afaed3aa3a1d21101a2","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        \"providers\": ["},{"line_number":28,"context_line":"            {"},{"line_number":29,"context_line":"                \"identification\": {"},{"line_number":30,"context_line":"                    \"name\": \"EXAMPLE_RESOURCE_PROVIDER\""},{"line_number":31,"context_line":"                },"},{"line_number":32,"context_line":"                \"inventories\": {"},{"line_number":33,"context_line":"                    \"additional\": ["}],"source_content_type":"text/x-python","patch_set":45,"id":"bf51134e_e2ca774d","line":30,"in_reply_to":"ff570b3c_0c746735","updated":"2020-06-15 08:27:49.000000000","message":"Done","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"56cfaa190d0d75eafc3629188f986c3274f28fcf","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        \"providers\": ["},{"line_number":28,"context_line":"            {"},{"line_number":29,"context_line":"                \"identification\": {"},{"line_number":30,"context_line":"                    \"name\": \"EXAMPLE_RESOURCE_PROVIDER\""},{"line_number":31,"context_line":"                },"},{"line_number":32,"context_line":"                \"inventories\": {"},{"line_number":33,"context_line":"                    \"additional\": ["}],"source_content_type":"text/x-python","patch_set":45,"id":"ff570b3c_0c746735","line":30,"in_reply_to":"ff570b3c_7e6ddb30","updated":"2020-06-02 01:15:13.000000000","message":"@john I am with you about this. but I just take these patches over and it will takes me a few days to digest them and discuss with experts before I can make any change. please stay tuned. thanks.","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"},{"author":{"_account_id":30192,"name":"Tony Su","email":"tao.su@intel.com","username":"tsu5"},"change_message_id":"e37a2440ae7c96d4b30d5afaed3aa3a1d21101a2","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        \"providers\": ["},{"line_number":28,"context_line":"            {"},{"line_number":29,"context_line":"                \"identification\": {"},{"line_number":30,"context_line":"                    \"name\": \"EXAMPLE_RESOURCE_PROVIDER\""},{"line_number":31,"context_line":"                },"},{"line_number":32,"context_line":"                \"inventories\": {"},{"line_number":33,"context_line":"                    \"additional\": ["}],"source_content_type":"text/x-python","patch_set":45,"id":"bf51134e_a2b19fe4","line":30,"in_reply_to":"ff570b3c_7e6ddb30","updated":"2020-06-15 08:27:49.000000000","message":"Done","commit_id":"7d9b64fe52e5b79a236c844901a79e532bbcd7f2"}],"requirements.txt":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a8b24f5deed4c84fea3a8b6efdd042046c93ef40","unresolved":false,"context_lines":[{"line_number":69,"context_line":"os-service-types\u003e\u003d1.7.0 # Apache-2.0"},{"line_number":70,"context_line":"taskflow\u003e\u003d2.16.0 # Apache-2.0"},{"line_number":71,"context_line":"python-dateutil\u003e\u003d2.5.3 # BSD"},{"line_number":72,"context_line":"zVMCloudConnector\u003e\u003d1.3.0;sys_platform!\u003d\u0027win32\u0027 # Apache 2.0 License"},{"line_number":73,"context_line":"futurist\u003e\u003d1.8.0 # Apache-2.0"},{"line_number":74,"context_line":"openstacksdk\u003e\u003d0.31.0 # Apache-2.0"},{"line_number":75,"context_line":"PyYAML\u003e\u003d3.12 # MIT"}],"source_content_type":"text/plain","patch_set":4,"id":"7faddb67_03f988c6","line":72,"updated":"2019-07-31 21:42:45.000000000","message":"unrelated whitespace change","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"8f4943d14fb0bdf75ad7ae6b34c93bbea8cc6d45","unresolved":false,"context_lines":[{"line_number":69,"context_line":"os-service-types\u003e\u003d1.7.0 # Apache-2.0"},{"line_number":70,"context_line":"taskflow\u003e\u003d2.16.0 # Apache-2.0"},{"line_number":71,"context_line":"python-dateutil\u003e\u003d2.5.3 # BSD"},{"line_number":72,"context_line":"zVMCloudConnector\u003e\u003d1.3.0;sys_platform!\u003d\u0027win32\u0027 # Apache 2.0 License"},{"line_number":73,"context_line":"futurist\u003e\u003d1.8.0 # Apache-2.0"},{"line_number":74,"context_line":"openstacksdk\u003e\u003d0.31.0 # Apache-2.0"},{"line_number":75,"context_line":"PyYAML\u003e\u003d3.12 # MIT"}],"source_content_type":"text/plain","patch_set":4,"id":"7faddb67_4edb19ec","line":72,"in_reply_to":"7faddb67_03f988c6","updated":"2019-08-01 16:58:43.000000000","message":"I was trying to be a good boy scout and clean it up while I was in it, but I will revert for now,","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0e985425732ec9a7a30d416a30e6bdef9194de0f","unresolved":false,"context_lines":[{"line_number":69,"context_line":"os-service-types\u003e\u003d1.7.0 # Apache-2.0"},{"line_number":70,"context_line":"taskflow\u003e\u003d2.16.0 # Apache-2.0"},{"line_number":71,"context_line":"python-dateutil\u003e\u003d2.5.3 # BSD"},{"line_number":72,"context_line":"zVMCloudConnector\u003e\u003d1.3.0;sys_platform!\u003d\u0027win32\u0027 # Apache 2.0 License"},{"line_number":73,"context_line":"futurist\u003e\u003d1.8.0 # Apache-2.0"},{"line_number":74,"context_line":"openstacksdk\u003e\u003d0.31.0 # Apache-2.0"},{"line_number":75,"context_line":"PyYAML\u003e\u003d3.12 # MIT"}],"source_content_type":"text/plain","patch_set":4,"id":"7faddb67_1e0f7a88","line":72,"in_reply_to":"7faddb67_4edb19ec","updated":"2019-08-02 23:32:02.000000000","message":"Nah, I\u0027m guessing this came from global-requirements.txt [1] and the two spaces were on purpose.\n\n[1] https://opendev.org/openstack/requirements/src/branch/master/global-requirements.txt#L242","commit_id":"22885cc0c7b82903ce90dbcc278016a7d8240f43"}],"test-requirements.txt":[{"author":{"_account_id":29745,"name":"Dustin Cowles","email":"cowlesd@gmail.com","username":"dustinc","status":"inactive"},"change_message_id":"7a874fb292caff27bb88d9621c481b7b7d787193","unresolved":false,"context_lines":[{"line_number":5,"context_line":"hacking\u003e\u003d1.1.0,\u003c1.2.0 # Apache-2.0"},{"line_number":6,"context_line":"contextlib2\u003e\u003d0.5.5;python_version\u003c\u00273.0\u0027  # PSF License"},{"line_number":7,"context_line":"coverage!\u003d4.4,\u003e\u003d4.0 # Apache-2.0"},{"line_number":8,"context_line":"ddt\u003e\u003d1.2.1 # MIT"},{"line_number":9,"context_line":"fixtures\u003e\u003d3.0.0 # Apache-2.0/BSD"},{"line_number":10,"context_line":"mock\u003e\u003d3.0.0 # BSD"},{"line_number":11,"context_line":"mox3\u003e\u003d0.20.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":10,"id":"7faddb67_f09274fc","line":8,"updated":"2019-08-08 16:17:28.000000000","message":"whoops, thanks","commit_id":"23012d033ec461005de8b2e723c326b52cbcd851"}]}
