)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":26787,"name":"Chris Janiszewski","email":"cjanisze@redhat.com","username":"OOsemka"},"change_message_id":"f102e6f7539089597932508e73ac05ac91eebfd4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"f3ce9407_225d7d17","updated":"2022-04-19 13:49:56.000000000","message":"This is very exciting Harald. I can\u0027t wait to take it for a spin.","commit_id":"d231c92c4a4c897781048f187c84f177b529269e"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"00b84a3d88cd886ded33d8636f1626e6da4fc141","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"513539e7_b8ae8158","updated":"2022-06-01 12:12:25.000000000","message":"recheck","commit_id":"8beb2aeb84890121363dac1f335b64d61025c8e0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1f6e4d97101c6255284dbff22a84efcaeeba4586","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"55697ef1_9b342836","updated":"2022-08-01 14:49:13.000000000","message":"Greetings Harald!\n\nA few things!\n\nOverall, I think it is fairly good, but I think we\u0027re going to need to generate an example configuration, and also maybe add a little logging. I would love to see a misconfiguration cause the service not to start, but I realize this is just an ML2 plugin so it might not be able to achieve that with Neutron\u0027s model.  I\u0027m a little worried about exception handling/logging, hence the encouraging more of a ltitle more logging.","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"}],"networking_baremetal/common.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1f6e4d97101c6255284dbff22a84efcaeeba4586","unresolved":true,"context_lines":[{"line_number":49,"context_line":"            on_load_failure_callback\u003d_load_failure_hook"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":"    except stevedore.exception.NoUniqueMatch as exc:"},{"line_number":52,"context_line":"        raise exceptions.DriverEntrypointLoadError("},{"line_number":53,"context_line":"            entry_point\u003df\u0027{DRIVER_NAMESPACE}.{driver}\u0027,"},{"line_number":54,"context_line":"            err\u003dexc)"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"34a44410_1e98079f","line":52,"updated":"2022-08-01 14:49:13.000000000","message":"2 items:\n1) Is this fatal for the process to start? - No, it is dynamically loaded so we\u0027ll only log when there is a misconfiguration from what I\u0027ve seen thus far.\n2) It feels like we should explicitly log something here. Depending on the behavior of the caller. It looks like the invocations in the code don\u0027t explicitly look for an error to occur. In the case of Neutron, looks like it is looking for MechanismDriverError from the ml2 layer exceptions to do any logging. :\\","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"b6759c9152b08c47008094c2a40542887bb2b103","unresolved":true,"context_lines":[{"line_number":49,"context_line":"            on_load_failure_callback\u003d_load_failure_hook"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":"    except stevedore.exception.NoUniqueMatch as exc:"},{"line_number":52,"context_line":"        raise exceptions.DriverEntrypointLoadError("},{"line_number":53,"context_line":"            entry_point\u003df\u0027{DRIVER_NAMESPACE}.{driver}\u0027,"},{"line_number":54,"context_line":"            err\u003dexc)"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"f98026e8_707422a6","line":52,"in_reply_to":"34a44410_1e98079f","updated":"2022-08-01 23:28:57.000000000","message":"I think a non-existing driver or a driver that fail to initialize will cause the service not to start.\n\nIf I add \"raise Exception(\u0027FAIL DRIVER\u0027) to the init method of a driver:\n  Aug 01 23:06:28 devstack neutron-server[110766]: ERROR networking_baremetal.common [-] Driver manager \u003cstevedore.driver.DriverManager object at 0x7f06a94b5f10\u003e failed to load device plugin EntryPoint(name\u003d\u0027netconf-openconfig\u0027, value\u003d\u0027networking_baremetal.drivers.netconf.openconfig:NetconfOpenConfigDriver\u0027, group\u003d\u0027networking_baremetal.drivers\u0027): FAIL DRIVER: Exception: FAIL DRIVER\n  Aug 01 23:06:28 devstack neutron-server[110766]: CRITICAL neutron.plugins.ml2.managers [-] The \u0027EntryPoint(name\u003d\u0027baremetal\u0027, value\u003d\u0027networking_baremetal.plugins.ml2.baremetal_mech:BaremetalMechanismDriver\u0027, group\u003d\u0027neutron.ml2.mechanism_drivers\u0027)\u0027 entrypoint could not be loaded for the following reason: \u0027Failed to load entrypoint EntryPoint(name\u003d\u0027netconf-openconfig\u0027, value\u003d\u0027networking_baremetal.drivers.netconf.openconfig:NetconfOpenConfigDriver\u0027, group\u003d\u0027networking_baremetal.drivers\u0027): FAIL DRIVER\u0027.: networking_baremetal.exceptions.DriverEntrypointLoadError: Failed to load entrypoint EntryPoint(name\u003d\u0027netconf-openconfig\u0027, value\u003d\u0027networking_baremetal.drivers.netconf.openconfig:NetconfOpenConfigDriver\u0027, group\u003d\u0027networking_baremetal.drivers\u0027): FAIL DRIVER\n  Aug 01 23:06:28 devstack neutron-server[110766]: DEBUG oslo_concurrency.lockutils [-] Lock \"manager\" \"released\" by \"neutron.manager.NeutronManager._create_instance\" :: held 0.392s {{(pid\u003d110766) inner /usr/local/lib/python3.8/dist-packages/oslo_concurrency/lockutils.py:400}}\n  Aug 01 23:06:28 devstack neutron-server[110766]: /usr/lib/python3/dist-packages/secretstorage/dhcrypto.py:15: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n  Aug 01 23:06:28 devstack neutron-server[110766]:   from cryptography.utils import int_from_bytes\n  Aug 01 23:06:28 devstack neutron-server[110766]: /usr/lib/python3/dist-packages/secretstorage/util.py:19: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n  Aug 01 23:06:28 devstack neutron-server[110766]:   from cryptography.utils import int_from_bytes\n  Aug 01 23:06:28 devstack neutron-server[110766]: Failed to load entrypoint EntryPoint(name\u003d\u0027netconf-openconfig\u0027, value\u003d\u0027networking_baremetal.drivers.netconf.openconfig:NetconfOpenConfigDriver\u0027, group\u003d\u0027networking_baremetal.drivers\u0027): FAIL DRIVER\n  Aug 01 23:06:29 devstack systemd[1]: devstack@q-svc.service: Main process exited, code\u003dexited, status\u003d1/FAILURE\n  Aug 01 23:06:29 devstack systemd[1]: devstack@q-svc.service: Failed with result \u0027exit-code\u0027.\n\nIf I try to set \"driver \u003d invalid-driver\" in config I get:\n  Aug 01 23:09:17 devstack neutron-server[110963]: WARNING stevedore.named [-] Could not load invalid-driver\n  Aug 01 23:09:17 devstack neutron-server[110963]: CRITICAL neutron.plugins.ml2.managers [-] The \u0027EntryPoint(name\u003d\u0027baremetal\u0027, value\u003d\u0027networking_baremetal.plugins.ml2.baremetal_mech:BaremetalMechanismDriver\u0027, group\u003d\u0027neutron.ml2.mechanism_drivers\u0027)\u0027 entrypoint could not be loaded for the following reason: \u0027Failed to load entrypoint networking_baremetal.drivers.invalid-driver: No \u0027networking_baremetal.drivers\u0027 driver found, looking for \u0027invalid-driver\u0027\u0027.: networking_baremetal.exceptions.DriverEntrypointLoadError: Failed to load entrypoint networking_baremetal.drivers.invalid-driver: No \u0027networking_baremetal.drivers\u0027 driver found, looking for \u0027invalid-driver\u0027\n  Aug 01 23:09:17 devstack neutron-server[110963]: DEBUG oslo_concurrency.lockutils [-] Lock \"manager\" \"released\" by \"neutron.manager.NeutronManager._create_instance\" :: held 1.034s {{(pid\u003d110963) inner /usr/local/lib/python3.8/dist-packages/oslo_concurrency/lockutils.py:400}}\n  Aug 01 23:09:17 devstack neutron-server[110963]: /usr/lib/python3/dist-packages/secretstorage/dhcrypto.py:15: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n  Aug 01 23:09:17 devstack neutron-server[110963]:   from cryptography.utils import int_from_bytes\n  Aug 01 23:09:17 devstack neutron-server[110963]: /usr/lib/python3/dist-packages/secretstorage/util.py:19: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n  Aug 01 23:09:17 devstack neutron-server[110963]:   from cryptography.utils import int_from_bytes\n  Aug 01 23:09:17 devstack neutron-server[110963]: Failed to load entrypoint networking_baremetal.drivers.invalid-driver: No \u0027networking_baremetal.drivers\u0027 driver found, looking for \u0027invalid-driver\u0027\n  Aug 01 23:09:17 devstack systemd[1]: devstack@q-svc.service: Main process exited, code\u003dexited, status\u003d1/FAILURE\n  Aug 01 23:09:17 devstack systemd[1]: devstack@q-svc.service: Failed with result \u0027exit-code\u0027.","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"}],"networking_baremetal/config.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0ba214cfb7169a622dbe899f024d6164c53de789","unresolved":true,"context_lines":[{"line_number":43,"context_line":"    ]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"networking_baremetal_group \u003d cfg.OptGroup("},{"line_number":47,"context_line":"    name\u003d\u0027networking_baremetal\u0027,"},{"line_number":48,"context_line":"    title\u003d\u0027ML2 networking-baremetal options\u0027)"},{"line_number":49,"context_line":"CONF.register_group(networking_baremetal_group)"},{"line_number":50,"context_line":"CONF.register_opts(_opts, group\u003dnetworking_baremetal_group)"}],"source_content_type":"text/x-python","patch_set":10,"id":"38a984c4_aff719d1","line":47,"range":{"start_line":46,"start_character":0,"end_line":47,"end_character":32},"updated":"2022-08-01 17:49:35.000000000","message":"https://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_89b/835324/17/check/openstack-tox-docs/89bbd97/docs/configuration/sample-config.html\n\nLooks like none of this gets loaded into the rendered sample.","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"b6759c9152b08c47008094c2a40542887bb2b103","unresolved":true,"context_lines":[{"line_number":43,"context_line":"    ]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"networking_baremetal_group \u003d cfg.OptGroup("},{"line_number":47,"context_line":"    name\u003d\u0027networking_baremetal\u0027,"},{"line_number":48,"context_line":"    title\u003d\u0027ML2 networking-baremetal options\u0027)"},{"line_number":49,"context_line":"CONF.register_group(networking_baremetal_group)"},{"line_number":50,"context_line":"CONF.register_opts(_opts, group\u003dnetworking_baremetal_group)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fc72c9cd_fc864869","line":47,"range":{"start_line":46,"start_character":0,"end_line":47,"end_character":32},"in_reply_to":"38a984c4_aff719d1","updated":"2022-08-01 23:28:57.000000000","message":"I\u0027ve added an entrypoint in setup.cfg so this group is loaded.","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1f6e4d97101c6255284dbff22a84efcaeeba4586","unresolved":true,"context_lines":[{"line_number":48,"context_line":"    title\u003d\u0027ML2 networking-baremetal options\u0027)"},{"line_number":49,"context_line":"CONF.register_group(networking_baremetal_group)"},{"line_number":50,"context_line":"CONF.register_opts(_opts, group\u003dnetworking_baremetal_group)"},{"line_number":51,"context_line":"for device in CONF.networking_baremetal.enabled_devices:"},{"line_number":52,"context_line":"    group \u003d cfg.OptGroup("},{"line_number":53,"context_line":"        name\u003ddevice,"},{"line_number":54,"context_line":"        title\u003df\u0027{device} Device options\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"121a1cdb_f46d9bbd","line":51,"range":{"start_line":51,"start_character":0,"end_line":51,"end_character":56},"updated":"2022-08-01 14:49:13.000000000","message":"maybe, if no enabled device, register an example device for example generation?","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"b6759c9152b08c47008094c2a40542887bb2b103","unresolved":true,"context_lines":[{"line_number":48,"context_line":"    title\u003d\u0027ML2 networking-baremetal options\u0027)"},{"line_number":49,"context_line":"CONF.register_group(networking_baremetal_group)"},{"line_number":50,"context_line":"CONF.register_opts(_opts, group\u003dnetworking_baremetal_group)"},{"line_number":51,"context_line":"for device in CONF.networking_baremetal.enabled_devices:"},{"line_number":52,"context_line":"    group \u003d cfg.OptGroup("},{"line_number":53,"context_line":"        name\u003ddevice,"},{"line_number":54,"context_line":"        title\u003df\u0027{device} Device options\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"339558d7_7694a6fb","line":51,"range":{"start_line":51,"start_character":0,"end_line":51,"end_character":56},"in_reply_to":"121a1cdb_f46d9bbd","updated":"2022-08-01 23:28:57.000000000","message":"If I\u0027m not mistaken list_opts() is only called by oslo-config-generator.\nI\u0027ve added an entry to ensure we get a sample entry for \"sample_default\u003d[\u0027device.example.com\u0027]\".","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1f6e4d97101c6255284dbff22a84efcaeeba4586","unresolved":true,"context_lines":[{"line_number":54,"context_line":"        title\u003df\u0027{device} Device options\u0027)"},{"line_number":55,"context_line":"    CONF.register_group(group)"},{"line_number":56,"context_line":"    CONF.register_opts(_device_opts, group\u003dgroup)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def list_opts():"},{"line_number":60,"context_line":"    return [(\u0027networking_baremetal\u0027, _opts)]"}],"source_content_type":"text/x-python","patch_set":10,"id":"ccad4beb_ddb8a533","line":57,"updated":"2022-08-01 14:49:13.000000000","message":"Just a thought here, this is going to make generating an example exceptionally difficult... It is likely something we need to keep, at least, partially in mind.","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"bd04702190bb639aab474cafc55c7093ed8297c8","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        title\u003df\u0027{device} Device options\u0027)"},{"line_number":55,"context_line":"    CONF.register_group(group)"},{"line_number":56,"context_line":"    CONF.register_opts(_device_opts, group\u003dgroup)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def list_opts():"},{"line_number":60,"context_line":"    return [(\u0027networking_baremetal\u0027, _opts)]"}],"source_content_type":"text/x-python","patch_set":10,"id":"ffd952e4_ea0a2cfd","line":57,"in_reply_to":"44d0b2fa_df865afc","updated":"2022-08-03 18:05:19.000000000","message":"I think that makes a lot of sense to do, since not doing it raises the burden to use the software by making it much harder to know how to configure.","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"b6759c9152b08c47008094c2a40542887bb2b103","unresolved":true,"context_lines":[{"line_number":54,"context_line":"        title\u003df\u0027{device} Device options\u0027)"},{"line_number":55,"context_line":"    CONF.register_group(group)"},{"line_number":56,"context_line":"    CONF.register_opts(_device_opts, group\u003dgroup)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def list_opts():"},{"line_number":60,"context_line":"    return [(\u0027networking_baremetal\u0027, _opts)]"}],"source_content_type":"text/x-python","patch_set":10,"id":"44d0b2fa_df865afc","line":57,"in_reply_to":"ccad4beb_ddb8a533","updated":"2022-08-01 23:28:57.000000000","message":"indeed, adding to that additional driver specific options are registered on initialization. see: https://review.opendev.org/c/openstack/networking-baremetal/+/835324/17/networking_baremetal/drivers/netconf/openconfig.py#298\n\nI think we can add a \"sample_default\" entry per-driver as implemnted. And the in list_opts we can have an entry per-driver with the union of generic + driver specific opts that will be present in generated sample config.","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1f6e4d97101c6255284dbff22a84efcaeeba4586","unresolved":true,"context_lines":[{"line_number":60,"context_line":"    return [(\u0027networking_baremetal\u0027, _opts)]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def get_devices():"},{"line_number":64,"context_line":"    devices \u003d dict()"},{"line_number":65,"context_line":"    for dev in CONF.networking_baremetal.enabled_devices:"},{"line_number":66,"context_line":"        if not CONF[dev].driver:"}],"source_content_type":"text/x-python","patch_set":10,"id":"a19246e7_15a36331","line":63,"updated":"2022-08-01 14:49:13.000000000","message":"Lets add a doc string to indicate when this gets called.","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"b6759c9152b08c47008094c2a40542887bb2b103","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    return [(\u0027networking_baremetal\u0027, _opts)]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def get_devices():"},{"line_number":64,"context_line":"    devices \u003d dict()"},{"line_number":65,"context_line":"    for dev in CONF.networking_baremetal.enabled_devices:"},{"line_number":66,"context_line":"        if not CONF[dev].driver:"}],"source_content_type":"text/x-python","patch_set":10,"id":"44e86946_53b57ffc","line":63,"in_reply_to":"a19246e7_15a36331","updated":"2022-08-01 23:28:57.000000000","message":"Done","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1f6e4d97101c6255284dbff22a84efcaeeba4586","unresolved":true,"context_lines":[{"line_number":67,"context_line":"            LOG.error(\u0027IGNORING invalid device %s, driver not specified.\u0027, dev)"},{"line_number":68,"context_line":"        if not CONF[dev].switch_id and not CONF[dev].switch_info:"},{"line_number":69,"context_line":"            LOG.error(\u0027IGNORING invalid device %s, switch_id and/or \u0027"},{"line_number":70,"context_line":"                      \u0027switch_info is required\u0027, dev)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        if CONF[dev].switch_id:"},{"line_number":73,"context_line":"            devices[CONF[dev].switch_id] \u003d dev"}],"source_content_type":"text/x-python","patch_set":10,"id":"21fba677_6a79b393","line":70,"updated":"2022-08-01 14:49:13.000000000","message":"Thinking along the same line, we likely need to validate drivers are valid on startup, but that can be in another patch.","commit_id":"7c5381948d8df1cf68fd4af2199ea01d2fa9d5f0"}],"networking_baremetal/plugins/ml2/baremetal_mech.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"bd04702190bb639aab474cafc55c7093ed8297c8","unresolved":true,"context_lines":[{"line_number":674,"context_line":"        \"\"\""},{"line_number":675,"context_line":"        for device, args in by_device.items():"},{"line_number":676,"context_line":"            driver \u003d args[\u0027driver\u0027]"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"            if bond_mode and bond_mode not in driver.SUPPORTED_BOND_MODES:"},{"line_number":679,"context_line":"                return False"},{"line_number":680,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"a704b611_dbb7a5e4","line":677,"updated":"2022-08-03 18:05:19.000000000","message":"We should *likely* consider at some point an act of connecting to the switch and gathering what it can actually handle.. A TODO note most likely :)","commit_id":"889a4a1cf063035f5fa7f180148857f69d696028"}]}
