)]}'
{"ironic/common/dhcp_factory.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"25aca787fcdc3eae42617d22a88bdd35eb2e0efa","unresolved":false,"context_lines":[{"line_number":20,"context_line":"dhcp_provider_opts \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027dhcp_provider\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027neutron\u0027,"},{"line_number":23,"context_line":"               help\u003d\u0027Specify which dhcp provider to use. \u0027)"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_6e06e922","line":23,"updated":"2014-08-08 17:37:13.000000000","message":"Nit: remove trailing space after the \u0027.\u0027","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"25aca787fcdc3eae42617d22a88bdd35eb2e0efa","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        if dhcp_provider:"},{"line_number":37,"context_line":"            dhcp_provider_name \u003d dhcp_provider"},{"line_number":38,"context_line":"        else:"},{"line_number":39,"context_line":"            dhcp_provider_name \u003d CONF.dhcp.dhcp_provider"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        _extension_manager \u003d stevedore.driver.DriverManager("},{"line_number":42,"context_line":"            \u0027ironic.dhcp\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_8effbd02","line":39,"updated":"2014-08-08 17:37:13.000000000","message":"Maybe it would read more clearly if you changed the `dhcp_provider` argument name to `dhcp_provider_name`, and just had `if dhcp_provider_name is None: dhcp_provider_name \u003d CONF.dhcp.dhcp_provider`.","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"25aca787fcdc3eae42617d22a88bdd35eb2e0efa","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            dhcp_provider_name,"},{"line_number":44,"context_line":"            invoke_kwds\u003dkwargs,"},{"line_number":45,"context_line":"            invoke_on_load\u003dTrue"},{"line_number":46,"context_line":"            )"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        _dhcp_provider \u003d _extension_manager.driver"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_aefc810e","line":46,"updated":"2014-08-08 17:37:13.000000000","message":"Nit: this `)` can just be at the end of the line before it.","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"4bfec71aeb02f4830ef09b8915454f00315d3f63","unresolved":false,"context_lines":[{"line_number":20,"context_line":"dhcp_provider_opts \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027dhcp_provider\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027neutron\u0027,"},{"line_number":23,"context_line":"               help\u003d\u0027Specify which dhcp provider to use.\u0027)"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_9893264d","line":23,"updated":"2014-08-12 11:43:59.000000000","message":"Nit: would be good to inform that we can use \"none\" to have a non-op provider","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f49272ab57dd728a8c0828b4d5e178971279f8f6","unresolved":false,"context_lines":[{"line_number":20,"context_line":"dhcp_provider_opts \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027dhcp_provider\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027neutron\u0027,"},{"line_number":23,"context_line":"               help\u003d\u0027Specify which dhcp provider to use.\u0027)"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_5e27b7b4","line":23,"in_reply_to":"baada198_9893264d","updated":"2014-08-12 12:01:03.000000000","message":"+1","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"4bfec71aeb02f4830ef09b8915454f00315d3f63","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    if dhcp_provider_name is None:"},{"line_number":36,"context_line":"        dhcp_provider_name \u003d CONF.dhcp.dhcp_provider"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        _extension_manager \u003d stevedore.driver.DriverManager("},{"line_number":39,"context_line":"            \u0027ironic.dhcp\u0027,"},{"line_number":40,"context_line":"            dhcp_provider_name,"},{"line_number":41,"context_line":"            invoke_kwds\u003dkwargs,"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_78de5211","line":38,"updated":"2014-08-12 11:43:59.000000000","message":"Question: I don\u0027t know much about stevedore, but in the drivers we use the dispatch.NameDispatchExtensionManager extension to manage our drivers, shouldn\u0027t we use the same here?","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"4bfec71aeb02f4830ef09b8915454f00315d3f63","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            invoke_kwds\u003dkwargs,"},{"line_number":42,"context_line":"            invoke_on_load\u003dTrue)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        _dhcp_provider \u003d _extension_manager.driver"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    return _dhcp_provider"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_184f1636","line":44,"updated":"2014-08-12 11:43:59.000000000","message":"we save the loaded driver to the _dhcp_provider variable but we never reuse it.\n\nAlso as _dhcp_provider is a global var, I think we have a race condition here, if two drivers calls update_dhcp at the same time, with different dhcp_provider_name they might conflict and endup overwirting the _dhcp_provider value before the return.  We need a lock here.","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"05307225fc6bf9869903790fc7c5cf9d81611f56","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            invoke_kwds\u003dkwargs,"},{"line_number":42,"context_line":"            invoke_on_load\u003dTrue)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        _dhcp_provider \u003d _extension_manager.driver"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    return _dhcp_provider"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_f84c22cb","line":44,"in_reply_to":"baada198_184f1636","updated":"2014-08-12 11:45:59.000000000","message":"s/update_dhcp/get_dhcp_provider/g","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"717ad67dc606aa6e55f2e8ded083eae3d38a2dec","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            invoke_kwds\u003dkwargs,"},{"line_number":42,"context_line":"            invoke_on_load\u003dTrue)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        _dhcp_provider \u003d _extension_manager.driver"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    return _dhcp_provider"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_5800a7ff","line":44,"in_reply_to":"baada198_adcb4771","updated":"2014-08-12 14:18:32.000000000","message":"+1 for removing `dhcp_provider_name` argument.","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"e76eb2c2658a88bb90443aed0a414ed4335dff49","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            invoke_kwds\u003dkwargs,"},{"line_number":42,"context_line":"            invoke_on_load\u003dTrue)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        _dhcp_provider \u003d _extension_manager.driver"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    return _dhcp_provider"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_adcb4771","line":44,"in_reply_to":"baada198_f84c22cb","updated":"2014-08-12 14:11:46.000000000","message":"I think there\u0027s actually a bigger problem... if `dhcp_provider_name` is not None, we\u0027re actually not loading a driver at all. So no race condition here, but for the wrong reasons.\n\nI\u0027m not sure that it\u0027s useful to have a `dhcp_provider_name` argument anyway, just always use the config.","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a1767f9e7bcd97bfb725d04fccd7d857c8e74487","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    provider.update_provider_dhcp(task, dhcp_opts)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def _reset_dhcp_provider():"},{"line_number":58,"context_line":"    \"\"\"Reset function to make testing easier.\"\"\""},{"line_number":59,"context_line":"    global _dhcp_provider"},{"line_number":60,"context_line":"    _dhcp_provider \u003d None"}],"source_content_type":"text/x-python","patch_set":16,"id":"7ac7a964_3a8652ba","line":57,"updated":"2014-08-14 17:29:04.000000000","message":"Modifying a module-global within test methods that depend upon specific values for that global is going to lead to non-deterministic test failures when those test classes happen to run at the same time.\n\nInstead of resetting the global, you need to mock the object within the test method.","commit_id":"3102a246c33c5c6392865aa1d3a4ba4c6dd6c096"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"dhcp_provider_opts \u003d ["},{"line_number":21,"context_line":"    cfg.StrOpt(\u0027dhcp_provider\u0027,"},{"line_number":22,"context_line":"               default\u003d\u0027neutron\u0027,"},{"line_number":23,"context_line":"               help\u003d\u0027Specify which dhcp provider to use.  \"neutron\" uses \u0027"},{"line_number":24,"context_line":"                    \u0027Neutron, and \"none\" uses a no-op provider.\u0027"},{"line_number":25,"context_line":"               )"},{"line_number":26,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_a25b0c53","line":23,"updated":"2014-08-15 01:18:33.000000000","message":"nit, can be shortened to \u0027The DHCP provider to use.\u0027\n\nFor user-facing things, you should use \u0027DHCP\u0027, not \u0027dhcp\u0027.\n\nnit2. Do you have two spaces after \u0027use.\u0027 ?","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        \u0027ironic.dhcp\u0027,"},{"line_number":49,"context_line":"        dhcp_provider_name,"},{"line_number":50,"context_line":"        invoke_kwds\u003dkwargs,"},{"line_number":51,"context_line":"        invoke_on_load\u003dTrue)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    _dhcp_provider \u003d _extension_manager.driver"},{"line_number":54,"context_line":"    return _dhcp_provider"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_28b7da87","line":51,"updated":"2014-08-15 01:18:33.000000000","message":"What happens if it can\u0027t get the dhcp provider? Will an exception be raised, or will _dhcp_provider be None --  causing some error when something tries to use _dhcp_provider?","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"18505b17056f6068ab692976e177fc264b7ac2ea","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        \u0027ironic.dhcp\u0027,"},{"line_number":49,"context_line":"        dhcp_provider_name,"},{"line_number":50,"context_line":"        invoke_kwds\u003dkwargs,"},{"line_number":51,"context_line":"        invoke_on_load\u003dTrue)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    _dhcp_provider \u003d _extension_manager.driver"},{"line_number":54,"context_line":"    return _dhcp_provider"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_5302fe0b","line":51,"in_reply_to":"7ac7a964_28b7da87","updated":"2014-08-15 09:33:25.000000000","message":"+1 that\u0027s a good point.  Here\u0027s the error raised http://paste.openstack.org/show/95453/\n\nRight now it will only fail after the deployment has started, which is not very user friendly. The good thing is that it doesn\u0027t cause everything to fail, the conductor won\u0027t die when it\u0027s raised nor the node will get stuck in some weird state.\n\nLooking at stevedore documentation, you can set a function that will be invoke when a driver fail to load[1], e.g:\n\n stevedore.driver.DriverManager(\n              ...\n              on_load_failure_callback\u003d\u003cfunc\u003e\n  )\n\nPerhaps we should use that to at least log/raise a more specific message? And preferable do it at startup time? \n\n[1] http://stevedore.readthedocs.org/en/latest/managers.html#drivermanager","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c8293c28ed798cc2fefe9f8fe502d718b9e35b07","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    dhcp_provider_name \u003d CONF.dhcp.dhcp_provider"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    if dhcp_provider_name not in CONF.dhcp.endpoints:"},{"line_number":58,"context_line":"        raise exception.DHCPNotFound(dhcp_provider_name\u003ddhcp_provider_name)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    _extension_manager \u003d stevedore.driver.DriverManager("},{"line_number":61,"context_line":"        \u0027ironic.dhcp\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_0b0ff5e1","line":58,"updated":"2014-08-21 22:09:14.000000000","message":"I\u0027d actually prefer to use the on_load_failure_callback feature that Lucas mentioned. It can raise this exception, and we wouldn\u0027t need this config option. \n\nI\u0027m not sure I see the value in adding it. It seems confusing that there is \u0027dhcp_provider\u0027 option with help saying \u0027none\u0027, \u0027neutron\u0027, and now this config option that contains the possible values for dhcp_provider.","commit_id":"0cdeebf1a241bb27db7105d9800d3cb1dd012d7c"},{"author":{"_account_id":11702,"name":"Ellen Hui","email":"ellenfkh@gmail.com","username":"ellenfkh"},"change_message_id":"7f711519f9428b589d3e10d4a3433750d8335c1b","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    dhcp_provider_name \u003d CONF.dhcp.dhcp_provider"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    if dhcp_provider_name not in CONF.dhcp.endpoints:"},{"line_number":58,"context_line":"        raise exception.DHCPNotFound(dhcp_provider_name\u003ddhcp_provider_name)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    _extension_manager \u003d stevedore.driver.DriverManager("},{"line_number":61,"context_line":"        \u0027ironic.dhcp\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_8080e08c","line":58,"in_reply_to":"1abeadc6_0b0ff5e1","updated":"2014-08-25 19:36:27.000000000","message":"on_load_failure_callback doesn\u0027t catch what I want it to here.  The callback triggers when the driver fails to load, but not if the driver endpoint isn\u0027t found -- the latter case just throws a runtime exception.\n\nYeah, I don\u0027t like the extra config option either.  I\u0027m not sure how to get rid of it, though.","commit_id":"0cdeebf1a241bb27db7105d9800d3cb1dd012d7c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c4500d5ea353b031412823618d10f6922d31e7ae","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    dhcp_provider_name \u003d CONF.dhcp.dhcp_provider"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    if dhcp_provider_name not in CONF.dhcp.endpoints:"},{"line_number":58,"context_line":"        raise exception.DHCPNotFound(dhcp_provider_name\u003ddhcp_provider_name)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    _extension_manager \u003d stevedore.driver.DriverManager("},{"line_number":61,"context_line":"        \u0027ironic.dhcp\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_764aa5ad","line":58,"in_reply_to":"1abeadc6_8080e08c","updated":"2014-08-25 23:30:22.000000000","message":"Oh. Hmm, not sure if that is a bug or feature or whatever in stevedore. How about a try/except around the call to stevedore.driver.DriverManager()?","commit_id":"0cdeebf1a241bb27db7105d9800d3cb1dd012d7c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"39d9741d012affb999eee6f5d87a1984073ae84b","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    dhcp_provider_name \u003d CONF.dhcp.dhcp_provider"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    # NOTE(jroll) stevedore does not invoke `on_load_failure_callback`"},{"line_number":54,"context_line":"    # if an entrypoint does not exist fo `dhcp_provider_name`; instead"},{"line_number":55,"context_line":"    # we catch the RuntimeError that is thrown and take action then."},{"line_number":56,"context_line":"    try:"},{"line_number":57,"context_line":"        _extension_manager \u003d stevedore.driver.DriverManager("}],"source_content_type":"text/x-python","patch_set":24,"id":"1abeadc6_634372af","line":54,"updated":"2014-08-27 17:14:36.000000000","message":"nit, if you do another patch. \u0027fo\u0027 -\u003e \u0027for\u0027","commit_id":"f21a8c0467313bb03025a6e963750fab7aaf8a9c"}],"ironic/common/exception.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c8293c28ed798cc2fefe9f8fe502d718b9e35b07","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class DHCPNotFound(NotFound):"},{"line_number":194,"context_line":"    message \u003d _(\"Failed to load dhcp_provider %(dhcp_provider_name)s.\")"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"class DriverNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_8b9ea561","line":194,"updated":"2014-08-21 22:09:14.000000000","message":"how about \u0027dhcp_provider ...\u0027 -\u003e \u0027DHCP provider \u0027%(dhcp_provider_name)s\u0027.\"\n\nI\u0027m worried about not putting the name in quotes, in case, for whatever reason, \u0027none\u0027 fails ;)","commit_id":"0cdeebf1a241bb27db7105d9800d3cb1dd012d7c"},{"author":{"_account_id":11702,"name":"Ellen Hui","email":"ellenfkh@gmail.com","username":"ellenfkh"},"change_message_id":"7f711519f9428b589d3e10d4a3433750d8335c1b","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class DHCPNotFound(NotFound):"},{"line_number":194,"context_line":"    message \u003d _(\"Failed to load dhcp_provider %(dhcp_provider_name)s.\")"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"class DriverNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_402408c6","line":194,"in_reply_to":"1abeadc6_8b9ea561","updated":"2014-08-25 19:36:27.000000000","message":"Sure, will do.","commit_id":"0cdeebf1a241bb27db7105d9800d3cb1dd012d7c"}],"ironic/conductor/manager.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":1044,"context_line":"        :param context: request context."},{"line_number":1045,"context_line":"        :param port_obj: a changed (but not saved) port object."},{"line_number":1046,"context_line":"        :raises: FailedToUpdateMacOnPort if MAC address changed and update"},{"line_number":1047,"context_line":"                 Neutron failed."},{"line_number":1048,"context_line":"        :raises: MACAlreadyExists if the update is setting a MAC which is"},{"line_number":1049,"context_line":"                 registered on another port already."},{"line_number":1050,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_65549b54","line":1047,"updated":"2014-08-15 01:18:33.000000000","message":"might want to strike out Neutron or somethin\u0027.","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":1056,"context_line":"            if \u0027address\u0027 in port_obj.obj_what_changed():"},{"line_number":1057,"context_line":"                vif \u003d port_obj.extra.get(\u0027vif_port_id\u0027)"},{"line_number":1058,"context_line":"                if vif:"},{"line_number":1059,"context_line":"                    api \u003d dhcp_factory.get_dhcp_provider("},{"line_number":1060,"context_line":"                        token\u003dcontext.auth_token)"},{"line_number":1061,"context_line":"                    api.update_port_address(vif, port_obj.address)"},{"line_number":1062,"context_line":"                # Log warning if there is no vif_port_id and an instance"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_85fff733","line":1059,"updated":"2014-08-15 01:18:33.000000000","message":"if it can\u0027t get a dhcp_provider, is some exception raised? If so, did you want to handle it or raise it. If the latter, probably ought to update the docstring for this method.","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"}],"ironic/dhcp/__init__.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"4bfec71aeb02f4830ef09b8915454f00315d3f63","unresolved":false,"context_lines":[{"line_number":6,"context_line":"# a copy of the License at"},{"line_number":7,"context_line":"#"},{"line_number":8,"context_line":"#      http://www.apache.org/licenses/LICENSE-2.0"},{"line_number":9,"context_line":"#"},{"line_number":10,"context_line":"# Unless required by applicable law or agreed to in writing, software"},{"line_number":11,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":12,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_ac099484","line":9,"updated":"2014-08-12 11:43:59.000000000","message":"nit: empty files shouldn\u0027t have a license header, if there\u0027s no content there\u0027s no way to make it copyrightable","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"}],"ironic/dhcp/base.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1c4fdbc110641bdb24b4d77e987c14048d8456f0","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        failures \u003d []"},{"line_number":84,"context_line":"        for port_id, port_vif in vifs.iteritems():"},{"line_number":85,"context_line":"            try:"},{"line_number":86,"context_line":"                api.update_port_dhcp_opts(task.context, port_vif, options)"},{"line_number":87,"context_line":"            except exception.FailedToUpdateDHCPOptOnPort:"},{"line_number":88,"context_line":"                failures.append(port_id)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_bc2b0d94","line":86,"updated":"2014-08-07 13:52:48.000000000","message":"TypeError: update_port_dhcp_opts() takes exactly 3 arguments (4 given)","commit_id":"3f874a56832e20151950c0263b79fe32c36ee3a0"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"25aca787fcdc3eae42617d22a88bdd35eb2e0efa","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                         {\u0027opt_name\u0027: \u0027server-ip-address\u0027,"},{"line_number":54,"context_line":"                          \u0027opt_value\u0027: \u0027123.123.123.456\u0027},"},{"line_number":55,"context_line":"                         {\u0027opt_name\u0027: \u0027tftp-server\u0027,"},{"line_number":56,"context_line":"                          \u0027opt_value\u0027: \u0027123.123.123.123\u0027}]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        :raises: FailedToUpdateDHCPOptOnPort"},{"line_number":59,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_c9fc4f0f","line":56,"updated":"2014-08-08 17:37:13.000000000","message":"Not saying this should necessarily change, but personally, I don\u0027t like Neutron\u0027s dhcp_options format, which is where this comes from. I would rather it be e.g. `{\u0027bootfile-name\u0027: \u0027pxelinux.0\u0027, ...}`, and convert it as needed (eg. in the neutron driver). But that might just be me.","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"25aca787fcdc3eae42617d22a88bdd35eb2e0efa","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        auth_token \u003d task.context.auth_token"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        api \u003d dhcp_factory.get_dhcp_provider(token\u003dauth_token)"},{"line_number":83,"context_line":"        failures \u003d []"},{"line_number":84,"context_line":"        for port_id, port_vif in vifs.iteritems():"},{"line_number":85,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_e9011305","line":82,"updated":"2014-08-08 17:37:13.000000000","message":"Could this just be `api \u003d self`? (and simplified down to just using `self` where `api` is used in this function). I *think* it could, but I\u0027m not 100% sure if this would drop down to the subclass or stay at this level of the inheritance chain.","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"10acb3e2dfa8257725628968e6bb0ba5b5f5d5e9","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from ironic.common import exception"},{"line_number":25,"context_line":"from ironic.common import network"},{"line_number":26,"context_line":"from ironic.openstack.common import log as logging"},{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_8914d4ea","line":26,"updated":"2014-08-11 21:57:19.000000000","message":"nit: should be two blank lines between this line and LOG \u003d ...","commit_id":"e636e048635072fbf86eb63cf1ca2a110fc17136"},{"author":{"_account_id":11702,"name":"Ellen Hui","email":"ellenfkh@gmail.com","username":"ellenfkh"},"change_message_id":"7374925bba984f179cdd0d3b50518e4dc836003f","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from ironic.common import exception"},{"line_number":25,"context_line":"from ironic.common import network"},{"line_number":26,"context_line":"from ironic.openstack.common import log as logging"},{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_694dc0c4","line":26,"in_reply_to":"baada198_8914d4ea","updated":"2014-08-11 22:14:42.000000000","message":"Done","commit_id":"e636e048635072fbf86eb63cf1ca2a110fc17136"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"10acb3e2dfa8257725628968e6bb0ba5b5f5d5e9","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        pass"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def update_provider_dhcp(self, task, options):"},{"line_number":72,"context_line":"        \"\"\"Send or update the DHCP BOOT options for this node.\"\"\""},{"line_number":73,"context_line":"        vifs \u003d network.get_node_vif_ids(task)"},{"line_number":74,"context_line":"        if not vifs:"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_a9bd18d3","line":71,"updated":"2014-08-11 21:57:19.000000000","message":"Not sure why this name changed from `update_dhcp`...","commit_id":"e636e048635072fbf86eb63cf1ca2a110fc17136"},{"author":{"_account_id":11702,"name":"Ellen Hui","email":"ellenfkh@gmail.com","username":"ellenfkh"},"change_message_id":"7374925bba984f179cdd0d3b50518e4dc836003f","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        pass"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def update_provider_dhcp(self, task, options):"},{"line_number":72,"context_line":"        \"\"\"Send or update the DHCP BOOT options for this node.\"\"\""},{"line_number":73,"context_line":"        vifs \u003d network.get_node_vif_ids(task)"},{"line_number":74,"context_line":"        if not vifs:"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_e961d038","line":71,"in_reply_to":"baada198_a9bd18d3","updated":"2014-08-11 22:14:42.000000000","message":"Both this interface and dhcp_factory had an update_dhcp method, which seemed confusing.  Looks like I accidentally renamed differently in neutron.py and none.py, though, will fix that.","commit_id":"e636e048635072fbf86eb63cf1ca2a110fc17136"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"4bfec71aeb02f4830ef09b8915454f00315d3f63","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @abc.abstractmethod"},{"line_number":38,"context_line":"    def __init__(self, **kwargs):"},{"line_number":39,"context_line":"        pass"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @abc.abstractmethod"},{"line_number":42,"context_line":"    def update_port_dhcp_opts(self, port_id, dhcp_options):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_8ce2109a","line":39,"updated":"2014-08-12 11:43:59.000000000","message":"I think the constructor should not be an abstractmethod, this is up to the provider whether use the baseclass constructor or override it.","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f49272ab57dd728a8c0828b4d5e178971279f8f6","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @abc.abstractmethod"},{"line_number":38,"context_line":"    def __init__(self, **kwargs):"},{"line_number":39,"context_line":"        pass"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @abc.abstractmethod"},{"line_number":42,"context_line":"    def update_port_dhcp_opts(self, port_id, dhcp_options):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_9e54effd","line":39,"in_reply_to":"baada198_8ce2109a","updated":"2014-08-12 12:01:03.000000000","message":"+1, abstract c-tor is a bit strange. We use abstract methods as a contract, that a method will be present. C-tor will always be present :)","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"4bfec71aeb02f4830ef09b8915454f00315d3f63","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        :raises: FailedToUpdateDHCPOptOnPort"},{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @abc.abstractmethod"},{"line_number":64,"context_line":"    def update_port_address(self, port_id, address):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_3dda0ce6","line":61,"updated":"2014-08-12 11:43:59.000000000","message":"nit: \"pass\" is not needed for methods using @abc.abstractmethod (this apply for other abstractmethod\u0027s in this class as well)","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"4bfec71aeb02f4830ef09b8915454f00315d3f63","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \"\"\"Send or update the DHCP BOOT options for this node.\"\"\""},{"line_number":75,"context_line":"        vifs \u003d network.get_node_vif_ids(task)"},{"line_number":76,"context_line":"        if not vifs:"},{"line_number":77,"context_line":"            LOG.warning(_(\"No VIFs found for node %(node)s when attempting to \""},{"line_number":78,"context_line":"                          \"update DHCP BOOT options.\"),"},{"line_number":79,"context_line":"                        {\u0027node\u0027: task.node.uuid})"},{"line_number":80,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_7dbd6466","line":77,"updated":"2014-08-12 11:43:59.000000000","message":"nit: _LW\n\nline 95 as well","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f49272ab57dd728a8c0828b4d5e178971279f8f6","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            return"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        failures \u003d []"},{"line_number":83,"context_line":"        for port_id, port_vif in vifs.iteritems():"},{"line_number":84,"context_line":"            try:"},{"line_number":85,"context_line":"                self.update_port_dhcp_opts(port_id, options)"},{"line_number":86,"context_line":"            except exception.FailedToUpdateDHCPOptOnPort:"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_9e6b0fb7","line":83,"updated":"2014-08-12 12:01:03.000000000","message":"iteritems() won\u0027t be compatible with future Python 3, use either .items() or six.iteritems(vifs)","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f49272ab57dd728a8c0828b4d5e178971279f8f6","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                    \"Failed to set DHCP BOOT options for any port on node %s.\")"},{"line_number":93,"context_line":"                    % task.node.uuid)"},{"line_number":94,"context_line":"            else:"},{"line_number":95,"context_line":"                LOG.warning(_(\"Some errors were encountered when updating the \""},{"line_number":96,"context_line":"                              \"DHCP BOOT options for node %(node)s on the \""},{"line_number":97,"context_line":"                              \"following ports: %(ports)s.\"),"},{"line_number":98,"context_line":"                            {\u0027node\u0027: task.node.uuid, \u0027ports\u0027: failures})"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_5e833754","line":95,"updated":"2014-08-12 12:01:03.000000000","message":"Shouldn\u0027t it be LOG.error?","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"dbd75836d9695e59a45eb08fee6c44fcbb8f6ed9","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    \"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self, **kwargs):"},{"line_number":36,"context_line":"        pass"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @abc.abstractmethod"},{"line_number":39,"context_line":"    def update_port_dhcp_opts(self, port_id, dhcp_options):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ab29df4_1d9b73ca","line":36,"updated":"2014-08-13 19:52:46.000000000","message":"No need to define an __init__ that does nothing.","commit_id":"71b9c5bec134ca6c25debc4c7ebadd01ed3b5bc6"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":31,"context_line":"class BaseDHCP(object):"},{"line_number":32,"context_line":"    \"\"\"Base class for dhcp provider APIs.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @abc.abstractmethod"},{"line_number":35,"context_line":"    def update_port_dhcp_opts(self, port_id, dhcp_options):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_0805be10","line":32,"updated":"2014-08-15 01:18:33.000000000","message":"nit: \u0027dhcp\u0027 -\u003e \u0027DHCP\u0027.","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @abc.abstractmethod"},{"line_number":52,"context_line":"    def update_port_address(self, port_id, address):"},{"line_number":53,"context_line":"        \"\"\"Update a port\u0027s mac address."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param port_id: port id."},{"line_number":56,"context_line":"        :param address: new MAC address."}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_c81ae66d","line":53,"updated":"2014-08-15 01:18:33.000000000","message":"nit: \u0027mac\u0027 -\u003e \u0027MAC\u0027.","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @abc.abstractmethod"},{"line_number":61,"context_line":"    def update_provider_dhcp(self, task, options):"},{"line_number":62,"context_line":"        \"\"\"Send or update the DHCP BOOT options for this node.\"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_28b19ae1","line":61,"updated":"2014-08-15 01:18:33.000000000","message":"I find the method name a bit odd. Since this is a method of the providerAPI, it seems odd to have \u0027provider\u0027 in the method name. Or am I missing something?\n\nWould \u0027update_dhcp_options()\u0027 or \u0027update_dhcp()\u0027 or \u0027update_dhcp_opts()\u0027 or \u0027update_node_dhcp_opts()\u0027 be better?","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"18505b17056f6068ab692976e177fc264b7ac2ea","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        \"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @abc.abstractmethod"},{"line_number":61,"context_line":"    def update_provider_dhcp(self, task, options):"},{"line_number":62,"context_line":"        \"\"\"Send or update the DHCP BOOT options for this node.\"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_136406e4","line":61,"in_reply_to":"7ac7a964_28b19ae1","updated":"2014-08-15 09:33:25.000000000","message":"+1","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @abc.abstractmethod"},{"line_number":61,"context_line":"    def update_provider_dhcp(self, task, options):"},{"line_number":62,"context_line":"        \"\"\"Send or update the DHCP BOOT options for this node.\"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_48b176f7","line":62,"updated":"2014-08-15 01:18:33.000000000","message":"What are the parameters? This is the same options as for update_port_dhcp_opts, right?","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"f3cf1626e4d67653ff81c2bed29794825363e5bd","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import abc"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from ironic.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":26,"id":"1abeadc6_3afa1e75","line":21,"updated":"2014-08-29 13:50:12.000000000","message":"blank line","commit_id":"31ff063278367ecb88e3aee723b44dff027c9201"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"70c227320be749372862832c1f4ead4389739de9","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import abc"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from ironic.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":26,"id":"1abeadc6_4b370ee3","line":21,"in_reply_to":"1abeadc6_3afa1e75","updated":"2014-08-29 14:47:02.000000000","message":"It should be there, abc is stdlib, six is third party","commit_id":"31ff063278367ecb88e3aee723b44dff027c9201"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"d89ff842efb5b9d0c8020c652fe5c1d5727359ed","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from ironic.openstack.common import log as logging"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":26,"id":"1abeadc6_3ac69e9a","line":27,"updated":"2014-08-29 13:45:10.000000000","message":"This is unused.","commit_id":"31ff063278367ecb88e3aee723b44dff027c9201"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"70c227320be749372862832c1f4ead4389739de9","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from ironic.openstack.common import log as logging"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":26,"id":"1abeadc6_6b320af3","line":27,"in_reply_to":"1abeadc6_3ac69e9a","updated":"2014-08-29 14:47:02.000000000","message":"Done","commit_id":"31ff063278367ecb88e3aee723b44dff027c9201"}],"ironic/dhcp/neutron.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1c4fdbc110641bdb24b4d77e987c14048d8456f0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Rackspace, Inc."},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_1f26abb9","line":1,"updated":"2014-08-07 13:52:48.000000000","message":"I don\u0027t think you should change copyrights","commit_id":"3f874a56832e20151950c0263b79fe32c36ee3a0"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"25aca787fcdc3eae42617d22a88bdd35eb2e0efa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"baada198_0e0c8d43","updated":"2014-08-08 17:37:13.000000000","message":"Agree with Zhongyue on capitalization, should probably just drop this change.","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"fa5f00f30cf86324283a20f04eed1cf0dc6258ed","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Openstack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_5d8c9939","line":1,"updated":"2014-08-08 00:40:25.000000000","message":"Open\"S\"tack seems to be correct.\n\n http://www.openstack.org/\n\nAlso I don\u0027t think you can change and existing license info.","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"},{"author":{"_account_id":11702,"name":"Ellen Hui","email":"ellenfkh@gmail.com","username":"ellenfkh"},"change_message_id":"dee607786b2ec53eab8d91021bbce22dc53ee888","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Openstack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_80d78c4e","line":1,"in_reply_to":"baada198_5d8c9939","updated":"2014-08-08 16:26:55.000000000","message":"Yep, my bad, I pasted the wrong license here while shuffling files around and then fixed it incorrectly.","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"10acb3e2dfa8257725628968e6bb0ba5b5f5d5e9","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            raise exception.FailedToUpdateMacOnPort(port_id\u003dport_id)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def api_update_dhcp(self, task, options):"},{"line_number":130,"context_line":"        super(NeutronDHCPApi, self).update_dhcp(task, options)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # TODO(adam_g): Hack to workaround bug 1334447 until we have a"},{"line_number":133,"context_line":"        # mechanism for synchronizing events with Neutron.  We need to sleep"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_a9943841","line":130,"updated":"2014-08-11 21:57:19.000000000","message":"`update_dhcp` no longer exists in the base class.\n\nAlso, why not name this method the same as the base class?","commit_id":"e636e048635072fbf86eb63cf1ca2a110fc17136"},{"author":{"_account_id":11702,"name":"Ellen Hui","email":"ellenfkh@gmail.com","username":"ellenfkh"},"change_message_id":"7374925bba984f179cdd0d3b50518e4dc836003f","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            raise exception.FailedToUpdateMacOnPort(port_id\u003dport_id)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def api_update_dhcp(self, task, options):"},{"line_number":130,"context_line":"        super(NeutronDHCPApi, self).update_dhcp(task, options)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # TODO(adam_g): Hack to workaround bug 1334447 until we have a"},{"line_number":133,"context_line":"        # mechanism for synchronizing events with Neutron.  We need to sleep"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_09cc4433","line":130,"in_reply_to":"baada198_a9943841","updated":"2014-08-11 22:14:42.000000000","message":"Fixed.","commit_id":"e636e048635072fbf86eb63cf1ca2a110fc17136"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6f80881ebd1e7147bdaf01d78c01c2f4574b8873","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            raise exception.FailedToUpdateMacOnPort(port_id\u003dport_id)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def update_provider_dhcp(self, task, options):"},{"line_number":130,"context_line":"        super(NeutronDHCPApi, self).update_dhcp(task, options)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # TODO(adam_g): Hack to workaround bug 1334447 until we have a"},{"line_number":133,"context_line":"        # mechanism for synchronizing events with Neutron.  We need to sleep"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_06f6e28f","line":130,"updated":"2014-08-12 07:14:21.000000000","message":"http://logs.openstack.org/51/112351/12/check/check-tempest-dsvm-virtual-ironic/90ff248/logs/screen-ir-cond.txt.gz:\n\n AttributeError: \u0027super\u0027 object has no attribute \u0027update_dhcp\u0027\n\nshould probably be update_provider_dhcp as well","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"4bfec71aeb02f4830ef09b8915454f00315d3f63","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            raise exception.FailedToUpdateMacOnPort(port_id\u003dport_id)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def update_provider_dhcp(self, task, options):"},{"line_number":130,"context_line":"        super(NeutronDHCPApi, self).update_dhcp(task, options)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # TODO(adam_g): Hack to workaround bug 1334447 until we have a"},{"line_number":133,"context_line":"        # mechanism for synchronizing events with Neutron.  We need to sleep"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_fdfa5442","line":130,"in_reply_to":"baada198_06f6e28f","updated":"2014-08-12 11:43:59.000000000","message":"+1","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f49272ab57dd728a8c0828b4d5e178971279f8f6","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        # they do not boot before Neutron agents have setup sufficent DHCP"},{"line_number":136,"context_line":"        # config for netboot."},{"line_number":137,"context_line":"        if isinstance(task.driver.power, ssh.SSHPower):"},{"line_number":138,"context_line":"            LOG.debug(_(\"Waiting 15 seconds for Neutron.\"))"},{"line_number":139,"context_line":"            time.sleep(15)"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_9ef06ffd","line":138,"updated":"2014-08-12 12:01:03.000000000","message":"while you\u0027re on it, could you remove _() call from this peace? Debug messages are not translated","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            raise exception.FailedToUpdateMacOnPort(port_id\u003dport_id)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def update_provider_dhcp(self, task, options):"},{"line_number":132,"context_line":"        \"\"\"Send or update the DHCP BOOT options for this node.\"\"\""},{"line_number":133,"context_line":"        vifs \u003d network.get_node_vif_ids(task)"},{"line_number":134,"context_line":"        if not vifs:"},{"line_number":135,"context_line":"            LOG.warning(_LW(\"No VIFs found for node %(node)s when attempting \""}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_08d93e57","line":132,"updated":"2014-08-15 01:18:33.000000000","message":"How about adding the :param:s to the docstring.","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"6f668b61541a9b10a72d6fdea699d0c1483ce2a0","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            raise exception.FailedToUpdateMacOnPort(port_id\u003dport_id)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def update_provider_dhcp(self, task, options):"},{"line_number":132,"context_line":"        \"\"\"Send or update the DHCP BOOT options for this node.\"\"\""},{"line_number":133,"context_line":"        vifs \u003d network.get_node_vif_ids(task)"},{"line_number":134,"context_line":"        if not vifs:"},{"line_number":135,"context_line":"            LOG.warning(_LW(\"No VIFs found for node %(node)s when attempting \""}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_7e4ee997","line":132,"in_reply_to":"7ac7a964_08d93e57","updated":"2014-08-15 05:41:32.000000000","message":"+1 :)","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"}],"ironic/dhcp/none.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"10acb3e2dfa8257725628968e6bb0ba5b5f5d5e9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def update_port_dhcp_opts(self, port_id, dhcp_options):"},{"line_number":26,"context_line":"        pass"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def api_update_dhcp(task, options):"},{"line_number":29,"context_line":"        pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def update_port_address(self, port_id, address):"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_e989d025","line":28,"updated":"2014-08-11 21:57:19.000000000","message":"Ditto on naming the same as base class.","commit_id":"e636e048635072fbf86eb63cf1ca2a110fc17136"},{"author":{"_account_id":11702,"name":"Ellen Hui","email":"ellenfkh@gmail.com","username":"ellenfkh"},"change_message_id":"7374925bba984f179cdd0d3b50518e4dc836003f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def update_port_dhcp_opts(self, port_id, dhcp_options):"},{"line_number":26,"context_line":"        pass"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def api_update_dhcp(task, options):"},{"line_number":29,"context_line":"        pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def update_port_address(self, port_id, address):"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_29cf4829","line":28,"in_reply_to":"baada198_e989d025","updated":"2014-08-11 22:14:42.000000000","message":"Fixed.","commit_id":"e636e048635072fbf86eb63cf1ca2a110fc17136"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"4bfec71aeb02f4830ef09b8915454f00315d3f63","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def update_port_dhcp_opts(self, port_id, dhcp_options):"},{"line_number":26,"context_line":"        pass"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def update_provider_dhcp(task, options):"},{"line_number":29,"context_line":"        pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def update_port_address(self, port_id, address):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_784e526f","line":28,"updated":"2014-08-12 11:43:59.000000000","message":"this method is not an abstractmethod in the base class, so I don\u0027t think we should override it here","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"e76eb2c2658a88bb90443aed0a414ed4335dff49","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def update_port_dhcp_opts(self, port_id, dhcp_options):"},{"line_number":26,"context_line":"        pass"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def update_provider_dhcp(task, options):"},{"line_number":29,"context_line":"        pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def update_port_address(self, port_id, address):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_edd45feb","line":28,"in_reply_to":"baada198_784e526f","updated":"2014-08-12 14:11:46.000000000","message":"I think this is being overridden because the base class does stuff, that this noop class does not need to do. I think this makes sense to me.","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"717ad67dc606aa6e55f2e8ded083eae3d38a2dec","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def update_port_dhcp_opts(self, port_id, dhcp_options):"},{"line_number":26,"context_line":"        pass"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def update_provider_dhcp(task, options):"},{"line_number":29,"context_line":"        pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def update_port_address(self, port_id, address):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_384bf35f","line":28,"in_reply_to":"baada198_edd45feb","updated":"2014-08-12 14:18:32.000000000","message":"Right, well, we have 2 providers \"neutron\" and \"none\" and both of them are overriding this method, perhaps this should be an abstract method then!?","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"dbd75836d9695e59a45eb08fee6c44fcbb8f6ed9","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class NoneDHCPApi(base.BaseDHCP):"},{"line_number":20,"context_line":"    \"\"\"No-op DHCP API."},{"line_number":21,"context_line":"    \"\"\""},{"line_number":22,"context_line":"    def __init__(self):"},{"line_number":23,"context_line":"        pass"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def update_port_dhcp_opts(self, port_id, dhcp_options):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ab29df4_bdd7e7be","line":22,"updated":"2014-08-13 19:52:46.000000000","message":"Since __init__ isn\u0027t one of the base class abstract methods, this isn\u0027t necessary.","commit_id":"71b9c5bec134ca6c25debc4c7ebadd01ed3b5bc6"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"776e9457a35a0ce8c4e3c6e2300922a74403a074","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class NoneDHCPApi(base.BaseDHCP):"},{"line_number":20,"context_line":"    \"\"\"No-op DHCP API."},{"line_number":21,"context_line":"    \"\"\""},{"line_number":22,"context_line":"    def update_port_dhcp_opts(self, port_id, dhcp_options):"},{"line_number":23,"context_line":"        pass"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_bc3417df","line":21,"updated":"2014-08-14 21:09:02.000000000","message":"Nit: if you push another patchset, move the closing quotes to the same line as the opening... I thought pep8 complained about this.","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"}],"ironic/drivers/modules/agent.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"25aca787fcdc3eae42617d22a88bdd35eb2e0efa","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        :returns: status of the deploy. One of ironic.common.states."},{"line_number":251,"context_line":"        \"\"\""},{"line_number":252,"context_line":"        dhcp_opts \u003d pxe_utils.dhcp_options_for_instance()"},{"line_number":253,"context_line":"        dhcp_factory.update_dhcp(task, dhcp_opts)"},{"line_number":254,"context_line":"        manager_utils.node_set_boot_device(task, \u0027pxe\u0027, persistent\u003dTrue)"},{"line_number":255,"context_line":"        manager_utils.node_power_action(task, states.REBOOT)"},{"line_number":256,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_0903a70c","line":253,"updated":"2014-08-08 17:37:13.000000000","message":"Shouldn\u0027t this be more like `dhcp_factory.get_dhcp_provider().update_dhcp()`?","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"25aca787fcdc3eae42617d22a88bdd35eb2e0efa","unresolved":false,"context_lines":[{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        :param task: a TaskManager instance."},{"line_number":325,"context_line":"        \"\"\""},{"line_number":326,"context_line":"        dhcp_factory.update_dhcp(task, CONF.agent.agent_pxe_bootfile_name)"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"class AgentVendorInterface(base.VendorInterface):"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_29086b26","line":326,"updated":"2014-08-08 17:37:13.000000000","message":"Ditto","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"}],"ironic/drivers/modules/pxe.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"25aca787fcdc3eae42617d22a88bdd35eb2e0efa","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        #               to deploy ramdisk"},{"line_number":524,"context_line":"        _create_token_file(task)"},{"line_number":525,"context_line":"        dhcp_opts \u003d pxe_utils.dhcp_options_for_instance()"},{"line_number":526,"context_line":"        dhcp_factory.update_dhcp(task, dhcp_opts)"},{"line_number":527,"context_line":"        manager_utils.node_set_boot_device(task, \u0027pxe\u0027, persistent\u003dTrue)"},{"line_number":528,"context_line":"        manager_utils.node_power_action(task, states.REBOOT)"},{"line_number":529,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_2e11515c","line":526,"updated":"2014-08-08 17:37:13.000000000","message":"Ditto","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"25aca787fcdc3eae42617d22a88bdd35eb2e0efa","unresolved":false,"context_lines":[{"line_number":583,"context_line":""},{"line_number":584,"context_line":"    def take_over(self, task):"},{"line_number":585,"context_line":"        dhcp_opts \u003d pxe_utils.dhcp_options_for_instance()"},{"line_number":586,"context_line":"        dhcp_factory.update_dhcp(task, dhcp_opts)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":""},{"line_number":589,"context_line":"class VendorPassthru(base.VendorInterface):"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_4e092531","line":586,"updated":"2014-08-08 17:37:13.000000000","message":"Ditto","commit_id":"b91432a6505cae3d428c83f1bb0ea08d839d8cab"}],"ironic/tests/dhcp/test_factory.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"a1767f9e7bcd97bfb725d04fccd7d857c8e74487","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.node \u003d object_utils.create_test_node(self.context)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_get_none_dhcp(self):"},{"line_number":52,"context_line":"        dhcp_factory._reset_dhcp_provider()"},{"line_number":53,"context_line":"        self.config(dhcp_provider\u003d\u0027none\u0027,"},{"line_number":54,"context_line":"                    group\u003d\u0027dhcp\u0027)"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7ac7a964_baf34272","line":52,"updated":"2014-08-14 17:29:04.000000000","message":"resetting the module-global inside a test case like this is going to lead to cross-thread races and non-deterministic failures","commit_id":"3102a246c33c5c6392865aa1d3a4ba4c6dd6c096"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                    group\u003d\u0027neutron\u0027)"},{"line_number":37,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_set_none_dhcp(self):"},{"line_number":40,"context_line":"        self.config(dhcp_provider\u003d\u0027none\u0027,"},{"line_number":41,"context_line":"                    group\u003d\u0027dhcp\u0027)"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_a3f14bcf","line":39,"updated":"2014-08-15 01:18:33.000000000","message":"I don\u0027t know if we want to test the default (not explicitly setting dhcp_provider \u003d something).\n\nI would like to see what happens if you set dhcp_provider\u003dbad_provider.","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"18505b17056f6068ab692976e177fc264b7ac2ea","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                    group\u003d\u0027neutron\u0027)"},{"line_number":37,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_set_none_dhcp(self):"},{"line_number":40,"context_line":"        self.config(dhcp_provider\u003d\u0027none\u0027,"},{"line_number":41,"context_line":"                    group\u003d\u0027dhcp\u0027)"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_2569b525","line":39,"in_reply_to":"7ac7a964_a3f14bcf","updated":"2014-08-15 09:33:25.000000000","message":"+1 for bad provider test","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"18505b17056f6068ab692976e177fc264b7ac2ea","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            # instead of creating a new (nonexistent) one.  If it does try to"},{"line_number":62,"context_line":"            # create the nonexistent dhcp provider, stevedore will complain."},{"line_number":63,"context_line":"            self.config(dhcp_provider\u003d\u0027nonexistent\u0027,"},{"line_number":64,"context_line":"                        group\u003d\u0027dhcp\u0027)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"            provider \u003d dhcp_factory.get_dhcp_provider()"},{"line_number":67,"context_line":"            self.assertEqual(0, mock_set_dhcp.call_count)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_65456db2","line":64,"updated":"2014-08-15 09:33:25.000000000","message":"I see what is trying to be tested here, but I don\u0027t think it\u0027s a valid test, changing the config file without resenting the service won\u0027t cause the service to re-read the configuration¹\n\nI think that a more valid/realistic test for this case would be to call get_dhcp_provider() twice and check if the _set_dhcp_provider() was invoke only once.\n\n\n¹ We don\u0027t support kill -HUP to reread the configs without restarting the service as well :(","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"3fc334608c3972561bc104feb0c9fb7e5849e52a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from ironic.tests import base"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"CONF \u003d cfg.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class TestDHCPFactory(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"1abeadc6_5a235a04","line":27,"updated":"2014-08-29 13:51:33.000000000","message":"This is unused.","commit_id":"31ff063278367ecb88e3aee723b44dff027c9201"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"70c227320be749372862832c1f4ead4389739de9","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from ironic.tests import base"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"CONF \u003d cfg.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class TestDHCPFactory(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"1abeadc6_ab76e2a1","line":27,"in_reply_to":"1abeadc6_5a235a04","updated":"2014-08-29 14:47:02.000000000","message":"Done","commit_id":"31ff063278367ecb88e3aee723b44dff027c9201"}],"ironic/tests/dhcp/test_neutron.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f49272ab57dd728a8c0828b4d5e178971279f8f6","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        with mock.patch.object(client.Client, \"__init__\") as mock_client_init:"},{"line_number":78,"context_line":"            mock_client_init.return_value \u003d None"},{"line_number":79,"context_line":"            dhcp_factory.get_dhcp_provider(dhcp_provider\u003d\u0027neutron\u0027,"},{"line_number":80,"context_line":"                                             token\u003dmy_context.auth_token)"},{"line_number":81,"context_line":"            mock_client_init.assert_called_once_with(**expected)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def test_create_without_token(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_bef613d6","line":80,"updated":"2014-08-12 12:01:03.000000000","message":"nit: indentation should be 2 spaces to the left","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"3fc334608c3972561bc104feb0c9fb7e5849e52a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from ironic.tests.objects import utils as object_utils"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONF \u003d cfg.CONF"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class TestNeutron(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"1abeadc6_5a3c3a2f","line":33,"updated":"2014-08-29 13:51:33.000000000","message":"This is unused.","commit_id":"31ff063278367ecb88e3aee723b44dff027c9201"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"70c227320be749372862832c1f4ead4389739de9","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from ironic.tests.objects import utils as object_utils"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONF \u003d cfg.CONF"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class TestNeutron(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"1abeadc6_cb795e94","line":33,"in_reply_to":"1abeadc6_5a3c3a2f","updated":"2014-08-29 14:47:02.000000000","message":"Done","commit_id":"31ff063278367ecb88e3aee723b44dff027c9201"}],"ironic/tests/drivers/test_pxe.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f49272ab57dd728a8c0828b4d5e178971279f8f6","unresolved":false,"context_lines":[{"line_number":745,"context_line":"            mock_get_image_mb.assert_called_once_with(fake_img_path)"},{"line_number":746,"context_line":"            mock_update_dhcp.assert_called_once_with("},{"line_number":747,"context_line":"                task, dhcp_opts)"},{"line_number":748,"context_line":"            mock_get_dhcp_provider.assert_called_once()"},{"line_number":749,"context_line":"            mock_node_set_boot.assert_called_once_with(task, \u0027pxe\u0027,"},{"line_number":750,"context_line":"                                                       persistent\u003dTrue)"},{"line_number":751,"context_line":"            mock_node_power_action.assert_called_once_with(task, states.REBOOT)"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_3eb843e7","line":748,"updated":"2014-08-12 12:01:03.000000000","message":"s/assert_called_once/assert_called_once_with/","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f49272ab57dd728a8c0828b4d5e178971279f8f6","unresolved":false,"context_lines":[{"line_number":791,"context_line":"            task.driver.deploy.take_over(task)"},{"line_number":792,"context_line":"            update_dhcp_mock.assert_called_once_with("},{"line_number":793,"context_line":"                task, dhcp_opts)"},{"line_number":794,"context_line":"            mock_get_dhcp_provider.assert_called_once()"},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"    @mock.patch.object(pxe, \u0027InstanceImageCache\u0027)"},{"line_number":797,"context_line":"    def test_continue_deploy_good(self, mock_image_cache):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_1ee61f13","line":794,"updated":"2014-08-12 12:01:03.000000000","message":"s/assert_called_once/assert_called_once_with/","commit_id":"64f8fb34c9488d1d670ea969556edea6c3fce0e4"}],"ironic/tests/test_network.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1c4fdbc110641bdb24b4d77e987c14048d8456f0","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            result \u003d network.get_node_vif_ids(task)"},{"line_number":51,"context_line":"        self.assertEqual(expected, result)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test__get_node_vif_ids_one_port(self):"},{"line_number":54,"context_line":"        port1 \u003d self._create_test_port(node_id\u003dself.node.id,"},{"line_number":55,"context_line":"                                       id\u003d6,"},{"line_number":56,"context_line":"                                       address\u003d\u0027aa:bb:cc\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_7f6407e6","line":53,"updated":"2014-08-07 13:52:48.000000000","message":"s/__/_/  as it\u0027s no longer a private function","commit_id":"3f874a56832e20151950c0263b79fe32c36ee3a0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1c4fdbc110641bdb24b4d77e987c14048d8456f0","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            result \u003d network.get_node_vif_ids(task)"},{"line_number":63,"context_line":"        self.assertEqual(expected, result)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test__get_node_vif_ids_two_ports(self):"},{"line_number":66,"context_line":"        port1 \u003d self._create_test_port(node_id\u003dself.node.id,"},{"line_number":67,"context_line":"                                       id\u003d6,"},{"line_number":68,"context_line":"                                       address\u003d\u0027aa:bb:cc\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_9f5f1b10","line":65,"updated":"2014-08-07 13:52:48.000000000","message":"ditto","commit_id":"3f874a56832e20151950c0263b79fe32c36ee3a0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _create_test_port(self, **kwargs):"},{"line_number":42,"context_line":"        p \u003d db_utils.get_test_port(**kwargs)"},{"line_number":43,"context_line":"        return self.dbapi.create_port(p)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_get_node_vif_ids_no_ports(self):"},{"line_number":46,"context_line":"        expected \u003d {}"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_8310cf4f","line":43,"updated":"2014-08-15 01:18:33.000000000","message":"wondering, is it better to use object_utils.create_test_port()?","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"cce9ab2780053b37b888df91d4fe21fa73d0cd7e","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_get_node_vif_ids_one_port(self):"},{"line_number":52,"context_line":"        port1 \u003d self._create_test_port(node_id\u003dself.node.id,"},{"line_number":53,"context_line":"                                       id\u003d6,"},{"line_number":54,"context_line":"                                       address\u003d\u0027aa:bb:cc\u0027,"},{"line_number":55,"context_line":"                                       uuid\u003dutils.generate_uuid(),"},{"line_number":56,"context_line":"                                       extra\u003d{\u0027vif_port_id\u0027: \u0027test-vif-A\u0027},"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ac7a964_03883f70","line":53,"updated":"2014-08-15 01:18:33.000000000","message":"I could be wrong, but I thought we were trying to get away from using id, and use uuid instead. I doubt that both id and uuid need to be specified though.","commit_id":"68385d0b9a995d81e79aeb90fb51e7d49784f395"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"3fc334608c3972561bc104feb0c9fb7e5849e52a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from ironic.tests.objects import utils as object_utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"CONF \u003d cfg.CONF"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class TestNetwork(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"1abeadc6_3a6f7e2c","line":29,"updated":"2014-08-29 13:51:33.000000000","message":"This is unused.","commit_id":"31ff063278367ecb88e3aee723b44dff027c9201"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"70c227320be749372862832c1f4ead4389739de9","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from ironic.tests.objects import utils as object_utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"CONF \u003d cfg.CONF"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class TestNetwork(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"1abeadc6_6b492a5f","line":29,"in_reply_to":"1abeadc6_3a6f7e2c","updated":"2014-08-29 14:47:02.000000000","message":"Done","commit_id":"31ff063278367ecb88e3aee723b44dff027c9201"}]}
