)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dee0103703f11cabd6535c8c53994d2b6553086e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"pass endpoint interface to Ironic client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":10,"context_line":"endpoint is possible, which breaks deployments where the controllers have"},{"line_number":11,"context_line":"no route to the public network per security requirement. In this case, we must"},{"line_number":12,"context_line":"pass the (endpoint) interface when constructing the Ironic client."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"5fc1f717_d72b6a2d","line":10,"range":{"start_line":9,"start_character":56,"end_line":10,"end_character":20},"updated":"2019-03-11 15:00:47.000000000","message":"Nova\u0027s lower-constraints for python-ironicclient is currently 2.4.0 and looking at the python-ironicclient construction code at that version, it looks like it only cares about the interface if an endpoint URL is not provided:\n\nhttps://github.com/openstack/python-ironicclient/blob/2.4.0/ironicclient/client.py#L110\n\nBut from the nova code, we always provide an endpoint URL, either because of the hard-coded override \"api_endpoint\" option or via the ksa session which gets the endpoint from the service catalog, correct? So I\u0027m kind of failing to see where this breaks down with python-ironicclient.\n\nI see that I610836e5038774621690aca88b2aee25670f0262 and I3b6fa53005f143d34f03bb1ed71c0aa04b7fce7b landed in python-ironicclient but those obviously aren\u0027t going to be in the versions nova is using as a lower constraint or on stable branches, so I\u0027m trying to figure out if we\u0027re just plumbing something in for things to work if you have the latest python-ironicclient 2.7.0 or if this is working around older ironicclient versions so we can backport this change?","commit_id":"61f3cb49087a715bd6617c7762005cd7d142cf36"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4f9f1f5092a7e8f7b61d868d014e7335749dd255","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"pass endpoint interface to Ironic client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":10,"context_line":"endpoint is possible, which breaks deployments where the controllers have"},{"line_number":11,"context_line":"no route to the public network per security requirement. In this case, we must"},{"line_number":12,"context_line":"pass the (endpoint) interface when constructing the Ironic client."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"5fc1f717_3a93b3fc","line":10,"range":{"start_line":9,"start_character":56,"end_line":10,"end_character":20},"in_reply_to":"5fc1f717_d72b6a2d","updated":"2019-03-11 16:04:19.000000000","message":"Re lower constraints and backporting: Yes, we did it this way so that this part of the fix can be backported, but we can\u0027t bump lower constraints in stable. So if someone wants the fix in q/r, they will need to install both pieces explicitly.","commit_id":"61f3cb49087a715bd6617c7762005cd7d142cf36"}],"nova/conf/utils.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f20984fe4c12b74bc84d133b5a49ae5f9711d4e0","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    # NOTE(gyee): we still need to include the deprecated \u0027interface\u0027 option"},{"line_number":37,"context_line":"    # as ironicclient, and possibly others, still depends on it."},{"line_number":38,"context_line":"    opts \u003d ks_loading.get_adapter_conf_options(include_deprecated\u003dTrue,"},{"line_number":39,"context_line":"                                               deprecated_opts\u003ddeprecated_opts)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    for opt in opts[:]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_0079f4fa","line":38,"range":{"start_line":38,"start_character":66,"end_line":38,"end_character":70},"updated":"2019-03-06 23:55:01.000000000","message":"ah, this is what you were saying in IRC, cool","commit_id":"481b4d7ad72f2538bc55e9468e37d3479fbc76e6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dee0103703f11cabd6535c8c53994d2b6553086e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                    keystoneauth1.loading.session.Session.register_conf_options"},{"line_number":34,"context_line":"    :return: List of cfg.Opts."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    # NOTE(gyee): we still need to include the deprecated \u0027interface\u0027 option"},{"line_number":37,"context_line":"    # as ironicclient, and possibly others, still depends on it."},{"line_number":38,"context_line":"    opts \u003d ks_loading.get_adapter_conf_options(include_deprecated\u003dTrue,"},{"line_number":39,"context_line":"                                               deprecated_opts\u003ddeprecated_opts)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    for opt in opts[:]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_371e6f70","line":38,"range":{"start_line":36,"start_character":4,"end_line":38,"end_character":71},"updated":"2019-03-11 15:00:47.000000000","message":"Hmm, should we make this a kwarg on the get_ksa_adapter_opts method we\u0027re in so the caller can determine this? And then we only need to pass True from the ironic driver code and can eventually remove it (on master) once python-ironicclient is updated to no longer require this?\n\nI see this makes the \u0027interface\u0027 option show up in docs generation though which is nice:\n\nhttp://logs.openstack.org/79/640879/8/check/openstack-tox-docs/219446b/html/configuration/config.html#ironic.interface","commit_id":"61f3cb49087a715bd6617c7762005cd7d142cf36"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cfd01998760af1146cdcc48a1f67578929fce852","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                    keystoneauth1.loading.session.Session.register_conf_options"},{"line_number":34,"context_line":"    :return: List of cfg.Opts."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    # NOTE(gyee): we still need to include the deprecated \u0027interface\u0027 option"},{"line_number":37,"context_line":"    # as ironicclient, and possibly others, still depends on it."},{"line_number":38,"context_line":"    opts \u003d ks_loading.get_adapter_conf_options(include_deprecated\u003dTrue,"},{"line_number":39,"context_line":"                                               deprecated_opts\u003ddeprecated_opts)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    for opt in opts[:]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_802836e2","line":38,"range":{"start_line":36,"start_character":4,"end_line":38,"end_character":71},"in_reply_to":"5fc1f717_1a7d97e6","updated":"2019-03-11 17:23:45.000000000","message":"Sure, I\u0027ll remove the \u0027interface\u0027 part.","commit_id":"61f3cb49087a715bd6617c7762005cd7d142cf36"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4f9f1f5092a7e8f7b61d868d014e7335749dd255","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                    keystoneauth1.loading.session.Session.register_conf_options"},{"line_number":34,"context_line":"    :return: List of cfg.Opts."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    # NOTE(gyee): we still need to include the deprecated \u0027interface\u0027 option"},{"line_number":37,"context_line":"    # as ironicclient, and possibly others, still depends on it."},{"line_number":38,"context_line":"    opts \u003d ks_loading.get_adapter_conf_options(include_deprecated\u003dTrue,"},{"line_number":39,"context_line":"                                               deprecated_opts\u003ddeprecated_opts)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    for opt in opts[:]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_1a7d97e6","line":38,"range":{"start_line":36,"start_character":4,"end_line":38,"end_character":71},"in_reply_to":"5fc1f717_371e6f70","updated":"2019-03-11 16:04:19.000000000","message":"Yes, good point, I should have noticed that.\n\nHowever, I actually don\u0027t necessarily think we should be including the deprecated opts at all. The operator ought to be using valid_interfaces if they want to send the value through. There\u0027s no reason to continue supporting \u0027interface\u0027 at this level.","commit_id":"61f3cb49087a715bd6617c7762005cd7d142cf36"}],"nova/tests/unit/virt/ironic/test_client_wrapper.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"16168ceb8d0e8728ee526e03f3b0698501cea51b","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                    \u0027retry_interval\u0027: CONF.ironic.api_retry_interval,"},{"line_number":176,"context_line":"                    \u0027os_ironic_api_version\u0027: [\u00271.46\u0027, \u00271.38\u0027],"},{"line_number":177,"context_line":"                    \u0027endpoint\u0027: endpoint,"},{"line_number":178,"context_line":"                    \u0027interface\u0027: [\u0027admin\u0027]}"},{"line_number":179,"context_line":"        mock_ir_cli.assert_called_once_with(1, **expected)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @mock.patch.object(client_wrapper.IronicClientWrapper, \u0027_multi_getattr\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_dd75129a","line":178,"range":{"start_line":178,"start_character":33,"end_line":178,"end_character":42},"updated":"2019-03-07 04:11:35.000000000","message":"This is a little surprising. Why does this end up as a list? Is it because valid_interfaces is a ListOpt? It doesn\u0027t matter on the ironicclient side, which is happy with either, so it\u0027s fine.","commit_id":"febf6db11d2e6c5fc023c3b9ce713696411e78fc"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"0554a9b5edfb42fd6910216516de4c0b931da934","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                    \u0027retry_interval\u0027: CONF.ironic.api_retry_interval,"},{"line_number":176,"context_line":"                    \u0027os_ironic_api_version\u0027: [\u00271.46\u0027, \u00271.38\u0027],"},{"line_number":177,"context_line":"                    \u0027endpoint\u0027: endpoint,"},{"line_number":178,"context_line":"                    \u0027interface\u0027: [\u0027admin\u0027]}"},{"line_number":179,"context_line":"        mock_ir_cli.assert_called_once_with(1, **expected)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @mock.patch.object(client_wrapper.IronicClientWrapper, \u0027_multi_getattr\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_d0bbb9e2","line":178,"range":{"start_line":178,"start_character":33,"end_line":178,"end_character":42},"in_reply_to":"5fc1f717_dd75129a","updated":"2019-03-07 06:08:23.000000000","message":"Yes, valid_interfaces is a list. So as long as the \u0027interface\u0027 argument is passed all the way to KSA, it will eventually do the right thing. See\n\nhttps://github.com/openstack/keystoneauth/blob/master/keystoneauth1/access/service_catalog.py#L128","commit_id":"febf6db11d2e6c5fc023c3b9ce713696411e78fc"}],"nova/virt/ironic/client_wrapper.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"53d1549cac8dc4fb281dca8cc35b4c414222d4d1","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        ironic_conf \u003d CONF[IRONIC_GROUP.name]"},{"line_number":103,"context_line":"        # FIXME(gyee): even though \u0027interface\u0027 had been deprecated in favor of"},{"line_number":104,"context_line":"        # \u0027valid_interfaces\u0027 in KSA, the session adapter in ironicclient is"},{"line_number":105,"context_line":"        # still using \u0027interface\u0027 for endpoint lookups. We\u0027ll need to update"},{"line_number":106,"context_line":"        # this code after we modernize ironicclient."},{"line_number":107,"context_line":"        kwargs[\u0027interface\u0027] \u003d ironic_conf.valid_interfaces"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_7438bd3a","line":106,"range":{"start_line":105,"start_character":56,"end_line":106,"end_character":52},"updated":"2019-03-04 23:26:20.000000000","message":"Since this patch depends on the ironicclient one, why not do it correctly right now?\n\nThat said, if you\u0027re trying to make this backportable to queens, aren\u0027t you going to have a tough time backporting the ironicclient lower constraint?","commit_id":"a5a28ea8f0ab54b8e50b496bb999e7de02882183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f4ba7b6340a7035e908216bee4d4106f7363d85c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        ironic_conf \u003d CONF[IRONIC_GROUP.name]"},{"line_number":103,"context_line":"        # FIXME(gyee): even though \u0027interface\u0027 had been deprecated in favor of"},{"line_number":104,"context_line":"        # \u0027valid_interfaces\u0027 in KSA, the session adapter in ironicclient is"},{"line_number":105,"context_line":"        # still using \u0027interface\u0027 for endpoint lookups. We\u0027ll need to update"},{"line_number":106,"context_line":"        # this code after we modernize ironicclient."},{"line_number":107,"context_line":"        kwargs[\u0027interface\u0027] \u003d ironic_conf.valid_interfaces"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_36e6d9ea","line":106,"range":{"start_line":105,"start_character":56,"end_line":106,"end_character":52},"in_reply_to":"5fc1f717_56b605dc","updated":"2019-03-06 00:11:04.000000000","message":"That\u0027s correct, but you *can\u0027t* do what I originally suggested and make the corresponding change (which assumes valid_interfaces exists in the client) in the commit you plan to backport.","commit_id":"a5a28ea8f0ab54b8e50b496bb999e7de02882183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d4088383ecef27ca47b081bb3a23cf7c02752afe","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        ironic_conf \u003d CONF[IRONIC_GROUP.name]"},{"line_number":103,"context_line":"        # FIXME(gyee): even though \u0027interface\u0027 had been deprecated in favor of"},{"line_number":104,"context_line":"        # \u0027valid_interfaces\u0027 in KSA, the session adapter in ironicclient is"},{"line_number":105,"context_line":"        # still using \u0027interface\u0027 for endpoint lookups. We\u0027ll need to update"},{"line_number":106,"context_line":"        # this code after we modernize ironicclient."},{"line_number":107,"context_line":"        kwargs[\u0027interface\u0027] \u003d ironic_conf.valid_interfaces"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_62d25c37","line":106,"range":{"start_line":105,"start_character":56,"end_line":106,"end_character":52},"in_reply_to":"5fc1f717_6227bcb8","updated":"2019-03-05 23:05:53.000000000","message":"Oh, I\u0027m on board with the *reasoning* for backporting. I was just leery (and ignorant) of the process for doing that in a client lib. I have since gathered more information:\n\n- The client lib fix can be backported, whereupon you have to\n- Release a new version and\n- Bump the upper constraint in the requirements project on the stable branch\n\nBut you can\u0027t bump the lower constraint in the nova project on the stable branch. Which means you have to leave this as it is for backport purposes; and then do the modernize/update thing in master only.","commit_id":"a5a28ea8f0ab54b8e50b496bb999e7de02882183"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5817334afa154167aa63cded4759101b19030019","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        ironic_conf \u003d CONF[IRONIC_GROUP.name]"},{"line_number":103,"context_line":"        # FIXME(gyee): even though \u0027interface\u0027 had been deprecated in favor of"},{"line_number":104,"context_line":"        # \u0027valid_interfaces\u0027 in KSA, the session adapter in ironicclient is"},{"line_number":105,"context_line":"        # still using \u0027interface\u0027 for endpoint lookups. We\u0027ll need to update"},{"line_number":106,"context_line":"        # this code after we modernize ironicclient."},{"line_number":107,"context_line":"        kwargs[\u0027interface\u0027] \u003d ironic_conf.valid_interfaces"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_56b605dc","line":106,"range":{"start_line":105,"start_character":56,"end_line":106,"end_character":52},"in_reply_to":"5fc1f717_62d25c37","updated":"2019-03-06 00:09:14.000000000","message":"Not sure if I understand. Bumping upper constraint should be adequate right? We can still backport this fix to stable/rocky and queens so as long as it doesn\u0027t break lower constraint ironicclient there right?","commit_id":"a5a28ea8f0ab54b8e50b496bb999e7de02882183"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"be7e6986afe06da8ce56a3e34d660d6121eb59ed","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        ironic_conf \u003d CONF[IRONIC_GROUP.name]"},{"line_number":103,"context_line":"        # FIXME(gyee): even though \u0027interface\u0027 had been deprecated in favor of"},{"line_number":104,"context_line":"        # \u0027valid_interfaces\u0027 in KSA, the session adapter in ironicclient is"},{"line_number":105,"context_line":"        # still using \u0027interface\u0027 for endpoint lookups. We\u0027ll need to update"},{"line_number":106,"context_line":"        # this code after we modernize ironicclient."},{"line_number":107,"context_line":"        kwargs[\u0027interface\u0027] \u003d ironic_conf.valid_interfaces"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_6227bcb8","line":106,"range":{"start_line":105,"start_character":56,"end_line":106,"end_character":52},"in_reply_to":"9fdfeff1_7438bd3a","updated":"2019-03-05 22:51:48.000000000","message":"Yes, I\u0027ll fix the \u0027valid_interfaces\u0027 part now.\n\nAs for your second question, the argument for backporting are:\n\n 1. ironicclient broke backward compatibility in queens by not allowing any endpoint other than public endpoint, which bakes the second argument.\n 2. this represents a security risk because this limitation force operators to open up public network access for the controllers. The controller network in production is segmented off, which does not have routes to public networks.","commit_id":"a5a28ea8f0ab54b8e50b496bb999e7de02882183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f20984fe4c12b74bc84d133b5a49ae5f9711d4e0","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        kwargs[\u0027os_ironic_api_version\u0027] \u003d ["},{"line_number":100,"context_line":"            \u0027%d.%d\u0027 % IRONIC_API_VERSION, \u0027%d.%d\u0027 % PRIOR_IRONIC_API_VERSION]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        ironic_conf \u003d CONF[IRONIC_GROUP.name]"},{"line_number":103,"context_line":"        kwargs[\u0027interface\u0027] \u003d ironic_conf.interface"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_a08580af","line":102,"updated":"2019-03-06 23:55:01.000000000","message":"sooo...\n\nThe important thing here is to pass interfaces through to ironic. On the nova side, `valid_interfaces` is still, um, valid. At this point (with your change on the conf side) you\u0027re accepting both; so you need to accommodate either one being specified. So I think here you need to say\n\n kwargs[\u0027interface\u0027] \u003d ironic_conf.valid_interfaces or ironic_conf.interface\n\nor similar. The stuff on the ironicclient side is already set up to handle the value being in either format (string or list) under the same key (\u0027interface\u0027).","commit_id":"481b4d7ad72f2538bc55e9468e37d3479fbc76e6"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b5978b28d1f545b57a1c8d83e572d6ab8880cc39","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        kwargs[\u0027os_ironic_api_version\u0027] \u003d ["},{"line_number":100,"context_line":"            \u0027%d.%d\u0027 % IRONIC_API_VERSION, \u0027%d.%d\u0027 % PRIOR_IRONIC_API_VERSION]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        ironic_conf \u003d CONF[IRONIC_GROUP.name]"},{"line_number":103,"context_line":"        kwargs[\u0027interface\u0027] \u003d ironic_conf.interface"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_0b283584","line":102,"in_reply_to":"5fc1f717_a08580af","updated":"2019-03-07 00:39:49.000000000","message":"Done","commit_id":"481b4d7ad72f2538bc55e9468e37d3479fbc76e6"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"16168ceb8d0e8728ee526e03f3b0698501cea51b","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        # so it is always set unless explicitly unset in the config file."},{"line_number":105,"context_line":"        # Also, \u0027interface\u0027 is deprecated in KSA so we should always be"},{"line_number":106,"context_line":"        # using \u0027valid_interfaces\u0027 whenever possbile."},{"line_number":107,"context_line":"        kwargs[\u0027interface\u0027] \u003d ironic_conf.valid_interfaces or \\"},{"line_number":108,"context_line":"            ironic_conf.interface"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_9d6f8ac4","line":107,"range":{"start_line":107,"start_character":62,"end_line":107,"end_character":63},"updated":"2019-03-07 04:11:35.000000000","message":"Nit: prefer parens over backslash","commit_id":"febf6db11d2e6c5fc023c3b9ce713696411e78fc"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"0554a9b5edfb42fd6910216516de4c0b931da934","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        # so it is always set unless explicitly unset in the config file."},{"line_number":105,"context_line":"        # Also, \u0027interface\u0027 is deprecated in KSA so we should always be"},{"line_number":106,"context_line":"        # using \u0027valid_interfaces\u0027 whenever possbile."},{"line_number":107,"context_line":"        kwargs[\u0027interface\u0027] \u003d ironic_conf.valid_interfaces or \\"},{"line_number":108,"context_line":"            ironic_conf.interface"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_f0c03553","line":107,"range":{"start_line":107,"start_character":62,"end_line":107,"end_character":63},"in_reply_to":"5fc1f717_9d6f8ac4","updated":"2019-03-07 06:08:23.000000000","message":"Done","commit_id":"febf6db11d2e6c5fc023c3b9ce713696411e78fc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1e924aa5b4e0fd4ffed340c8fa87a76076cc965","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            cli \u003d ironic.client.get_client(IRONIC_API_VERSION[0],"},{"line_number":133,"context_line":"                                           endpoint\u003dironic_url,"},{"line_number":134,"context_line":"                                           session\u003dsess, **kwargs)"},{"line_number":135,"context_line":"            # Cache the client so we don\u0027t have to reconstruct and"},{"line_number":136,"context_line":"            # reauthenticate it every time we need it."}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_b7b6def9","line":133,"range":{"start_line":133,"start_character":43,"end_line":133,"end_character":62},"updated":"2019-03-11 15:03:50.000000000","message":"This is where we always pass in an endpoint so we wouldn\u0027t get here correct?\n\nhttps://github.com/openstack/python-ironicclient/blob/2.4.0/ironicclient/client.py#L110\n\nOr is the issue that when we get the ksa adapter above, based on configuration, it\u0027s not using the \"interface\" option which is set in config to \u0027internal\u0027 and \"valid_interfaces\" is nulled out in config? So the endpoint URL we do pass to construct the client is for the public endpoint.","commit_id":"61f3cb49087a715bd6617c7762005cd7d142cf36"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d28336323f6290af952e78ce488fef6121d2d141","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            cli \u003d ironic.client.get_client(IRONIC_API_VERSION[0],"},{"line_number":133,"context_line":"                                           endpoint\u003dironic_url,"},{"line_number":134,"context_line":"                                           session\u003dsess, **kwargs)"},{"line_number":135,"context_line":"            # Cache the client so we don\u0027t have to reconstruct and"},{"line_number":136,"context_line":"            # reauthenticate it every time we need it."}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_405fa90d","line":133,"range":{"start_line":133,"start_character":43,"end_line":133,"end_character":62},"in_reply_to":"5fc1f717_00f1a66b","updated":"2019-03-11 21:20:52.000000000","message":"\u003e As I mentioned before, this patch introduced the problem.\n \u003e \n \u003e https://review.openstack.org/#/c/514673\n \u003e \n \u003e It basically made \u0027interface\u0027 param mandatory because that\u0027s what\u0027s\n \u003e being used to construct the endpoint_filter, which if present, it\n \u003e will tell session to do a endpoint lookup.\n\nAh - it\u0027s not for the request itself; it\u0027s because every request is doing version negotiation (ew!) and that negotiation is what\u0027s using the endpoint filter.\n\n \u003e Unfortunately, ironicclient does not pass endpoint_override either,\n \u003e which it should be if present.\n \u003e \n \u003e https://github.com/openstack/python-ironicclient/blob/stable/queens/ironicclient/common/http.py#L582\n\nNo, by this point endpoint_override has already been parlayed into `url`.\n\n \u003e I think overall, we really need to modernize the ironicclient code\n\nOh hell yeah. Like get rid of it entirely. I\u0027m working on that.\n\n \u003e as there seem to be quite a bit of unnecessary duplication between\n \u003e ironicclient/common/http.py and KSA. We should just pass the the\n \u003e params in the [keystone_authtoken] section all the way through, and\n \u003e let KSA handle the session construction and auth plugin loading.\n\nThat\u0027s what I\u0027ve started to do here [1][2]. However, we can do better long-term by actually getting rid of ironicclient and simply using the ksa adapter constructed in nova to make direct API calls. I\u0027m going to start down that path soon and see where it leads.\n\n[1] https://review.openstack.org/641169\n[2] https://review.openstack.org/641170","commit_id":"61f3cb49087a715bd6617c7762005cd7d142cf36"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e8dc4cb7fd4e69c47f75aac269ff44cd1557816a","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            cli \u003d ironic.client.get_client(IRONIC_API_VERSION[0],"},{"line_number":133,"context_line":"                                           endpoint\u003dironic_url,"},{"line_number":134,"context_line":"                                           session\u003dsess, **kwargs)"},{"line_number":135,"context_line":"            # Cache the client so we don\u0027t have to reconstruct and"},{"line_number":136,"context_line":"            # reauthenticate it every time we need it."}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_35672bc0","line":133,"range":{"start_line":133,"start_character":43,"end_line":133,"end_character":62},"in_reply_to":"5fc1f717_00f1a66b","updated":"2019-03-12 17:42:42.000000000","message":"\u003e As I mentioned before, this patch introduced the problem.\n \u003e \n \u003e https://review.openstack.org/#/c/514673\n \u003e \n \u003e It basically made \u0027interface\u0027 param mandatory because that\u0027s what\u0027s\n \u003e being used to construct the endpoint_filter, which if present, it\n \u003e will tell session to do a endpoint lookup.\n \u003e \n \u003e https://github.com/openstack/keystoneauth/blob/master/keystoneauth1/session.py#L724\n \u003e \n \u003e Unfortunately, ironicclient does not pass endpoint_override either,\n \u003e which it should be if present.\n \u003e \n \u003e https://github.com/openstack/python-ironicclient/blob/stable/queens/ironicclient/common/http.py#L582\n \u003e \n\nThis would have been information for the commit message so you didn\u0027t have to repeat it per reviewer trying to understand this. :)","commit_id":"61f3cb49087a715bd6617c7762005cd7d142cf36"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"76d8037e2c734f7d74479c2bc24df17bb671d815","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            cli \u003d ironic.client.get_client(IRONIC_API_VERSION[0],"},{"line_number":133,"context_line":"                                           endpoint\u003dironic_url,"},{"line_number":134,"context_line":"                                           session\u003dsess, **kwargs)"},{"line_number":135,"context_line":"            # Cache the client so we don\u0027t have to reconstruct and"},{"line_number":136,"context_line":"            # reauthenticate it every time we need it."}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_b5723b7a","line":133,"range":{"start_line":133,"start_character":43,"end_line":133,"end_character":62},"in_reply_to":"5fc1f717_35672bc0","updated":"2019-03-12 17:43:25.000000000","message":"*good information","commit_id":"61f3cb49087a715bd6617c7762005cd7d142cf36"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4f9f1f5092a7e8f7b61d868d014e7335749dd255","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            cli \u003d ironic.client.get_client(IRONIC_API_VERSION[0],"},{"line_number":133,"context_line":"                                           endpoint\u003dironic_url,"},{"line_number":134,"context_line":"                                           session\u003dsess, **kwargs)"},{"line_number":135,"context_line":"            # Cache the client so we don\u0027t have to reconstruct and"},{"line_number":136,"context_line":"            # reauthenticate it every time we need it."}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_daf62ffa","line":133,"range":{"start_line":133,"start_character":43,"end_line":133,"end_character":62},"in_reply_to":"5fc1f717_b7b6def9","updated":"2019-03-11 16:04:19.000000000","message":"I think it depends whether `endpoint` is fully qualified. If it comes from the service catalog, it is; but if we use endpoint_override or api_endpoint, I\u0027m not sure if you\u0027re allowed to specify that as non-fully-qualified. Because if you can do that, then the individual Session.request will use the interface (which is part of endpoint_filter by that time) to construct the base URL [1].\n\nIt\u0027s also possible that, somewhere deep in the bowels of ksa and/or requests where I haven\u0027t looked yet, there\u0027s a sanity check to make sure the interface in the URL doesn\u0027t conflict with the one in the kwargs.\n\nThe fact that the bug exists, is reproducible, and is resolved by this (plus the ironicclient side of the fix) indicates to me that we\u0027re missing the exact code path that gets us here. I wouldn\u0027t mind seeing a stack trace and/or conf dump and/or more detailed logging on the bug [2] so we can figure out what\u0027s really going on.\n\n[1] https://github.com/openstack/keystoneauth/blob/bde07bc95b5b5d16b829f72be7aaa62fab9d716a/keystoneauth1/session.py#L715-L726\n[2] https://bugs.launchpad.net/nova/+bug/1818295","commit_id":"61f3cb49087a715bd6617c7762005cd7d142cf36"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cfd01998760af1146cdcc48a1f67578929fce852","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            cli \u003d ironic.client.get_client(IRONIC_API_VERSION[0],"},{"line_number":133,"context_line":"                                           endpoint\u003dironic_url,"},{"line_number":134,"context_line":"                                           session\u003dsess, **kwargs)"},{"line_number":135,"context_line":"            # Cache the client so we don\u0027t have to reconstruct and"},{"line_number":136,"context_line":"            # reauthenticate it every time we need it."}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_00f1a66b","line":133,"range":{"start_line":133,"start_character":43,"end_line":133,"end_character":62},"in_reply_to":"5fc1f717_daf62ffa","updated":"2019-03-11 17:23:45.000000000","message":"As I mentioned before, this patch introduced the problem.\n\nhttps://review.openstack.org/#/c/514673\n\nIt basically made \u0027interface\u0027 param mandatory because that\u0027s what\u0027s being used to construct the endpoint_filter, which if present, it will tell session to do a endpoint lookup.\n\nhttps://github.com/openstack/keystoneauth/blob/master/keystoneauth1/session.py#L724\n\nUnfortunately, ironicclient does not pass endpoint_override either, which it should be if present.\n\nhttps://github.com/openstack/python-ironicclient/blob/stable/queens/ironicclient/common/http.py#L582\n\nI think overall, we really need to modernize the ironicclient code as there seem to be quite a bit of unnecessary duplication between ironicclient/common/http.py and KSA. We should just pass the the params in the [keystone_authtoken] section all the way through, and let KSA handle the session construction and auth plugin loading. There\u0027s really no need to do that in each layer.","commit_id":"61f3cb49087a715bd6617c7762005cd7d142cf36"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e8dc4cb7fd4e69c47f75aac269ff44cd1557816a","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            \u0027%d.%d\u0027 % IRONIC_API_VERSION, \u0027%d.%d\u0027 % PRIOR_IRONIC_API_VERSION]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        ironic_conf \u003d CONF[IRONIC_GROUP.name]"},{"line_number":103,"context_line":"        kwargs[\u0027interface\u0027] \u003d ironic_conf.valid_interfaces"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"},{"line_number":106,"context_line":"        # service catalog. Use `endpoint_override` if you want to override it."}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_d56d87cc","line":103,"range":{"start_line":103,"start_character":8,"end_line":103,"end_character":27},"updated":"2019-03-12 17:42:42.000000000","message":"This looks weird since we\u0027re assigning a list to what looks like a singular value, e.g. \u0027internal\u0027 or \u0027public\u0027. But if I followed along in the PS8 comments correctly, this all gets passed through to KSA right? And KSA handles interface being a list? It would be nice to have a comment explaining this and if/when we can remove this, i.e. is there something we can do in ironicclient to fix this?\n\nAnd yes I guess KSA is OK with this being a single value or a list:\n\nhttps://github.com/openstack/keystoneauth/blob/83be7453fa0cd36b504b9ec268bd09525376b944/keystoneauth1/identity/base.py#L329\n\nhttps://github.com/openstack/keystoneauth/blob/83be7453fa0cd36b504b9ec268bd09525376b944/keystoneauth1/access/service_catalog.py#L128","commit_id":"73feb4a4987488b27e85cd83c86d3597dc6d3171"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2bf3ff4bdce9acd2ad817f74ccb0ffc15d05544a","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            \u0027%d.%d\u0027 % IRONIC_API_VERSION, \u0027%d.%d\u0027 % PRIOR_IRONIC_API_VERSION]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        ironic_conf \u003d CONF[IRONIC_GROUP.name]"},{"line_number":103,"context_line":"        kwargs[\u0027interface\u0027] \u003d ironic_conf.valid_interfaces"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"},{"line_number":106,"context_line":"        # service catalog. Use `endpoint_override` if you want to override it."}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_70fdc1af","line":103,"range":{"start_line":103,"start_character":8,"end_line":103,"end_character":27},"in_reply_to":"5fc1f717_d56d87cc","updated":"2019-03-12 19:01:09.000000000","message":"Yes, it gets passed through to ksa adapter init, which is set up to handle either a single value or a list as you say. This was done to preserve backward compatibility: it was originally a single value; then valid_interfaces was introduced *as a conf option only* to feed into that same init kwarg. So the single-value behavior was preserved for non-conf-based consumers.","commit_id":"73feb4a4987488b27e85cd83c86d3597dc6d3171"}],"releasenotes/notes/set-endpoint-interface-for-ironicclient-a0b6b8f8dedc7341.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"53d1549cac8dc4fb281dca8cc35b4c414222d4d1","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":5,"context_line":"    endpoint is possible, which breaking deployments where the controllers have"},{"line_number":6,"context_line":"    no route the public network per security requirement. In this case, we must"},{"line_number":7,"context_line":"    pass the (endpoint) interface when constructing the Ironic client."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"9fdfeff1_b401456d","line":5,"range":{"start_line":5,"start_character":32,"end_line":5,"end_character":40},"updated":"2019-03-04 23:26:20.000000000","message":"breaks","commit_id":"a5a28ea8f0ab54b8e50b496bb999e7de02882183"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"be7e6986afe06da8ce56a3e34d660d6121eb59ed","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":5,"context_line":"    endpoint is possible, which breaking deployments where the controllers have"},{"line_number":6,"context_line":"    no route the public network per security requirement. In this case, we must"},{"line_number":7,"context_line":"    pass the (endpoint) interface when constructing the Ironic client."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_822c289a","line":5,"range":{"start_line":5,"start_character":32,"end_line":5,"end_character":40},"in_reply_to":"9fdfeff1_b401456d","updated":"2019-03-05 22:51:48.000000000","message":"Done","commit_id":"a5a28ea8f0ab54b8e50b496bb999e7de02882183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f20984fe4c12b74bc84d133b5a49ae5f9711d4e0","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":5,"context_line":"    endpoint is possible, which breaking deployments where the controllers have"},{"line_number":6,"context_line":"    no route the public network per security requirement. In this case, we must"},{"line_number":7,"context_line":"    pass the (endpoint) interface when constructing the Ironic client."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5fc1f717_20f51058","line":5,"range":{"start_line":5,"start_character":32,"end_line":5,"end_character":40},"updated":"2019-03-06 23:55:01.000000000","message":"breaks","commit_id":"481b4d7ad72f2538bc55e9468e37d3479fbc76e6"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b5978b28d1f545b57a1c8d83e572d6ab8880cc39","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":5,"context_line":"    endpoint is possible, which breaking deployments where the controllers have"},{"line_number":6,"context_line":"    no route the public network per security requirement. In this case, we must"},{"line_number":7,"context_line":"    pass the (endpoint) interface when constructing the Ironic client."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5fc1f717_0b84b55d","line":5,"range":{"start_line":5,"start_character":32,"end_line":5,"end_character":40},"in_reply_to":"5fc1f717_20f51058","updated":"2019-03-07 00:39:49.000000000","message":"Done","commit_id":"481b4d7ad72f2538bc55e9468e37d3479fbc76e6"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f20984fe4c12b74bc84d133b5a49ae5f9711d4e0","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":5,"context_line":"    endpoint is possible, which breaking deployments where the controllers have"},{"line_number":6,"context_line":"    no route the public network per security requirement. In this case, we must"},{"line_number":7,"context_line":"    pass the (endpoint) interface when constructing the Ironic client."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5fc1f717_c0e9ac80","line":6,"range":{"start_line":6,"start_character":13,"end_line":6,"end_character":16},"updated":"2019-03-06 23:55:01.000000000","message":"to the","commit_id":"481b4d7ad72f2538bc55e9468e37d3479fbc76e6"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b5978b28d1f545b57a1c8d83e572d6ab8880cc39","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":5,"context_line":"    endpoint is possible, which breaking deployments where the controllers have"},{"line_number":6,"context_line":"    no route the public network per security requirement. In this case, we must"},{"line_number":7,"context_line":"    pass the (endpoint) interface when constructing the Ironic client."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5fc1f717_2b897174","line":6,"range":{"start_line":6,"start_character":13,"end_line":6,"end_character":16},"in_reply_to":"5fc1f717_c0e9ac80","updated":"2019-03-07 00:39:49.000000000","message":"Done","commit_id":"481b4d7ad72f2538bc55e9468e37d3479fbc76e6"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"1b08ea6638578a5560de74ae18f8c96903d5ab5d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":5,"context_line":"    endpoint is possible, which breaks deployments where the controllers have"},{"line_number":6,"context_line":"    no route to the public network per security requirement. In this case, we must"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5fc1f717_11bb670e","line":3,"updated":"2019-03-08 09:52:01.000000000","message":"Missing the bug # and/or launchpad link","commit_id":"522b89b7960caa70d0f49f39a890388d1b6487db"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"de78bb64e0f1435c0c874edd2cde52b32b9590a8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":5,"context_line":"    endpoint is possible, which breaks deployments where the controllers have"},{"line_number":6,"context_line":"    no route to the public network per security requirement. In this case, we must"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5fc1f717_a2b9dfe9","line":3,"in_reply_to":"5fc1f717_11bb670e","updated":"2019-03-08 14:08:20.000000000","message":"Thanks cmurphy, good catch","commit_id":"522b89b7960caa70d0f49f39a890388d1b6487db"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"1876661234deeec000d700a3a26fcf4e19265bf9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":5,"context_line":"    endpoint is possible, which breaks deployments where the controllers have"},{"line_number":6,"context_line":"    no route to the public network per security requirement. In this case, we must"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5fc1f717_b337f3b0","line":3,"in_reply_to":"5fc1f717_a2b9dfe9","updated":"2019-03-08 16:09:17.000000000","message":"Done","commit_id":"522b89b7960caa70d0f49f39a890388d1b6487db"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fab725c7a485ab45ec4b27e413f25059915eaaa6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [`bug 1818295 \u003chttps://bugs.launchpad.net/nova/+bug/1818295\u003e`_]"},{"line_number":5,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":6,"context_line":"    endpoint is possible, which breaks deployments where the controllers have"},{"line_number":7,"context_line":"    no route to the public network per security requirement. In this case, we"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"5fc1f717_479b64c8","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":67},"updated":"2019-03-08 19:46:29.000000000","message":"✔","commit_id":"c183f8cc816c655663de9bebb1ae88288fad20ca"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fad704440403977077caa22d03c4a96b1d0e41cb","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    [`bug 1818295 \u003chttps://bugs.launchpad.net/nova/+bug/1818295\u003e`_]"},{"line_number":5,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":6,"context_line":"    endpoint is possible, which breaks deployments where the controllers have"},{"line_number":7,"context_line":"    no route to the public network per security requirement. In this case, we"},{"line_number":8,"context_line":"    must pass the (endpoint) interface when constructing the Ironic client."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"5fc1f717_8b4cbc42","line":8,"range":{"start_line":7,"start_character":61,"end_line":8,"end_character":75},"updated":"2019-03-12 19:02:50.000000000","message":"This doesn\u0027t really matter for a release note (the implementation details).\n\nAlso, per the commit message, isn\u0027t this only fixed if you have both the nova fix and a patched python-ironicclient with change I610836e5038774621690aca88b2aee25670f0262?","commit_id":"7f5ba52218ae6de70bd48d0408176f2f51c4fd22"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6d032f942956e8826e6820648126990cb0b48125","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    [`bug 1818295 \u003chttps://bugs.launchpad.net/nova/+bug/1818295\u003e`_]"},{"line_number":5,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":6,"context_line":"    endpoint is possible, which breaks deployments where the controllers have"},{"line_number":7,"context_line":"    no route to the public network per security requirement. In this case, we"},{"line_number":8,"context_line":"    must pass the (endpoint) interface when constructing the Ironic client."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"5fc1f717_6beb90db","line":8,"range":{"start_line":7,"start_character":61,"end_line":8,"end_character":75},"in_reply_to":"5fc1f717_8b4cbc42","updated":"2019-03-12 19:07:49.000000000","message":"Done","commit_id":"7f5ba52218ae6de70bd48d0408176f2f51c4fd22"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a83deb32c22895ebd4e0870b99ea307c12f676fd","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    Fixes the problem with endpoint lookup in Ironic driver where only public"},{"line_number":6,"context_line":"    endpoint is possible, which breaks deployments where the controllers have"},{"line_number":7,"context_line":"    no route to the public network per security requirement. Note that"},{"line_number":8,"context_line":"    ironicclient fix I610836e5038774621690aca88b2aee25670f0262 must also be"},{"line_number":9,"context_line":"    present to resolve the bug."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"5fc1f717_cbdac449","line":8,"range":{"start_line":8,"start_character":4,"end_line":8,"end_character":16},"updated":"2019-03-12 19:08:22.000000000","message":"nit: let\u0027s use the pip name (python-ironicclient).","commit_id":"fdfdf2b49834bf8b4cf5b4a65edf0093a440737a"}]}
