)]}'
{"etc/nova/nova.conf.sample":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"c3007905b65eb6529d7c434535528a107550d7e0","unresolved":false,"context_lines":[{"line_number":420,"context_line":"# Specify the extension aliases here."},{"line_number":421,"context_line":"#v3_api_extensions_blacklist\u003d"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"# If the list is not empty then a v3 API extension "},{"line_number":424,"context_line":"# will only be loaded if it exists in this list. "},{"line_number":425,"context_line":"# Specify the extension aliases here"},{"line_number":426,"context_line":"#v3_api_extensions_whitelist\u003d"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"AAAAPH%2F%2FlvY%3D","line":423,"updated":"2013-05-29 20:49:44.000000000","message":"Trailing whitespace","commit_id":"7348b6b07f81392154e8b06a76017cbf6abf6017"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"fe663d3c317ce0166bc5f8f097ce00bc6e426b34","unresolved":false,"context_lines":[{"line_number":420,"context_line":"# Specify the extension aliases here."},{"line_number":421,"context_line":"#v3_api_extensions_blacklist\u003d"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"# If the list is not empty then a v3 API extension "},{"line_number":424,"context_line":"# will only be loaded if it exists in this list. "},{"line_number":425,"context_line":"# Specify the extension aliases here"},{"line_number":426,"context_line":"#v3_api_extensions_whitelist\u003d"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"AAAAPH%2F%2FlB0%3D","line":423,"in_reply_to":"AAAAPH%2F%2FlvY%3D","updated":"2013-05-30 04:20:16.000000000","message":"Done","commit_id":"7348b6b07f81392154e8b06a76017cbf6abf6017"}],"nova/api/openstack/__init__.py":[{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"462203bdfc098c78d1f00e322b96cb7d25f285fb","unresolved":false,"context_lines":[{"line_number":229,"context_line":"                                               extensions.V3APIExtensionBase):"},{"line_number":230,"context_line":"                if ext.obj.alias in CONF.v3_api_extensions_blacklist:"},{"line_number":231,"context_line":"                    LOG.warning(\"Not loading %s because it\u0027s in the blacklist\","},{"line_number":232,"context_line":"                                ext.obj.alias)"},{"line_number":233,"context_line":"                    return False"},{"line_number":234,"context_line":"                else:"},{"line_number":235,"context_line":"                    return self._register_extension(ext)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2F8kk%3D","line":232,"updated":"2013-05-18 04:37:18.000000000","message":"LOG message should follow \"Internationalization (i18n) Strings\"","commit_id":"1827c4bc71a2809ad389ed0606d8ee72869f51dd"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"1e67bc16c4fc0dccd499cfc46ee3f5e41adb847c","unresolved":false,"context_lines":[{"line_number":229,"context_line":"                                               extensions.V3APIExtensionBase):"},{"line_number":230,"context_line":"                if ext.obj.alias in CONF.v3_api_extensions_blacklist:"},{"line_number":231,"context_line":"                    LOG.warning(\"Not loading %s because it\u0027s in the blacklist\","},{"line_number":232,"context_line":"                                ext.obj.alias)"},{"line_number":233,"context_line":"                    return False"},{"line_number":234,"context_line":"                else:"},{"line_number":235,"context_line":"                    return self._register_extension(ext)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2F8WA%3D","line":232,"in_reply_to":"AAAAPH%2F%2F8kk%3D","updated":"2013-05-18 10:52:15.000000000","message":"Done","commit_id":"1827c4bc71a2809ad389ed0606d8ee72869f51dd"},{"author":{"_account_id":7494,"name":"Guangya Liu","email":"gyliu513@gmail.com","username":"JayLau"},"change_message_id":"462203bdfc098c78d1f00e322b96cb7d25f285fb","unresolved":false,"context_lines":[{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        self.init_only \u003d init_only"},{"line_number":240,"context_line":"        LOG.debug(\"v3 API Extension Blacklist: %s\","},{"line_number":241,"context_line":"                  CONF.v3_api_extensions_blacklist)"},{"line_number":242,"context_line":"        self.api_extension_manager \u003d stevedore.enabled.EnabledExtensionManager("},{"line_number":243,"context_line":"            namespace\u003dself.API_EXTENSION_NAMESPACE,"},{"line_number":244,"context_line":"            check_func\u003d_check_load_extension,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2F8kg%3D","line":241,"updated":"2013-05-18 04:37:18.000000000","message":"LOG message should follow \"Internationalization (i18n) Strings\"","commit_id":"1827c4bc71a2809ad389ed0606d8ee72869f51dd"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"1e67bc16c4fc0dccd499cfc46ee3f5e41adb847c","unresolved":false,"context_lines":[{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        self.init_only \u003d init_only"},{"line_number":240,"context_line":"        LOG.debug(\"v3 API Extension Blacklist: %s\","},{"line_number":241,"context_line":"                  CONF.v3_api_extensions_blacklist)"},{"line_number":242,"context_line":"        self.api_extension_manager \u003d stevedore.enabled.EnabledExtensionManager("},{"line_number":243,"context_line":"            namespace\u003dself.API_EXTENSION_NAMESPACE,"},{"line_number":244,"context_line":"            check_func\u003d_check_load_extension,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2F8V8%3D","line":241,"in_reply_to":"AAAAPH%2F%2F8kg%3D","updated":"2013-05-18 10:52:15.000000000","message":"Done","commit_id":"1827c4bc71a2809ad389ed0606d8ee72869f51dd"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"6649f2c8230a94cdeeb475edc1f8f3ffff6cab5a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    cfg.ListOpt(\u0027v3_api_extensions_blacklist\u0027,"},{"line_number":43,"context_line":"                default\u003d[],"},{"line_number":44,"context_line":"                help\u003d\u0027A list of v3 API extensions to never load. \u0027"},{"line_number":45,"context_line":"                     \u0027Specify the extension aliases here\u0027)"},{"line_number":46,"context_line":"]"},{"line_number":47,"context_line":"CONF.register_opts(ext_opts)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FsEI%3D","line":45,"updated":"2013-05-27 01:20:14.000000000","message":"I think this is fine, but I actually think a whitelist option is even more important.  I think deployments need to be able to ensure that the API exposed will not change at all, even if the code gets updated and a new extension appears.","commit_id":"2325aaa8385c77df5265b04d5115b69857266a8f"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"26fdb2c4c749d1a836e840c2ccf860059172c2e1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    cfg.ListOpt(\u0027v3_api_extensions_blacklist\u0027,"},{"line_number":43,"context_line":"                default\u003d[],"},{"line_number":44,"context_line":"                help\u003d\u0027A list of v3 API extensions to never load. \u0027"},{"line_number":45,"context_line":"                     \u0027Specify the extension aliases here\u0027)"},{"line_number":46,"context_line":"]"},{"line_number":47,"context_line":"CONF.register_opts(ext_opts)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fr7I%3D","line":45,"in_reply_to":"AAAAPH%2F%2FsEI%3D","updated":"2013-05-27 05:17:25.000000000","message":"ok I\u0027ll add a whitelist config option as well","commit_id":"2325aaa8385c77df5265b04d5115b69857266a8f"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"c3007905b65eb6529d7c434535528a107550d7e0","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            if (self.init_only is None or ext.obj.alias in"},{"line_number":247,"context_line":"                self.init_only) and isinstance(ext.obj,"},{"line_number":248,"context_line":"                                               extensions.V3APIExtensionBase):"},{"line_number":249,"context_line":"                if (CONF.v3_api_extensions_whitelist and"},{"line_number":250,"context_line":"                    ext.obj.alias not in CONF.v3_api_extensions_whitelist):"},{"line_number":251,"context_line":"                    LOG.warning("},{"line_number":252,"context_line":"                            _(\"Not loading %s because it\u0027s not in the \""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPH%2F%2Fltw%3D","line":249,"updated":"2013-05-29 20:49:44.000000000","message":"I think this could be slightly more readable by testing the cases that would lead to self._register_extension.  \n\nif (CONF.v3_api_extensions_whitelist and ext.obj.alias in CONF.v3_api_extensions_whitelist):\n   self._register_extension(ext)\n\nand same for blacklist.  It just seems really confusing to me to check for not in the whitelist and if in the blacklist.  Parsing it the other way would be easier.","commit_id":"7348b6b07f81392154e8b06a76017cbf6abf6017"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"fe663d3c317ce0166bc5f8f097ce00bc6e426b34","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            if (self.init_only is None or ext.obj.alias in"},{"line_number":247,"context_line":"                self.init_only) and isinstance(ext.obj,"},{"line_number":248,"context_line":"                                               extensions.V3APIExtensionBase):"},{"line_number":249,"context_line":"                if (CONF.v3_api_extensions_whitelist and"},{"line_number":250,"context_line":"                    ext.obj.alias not in CONF.v3_api_extensions_whitelist):"},{"line_number":251,"context_line":"                    LOG.warning("},{"line_number":252,"context_line":"                            _(\"Not loading %s because it\u0027s not in the \""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPH%2F%2FlBg%3D","line":249,"in_reply_to":"AAAAPH%2F%2Fltw%3D","updated":"2013-05-30 04:20:16.000000000","message":"ok, fair enough.","commit_id":"7348b6b07f81392154e8b06a76017cbf6abf6017"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"c3007905b65eb6529d7c434535528a107550d7e0","unresolved":false,"context_lines":[{"line_number":261,"context_line":"                    return self._register_extension(ext)"},{"line_number":262,"context_line":"            else:"},{"line_number":263,"context_line":"                return False"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        self.init_only \u003d init_only"},{"line_number":266,"context_line":"        LOG.debug(_(\"v3 API Extension Blacklist: %s\"),"},{"line_number":267,"context_line":"                  CONF.v3_api_extensions_blacklist)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPH%2F%2FltY%3D","line":264,"updated":"2013-05-29 20:49:44.000000000","message":"Not really sure where to put this comment but, could you add a check somewhere to verify that there are no extensions in the whitelist and blacklist.  We could also pick a precedence but I think it makes sense to alert a deployer that they\u0027ve probably misconfigured something.  Maybe something like\n\nif len(set(CONF.v3_api_extensions_whitelist).intersection(CONF.v3_api_extensions_whitelist)) !\u003d 0:\n   raise SomeException","commit_id":"7348b6b07f81392154e8b06a76017cbf6abf6017"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"88d7acfb4e098faa840330dcf914c34ce1aadd62","unresolved":false,"context_lines":[{"line_number":261,"context_line":"                    return self._register_extension(ext)"},{"line_number":262,"context_line":"            else:"},{"line_number":263,"context_line":"                return False"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        self.init_only \u003d init_only"},{"line_number":266,"context_line":"        LOG.debug(_(\"v3 API Extension Blacklist: %s\"),"},{"line_number":267,"context_line":"                  CONF.v3_api_extensions_blacklist)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPH%2F%2FkJk%3D","line":264,"in_reply_to":"AAAAPH%2F%2FlBM%3D","updated":"2013-05-30 13:20:08.000000000","message":"That\u0027s fair, but if that\u0027s the case then I think it makes sense to explicitly state that a blacklist will override the whitelist in the conf sample comments.  It should be fairly obvious, but it doesn\u0027t hurt to be very clear.","commit_id":"7348b6b07f81392154e8b06a76017cbf6abf6017"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"fe663d3c317ce0166bc5f8f097ce00bc6e426b34","unresolved":false,"context_lines":[{"line_number":261,"context_line":"                    return self._register_extension(ext)"},{"line_number":262,"context_line":"            else:"},{"line_number":263,"context_line":"                return False"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        self.init_only \u003d init_only"},{"line_number":266,"context_line":"        LOG.debug(_(\"v3 API Extension Blacklist: %s\"),"},{"line_number":267,"context_line":"                  CONF.v3_api_extensions_blacklist)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPH%2F%2FlBM%3D","line":264,"in_reply_to":"AAAAPH%2F%2FltY%3D","updated":"2013-05-30 04:20:16.000000000","message":"I think raising an exception is perhaps too far as it will cause nova-api to abort - perhaps Log a warning instead? I\u0027m not sure that people will commonly use both a whitelist and blacklist at the same time, but at least just logging a warning rather than an exception will allow them to do so.","commit_id":"7348b6b07f81392154e8b06a76017cbf6abf6017"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"9a7190f6617065672d99d84725188cee70f57383","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                        return False"},{"line_number":266,"context_line":"                else:"},{"line_number":267,"context_line":"                    LOG.warning("},{"line_number":268,"context_line":"                        _(\"Not loading %s because it\u0027s not in the whitelist\"),"},{"line_number":269,"context_line":"                        ext.obj.alias)"},{"line_number":270,"context_line":"                    return False"},{"line_number":271,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2FeMk%3D","line":268,"updated":"2013-06-03 02:07:32.000000000","message":"should \"it\u0027s\" be \"it is\" ?","commit_id":"7e5ee33e9bf7c826fc133725400afb7e102ee510"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"cb0d95e36fe943b9e5dc1e17da5a16a01201e29e","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                        return False"},{"line_number":266,"context_line":"                else:"},{"line_number":267,"context_line":"                    LOG.warning("},{"line_number":268,"context_line":"                        _(\"Not loading %s because it\u0027s not in the whitelist\"),"},{"line_number":269,"context_line":"                        ext.obj.alias)"},{"line_number":270,"context_line":"                    return False"},{"line_number":271,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2FeHo%3D","line":268,"in_reply_to":"AAAAPH%2F%2FeMk%3D","updated":"2013-06-03 03:54:09.000000000","message":"hrm is there a coding style against using contractions in error messages? Either way I\u0027m not that fussed and will fix when adding the config group","commit_id":"7e5ee33e9bf7c826fc133725400afb7e102ee510"}],"nova/tests/api/openstack/compute/test_v3_extensions.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"c13352c73a56fc3a1cf626899cda7bf7e23a65ce","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.assertIn(\u0027os-fixed-ips\u0027, app._loaded_extension_info.extensions)"},{"line_number":66,"context_line":"        CONF.set_override(\u0027extensions_whitelist\u0027, \u0027servers,os-fixed-ips\u0027,"},{"line_number":67,"context_line":"                          \u0027osapi_v3\u0027)"},{"line_number":68,"context_line":"        CONF.set_override(\u0027extensions_blacklist\u0027, \u0027os-fixed-ips\u0027, \u0027osapi_v3\u0027)"},{"line_number":69,"context_line":"        app \u003d compute.APIRouterV3()"},{"line_number":70,"context_line":"        self.assertNotIn(\u0027os-fixed-ips\u0027, app._loaded_extension_info.extensions)"},{"line_number":71,"context_line":"        self.assertIn(\u0027servers\u0027, app._loaded_extension_info.extensions)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPH%2F%2FcWY%3D","line":68,"updated":"2013-06-03 20:16:55.000000000","message":"This is a minor nit, since it doesn\u0027t seem to affect anything, but you sometimes use a string with a csv list and other times pass multiple string args.  Might be nice to clean it up at some point.","commit_id":"bb36650f87dd4b30e9ebbbb4409444b4482338b5"}]}
