)]}'
{"nova/cmd/status.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"83d54c669a798ad9ee867fc7bd3cb2c0741e9768","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        handling requests it has somewhere to send those builds."},{"line_number":197,"context_line":"        \"\"\""},{"line_number":198,"context_line":"        try:"},{"line_number":199,"context_line":"            # TODO(efried): Use ksa\u0027s version filtering in _placement_get"},{"line_number":200,"context_line":"            versions \u003d self._placement_get(\"/\")"},{"line_number":201,"context_line":"            max_version \u003d pkg_resources.parse_version("},{"line_number":202,"context_line":"                versions[\"versions\"][0][\"max_version\"])"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f4b6375_08060e53","line":199,"updated":"2017-10-27 13:37:46.000000000","message":"I\u0027m not sure that we need 2 TODOs for the same thing.","commit_id":"075133e0cb5cc000cc48e0394923c7af92cce15d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1078c714bdeb15e5ef4a9b8090007a782d1cf896","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        handling requests it has somewhere to send those builds."},{"line_number":197,"context_line":"        \"\"\""},{"line_number":198,"context_line":"        try:"},{"line_number":199,"context_line":"            # TODO(efried): Use ksa\u0027s version filtering in _placement_get"},{"line_number":200,"context_line":"            versions \u003d self._placement_get(\"/\")"},{"line_number":201,"context_line":"            max_version \u003d pkg_resources.parse_version("},{"line_number":202,"context_line":"                versions[\"versions\"][0][\"max_version\"])"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f4b6375_4320679b","line":199,"in_reply_to":"3f4b6375_08060e53","updated":"2017-10-27 13:58:17.000000000","message":"Done","commit_id":"075133e0cb5cc000cc48e0394923c7af92cce15d"}],"nova/conf/placement.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"aa74c9bbf7e9cfcc22492d1d49bfc30b95d6c1e4","unresolved":false,"context_lines":[{"line_number":40,"context_line":"\"\"\")"},{"line_number":41,"context_line":"]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"deprecated_opts \u003d {"},{"line_number":44,"context_line":"    \u0027region_name\u0027: [cfg.DeprecatedOpt(\u0027os_region_name\u0027,"},{"line_number":45,"context_line":"                                      group\u003dplacement_group.name)],"},{"line_number":46,"context_line":"    \u0027valid_interfaces\u0027: [cfg.DeprecatedOpt(\u0027os_interface\u0027,"},{"line_number":47,"context_line":"                                           group\u003dplacement_group.name)]"},{"line_number":48,"context_line":"}"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def register_opts(conf):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f287b81_38296236","line":48,"range":{"start_line":43,"start_character":0,"end_line":48,"end_character":1},"updated":"2017-09-07 22:25:30.000000000","message":"reno these","commit_id":"490d5c9f26848e871adb09c7ed31bbf092b0df90"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"87325eb70f33a0039053bf78c0b66ade6d46c76e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"\"\"\")"},{"line_number":41,"context_line":"]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"deprecated_opts \u003d {"},{"line_number":44,"context_line":"    \u0027region_name\u0027: [cfg.DeprecatedOpt(\u0027os_region_name\u0027,"},{"line_number":45,"context_line":"                                      group\u003dplacement_group.name)],"},{"line_number":46,"context_line":"    \u0027valid_interfaces\u0027: [cfg.DeprecatedOpt(\u0027os_interface\u0027,"},{"line_number":47,"context_line":"                                           group\u003dplacement_group.name)]"},{"line_number":48,"context_line":"}"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def register_opts(conf):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f287b81_5831ce58","line":48,"range":{"start_line":43,"start_character":0,"end_line":48,"end_character":1},"in_reply_to":"7f287b81_38296236","updated":"2017-09-07 22:25:43.000000000","message":"Done","commit_id":"490d5c9f26848e871adb09c7ed31bbf092b0df90"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"00d2277929989b8c75bb7f6fa7d5f567102996ee","unresolved":false,"context_lines":[{"line_number":41,"context_line":"]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"deprecated_opts \u003d {"},{"line_number":44,"context_line":"    \u0027region_name\u0027: [cfg.DeprecatedOpt(\u0027os_region_name\u0027,"},{"line_number":45,"context_line":"                                      group\u003dplacement_group.name)],"},{"line_number":46,"context_line":"    \u0027valid_interfaces\u0027: [cfg.DeprecatedOpt(\u0027os_interface\u0027,"},{"line_number":47,"context_line":"                                           group\u003dplacement_group.name)]"},{"line_number":48,"context_line":"}"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_a3971b45","line":47,"range":{"start_line":44,"start_character":4,"end_line":47,"end_character":71},"updated":"2017-10-27 14:17:32.000000000","message":"Don\u0027t you actually need to mark these as deprecated above and give a deprecated_since and deprecated_reason to explain that they are redundant with the ksa options and those should be used instead?\n\nI see the ksa options have a mention about the others being deprecated:\n\n# List of interfaces, in order of preference, for endpoint URL. (list value)\n# Deprecated group/name - [placement]/os_interface\n#valid_interfaces \u003d internal,public\n\n# The default region_name for endpoint URL discovery. (string value)\n# Deprecated group/name - [placement]/os_region_name\n#region_name \u003d \u003cNone\u003e\n\nBut shouldn\u0027t we explicitly call out the placement options that are deprecated (since and reason?).","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d694d4cfc0f76eb97c0b881a0bbe7f6298d30f74","unresolved":false,"context_lines":[{"line_number":41,"context_line":"]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"deprecated_opts \u003d {"},{"line_number":44,"context_line":"    \u0027region_name\u0027: [cfg.DeprecatedOpt(\u0027os_region_name\u0027,"},{"line_number":45,"context_line":"                                      group\u003dplacement_group.name)],"},{"line_number":46,"context_line":"    \u0027valid_interfaces\u0027: [cfg.DeprecatedOpt(\u0027os_interface\u0027,"},{"line_number":47,"context_line":"                                           group\u003dplacement_group.name)]"},{"line_number":48,"context_line":"}"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_3ea9008f","line":47,"range":{"start_line":44,"start_character":4,"end_line":47,"end_character":71},"in_reply_to":"3f4b6375_a3971b45","updated":"2017-10-27 14:47:26.000000000","message":"Done","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9e04851b6e06e74a8066c8d64dfac56a8511294d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \u0027os_region_name\u0027,"},{"line_number":29,"context_line":"        deprecated_for_removal\u003dTrue,"},{"line_number":30,"context_line":"        deprecated_since\u003d\u002717.0.0\u0027,"},{"line_number":31,"context_line":"        deprecated_reason\u003d\u0027Endpoint lookup uses the service catalog via \u0027"},{"line_number":32,"context_line":"                          \u0027common keystoneauth1 Adapter configuration \u0027"},{"line_number":33,"context_line":"                          \u0027options.\u0027,"},{"line_number":34,"context_line":"        help\u003d\"\"\""},{"line_number":35,"context_line":"Region name of this node. This is used when picking the URL in the service"},{"line_number":36,"context_line":"catalog."}],"source_content_type":"text/x-python","patch_set":18,"id":"3f4b6375_393913f2","line":33,"range":{"start_line":31,"start_character":27,"end_line":33,"end_character":34},"updated":"2017-10-27 20:54:58.000000000","message":"nit: mention the \"region_name\" option in here specifically?","commit_id":"55b80cfa48126f9bdd8b8c0980eebfcadc921386"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6dd0f9e717a45540452a6c37af1e708f099a0c64","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \u0027os_region_name\u0027,"},{"line_number":29,"context_line":"        deprecated_for_removal\u003dTrue,"},{"line_number":30,"context_line":"        deprecated_since\u003d\u002717.0.0\u0027,"},{"line_number":31,"context_line":"        deprecated_reason\u003d\u0027Endpoint lookup uses the service catalog via \u0027"},{"line_number":32,"context_line":"                          \u0027common keystoneauth1 Adapter configuration \u0027"},{"line_number":33,"context_line":"                          \u0027options.\u0027,"},{"line_number":34,"context_line":"        help\u003d\"\"\""},{"line_number":35,"context_line":"Region name of this node. This is used when picking the URL in the service"},{"line_number":36,"context_line":"catalog."}],"source_content_type":"text/x-python","patch_set":18,"id":"3f4b6375_c1756534","line":33,"range":{"start_line":31,"start_character":27,"end_line":33,"end_character":34},"in_reply_to":"3f4b6375_393913f2","updated":"2017-10-27 23:09:39.000000000","message":"Done","commit_id":"55b80cfa48126f9bdd8b8c0980eebfcadc921386"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9e04851b6e06e74a8066c8d64dfac56a8511294d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027os_interface\u0027,"},{"line_number":44,"context_line":"        deprecated_for_removal\u003dTrue,"},{"line_number":45,"context_line":"        deprecated_since\u003d\u002717.0.0\u0027,"},{"line_number":46,"context_line":"        deprecated_reason\u003d\u0027Endpoint lookup uses the service catalog via \u0027"},{"line_number":47,"context_line":"                          \u0027common keystoneauth1 Adapter configuration \u0027"},{"line_number":48,"context_line":"                          \u0027options.\u0027,"},{"line_number":49,"context_line":"        help\u003d\"\"\""},{"line_number":50,"context_line":"Endpoint interface for this node. This is used when picking the URL in the"},{"line_number":51,"context_line":"service catalog."}],"source_content_type":"text/x-python","patch_set":18,"id":"3f4b6375_f9225bba","line":48,"range":{"start_line":46,"start_character":27,"end_line":48,"end_character":35},"updated":"2017-10-27 20:54:58.000000000","message":"Mention \"valid_interfaces\" specifically?","commit_id":"55b80cfa48126f9bdd8b8c0980eebfcadc921386"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6dd0f9e717a45540452a6c37af1e708f099a0c64","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027os_interface\u0027,"},{"line_number":44,"context_line":"        deprecated_for_removal\u003dTrue,"},{"line_number":45,"context_line":"        deprecated_since\u003d\u002717.0.0\u0027,"},{"line_number":46,"context_line":"        deprecated_reason\u003d\u0027Endpoint lookup uses the service catalog via \u0027"},{"line_number":47,"context_line":"                          \u0027common keystoneauth1 Adapter configuration \u0027"},{"line_number":48,"context_line":"                          \u0027options.\u0027,"},{"line_number":49,"context_line":"        help\u003d\"\"\""},{"line_number":50,"context_line":"Endpoint interface for this node. This is used when picking the URL in the"},{"line_number":51,"context_line":"service catalog."}],"source_content_type":"text/x-python","patch_set":18,"id":"3f4b6375_a1726948","line":48,"range":{"start_line":46,"start_character":27,"end_line":48,"end_character":35},"in_reply_to":"3f4b6375_f9225bba","updated":"2017-10-27 23:09:39.000000000","message":"Done","commit_id":"55b80cfa48126f9bdd8b8c0980eebfcadc921386"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e3fa340b7ec50ea90d333a9be91514eb86a4d663","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \u0027os_region_name\u0027,"},{"line_number":29,"context_line":"        deprecated_for_removal\u003dTrue,"},{"line_number":30,"context_line":"        deprecated_since\u003d\u002717.0.0\u0027,"},{"line_number":31,"context_line":"        deprecated_name\u003d\u0027region_name\u0027,"},{"line_number":32,"context_line":"        deprecated_reason\u003d\u0027Endpoint lookup uses the service catalog via \u0027"},{"line_number":33,"context_line":"                          \u0027common keystoneauth1 Adapter configuration \u0027"},{"line_number":34,"context_line":"                          \u0027options.  Use the region_name option instead.\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f4b6375_9ad0f255","line":31,"updated":"2017-10-28 01:51:50.000000000","message":"I don\u0027t think this is what you want - this is when you rename something, so this says, \u0027region_name\u0027 is the old deprecated name, you want to use \u0027os_region_name\u0027 now, which isn\u0027t what you want. I think what you added to the deprecated_reason is good enough.\n\nThis is how it\u0027s rendered in the sample config file:\n\n# DEPRECATED:\n# Region name of this node. This is used when picking the URL in the service\n# catalog.\n#\n# Possible values:\n#\n# * Any string representing region name\n#  (string value)\n# Deprecated group/name - [placement]/region_name\n# This option is deprecated for removal since 17.0.0.\n# Its value may be silently ignored in the future.\n# Reason: Endpoint lookup uses the service catalog via common keystoneauth1\n# Adapter configuration options.  Use the region_name option instead.\n#os_region_name \u003d \u003cNone\u003e\n\nhttp://logs.openstack.org/47/492247/19/check/build-openstack-sphinx-docs/ff5c410/html/configuration/sample-config.html\n\nAnd that\u0027s not what you want.","commit_id":"374fe5a8b743bfa885f77bfcfc472214d237b9fe"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"417b55a487f16878b128edb095dfd6d206946555","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \u0027os_region_name\u0027,"},{"line_number":29,"context_line":"        deprecated_for_removal\u003dTrue,"},{"line_number":30,"context_line":"        deprecated_since\u003d\u002717.0.0\u0027,"},{"line_number":31,"context_line":"        deprecated_name\u003d\u0027region_name\u0027,"},{"line_number":32,"context_line":"        deprecated_reason\u003d\u0027Endpoint lookup uses the service catalog via \u0027"},{"line_number":33,"context_line":"                          \u0027common keystoneauth1 Adapter configuration \u0027"},{"line_number":34,"context_line":"                          \u0027options.  Use the region_name option instead.\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f4b6375_fa1c8614","line":31,"in_reply_to":"3f4b6375_9ad0f255","updated":"2017-10-28 02:12:05.000000000","message":"Oh, right, duh - I have been known to get those backwards.","commit_id":"374fe5a8b743bfa885f77bfcfc472214d237b9fe"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b6f204146f58a62d240b506ecac58b6b4b388ee9","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from nova.objects import fields"},{"line_number":32,"context_line":"from nova.scheduler import utils as scheduler_utils"},{"line_number":33,"context_line":"from nova import utils"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_c3e217a0","line":34,"updated":"2017-10-27 14:29:16.000000000","message":"This is highly offensive.","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d694d4cfc0f76eb97c0b881a0bbe7f6298d30f74","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from nova.objects import fields"},{"line_number":32,"context_line":"from nova.scheduler import utils as scheduler_utils"},{"line_number":33,"context_line":"from nova import utils"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_1e71a4a8","line":34,"in_reply_to":"3f4b6375_c3e217a0","updated":"2017-10-27 14:47:26.000000000","message":"I\u0027m with you, but edmondsw is constantly referencing [1]... although he doesn\u0027t seem to have done that on this patch.\n\n[1] https://docs.openstack.org/hacking/latest/user/hacking.html#import-order-template","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b6f204146f58a62d240b506ecac58b6b4b388ee9","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        self._provider_tree \u003d provider_tree.ProviderTree()"},{"line_number":255,"context_line":"        self._provider_aggregate_map \u003d {}"},{"line_number":256,"context_line":"        self.aggregate_refresh_time \u003d {}"},{"line_number":257,"context_line":"        # TODO(mriedem): Perform some version discovery at some point."},{"line_number":258,"context_line":"        client \u003d utils.get_ksa_adapter(\u0027placement\u0027)"},{"line_number":259,"context_line":"        # Set accept header on every request to ensure we notify placement"},{"line_number":260,"context_line":"        # service of our response body media type preferences."}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_834e5f94","line":257,"range":{"start_line":257,"start_character":8,"end_line":257,"end_character":70},"updated":"2017-10-27 14:29:16.000000000","message":"This isn\u0027t really the right place for this, it\u0027s something we should check per request, not when creating the client.","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6dd0f9e717a45540452a6c37af1e708f099a0c64","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        self._provider_tree \u003d provider_tree.ProviderTree()"},{"line_number":255,"context_line":"        self._provider_aggregate_map \u003d {}"},{"line_number":256,"context_line":"        self.aggregate_refresh_time \u003d {}"},{"line_number":257,"context_line":"        # TODO(mriedem): Perform some version discovery at some point."},{"line_number":258,"context_line":"        client \u003d utils.get_ksa_adapter(\u0027placement\u0027)"},{"line_number":259,"context_line":"        # Set accept header on every request to ensure we notify placement"},{"line_number":260,"context_line":"        # service of our response body media type preferences."}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_612eb1fb","line":257,"range":{"start_line":257,"start_character":8,"end_line":257,"end_character":70},"in_reply_to":"3f4b6375_6b2b3282","updated":"2017-10-27 23:09:39.000000000","message":"Rightright.  So I assumed the TODO was there because we want to do that other thing at some point.  If we do, this is where it ought to be done.  If we don\u0027t, then we don\u0027t need the TODO.  In either case, either doing the discovery or removing the TODO would be appropriate for a followon patch.","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d694d4cfc0f76eb97c0b881a0bbe7f6298d30f74","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        self._provider_tree \u003d provider_tree.ProviderTree()"},{"line_number":255,"context_line":"        self._provider_aggregate_map \u003d {}"},{"line_number":256,"context_line":"        self.aggregate_refresh_time \u003d {}"},{"line_number":257,"context_line":"        # TODO(mriedem): Perform some version discovery at some point."},{"line_number":258,"context_line":"        client \u003d utils.get_ksa_adapter(\u0027placement\u0027)"},{"line_number":259,"context_line":"        # Set accept header on every request to ensure we notify placement"},{"line_number":260,"context_line":"        # service of our response body media type preferences."}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_fedec86a","line":257,"range":{"start_line":257,"start_character":8,"end_line":257,"end_character":70},"in_reply_to":"3f4b6375_834e5f94","updated":"2017-10-27 14:47:26.000000000","message":"At client creation time is when we get to find out (from the endpoint) what microversions the other side supports.  We would presumably cache that information so we can know what microversions we should be sending on a per-call basis (and moreover what functionality is or is not supported).  If we left it per-call, we\u0027d be sending our preferred microversion over the wire and getting a bounce from the server if it\u0027s not supported.  (Which would be one way of doing it, I suppose.)","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9e04851b6e06e74a8066c8d64dfac56a8511294d","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        self._provider_tree \u003d provider_tree.ProviderTree()"},{"line_number":255,"context_line":"        self._provider_aggregate_map \u003d {}"},{"line_number":256,"context_line":"        self.aggregate_refresh_time \u003d {}"},{"line_number":257,"context_line":"        # TODO(mriedem): Perform some version discovery at some point."},{"line_number":258,"context_line":"        client \u003d utils.get_ksa_adapter(\u0027placement\u0027)"},{"line_number":259,"context_line":"        # Set accept header on every request to ensure we notify placement"},{"line_number":260,"context_line":"        # service of our response body media type preferences."}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_6b2b3282","line":257,"range":{"start_line":257,"start_character":8,"end_line":257,"end_character":70},"in_reply_to":"3f4b6375_fedec86a","updated":"2017-10-27 20:54:58.000000000","message":"\u003e If we left it per-call, we\u0027d be sending our preferred microversion over the wire and getting a bounce from the server if it\u0027s not supported. (Which would be one way of doing it, I suppose.)\n\nThat\u0027s actually what we\u0027re doing today - we\u0027re just sending the version we want and assuming Placement will handle it, otherwise we\u0027ll get a 404 or 405 back I think depending on the call. We\u0027ve just papered over this by putting stuff in the release notes saying things like, \"make sure placement is upgraded before conductor and scheduler and is at version 1.10\".","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b6f204146f58a62d240b506ecac58b6b4b388ee9","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        # media type to application/json for us. Placement API is"},{"line_number":278,"context_line":"        # more sensitive to this than other APIs in the OpenStack"},{"line_number":279,"context_line":"        # ecosystem."},{"line_number":280,"context_line":"        kwargs \u003d {\u0027microversion\u0027: version}"},{"line_number":281,"context_line":"        if data:"},{"line_number":282,"context_line":"            kwargs[\u0027json\u0027] \u003d data"},{"line_number":283,"context_line":"        return self._client.put(url, raise_exc\u003dFalse, **kwargs)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def delete(self, url, version\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_233c4bdf","line":282,"range":{"start_line":280,"start_character":8,"end_line":282,"end_character":33},"updated":"2017-10-27 14:29:16.000000000","message":"You\u0027re handling this differently than in post() above - not a big deal, just inconsistent. I prefer what you have above.","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d694d4cfc0f76eb97c0b881a0bbe7f6298d30f74","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        # media type to application/json for us. Placement API is"},{"line_number":278,"context_line":"        # more sensitive to this than other APIs in the OpenStack"},{"line_number":279,"context_line":"        # ecosystem."},{"line_number":280,"context_line":"        kwargs \u003d {\u0027microversion\u0027: version}"},{"line_number":281,"context_line":"        if data:"},{"line_number":282,"context_line":"            kwargs[\u0027json\u0027] \u003d data"},{"line_number":283,"context_line":"        return self._client.put(url, raise_exc\u003dFalse, **kwargs)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def delete(self, url, version\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_fe4c8842","line":282,"range":{"start_line":280,"start_character":8,"end_line":282,"end_character":33},"in_reply_to":"3f4b6375_233c4bdf","updated":"2017-10-27 14:47:26.000000000","message":"I agree, but I\u0027m actually just being very careful not to change what was there before.  If you take a look at the base rev, post is always sending the data; whereas put is sending it only if there\u0027s something there.  I didn\u0027t know whether there was some significance to that distinction, so I made sure to duplicate it.","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9e04851b6e06e74a8066c8d64dfac56a8511294d","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        # media type to application/json for us. Placement API is"},{"line_number":278,"context_line":"        # more sensitive to this than other APIs in the OpenStack"},{"line_number":279,"context_line":"        # ecosystem."},{"line_number":280,"context_line":"        kwargs \u003d {\u0027microversion\u0027: version}"},{"line_number":281,"context_line":"        if data:"},{"line_number":282,"context_line":"            kwargs[\u0027json\u0027] \u003d data"},{"line_number":283,"context_line":"        return self._client.put(url, raise_exc\u003dFalse, **kwargs)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def delete(self, url, version\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_4b5516fa","line":282,"range":{"start_line":280,"start_character":8,"end_line":282,"end_character":33},"in_reply_to":"3f4b6375_fe4c8842","updated":"2017-10-27 20:54:58.000000000","message":"Oh yeah, huh, weird. Probably just different people wrote each method.","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"}],"nova/tests/unit/cmd/test_status.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9e04851b6e06e74a8066c8d64dfac56a8511294d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        self.assertTrue(mock_get.called)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def test_placement_get_interface_default(self):"},{"line_number":144,"context_line":"        \"\"\"Tests that we try internal, then public interface by default.\"\"\""},{"line_number":145,"context_line":"        self._test_placement_get_interface([\u0027internal\u0027, \u0027public\u0027])"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def test_placement_get_interface_internal(self):"},{"line_number":148,"context_line":"        \"\"\"Tests that \"internal\" is specified for interface when configured.\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_8be78e47","line":145,"range":{"start_line":144,"start_character":8,"end_line":145,"end_character":66},"updated":"2017-10-27 20:54:58.000000000","message":"os_interface defaults to None which means it defaults to whatever KSA defaults to, and I\u0027m pretty sure that\u0027s \"public\", at least with how we did things before the KSA adapter stuff.\n\nSo this is probably something worth mentioning in the release note that while os_interface is deprecated in favor of valid_interfaces, the defaults will change from \u0027public\u0027 to \u0027internal\u0027 as the first choice if you don\u0027t specify it in config.","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6dd0f9e717a45540452a6c37af1e708f099a0c64","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        self.assertTrue(mock_get.called)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def test_placement_get_interface_default(self):"},{"line_number":144,"context_line":"        \"\"\"Tests that we try internal, then public interface by default.\"\"\""},{"line_number":145,"context_line":"        self._test_placement_get_interface([\u0027internal\u0027, \u0027public\u0027])"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def test_placement_get_interface_internal(self):"},{"line_number":148,"context_line":"        \"\"\"Tests that \"internal\" is specified for interface when configured.\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_a18dc9d4","line":145,"range":{"start_line":144,"start_character":8,"end_line":145,"end_character":66},"in_reply_to":"3f4b6375_8be78e47","updated":"2017-10-27 23:09:39.000000000","message":"Done","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b6f204146f58a62d240b506ecac58b6b4b388ee9","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def test_placement_get_interface_internal(self):"},{"line_number":148,"context_line":"        \"\"\"Tests that \"internal\" is specified for interface when configured.\"\"\""},{"line_number":149,"context_line":"        # TODO(efried): Test that the deprecated opts (e.g. os_interface) still"},{"line_number":150,"context_line":"        #               work once bug #1709728 is resolved."},{"line_number":151,"context_line":"        self.flags(valid_interfaces\u003d\u0027internal\u0027, group\u003d\u0027placement\u0027)"},{"line_number":152,"context_line":"        self._test_placement_get_interface([\u0027internal\u0027])"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_fe148845","line":150,"range":{"start_line":149,"start_character":8,"end_line":150,"end_character":59},"updated":"2017-10-27 14:29:16.000000000","message":"So you\u0027re deprecating something and the replacement doesn\u0027t work yet?","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9e04851b6e06e74a8066c8d64dfac56a8511294d","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def test_placement_get_interface_internal(self):"},{"line_number":148,"context_line":"        \"\"\"Tests that \"internal\" is specified for interface when configured.\"\"\""},{"line_number":149,"context_line":"        # TODO(efried): Test that the deprecated opts (e.g. os_interface) still"},{"line_number":150,"context_line":"        #               work once bug #1709728 is resolved."},{"line_number":151,"context_line":"        self.flags(valid_interfaces\u003d\u0027internal\u0027, group\u003d\u0027placement\u0027)"},{"line_number":152,"context_line":"        self._test_placement_get_interface([\u0027internal\u0027])"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_cb6106d6","line":150,"range":{"start_line":149,"start_character":8,"end_line":150,"end_character":59},"in_reply_to":"3f4b6375_7e30989f","updated":"2017-10-27 20:54:58.000000000","message":"OK so if we tell people not to use os_interface and instead start setting valid_interfaces, it will work, yes? And vice-versa?","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6dd0f9e717a45540452a6c37af1e708f099a0c64","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def test_placement_get_interface_internal(self):"},{"line_number":148,"context_line":"        \"\"\"Tests that \"internal\" is specified for interface when configured.\"\"\""},{"line_number":149,"context_line":"        # TODO(efried): Test that the deprecated opts (e.g. os_interface) still"},{"line_number":150,"context_line":"        #               work once bug #1709728 is resolved."},{"line_number":151,"context_line":"        self.flags(valid_interfaces\u003d\u0027internal\u0027, group\u003d\u0027placement\u0027)"},{"line_number":152,"context_line":"        self._test_placement_get_interface([\u0027internal\u0027])"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_61659145","line":150,"range":{"start_line":149,"start_character":8,"end_line":150,"end_character":59},"in_reply_to":"3f4b6375_cb6106d6","updated":"2017-10-27 23:09:39.000000000","message":"Yes.  The bug only affects test.","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d694d4cfc0f76eb97c0b881a0bbe7f6298d30f74","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def test_placement_get_interface_internal(self):"},{"line_number":148,"context_line":"        \"\"\"Tests that \"internal\" is specified for interface when configured.\"\"\""},{"line_number":149,"context_line":"        # TODO(efried): Test that the deprecated opts (e.g. os_interface) still"},{"line_number":150,"context_line":"        #               work once bug #1709728 is resolved."},{"line_number":151,"context_line":"        self.flags(valid_interfaces\u003d\u0027internal\u0027, group\u003d\u0027placement\u0027)"},{"line_number":152,"context_line":"        self._test_placement_get_interface([\u0027internal\u0027])"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_7e30989f","line":150,"range":{"start_line":149,"start_character":8,"end_line":150,"end_character":59},"in_reply_to":"3f4b6375_fe148845","updated":"2017-10-27 14:47:26.000000000","message":"The replacement works in code - the bug is that CONF.set_override (the guts of self.flags) doesn\u0027t do the swap-o change-o between the old name and the new name correctly, so I can\u0027t actually write a test that proves that setting os_interface shows up in the code as valid_interfaces.","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"}],"nova/utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b6f204146f58a62d240b506ecac58b6b4b388ee9","unresolved":false,"context_lines":[{"line_number":1299,"context_line":"    \"\"\""},{"line_number":1300,"context_line":"    # Get the conf group corresponding to the service type."},{"line_number":1301,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"},{"line_number":1302,"context_line":"    if not confgrp or not hasattr(CONF, confgrp):"},{"line_number":1303,"context_line":"        # Try the service type as the conf group.  This is necessary for e.g."},{"line_number":1304,"context_line":"        # placement, while it\u0027s still part of the nova project."},{"line_number":1305,"context_line":"        # Note that this might become the first thing we try if/as we move to"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_fe3da8c3","line":1302,"updated":"2017-10-27 14:29:16.000000000","message":"Why do we need this? The service_type is \u0027placement\u0027 and the config group is \u0027placement\u0027 so why the special hackery?","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6dd0f9e717a45540452a6c37af1e708f099a0c64","unresolved":false,"context_lines":[{"line_number":1299,"context_line":"    \"\"\""},{"line_number":1300,"context_line":"    # Get the conf group corresponding to the service type."},{"line_number":1301,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"},{"line_number":1302,"context_line":"    if not confgrp or not hasattr(CONF, confgrp):"},{"line_number":1303,"context_line":"        # Try the service type as the conf group.  This is necessary for e.g."},{"line_number":1304,"context_line":"        # placement, while it\u0027s still part of the nova project."},{"line_number":1305,"context_line":"        # Note that this might become the first thing we try if/as we move to"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_043a6bcc","line":1302,"in_reply_to":"3f4b6375_2ba89ad9","updated":"2017-10-27 23:09:39.000000000","message":"It\u0027s not a bug in sta; it\u0027s just that we\u0027re *generally* using project names rather than service types as conf group names.  placement is the exception, and is actually the direction we (read: Monty) want to go.\n\nWhen placement splits, it will go to a project presumably called \u0027placement\u0027.  If that happens, this code will still work, but this condition won\u0027t trigger because the get_project_name above will actually hit.  If the project name isn\u0027t \u0027placement\u0027, then - as long as the project name doesn\u0027t conflict with some existing conf group - the code path will be identical (i.e. falling back to the service type name).\n\nConfused yet?","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9e04851b6e06e74a8066c8d64dfac56a8511294d","unresolved":false,"context_lines":[{"line_number":1299,"context_line":"    \"\"\""},{"line_number":1300,"context_line":"    # Get the conf group corresponding to the service type."},{"line_number":1301,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"},{"line_number":1302,"context_line":"    if not confgrp or not hasattr(CONF, confgrp):"},{"line_number":1303,"context_line":"        # Try the service type as the conf group.  This is necessary for e.g."},{"line_number":1304,"context_line":"        # placement, while it\u0027s still part of the nova project."},{"line_number":1305,"context_line":"        # Note that this might become the first thing we try if/as we move to"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_2ba89ad9","line":1302,"in_reply_to":"3f4b6375_7ea3f8b2","updated":"2017-10-27 20:54:58.000000000","message":"Hmm, seems like a bug in the service type authority - what happens when we eventually split out placement?","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d694d4cfc0f76eb97c0b881a0bbe7f6298d30f74","unresolved":false,"context_lines":[{"line_number":1299,"context_line":"    \"\"\""},{"line_number":1300,"context_line":"    # Get the conf group corresponding to the service type."},{"line_number":1301,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"},{"line_number":1302,"context_line":"    if not confgrp or not hasattr(CONF, confgrp):"},{"line_number":1303,"context_line":"        # Try the service type as the conf group.  This is necessary for e.g."},{"line_number":1304,"context_line":"        # placement, while it\u0027s still part of the nova project."},{"line_number":1305,"context_line":"        # Note that this might become the first thing we try if/as we move to"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_7ea3f8b2","line":1302,"in_reply_to":"3f4b6375_fe3da8c3","updated":"2017-10-27 14:47:26.000000000","message":"For everything else, we glean the conf group name from sta by mapping the service type (e.g. \u0027image\u0027) to its project name (e.g. \u0027glance\u0027).  But the project name for service type \u0027placement\u0027 is \u0027nova\u0027.  Fortunately there\u0027s no [nova] conf group, or we would have had to do some *other* kind of special hackery.","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"}],"releasenotes/notes/placement-via-ksa-02d87c87636912f8.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"21d8ed85e56c509cadd2385ea2ee8d040d39876f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    follows::"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"      os_region_name  deprecated in favor of  region_name"},{"line_number":13,"context_line":"      os_interface    deprecated in favor of  valid_interfaces"}],"source_content_type":"text/x-yaml","patch_set":9,"id":"7f287b81_d346bf50","line":13,"updated":"2017-09-07 22:46:00.000000000","message":"lookit that fancy formatting","commit_id":"0180e70b446096b6316c71c44c4cbbf892d4fc65"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c9e070598ef9b1293716f33c44adc92e64611a92","unresolved":false,"context_lines":[{"line_number":7,"context_line":"deprecations:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    Configuration options in the ``[placement]`` section are deprecated as"},{"line_number":10,"context_line":"    follows::"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"      os_region_name  deprecated in favor of  region_name"},{"line_number":13,"context_line":"      os_interface    deprecated in favor of  valid_interfaces"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3f4b6375_83c9bf26","line":13,"range":{"start_line":10,"start_character":11,"end_line":13,"end_character":62},"updated":"2017-10-27 14:21:42.000000000","message":"This renders weird as code, the \"in\" is highlighted. How about just doing a bulleted list and putting the config option names in ``option``?","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d694d4cfc0f76eb97c0b881a0bbe7f6298d30f74","unresolved":false,"context_lines":[{"line_number":7,"context_line":"deprecations:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    Configuration options in the ``[placement]`` section are deprecated as"},{"line_number":10,"context_line":"    follows::"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"      os_region_name  deprecated in favor of  region_name"},{"line_number":13,"context_line":"      os_interface    deprecated in favor of  valid_interfaces"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3f4b6375_6336c305","line":13,"range":{"start_line":10,"start_character":11,"end_line":13,"end_character":62},"in_reply_to":"3f4b6375_83c9bf26","updated":"2017-10-27 14:47:26.000000000","message":"Done","commit_id":"e13481bf603d97aee258b01fb2d30f2be0a48183"}]}
