)]}'
{"ironic/common/exception.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"8356cc4857bb2667d97cb4c1c43765efda652047","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"class InvalidDriver(Invalid):"},{"line_number":146,"context_line":"    message \u003d _(\"Invalid driver \u0027%(driver)s\u0027 requested.\")"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class PatchError(Invalid):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAXX%2F%2F%2FHU%3D","line":146,"updated":"2014-04-24 20:52:28.000000000","message":"Why add a new driver here? I think DriverNotFound is probably sufficient.","commit_id":"c5b352a2ef173a0a0883272642aa15895aa43dc7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"540a1788be01ef8fbdd3bc5b450f16bf12b7ee97","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"class InvalidDriver(Invalid):"},{"line_number":146,"context_line":"    message \u003d _(\"Invalid driver \u0027%(driver)s\u0027 requested.\")"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class PatchError(Invalid):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAXX%2F%2F3To%3D","line":146,"in_reply_to":"AAAAXX%2F%2F%2B3U%3D","updated":"2014-04-25 17:30:14.000000000","message":"Seems like it would be fine to me, but better error messages always help :)","commit_id":"c5b352a2ef173a0a0883272642aa15895aa43dc7"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"0a22114afb35a987eae6514aaad921177801e48b","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"class InvalidDriver(Invalid):"},{"line_number":146,"context_line":"    message \u003d _(\"Invalid driver \u0027%(driver)s\u0027 requested.\")"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class PatchError(Invalid):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAXX%2F%2F2O0%3D","line":146,"in_reply_to":"AAAAXX%2F%2F%2B3U%3D","updated":"2014-04-25 20:12:14.000000000","message":"You can always overwrite the exception\u0027s message, though I wonder if we should just change the message for that exception globally.\n\nAlso, DriverNotFound may already be raised by the RPC method, prior to even reaching the Conductor. So it really should be the same exception whether the driver is not known (no entry in the database), or something has changed suddenly and the driver, while known and mapped to a conductor, is not loaded on that conductor any longer.","commit_id":"c5b352a2ef173a0a0883272642aa15895aa43dc7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c6b80cabdde853a1e328f33ccaa661660d3c1797","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"class InvalidDriver(Invalid):"},{"line_number":146,"context_line":"    message \u003d _(\"Invalid driver \u0027%(driver)s\u0027 requested.\")"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class PatchError(Invalid):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAXX%2F%2F%2B3U%3D","line":146,"in_reply_to":"AAAAXX%2F%2F%2FHU%3D","updated":"2014-04-24 21:04:30.000000000","message":"The msg from DriverNotFound is \u0027Failed to load driver X\u0027 and I wasn\u0027t sure that would be clear to the user or not. Thought I\u0027d throw this in to see what people think ;)","commit_id":"c5b352a2ef173a0a0883272642aa15895aa43dc7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"59ad66867c1617198783fde5243e764ed957cf7b","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"class InvalidDriver(Invalid):"},{"line_number":146,"context_line":"    message \u003d _(\"Invalid driver \u0027%(driver)s\u0027 requested.\")"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class PatchError(Invalid):"}],"source_content_type":"text/x-python","patch_set":7,"id":"bad4c104_26581056","line":146,"in_reply_to":"AAAAXX%2F%2F2O0%3D","updated":"2014-04-29 16:20:15.000000000","message":"The votes are in, and InvalidDriver is out. I modified the message associated with DriverNotFound to (try to) distinguish trying to get driver info from the hashring (\"entry in database\") vs from a conductor (\"not loaded any longer\").","commit_id":"c5b352a2ef173a0a0883272642aa15895aa43dc7"}],"ironic/conductor/manager.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"522d638a3414431fd9e611da2b70c25dc1403cbf","unresolved":false,"context_lines":[{"line_number":122,"context_line":"class ConductorManager(periodic_task.PeriodicTasks):"},{"line_number":123,"context_line":"    \"\"\"Ironic Conductor manager main class.\"\"\""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    RPC_API_VERSION \u003d \u00271.14\u0027"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    target \u003d messaging.Target(version\u003dRPC_API_VERSION)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_33793afd","side":"PARENT","line":125,"updated":"2014-05-07 16:29:30.000000000","message":"Ew, this sounds like a potential bug right now in trunk... (not related to ur patch, I\u0027m just pointing it out here)","commit_id":"c5068b20065cc38e676c96e3ccbe096ed4801654"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b0e0fa65a34038a377309112384e4010962ac5a1","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        try:"},{"line_number":179,"context_line":"            return self._driver_factory[driver_name].obj"},{"line_number":180,"context_line":"        except KeyError:"},{"line_number":181,"context_line":"            raise exception.DriverNotFound(driver_name\u003ddriver_name)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def periodic_tasks(self, context, raise_on_error\u003dFalse):"},{"line_number":184,"context_line":"        \"\"\"Periodic tasks are run at pre-specified interval.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_1465a81d","line":181,"updated":"2014-05-13 12:38:51.000000000","message":"In has_ring you change error message to smth like \"Driver %s not found\". Doesn\u0027t it make sense here as well?","commit_id":"fadc791af47a963c723518de88a4aa8e6609bd96"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab35aefad42fe0867da762f4e3b9df4f70242fd4","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        try:"},{"line_number":179,"context_line":"            return self._driver_factory[driver_name].obj"},{"line_number":180,"context_line":"        except KeyError:"},{"line_number":181,"context_line":"            raise exception.DriverNotFound(driver_name\u003ddriver_name)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def periodic_tasks(self, context, raise_on_error\u003dFalse):"},{"line_number":184,"context_line":"        \"\"\"Periodic tasks are run at pre-specified interval.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_6522fc02","line":181,"in_reply_to":"7adec928_1465a81d","updated":"2014-05-21 14:51:55.000000000","message":"Well, yes and no. It might or might not make sense to the end user, to see the same error message. For me, it makes sense, because I wanted a different message to distinguish the two places where it could fail.\n\nDo we have a policy on this?","commit_id":"fadc791af47a963c723518de88a4aa8e6609bd96"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b0e0fa65a34038a377309112384e4010962ac5a1","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        \"\"\""},{"line_number":197,"context_line":"        LOG.debug(_(\"RPC get_driver_properties called for driver %(driver)s\") %"},{"line_number":198,"context_line":"                {\u0027driver\u0027: driver_name})"},{"line_number":199,"context_line":"        driver \u003d self.get_driver(driver_name)"},{"line_number":200,"context_line":"        return driver.get_properties()"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_3468e4f4","line":198,"updated":"2014-05-13 12:38:51.000000000","message":"1. A bit wrong indentation; 2. I think the policy now is to not translate debug messages","commit_id":"fadc791af47a963c723518de88a4aa8e6609bd96"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab35aefad42fe0867da762f4e3b9df4f70242fd4","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        \"\"\""},{"line_number":197,"context_line":"        LOG.debug(_(\"RPC get_driver_properties called for driver %(driver)s\") %"},{"line_number":198,"context_line":"                {\u0027driver\u0027: driver_name})"},{"line_number":199,"context_line":"        driver \u003d self.get_driver(driver_name)"},{"line_number":200,"context_line":"        return driver.get_properties()"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_a51c04c3","line":198,"in_reply_to":"7adec928_3468e4f4","updated":"2014-05-21 14:51:55.000000000","message":"Ah yes, the do-not-translate-debug-msgs has landed. Thx.","commit_id":"fadc791af47a963c723518de88a4aa8e6609bd96"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"31508507d3961e925cbd28b470020a04eac6b41a","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        except exception.ConductorNotFound:"},{"line_number":167,"context_line":"            pass"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def get_driver(self, driver_name):"},{"line_number":170,"context_line":"        \"\"\"Get the driver."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        :param driver_name: name of the driver."}],"source_content_type":"text/x-python","patch_set":13,"id":"5adbc538_04a69c10","line":169,"updated":"2014-05-26 20:59:35.000000000","message":"Sorry if this was discussed already, but do we want this method to be public? \nI think we don\u0027t want to expose access to the driver directly because often we have some orchestration around it. And it\u0027s not a part of RPC_API\n\nWhat do you think?","commit_id":"7cef2307c31b42e0917477f1782541cc234b98e8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"aacd6926151fc5f2c322d43a42de5e9fdf9c4c73","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        except exception.ConductorNotFound:"},{"line_number":167,"context_line":"            pass"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def get_driver(self, driver_name):"},{"line_number":170,"context_line":"        \"\"\"Get the driver."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        :param driver_name: name of the driver."}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_5774e4fc","line":169,"in_reply_to":"5adbc538_04a69c10","updated":"2014-05-27 13:53:16.000000000","message":"I\u0027m not sure. But it won\u0027t hurt to change it ;)","commit_id":"7cef2307c31b42e0917477f1782541cc234b98e8"}],"ironic/conductor/rpcapi.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"0a22114afb35a987eae6514aaad921177801e48b","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        1.12 - validate_vendor_action, do_vendor_action replaced by single"},{"line_number":60,"context_line":"              vendor_passthru method."},{"line_number":61,"context_line":"        1.13 - Added update_port."},{"line_number":62,"context_line":"        1.14 - Added get_driver_properties."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    \"\"\""},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAXX%2F%2F2OU%3D","line":62,"updated":"2014-04-25 20:12:14.000000000","message":"version bump will conflict with https://review.openstack.org/#/c/81919","commit_id":"c5b352a2ef173a0a0883272642aa15895aa43dc7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"59ad66867c1617198783fde5243e764ed957cf7b","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        1.12 - validate_vendor_action, do_vendor_action replaced by single"},{"line_number":60,"context_line":"              vendor_passthru method."},{"line_number":61,"context_line":"        1.13 - Added update_port."},{"line_number":62,"context_line":"        1.14 - Added get_driver_properties."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    \"\"\""},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bad4c104_e62468c8","line":62,"in_reply_to":"AAAAXX%2F%2F2OU%3D","updated":"2014-04-29 16:20:15.000000000","message":"Durn. That review got merged before mine ;)","commit_id":"c5b352a2ef173a0a0883272642aa15895aa43dc7"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"4e494f49b2566ddc9a5f9dbb220cb7e50efbfe95","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        # handle a driver, use the same mapping to a driver class.)"},{"line_number":317,"context_line":"        topic \u003d self.topic + \".\" + ring.hosts[0]"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        return self.call(context,"},{"line_number":320,"context_line":"                         self.make_msg(\u0027get_driver_properties\u0027,"},{"line_number":321,"context_line":"                                       driver_name\u003ddriver_name),"},{"line_number":322,"context_line":"                         topic\u003dtopic)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAXX%2F%2F7aA%3D","line":319,"updated":"2014-04-25 08:35:18.000000000","message":"Why look up a conductor at all?   Just cast to self.topic and any conductor will pick it up.","commit_id":"c5b352a2ef173a0a0883272642aa15895aa43dc7"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"3f3ff6d1e44fe780002f45f6abaace44121bd383","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        # handle a driver, use the same mapping to a driver class.)"},{"line_number":317,"context_line":"        topic \u003d self.topic + \".\" + ring.hosts[0]"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        return self.call(context,"},{"line_number":320,"context_line":"                         self.make_msg(\u0027get_driver_properties\u0027,"},{"line_number":321,"context_line":"                                       driver_name\u003ddriver_name),"},{"line_number":322,"context_line":"                         topic\u003dtopic)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAXX%2F%2F4FQ%3D","line":319,"in_reply_to":"AAAAXX%2F%2F7aA%3D","updated":"2014-04-25 15:59:56.000000000","message":"Oops, I missed that the ring manager actually gets the driver to select conductor based on that.  So, nevermind!","commit_id":"c5b352a2ef173a0a0883272642aa15895aa43dc7"},{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"b7212c4679047b75033c6d2abace8a5c4998ab48","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        \"\"\"Get the required and optional properties of the driver."},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        :param context: request context."},{"line_number":320,"context_line":"        :param driver_name: name of the driver."},{"line_number":321,"context_line":"        :returns: a dictionary with the properties."},{"line_number":322,"context_line":"        :raises: DriverNotFound."},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_06c4fb3e","line":320,"updated":"2014-05-27 08:38:14.000000000","message":"Probably need to include :param topic here","commit_id":"7cef2307c31b42e0917477f1782541cc234b98e8"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"aacd6926151fc5f2c322d43a42de5e9fdf9c4c73","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        \"\"\"Get the required and optional properties of the driver."},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        :param context: request context."},{"line_number":320,"context_line":"        :param driver_name: name of the driver."},{"line_number":321,"context_line":"        :returns: a dictionary with the properties."},{"line_number":322,"context_line":"        :raises: DriverNotFound."},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_17cedc5a","line":320,"in_reply_to":"3ae8d1ca_06c4fb3e","updated":"2014-05-27 13:53:16.000000000","message":"Ah, yes, good catch. Thx.","commit_id":"7cef2307c31b42e0917477f1782541cc234b98e8"},{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"b7212c4679047b75033c6d2abace8a5c4998ab48","unresolved":false,"context_lines":[{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        \"\"\""},{"line_number":325,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic,"},{"line_number":326,"context_line":"                                    version\u003d\u00271.16\u0027)"},{"line_number":327,"context_line":"        return cctxt.call(context, \u0027get_driver_properties\u0027,"},{"line_number":328,"context_line":"                          driver_name\u003ddriver_name)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_26c1f72e","line":326,"updated":"2014-05-27 08:38:14.000000000","message":"Should this reference RPC_API_VERSION instead of hardcoding?","commit_id":"7cef2307c31b42e0917477f1782541cc234b98e8"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a873b06ac309322684747c6517af733920fe8091","unresolved":false,"context_lines":[{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        \"\"\""},{"line_number":325,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic,"},{"line_number":326,"context_line":"                                    version\u003d\u00271.16\u0027)"},{"line_number":327,"context_line":"        return cctxt.call(context, \u0027get_driver_properties\u0027,"},{"line_number":328,"context_line":"                          driver_name\u003ddriver_name)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_59d8a453","line":326,"in_reply_to":"3ae8d1ca_26c1f72e","updated":"2014-05-27 08:52:38.000000000","message":"RPC_API_VERSION will change with time, but for this call 1.16 will always be enough. That\u0027s how I understand it :)","commit_id":"7cef2307c31b42e0917477f1782541cc234b98e8"},{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"912c24c214da01f89d4e2580df5d7f1691f84143","unresolved":false,"context_lines":[{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        \"\"\""},{"line_number":325,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic,"},{"line_number":326,"context_line":"                                    version\u003d\u00271.16\u0027)"},{"line_number":327,"context_line":"        return cctxt.call(context, \u0027get_driver_properties\u0027,"},{"line_number":328,"context_line":"                          driver_name\u003ddriver_name)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_2d5f1210","line":326,"in_reply_to":"3ae8d1ca_59d8a453","updated":"2014-05-27 10:56:18.000000000","message":"Ahh, thanks Dmitry for the clarification.","commit_id":"7cef2307c31b42e0917477f1782541cc234b98e8"}],"ironic/drivers/base.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b0e0fa65a34038a377309112384e4010962ac5a1","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            iface \u003d getattr(self, iface_name, None)"},{"line_number":105,"context_line":"            if iface:"},{"line_number":106,"context_line":"                (required, optional) \u003d iface.get_properties()"},{"line_number":107,"context_line":"                for (name, description) in required.iteritems():"},{"line_number":108,"context_line":"                    all_properties[name] \u003d {\u0027description\u0027: description,"},{"line_number":109,"context_line":"                                           \u0027required\u0027: True}"},{"line_number":110,"context_line":"                for (name, description) in optional.iteritems():"}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_f47d9cb2","line":107,"updated":"2014-05-13 12:38:51.000000000","message":"Don\u0027t we use just items() to comply with somewhere-in-the-future support for Py3k?","commit_id":"fadc791af47a963c723518de88a4aa8e6609bd96"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab35aefad42fe0867da762f4e3b9df4f70242fd4","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            iface \u003d getattr(self, iface_name, None)"},{"line_number":105,"context_line":"            if iface:"},{"line_number":106,"context_line":"                (required, optional) \u003d iface.get_properties()"},{"line_number":107,"context_line":"                for (name, description) in required.iteritems():"},{"line_number":108,"context_line":"                    all_properties[name] \u003d {\u0027description\u0027: description,"},{"line_number":109,"context_line":"                                           \u0027required\u0027: True}"},{"line_number":110,"context_line":"                for (name, description) in optional.iteritems():"}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_25039474","line":107,"in_reply_to":"7adec928_f47d9cb2","updated":"2014-05-21 14:51:55.000000000","message":"I don\u0027t know. I took a look at https://wiki.openstack.org/wiki/Python3 and you\u0027re right! I changed it wherever I used it. Looks like we have a mix in our code base. I\u0027m sure someone will get around to changing so I\u0027m not going to open a bug about it.","commit_id":"fadc791af47a963c723518de88a4aa8e6609bd96"}],"ironic/drivers/modules/ipmitool.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"90bce610de75d6a242278e31b8016e6fd0891d70","unresolved":false,"context_lines":[{"line_number":53,"context_line":"OPTIONAL_PROPERTIES \u003d {\u0027ipmi_password\u0027: _(\"password\"),"},{"line_number":54,"context_line":"                       \u0027ipmi_priv_level\u0027: _("},{"line_number":55,"context_line":"                           \"privilege level; default is ADMINISTRATOR. One of \""},{"line_number":56,"context_line":"                           ) + \u0027, \u0027.join(VALID_PRIV_LEVELS),"},{"line_number":57,"context_line":"                       \u0027ipmi_username\u0027: _(\"username; default is NULL user\")}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7adec928_6ad38738","line":56,"updated":"2014-05-22 14:07:57.000000000","message":"I think it\u0027s better to use % operator instead of concatentation, as it might happen, that after translation the list will no longer be in the end. That will also be more easy-to-understand for a translator.","commit_id":"3e4b9242c840240a64918e4b57a80b625e6e72f0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"eaf64f3066de8f21ac89b5278c8c443d431761af","unresolved":false,"context_lines":[{"line_number":53,"context_line":"OPTIONAL_PROPERTIES \u003d {\u0027ipmi_password\u0027: _(\"password\"),"},{"line_number":54,"context_line":"                       \u0027ipmi_priv_level\u0027: _("},{"line_number":55,"context_line":"                           \"privilege level; default is ADMINISTRATOR. One of \""},{"line_number":56,"context_line":"                           ) + \u0027, \u0027.join(VALID_PRIV_LEVELS),"},{"line_number":57,"context_line":"                       \u0027ipmi_username\u0027: _(\"username; default is NULL user\")}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7adec928_45c31c57","line":56,"in_reply_to":"7adec928_6ad38738","updated":"2014-05-22 14:30:13.000000000","message":"Done.","commit_id":"3e4b9242c840240a64918e4b57a80b625e6e72f0"}],"ironic/drivers/modules/pxe.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"bb5ad27ddd57eee8b313eaf0ff9ea248e9d2f829","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                       \u0027pxe_deploy_ramdisk\u0027,"},{"line_number":83,"context_line":"                       \u0027pxe_image_source\u0027,"},{"line_number":84,"context_line":"                       \u0027pxe_root_gb\u0027]"},{"line_number":85,"context_line":"OPTIONAL_PROPERTIES \u003d [\u0027pxe_deploy_key\u0027,"},{"line_number":86,"context_line":"                       \u0027pxe_instance_name\u0027,"},{"line_number":87,"context_line":"                       \u0027pxe_key_data\u0027,"},{"line_number":88,"context_line":"                       \u0027pxe_swap_mb\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2BkPM%3D","line":85,"updated":"2014-02-20 13:48:17.000000000","message":"This parameter for internal use only.","commit_id":"b024e27120b230aa364929624f1d4bd6cc721680"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b725bfa9a62373c1e8a156c9b1c5262a887825ca","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                       \u0027pxe_deploy_ramdisk\u0027,"},{"line_number":83,"context_line":"                       \u0027pxe_image_source\u0027,"},{"line_number":84,"context_line":"                       \u0027pxe_root_gb\u0027]"},{"line_number":85,"context_line":"OPTIONAL_PROPERTIES \u003d [\u0027pxe_deploy_key\u0027,"},{"line_number":86,"context_line":"                       \u0027pxe_instance_name\u0027,"},{"line_number":87,"context_line":"                       \u0027pxe_key_data\u0027,"},{"line_number":88,"context_line":"                       \u0027pxe_swap_mb\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Bimo%3D","line":85,"in_reply_to":"AAAAUX%2F%2BkPM%3D","updated":"2014-02-20 16:23:27.000000000","message":"Ah yes, thanks for pointing that out.","commit_id":"b024e27120b230aa364929624f1d4bd6cc721680"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"bb5ad27ddd57eee8b313eaf0ff9ea248e9d2f829","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                       \u0027pxe_root_gb\u0027]"},{"line_number":85,"context_line":"OPTIONAL_PROPERTIES \u003d [\u0027pxe_deploy_key\u0027,"},{"line_number":86,"context_line":"                       \u0027pxe_instance_name\u0027,"},{"line_number":87,"context_line":"                       \u0027pxe_key_data\u0027,"},{"line_number":88,"context_line":"                       \u0027pxe_swap_mb\u0027]"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2BkNw%3D","line":87,"updated":"2014-02-20 13:48:17.000000000","message":"This parameter unused IMO.","commit_id":"b024e27120b230aa364929624f1d4bd6cc721680"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"656ae1bf61e462194bb502236d3d7529e93a072a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                       \u0027pxe_root_gb\u0027]"},{"line_number":85,"context_line":"OPTIONAL_PROPERTIES \u003d [\u0027pxe_deploy_key\u0027,"},{"line_number":86,"context_line":"                       \u0027pxe_instance_name\u0027,"},{"line_number":87,"context_line":"                       \u0027pxe_key_data\u0027,"},{"line_number":88,"context_line":"                       \u0027pxe_swap_mb\u0027]"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2BiUA%3D","line":87,"in_reply_to":"AAAAUX%2F%2BinI%3D","updated":"2014-02-20 16:47:42.000000000","message":"I decided to remove pxe_key_data in a separate review: https://review.openstack.org/75098.","commit_id":"b024e27120b230aa364929624f1d4bd6cc721680"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"b725bfa9a62373c1e8a156c9b1c5262a887825ca","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                       \u0027pxe_root_gb\u0027]"},{"line_number":85,"context_line":"OPTIONAL_PROPERTIES \u003d [\u0027pxe_deploy_key\u0027,"},{"line_number":86,"context_line":"                       \u0027pxe_instance_name\u0027,"},{"line_number":87,"context_line":"                       \u0027pxe_key_data\u0027,"},{"line_number":88,"context_line":"                       \u0027pxe_swap_mb\u0027]"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2BinI%3D","line":87,"in_reply_to":"AAAAUX%2F%2BkNw%3D","updated":"2014-02-20 16:23:27.000000000","message":"Yes, it is unused, but it is in the code. Should I delete all references to it, or should that be done in another review?","commit_id":"b024e27120b230aa364929624f1d4bd6cc721680"}],"ironic/drivers/modules/ssh.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"1aa70f7a82657c352e0737f502987dbbf0c6fef9","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                \"key_filename be set.\"))"},{"line_number":208,"context_line":"        if not os.path.isfile(key_filename):"},{"line_number":209,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":210,"context_line":"                \"SSH key file %s not found.\") % key_filename)"},{"line_number":211,"context_line":"        res[\u0027key_filename\u0027] \u003d key_filename"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    return res"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWn%2F%2F9Ko%3D","line":210,"updated":"2014-04-08 09:16:46.000000000","message":"Both ssh_password or ssh_key_filename are marked as optional, but if not sent it\u0027s going to fail in validation anyway :/\n\nOne suggestions (probably not the best, but at least we can start a discussion about it) would be to use a tuple as the key for the dictionary - it\u0027s hashable - for things like that, where _one_ of the options is required to be present.\n\ne.g:\n\nREQUIRED_PROPERTIES \u003d {\n\n\u0027ssh_virt_type\u0027: _(\"virtualization software to use; one of vbox, virsh, \"\n\"vmware\"),\n\n\u0027ssh_address\u0027: _(\"IP address or hostname of the node to ssh into\"),\n\n\u0027ssh_username\u0027: _(\"username to authenticate as\"),\n\n(\u0027ssh_password\u0027, \u0027ssh_key_filename\u0027): (_(\u0027password...\u0027), _(\u0027key file\u0027...))\n\n}","commit_id":"08080ceb6450bef0700d511e8a5c7fb1b449403e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"dd09fab6bb0aceb12a7ec6e6c89ff4276ae67b27","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                \"key_filename be set.\"))"},{"line_number":208,"context_line":"        if not os.path.isfile(key_filename):"},{"line_number":209,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":210,"context_line":"                \"SSH key file %s not found.\") % key_filename)"},{"line_number":211,"context_line":"        res[\u0027key_filename\u0027] \u003d key_filename"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    return res"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2FHoc%3D","line":210,"in_reply_to":"AAAAWn%2F%2F9Ko%3D","updated":"2014-04-23 21:22:39.000000000","message":"Hmm, good point. I can move those from the optional to the required list. \n\nI can also do what you suggest and put the \u0027one-and-only-one-of is required\u0027 in a tuple. One of my concerns is where it might go from there. Eg, what if there is another case where it is \u0027two-and-only-two-of is required\u0027, or \u0027at least one of is required\u0027. One solution is to put all such cases in a tuple, and the description contains the details (eg, \u0027X blah blah. One and only one of X, Y, Z must be specified.\u0027).\n\nThe question is how far we want to go with the required/optional properties. Is this tuple for internal use only, or are we going to present the info as a tuple in the API/CLI? I think to keep things \u0027simple\u0027, the API/CLI should just list the properties as proposed. But if we do that, then is it worth the effort of using tuples internally?","commit_id":"08080ceb6450bef0700d511e8a5c7fb1b449403e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"eaaba9ef589eff79b7548fc6fe768ba6d4deab60","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                \"key_filename be set.\"))"},{"line_number":208,"context_line":"        if not os.path.isfile(key_filename):"},{"line_number":209,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":210,"context_line":"                \"SSH key file %s not found.\") % key_filename)"},{"line_number":211,"context_line":"        res[\u0027key_filename\u0027] \u003d key_filename"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    return res"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXX%2F%2F%2FpQ%3D","line":210,"in_reply_to":"AAAAXH%2F%2FHoc%3D","updated":"2014-04-24 19:15:55.000000000","message":"Lucas and I discussed this on IRC [1]. We decided to \n1. move the options from optional to required\n2. mention in each of the options\u0027 description that one of them is required\n\n[1] http://eavesdrop.openstack.org/irclogs/%23openstack-ironic/%23openstack-ironic.2014-04-24.log, around 2014-04-24T13:13:27.","commit_id":"08080ceb6450bef0700d511e8a5c7fb1b449403e"},{"author":{"_account_id":7411,"name":"Matt Wagner","email":"matt.wagner@redhat.com","username":"matty_dubs"},"change_message_id":"6b79e3d5579d1e398aa1d104fb489c63c197ad31","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def get_properties(self):"},{"line_number":380,"context_line":"        req \u003d REQUIRED_PROPERTIES.copy()"},{"line_number":381,"context_line":"        req.update(CREDENTIAL_PROPERTIES)"},{"line_number":382,"context_line":"        return (req, OPTIONAL_PROPERTIES)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def validate(self, task, node):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9ad9bd40_3480a5bf","line":381,"updated":"2014-05-06 19:52:12.000000000","message":"I\u0027m not sure this is practical to change (nor that I\u0027m not misreading something), but I don\u0027t entirely love that we have to shoehorn all of CREDENTIAL_PROPERTIES into REQUIRED_PROPERTIES here.\n\nIt seems like it would keep a client application from coming along and validating that all parameters in REQUIRED_PROPERTIES are present. (Say, an eventual Ironic UI component.)\n\nI think trying to solve that, though, could make the scope of this patch too large/complicated. But it\u0027s something that might need solving eventually. (What if we said that an array of parameters meant that only one of them was required? Though that can\u0027t really be nested instead a dict.)\n\ntl;dr - This is probably fine for now, but might be a future issue.","commit_id":"15457bd0a2bfc8a5fed5a18ea52de6442d479f57"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"4546bf4909b199fbd6cbc9cb57cc0cc9093f24a7","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def get_properties(self):"},{"line_number":380,"context_line":"        req \u003d REQUIRED_PROPERTIES.copy()"},{"line_number":381,"context_line":"        req.update(CREDENTIAL_PROPERTIES)"},{"line_number":382,"context_line":"        return (req, OPTIONAL_PROPERTIES)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def validate(self, task, node):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9ad9bd40_aaa1ae95","line":381,"in_reply_to":"9ad9bd40_3480a5bf","updated":"2014-05-06 20:14:51.000000000","message":"Hey Matt, great minds think alike. Sort of :-)\n\nI originally had these as options, but Lucas pointed out [1] that one is required, and he provided a suggestion. We discussed it, and making them required (with the description being more specific) seemed like the lesser of two evils.\n\nI don\u0027t know what the \"right\" solution might be. Let me know if you have some ideas. This API, from my point of view, is really to give a user some help, not for some application. (Wouldn\u0027t they just use validate instead?)\n\n[1] https://review.openstack.org/#/c/73005/6/ironic/drivers/modules/ssh.py","commit_id":"15457bd0a2bfc8a5fed5a18ea52de6442d479f57"},{"author":{"_account_id":7411,"name":"Matt Wagner","email":"matt.wagner@redhat.com","username":"matty_dubs"},"change_message_id":"5a3b43d8c1b982e32d971c607699d6e0911b34ad","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def get_properties(self):"},{"line_number":380,"context_line":"        req \u003d REQUIRED_PROPERTIES.copy()"},{"line_number":381,"context_line":"        req.update(CREDENTIAL_PROPERTIES)"},{"line_number":382,"context_line":"        return (req, OPTIONAL_PROPERTIES)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def validate(self, task, node):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9ad9bd40_2a6afeed","line":381,"in_reply_to":"9ad9bd40_aaa1ae95","updated":"2014-05-06 20:29:29.000000000","message":"Oh, thanks for the pointer -- I should have read further back!\n\nAfter reading the discussion there, I agree with your points and the decision. Don\u0027t mind me! ;)","commit_id":"15457bd0a2bfc8a5fed5a18ea52de6442d479f57"}],"ironic/tests/api/v1/test_drivers.py":[{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"581c1dde2e7698f4603aa25a9543502bcaa6c705","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        mock_topic.assert_called_once_with(driver_name)"},{"line_number":134,"context_line":"        self.assertFalse(mock_properties.called)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def test_driver_properties_cannot_load(self, mock_topic, mock_properties):"},{"line_number":137,"context_line":"        driver_name \u003d \u0027driver\u0027"},{"line_number":138,"context_line":"        mock_topic.return_value \u003d \u0027driver_topic\u0027"},{"line_number":139,"context_line":"        mock_properties.side_effect \u003d exception.DriverNotFound("}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_56276a64","line":136,"updated":"2014-05-09 01:21:42.000000000","message":"How about test_driver_properties_invalid_driver_name ?","commit_id":"fadc791af47a963c723518de88a4aa8e6609bd96"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ab35aefad42fe0867da762f4e3b9df4f70242fd4","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        mock_topic.assert_called_once_with(driver_name)"},{"line_number":134,"context_line":"        self.assertFalse(mock_properties.called)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def test_driver_properties_cannot_load(self, mock_topic, mock_properties):"},{"line_number":137,"context_line":"        driver_name \u003d \u0027driver\u0027"},{"line_number":138,"context_line":"        mock_topic.return_value \u003d \u0027driver_topic\u0027"},{"line_number":139,"context_line":"        mock_properties.side_effect \u003d exception.DriverNotFound("}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_85754834","line":136,"in_reply_to":"7adec928_39a731bf","updated":"2014-05-21 14:51:55.000000000","message":"I didn\u0027t really want to rename the above test, but I did it:-) I also added comments.\n\nWell, it isn\u0027t \u0027only\u0027 checking the status code, it is also checking that certain functions (mocked) were called.","commit_id":"fadc791af47a963c723518de88a4aa8e6609bd96"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"38322bfe89bb196629b937f030c512a32380707e","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        mock_topic.assert_called_once_with(driver_name)"},{"line_number":134,"context_line":"        self.assertFalse(mock_properties.called)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def test_driver_properties_cannot_load(self, mock_topic, mock_properties):"},{"line_number":137,"context_line":"        driver_name \u003d \u0027driver\u0027"},{"line_number":138,"context_line":"        mock_topic.return_value \u003d \u0027driver_topic\u0027"},{"line_number":139,"context_line":"        mock_properties.side_effect \u003d exception.DriverNotFound("}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_f98dc97c","line":136,"in_reply_to":"7adec928_56276a64","updated":"2014-05-09 02:15:52.000000000","message":"There are two places where there could be a problem with a driver name. The first one is in get_topic_for_driver(), which is what the test_driver_properties_no_topic (above) tests. (And if I were to rename something to ..invalid_driver_name, it would be the above test.)\n\nThe second place is in the ConductorManager, where for whatever reason, the driver isn\u0027t loaded. Which is what this test is about. I\u0027m hesitant to rename it to what you suggest, since I\u0027m not sure it is clear enough what is being tested.\n\nLet me know what you think. I could add some comments or change the name to something else that makes it clearer?","commit_id":"fadc791af47a963c723518de88a4aa8e6609bd96"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"8ef188eb65f5371b3a03c3e04637740c206e38e4","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        mock_topic.assert_called_once_with(driver_name)"},{"line_number":134,"context_line":"        self.assertFalse(mock_properties.called)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def test_driver_properties_cannot_load(self, mock_topic, mock_properties):"},{"line_number":137,"context_line":"        driver_name \u003d \u0027driver\u0027"},{"line_number":138,"context_line":"        mock_topic.return_value \u003d \u0027driver_topic\u0027"},{"line_number":139,"context_line":"        mock_properties.side_effect \u003d exception.DriverNotFound("}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_39a731bf","line":136,"in_reply_to":"7adec928_f98dc97c","updated":"2014-05-09 02:26:21.000000000","message":"Ah, I misunderstood, sorry. Then you may want to rename the above test to \"test_driver_properties_invalid_driver_name\".\nAnd the name of this test doesn\u0027t need to be changed.\nThis test is checking only the status code, right?","commit_id":"fadc791af47a963c723518de88a4aa8e6609bd96"}],"ironic/tests/conductor/test_manager.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"0a22114afb35a987eae6514aaad921177801e48b","unresolved":false,"context_lines":[{"line_number":1751,"context_line":"                                 \u0027pxe_preserve_ephemeral\u0027, \u0027pxe_swap_mb\u0027]}"},{"line_number":1752,"context_line":"        self._check_driver_properties(\"fake_pxe\", expected)"},{"line_number":1753,"context_line":""},{"line_number":1754,"context_line":"    def __test_driver_properties_fake_seamicro(self):"},{"line_number":1755,"context_line":"        # NOTE(rloo). Disabled until we figure out how to handle unit testing"},{"line_number":1756,"context_line":"        #             of 3rd party drivers."},{"line_number":1757,"context_line":"        expected \u003d {\u0027required\u0027: [\u0027seamicro_api_endpoint\u0027, \u0027seamicro_password\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAXX%2F%2F2Gc%3D","line":1754,"updated":"2014-04-25 20:12:14.000000000","message":"this is resolved by https://review.openstack.org/#/c/90174/","commit_id":"c5b352a2ef173a0a0883272642aa15895aa43dc7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"59ad66867c1617198783fde5243e764ed957cf7b","unresolved":false,"context_lines":[{"line_number":1751,"context_line":"                                 \u0027pxe_preserve_ephemeral\u0027, \u0027pxe_swap_mb\u0027]}"},{"line_number":1752,"context_line":"        self._check_driver_properties(\"fake_pxe\", expected)"},{"line_number":1753,"context_line":""},{"line_number":1754,"context_line":"    def __test_driver_properties_fake_seamicro(self):"},{"line_number":1755,"context_line":"        # NOTE(rloo). Disabled until we figure out how to handle unit testing"},{"line_number":1756,"context_line":"        #             of 3rd party drivers."},{"line_number":1757,"context_line":"        expected \u003d {\u0027required\u0027: [\u0027seamicro_api_endpoint\u0027, \u0027seamicro_password\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"bad4c104_612682bc","line":1754,"in_reply_to":"AAAAXX%2F%2F2Gc%3D","updated":"2014-04-29 16:20:15.000000000","message":"Yes, I tried it out and it worked. But I\u0027d prefer to wait until 90174 lands. I could make it a dependency, but if (I can only hope!) this is approved first, I\u0027d rather it get merged than to wait (and then possibly have to rebase, etc.)","commit_id":"c5b352a2ef173a0a0883272642aa15895aa43dc7"}]}
