)]}'
{"ironic/common/exception.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"f2df0a563de9a9e3ee19e1c20c3d79a19459991d","unresolved":false,"context_lines":[{"line_number":344,"context_line":"class NoFreeConductorWorker(TemporaryFailure):"},{"line_number":345,"context_line":"    message \u003d _(\u0027Requested action cannot be performed due to lack of free \u0027"},{"line_number":346,"context_line":"                \u0027conductor workers.\u0027)"},{"line_number":347,"context_line":"    code \u003d 503  # Service Unavailable (temporary)."},{"line_number":348,"context_line":""},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"class VendorPassthruException(IronicException):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2F1a0%3D","line":347,"updated":"2014-03-03 21:57:31.000000000","message":"The TemporaryFailure class already sets code \u003d 503, so it\u0027s not needed here.","commit_id":"952228b6e9fa42e4588ee8b7be5daba3eefc9236"}],"ironic/drivers/fake.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __init__(self):"},{"line_number":82,"context_line":"        self.power \u003d seamicro.Power()"},{"line_number":83,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":84,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":85,"context_line":"        self.seamicro_vendor \u003d seamicro.VendorPassthru()"},{"line_number":86,"context_line":"        self.pxe_vendor \u003d pxe.VendorPassthru()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3Nc%3D","line":83,"updated":"2014-02-18 15:23:01.000000000","message":"fake.FakeDeploy() needed for fake driver.","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"ac327dd99dfae49a93129b5cd502b28683444b43","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __init__(self):"},{"line_number":82,"context_line":"        self.power \u003d seamicro.Power()"},{"line_number":83,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":84,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":85,"context_line":"        self.seamicro_vendor \u003d seamicro.VendorPassthru()"},{"line_number":86,"context_line":"        self.pxe_vendor \u003d pxe.VendorPassthru()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BwFc%3D","line":83,"in_reply_to":"AAAAUX%2F%2B3Nc%3D","updated":"2014-02-19 12:12:16.000000000","message":"Done","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":84,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":85,"context_line":"        self.seamicro_vendor \u003d seamicro.VendorPassthru()"},{"line_number":86,"context_line":"        self.pxe_vendor \u003d pxe.VendorPassthru()"},{"line_number":87,"context_line":"        self.vendor \u003d seamicro.SeaMicroPXEMultipleVendorInterface("},{"line_number":88,"context_line":"            self.seamicro_vendor, self.pxe_vendor)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3Og%3D","line":86,"updated":"2014-02-18 15:23:01.000000000","message":"I think seamicro_vendor, pxe_vendor should not be attributes of this class.","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"ac327dd99dfae49a93129b5cd502b28683444b43","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":84,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":85,"context_line":"        self.seamicro_vendor \u003d seamicro.VendorPassthru()"},{"line_number":86,"context_line":"        self.pxe_vendor \u003d pxe.VendorPassthru()"},{"line_number":87,"context_line":"        self.vendor \u003d seamicro.SeaMicroPXEMultipleVendorInterface("},{"line_number":88,"context_line":"            self.seamicro_vendor, self.pxe_vendor)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BwE4%3D","line":86,"in_reply_to":"AAAAUX%2F%2B3Og%3D","updated":"2014-02-19 12:12:16.000000000","message":"Can you explain this more? Should those vendor passthru\u0027s be declared in SeaMicroPXEMultipleVendorInterface class?","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"}],"ironic/drivers/modules/seamicro.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        vlan_id \u003d kwargs.get(\u0027vlan_id\u0027)"},{"line_number":386,"context_line":"        if not vlan_id:"},{"line_number":387,"context_line":"            raise exception.InvalidParameterValue(_(\"No vlan id provided\"))"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        seamicro_info \u003d _parse_driver_info(node)"},{"line_number":390,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3JU%3D","line":387,"updated":"2014-02-18 15:23:01.000000000","message":"Should be in validate() method?","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"ac327dd99dfae49a93129b5cd502b28683444b43","unresolved":false,"context_lines":[{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        vlan_id \u003d kwargs.get(\u0027vlan_id\u0027)"},{"line_number":386,"context_line":"        if not vlan_id:"},{"line_number":387,"context_line":"            raise exception.InvalidParameterValue(_(\"No vlan id provided\"))"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        seamicro_info \u003d _parse_driver_info(node)"},{"line_number":390,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Bv%2Fo%3D","line":387,"in_reply_to":"AAAAUX%2F%2B3JU%3D","updated":"2014-02-19 12:12:16.000000000","message":"The validate method is to validate the vendor passthru method availability, each vendor passthru method will have to do its own input validation.","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":396,"context_line":"            server \u003d server.refresh(5)"},{"line_number":397,"context_line":"            server.set_untagged_vlan(vlan_id)"},{"line_number":398,"context_line":"        except seamicro_client_exception.ClientException as ex:"},{"line_number":399,"context_line":"            LOG.error(_(\"SeaMicro client exception: %s\"), ex.message)"},{"line_number":400,"context_line":"            raise exception.IronicException(message\u003dex.message)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        dbapi \u003d db_api.get_instance()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3HY%3D","line":399,"updated":"2014-02-18 15:23:01.000000000","message":"\u0027message\u0027 attribute of exception deprecated, if seamicro_client_exception.ClientException has this attribute obvious?","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"ac327dd99dfae49a93129b5cd502b28683444b43","unresolved":false,"context_lines":[{"line_number":396,"context_line":"            server \u003d server.refresh(5)"},{"line_number":397,"context_line":"            server.set_untagged_vlan(vlan_id)"},{"line_number":398,"context_line":"        except seamicro_client_exception.ClientException as ex:"},{"line_number":399,"context_line":"            LOG.error(_(\"SeaMicro client exception: %s\"), ex.message)"},{"line_number":400,"context_line":"            raise exception.IronicException(message\u003dex.message)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        dbapi \u003d db_api.get_instance()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BwDE%3D","line":399,"in_reply_to":"AAAAUX%2F%2B3HY%3D","updated":"2014-02-19 12:12:16.000000000","message":"Please explain, is the \u0027message\u0027 attribute deprecated. SeaMicro client ClientException has not deprecated \u0027message\u0027 attribute","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":397,"context_line":"            server.set_untagged_vlan(vlan_id)"},{"line_number":398,"context_line":"        except seamicro_client_exception.ClientException as ex:"},{"line_number":399,"context_line":"            LOG.error(_(\"SeaMicro client exception: %s\"), ex.message)"},{"line_number":400,"context_line":"            raise exception.IronicException(message\u003dex.message)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        dbapi \u003d db_api.get_instance()"},{"line_number":403,"context_line":"        properties \u003d node[\u0027properties\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3Ik%3D","line":400,"updated":"2014-02-18 15:23:01.000000000","message":"Please use custom exception here.","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"ac327dd99dfae49a93129b5cd502b28683444b43","unresolved":false,"context_lines":[{"line_number":397,"context_line":"            server.set_untagged_vlan(vlan_id)"},{"line_number":398,"context_line":"        except seamicro_client_exception.ClientException as ex:"},{"line_number":399,"context_line":"            LOG.error(_(\"SeaMicro client exception: %s\"), ex.message)"},{"line_number":400,"context_line":"            raise exception.IronicException(message\u003dex.message)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        dbapi \u003d db_api.get_instance()"},{"line_number":403,"context_line":"        properties \u003d node[\u0027properties\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Bv%2BU%3D","line":400,"in_reply_to":"AAAAUX%2F%2B3Ik%3D","updated":"2014-02-19 12:12:16.000000000","message":"Done","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        dbapi \u003d db_api.get_instance()"},{"line_number":403,"context_line":"        properties \u003d node[\u0027properties\u0027]"},{"line_number":404,"context_line":"        properties[\u0027vlan_id\u0027] \u003d vlan_id"},{"line_number":405,"context_line":"        dbapi.update_node(node[\u0027id\u0027], {\u0027properties\u0027: properties})"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    def _attach_volume(self, task, node, **kwargs):"},{"line_number":408,"context_line":"        \"\"\"Attach volume from SeaMicro storage pools for ironic to node."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3GU%3D","line":405,"updated":"2014-02-18 15:23:01.000000000","message":"Please use node.save(context) instead w/o direct dbapi call.","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"ac327dd99dfae49a93129b5cd502b28683444b43","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        dbapi \u003d db_api.get_instance()"},{"line_number":403,"context_line":"        properties \u003d node[\u0027properties\u0027]"},{"line_number":404,"context_line":"        properties[\u0027vlan_id\u0027] \u003d vlan_id"},{"line_number":405,"context_line":"        dbapi.update_node(node[\u0027id\u0027], {\u0027properties\u0027: properties})"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    def _attach_volume(self, task, node, **kwargs):"},{"line_number":408,"context_line":"        \"\"\"Attach volume from SeaMicro storage pools for ironic to node."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Bv%2Bc%3D","line":405,"in_reply_to":"AAAAUX%2F%2B3GU%3D","updated":"2014-02-19 12:12:16.000000000","message":"Done","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":420,"context_line":"        if volume_id is None:"},{"line_number":421,"context_line":"            volume_size \u003d kwargs.get(\u0027volume_size\u0027)"},{"line_number":422,"context_line":"            if volume_size is None:"},{"line_number":423,"context_line":"                raise exception.InvalidParameterValue("},{"line_number":424,"context_line":"                    _(\"No volume size provided for creating volume\"))"},{"line_number":425,"context_line":"            volume_id \u003d _create_volume(seamicro_info, volume_size)"},{"line_number":426,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3Fo%3D","line":423,"updated":"2014-02-18 15:23:01.000000000","message":"Should be in validate() method?","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":437,"context_line":"            dbapi \u003d db_api.get_instance()"},{"line_number":438,"context_line":"            properties \u003d node[\u0027properties\u0027]"},{"line_number":439,"context_line":"            properties[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":440,"context_line":"            dbapi.update_node(node[\u0027id\u0027], {\u0027properties\u0027: properties})"},{"line_number":441,"context_line":"        else:"},{"line_number":442,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":443,"context_line":"                \"Invalid volume id specified\"))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3Ec%3D","line":440,"updated":"2014-02-18 15:23:01.000000000","message":"ditto l405","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":439,"context_line":"            properties[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":440,"context_line":"            dbapi.update_node(node[\u0027id\u0027], {\u0027properties\u0027: properties})"},{"line_number":441,"context_line":"        else:"},{"line_number":442,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":443,"context_line":"                \"Invalid volume id specified\"))"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    def _set_boot_device(self, task, node, **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3Eo%3D","line":442,"updated":"2014-02-18 15:23:01.000000000","message":"ditto l423\n\nand this exception can be raised from _validate_volume() directly","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        boot_device \u003d kwargs.get(\u0027boot_device\u0027)"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        if boot_device is None:"},{"line_number":453,"context_line":"            raise exception.InvalidParameterValue(_(\"No boot device provided\"))"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"        if boot_device not in VALID_BOOT_DEVICES:"},{"line_number":456,"context_line":"            raise exception.InvalidParameterValue(_(\"Boot device is invalid\"))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3D4%3D","line":453,"updated":"2014-02-18 15:23:01.000000000","message":"ditto l423","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":453,"context_line":"            raise exception.InvalidParameterValue(_(\"No boot device provided\"))"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"        if boot_device not in VALID_BOOT_DEVICES:"},{"line_number":456,"context_line":"            raise exception.InvalidParameterValue(_(\"Boot device is invalid\"))"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        seamicro_info \u003d _parse_driver_info(node)"},{"line_number":459,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3D0%3D","line":456,"updated":"2014-02-18 15:23:01.000000000","message":"ditto","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":464,"context_line":"            server.set_boot_order(boot_device)"},{"line_number":465,"context_line":"        except seamicro_client_exception.ClientException as ex:"},{"line_number":466,"context_line":"            LOG.error(_(\"set_boot_device error:  %s\"), ex.message)"},{"line_number":467,"context_line":"            raise exception.IronicException(message\u003dex.message)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"class SeaMicroPXEMultipleVendorInterface(base.VendorInterface):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3Ck%3D","line":467,"updated":"2014-02-18 15:23:01.000000000","message":"ditto l400","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        \"\"\""},{"line_number":488,"context_line":"        method \u003d kwargs.get(\u0027method\u0027)"},{"line_number":489,"context_line":"        return self.mapping.get(method) or self.pxe_vendor"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def validate(self, *args, **kwargs):"},{"line_number":492,"context_line":"        \"\"\"Call validate on the appropriate interface only.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3AQ%3D","line":489,"updated":"2014-02-18 15:23:01.000000000","message":"I think this can be simple\n\n return self.seamicro_vendor if method in VENDOR_PASSTHRU_METHODS else self.pxe_vendor\n\nw/o self.mapping","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"beedf62d27b2f4209130173e0c330e6b200a1678","unresolved":false,"context_lines":[{"line_number":378,"context_line":"    def vendor_passthru(self, task, node, **kwargs):"},{"line_number":379,"context_line":"        \"\"\"Dispatch vendor specific method calls.\"\"\""},{"line_number":380,"context_line":"        method \u003d kwargs[\u0027method\u0027]"},{"line_number":381,"context_line":"        if hasattr(self, \"_\" + method) and method in VENDOR_PASSTHRU_METHODS:"},{"line_number":382,"context_line":"            return getattr(self, \"_\" + method)(task, node, **kwargs)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def _set_node_vlan_id(self, task, node, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bkms%3D","line":381,"updated":"2014-02-20 13:15:21.000000000","message":"I think only \n\n if method in VENDOR_PASSTHRU_METHODS:\n\nneeded here.","commit_id":"1f02b3d3fa78f089bcac0a8c15b5baeedd05522b"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"beedf62d27b2f4209130173e0c330e6b200a1678","unresolved":false,"context_lines":[{"line_number":404,"context_line":"            LOG.error(_(\"SeaMicro client exception: %s\"), ex.message)"},{"line_number":405,"context_line":"            raise exception.VendorPassthruException(message\u003dex.message)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        node.properties[\u0027vlan_id\u0027] \u003d vlan_id"},{"line_number":408,"context_line":"        node.save(task.context)"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def _attach_volume(self, task, node, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BkkU%3D","line":407,"updated":"2014-02-20 13:15:21.000000000","message":"This not touch _changed_fields in object, and save() will not work IMO.\n\n properties \u003d node.properties\n properties[\u0027vlan_id\u0027] \u003d vlan_id\n node.properties \u003d properties\n\nexample https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/pxe.py#L148\n\nThis is black magic of UOM. \nAnd maybe to use \u0027seamicro_vlan_id\u0027 as name?","commit_id":"1f02b3d3fa78f089bcac0a8c15b5baeedd05522b"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"beedf62d27b2f4209130173e0c330e6b200a1678","unresolved":false,"context_lines":[{"line_number":437,"context_line":"                LOG.error(_(\"SeaMicro client exception: %s\"), ex.message)"},{"line_number":438,"context_line":"                raise exception.VendorPassthruException(message\u003dex.message)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"            node.properties[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":441,"context_line":"            node.save(task.context)"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"    def _set_boot_device(self, task, node, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bkg4%3D","line":440,"updated":"2014-02-20 13:15:21.000000000","message":"ditto","commit_id":"1f02b3d3fa78f089bcac0a8c15b5baeedd05522b"}],"ironic/drivers/modules/seamicro/driver.py":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"98722680d9b1bc5c609dd9e8c9798cf9d2e906bb","unresolved":false,"context_lines":[{"line_number":45,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"VENDOR_PASSTHRU_ALLOWED_METHODS \u003d [\u0027set_node_vlan_id\u0027, \u0027attach_volume\u0027,"},{"line_number":48,"context_line":"                                   \u0027set_boot_device\u0027]"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"VALID_BOOT_DEVICES \u003d [\u0027pxe\u0027, \u0027disk\u0027]"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9Ytc%3D","line":48,"updated":"2014-02-07 09:37:13.000000000","message":"Minor comments here - It is better that we keep an alphabetical for scanning:\n\nVENDOR_PASSTHRU_ALLOWED_METHODS \u003d [ \u0027attach_volume\u0027, \u0027set_boot_device\u0027, \u0027set_node_vlan_id\u0027 ]","commit_id":"3b78f432f75c5e89235bb7322eee7fd114b4294e"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"98722680d9b1bc5c609dd9e8c9798cf9d2e906bb","unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"def _get_pools(driver_info, filters\u003dNone):"},{"line_number":266,"context_line":"    \"\"\"Get SeaMicro storage pools matching given filters\"\"\""},{"line_number":267,"context_line":"    s_client \u003d _get_client(**driver_info)"},{"line_number":268,"context_line":"    return s_client.pools.list(filters\u003dfilters)"},{"line_number":269,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9YtM%3D","line":266,"updated":"2014-02-07 09:37:13.000000000","message":"It is better we have a blank line here.","commit_id":"3b78f432f75c5e89235bb7322eee7fd114b4294e"},{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"febe02a0ada17e84dae3d2d6810543eddb76326f","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        if hasattr(self, method) and method in VENDOR_PASSTHRU_ALLOWED_METHODS:"},{"line_number":365,"context_line":"            return getattr(self, method)(task, node, **kwargs)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    def set_node_vlan_id(self, task, node, **kwargs):"},{"line_number":368,"context_line":"        \"\"\" Sets a untagged vlan id for NIC 0 of node."},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        @kwargs vlan_id: id of untagged vlan for NIC 0 of node"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2F4RI%3D","line":367,"updated":"2014-02-10 08:04:07.000000000","message":"VendorPassthru methods should be implemented as private and access via vendor_passthru (see: http://git.openstack.org/cgit/openstack/ironic/tree/ironic/drivers/base.py#n283)","commit_id":"3b78f432f75c5e89235bb7322eee7fd114b4294e"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"98722680d9b1bc5c609dd9e8c9798cf9d2e906bb","unresolved":false,"context_lines":[{"line_number":388,"context_line":"            raise exception.IronicException(message\u003dex.message)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"        dbapi \u003d db_api.get_instance()"},{"line_number":391,"context_line":"        properties \u003d node[\u0027properties\u0027]"},{"line_number":392,"context_line":"        properties[\u0027vlan_id\u0027] \u003d vlan_id"},{"line_number":393,"context_line":"        dbapi.update_node(node[\u0027id\u0027], {\u0027properties\u0027: properties})"},{"line_number":394,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9Yqk%3D","line":391,"updated":"2014-02-07 09:37:13.000000000","message":"Ironic\u0027s code is changing to use object attributes as attributes instead of dictionary keys, we have some patches [1] already, so suggest to change code:\n\n    properties \u003d node.properties\n\n[1] https://review.openstack.org/#/q/status:open+project:openstack/ironic+branch:master+topic:bug/1256260_rid_dict_method,n,z","commit_id":"3b78f432f75c5e89235bb7322eee7fd114b4294e"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"98722680d9b1bc5c609dd9e8c9798cf9d2e906bb","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        dbapi \u003d db_api.get_instance()"},{"line_number":391,"context_line":"        properties \u003d node[\u0027properties\u0027]"},{"line_number":392,"context_line":"        properties[\u0027vlan_id\u0027] \u003d vlan_id"},{"line_number":393,"context_line":"        dbapi.update_node(node[\u0027id\u0027], {\u0027properties\u0027: properties})"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    def attach_volume(self, task, node, **kwargs):"},{"line_number":396,"context_line":"        \"\"\" Attach volume from SeaMicro storage pools for ironic to node."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9YqY%3D","line":393,"updated":"2014-02-07 09:37:13.000000000","message":"ditto:\n\n    dbapi.update_node(node.id, {\u0027properties\u0027: properties}","commit_id":"3b78f432f75c5e89235bb7322eee7fd114b4294e"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"98722680d9b1bc5c609dd9e8c9798cf9d2e906bb","unresolved":false,"context_lines":[{"line_number":423,"context_line":"            dbapi \u003d db_api.get_instance()"},{"line_number":424,"context_line":"            properties \u003d node[\u0027properties\u0027]"},{"line_number":425,"context_line":"            properties[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":426,"context_line":"            dbapi.update_node(node[\u0027id\u0027], {\u0027properties\u0027: properties})"},{"line_number":427,"context_line":"        else:"},{"line_number":428,"context_line":"            raise exception.IronicException(_(\"Invalid volume id specified\"))"},{"line_number":429,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9YwQ%3D","line":426,"updated":"2014-02-07 09:37:13.000000000","message":"ditto:\n\n    dbapi.update_node(node.id, {\u0027properties\u0027: properties}","commit_id":"3b78f432f75c5e89235bb7322eee7fd114b4294e"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"1ba9625f454b70168826dc69a36893d3303b8e4b","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    # Check if the ironic \u003cscard\u003e/ironic-\u003cpool_id\u003e/\u003cvolume_id\u003e naming scheme"},{"line_number":268,"context_line":"    # is present in volume id"},{"line_number":269,"context_line":"    pool_id \u003d volume.id.split(\u0027/\u0027)[1].lower()"},{"line_number":270,"context_line":"    return \"ironic-\" in pool_id"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2FubQ%3D","line":269,"updated":"2014-02-11 08:14:02.000000000","message":"I am confusing here, where is the code logic to check naming scheme?\n\nAnd if there is no such char \u0027/\u0027 in the volume.id, what happens?","commit_id":"75aa565e4615bacfef332b96c9bc9d9b5db72ce0"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"a50b90975d7bed157ddc15b7b9d2be9161d8bf94","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    # Check if the ironic \u003cscard\u003e/ironic-\u003cpool_id\u003e/\u003cvolume_id\u003e naming scheme"},{"line_number":268,"context_line":"    # is present in volume id"},{"line_number":269,"context_line":"    pool_id \u003d volume.id.split(\u0027/\u0027)[1].lower()"},{"line_number":270,"context_line":"    return \"ironic-\" in pool_id"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2FsCs%3D","line":269,"in_reply_to":"AAAAUX%2F%2FubQ%3D","updated":"2014-02-11 15:17:58.000000000","message":"SeaMicro volumes for ironic are named using \"\u003cscard\u003e/ironic-\u003cpool_id\u003e/\u003cvolume_id\u003e\" scheme. we are checking if string \"ironic\" exists in the pool id. We have designated pools for ironic in SeaMicro chassis.  There wont be a case where char \"/\" wont be present in the volume.id, but we can still handle it","commit_id":"75aa565e4615bacfef332b96c9bc9d9b5db72ce0"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"1ba9625f454b70168826dc69a36893d3303b8e4b","unresolved":false,"context_lines":[{"line_number":429,"context_line":"                server \u003d server.refresh(5)"},{"line_number":430,"context_line":"                server.attach_volume(volume_id)"},{"line_number":431,"context_line":"            except seamicro_client_exception.ClientException as ex:"},{"line_number":432,"context_line":"                LOG.error(_(ex.message))"},{"line_number":433,"context_line":"                raise exception.IronicException(message\u003dex.message)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"            dbapi \u003d db_api.get_instance()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2FuV4%3D","line":432,"updated":"2014-02-11 08:14:02.000000000","message":"This i18n does not make sense, the message id can not be generated, so translator can get nothing, how about this way:\n    LOG.error(_(\"seamicro client exception:%s\") % str(ex))","commit_id":"75aa565e4615bacfef332b96c9bc9d9b5db72ce0"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"1ba9625f454b70168826dc69a36893d3303b8e4b","unresolved":false,"context_lines":[{"line_number":437,"context_line":"            properties[\u0027volume_id\u0027] \u003d volume_id"},{"line_number":438,"context_line":"            dbapi.update_node(node[\u0027id\u0027], {\u0027properties\u0027: properties})"},{"line_number":439,"context_line":"        else:"},{"line_number":440,"context_line":"            raise exception.IronicException(_(\"Invalid volume id specified\"))"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    def set_boot_device(self, task, node, **kwargs):"},{"line_number":443,"context_line":"        \"\"\" Set the boot device of the node."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2FuWw%3D","line":440,"updated":"2014-02-11 08:14:02.000000000","message":"I understand our IronicException is general exception base class for Ironic, so it is better we dont raise it directly, how about this code:\n\n    raise exception.InvalidParameterValue(_(\"\"Invalid volume id specified\"\"))\n\nIf we have no existing proper exception to be used, we can define another new one.","commit_id":"75aa565e4615bacfef332b96c9bc9d9b5db72ce0"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"1ba9625f454b70168826dc69a36893d3303b8e4b","unresolved":false,"context_lines":[{"line_number":460,"context_line":""},{"line_number":461,"context_line":"            server.set_boot_order(boot_device)"},{"line_number":462,"context_line":"        except seamicro_client_exception.ClientException as ex:"},{"line_number":463,"context_line":"            LOG.error(_(ex.message))"},{"line_number":464,"context_line":"            raise exception.IronicException(message\u003dex.message)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2FuYo%3D","line":463,"updated":"2014-02-11 08:14:02.000000000","message":"This i18n does not make sense, the message id can not be generated, so translator can get nothing, how about this way:\n\n    LOG.error(_(\"set_boot_device error:%s\") % str(ex))","commit_id":"75aa565e4615bacfef332b96c9bc9d9b5db72ce0"}],"ironic/drivers/pxe.py":[{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"febe02a0ada17e84dae3d2d6810543eddb76326f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self.power \u003d seamicro.Power()"},{"line_number":94,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":95,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":96,"context_line":"        self.vendor \u003d seamicro.VendorPassthru()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2F4QA%3D","line":96,"updated":"2014-02-10 08:04:07.000000000","message":"pxe.VendorPassthru is also needed for the _continue_deploy method.\n\nPlease take a look to https://review.openstack.org/#/c/70863/ for a multiplexed VendorPassthru example.","commit_id":"3b78f432f75c5e89235bb7322eee7fd114b4294e"},{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"fee24930acb25a799bf37ff9821135adbe037d2f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.power \u003d seamicro.Power()"},{"line_number":95,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":96,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":97,"context_line":"        self.vendor \u003d seamicro.VendorPassthru()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FkzQ%3D","line":97,"updated":"2014-02-12 08:50:02.000000000","message":"eliminating pxe.VendorPassthru(), we cannot access the _continue_deploy, so the node will never get the image. We should multiplex this","commit_id":"b48ef11d77789045a43f9bc6de5b0c40aa356b54"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"8e529fa8de48a281594f8dc6cfff73179dbbe851","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.power \u003d seamicro.Power()"},{"line_number":95,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":96,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":97,"context_line":"        self.vendor \u003d seamicro.VendorPassthru()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FjqE%3D","line":97,"in_reply_to":"AAAAUX%2F%2FkzQ%3D","updated":"2014-02-12 11:23:25.000000000","message":"Hi, I am waiting for this to land (https://review.openstack.org/#/c/70863), will make changes to my patch accordingly","commit_id":"b48ef11d77789045a43f9bc6de5b0c40aa356b54"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"90c0128591eec0f42970aeee8b2477881aa27cbb","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":96,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":97,"context_line":"        self.seamicro_vendor \u003d seamicro.VendorPassthru()"},{"line_number":98,"context_line":"        self.pxe_vendor \u003d pxe.VendorPassthru()"},{"line_number":99,"context_line":"        self.vendor \u003d seamicro.SeaMicroPXEMultipleVendorInterface("},{"line_number":100,"context_line":"            self.seamicro_vendor, self.pxe_vendor)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2B3OQ%3D","line":98,"updated":"2014-02-18 15:23:01.000000000","message":"I think seamicro_vendor, pxe_vendor should not be attributes of this class.","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"ac327dd99dfae49a93129b5cd502b28683444b43","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":96,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":97,"context_line":"        self.seamicro_vendor \u003d seamicro.VendorPassthru()"},{"line_number":98,"context_line":"        self.pxe_vendor \u003d pxe.VendorPassthru()"},{"line_number":99,"context_line":"        self.vendor \u003d seamicro.SeaMicroPXEMultipleVendorInterface("},{"line_number":100,"context_line":"            self.seamicro_vendor, self.pxe_vendor)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BwFs%3D","line":98,"in_reply_to":"AAAAUX%2F%2B3OQ%3D","updated":"2014-02-19 12:12:16.000000000","message":"Are you proposing that we create the individual vendor passthrus in the class SeaMicroPXEMultipleVendorInterface ?","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"}],"ironic/tests/drivers/seamicro/test_driver.py":[{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"a46757a15341be19a4c111eff7a5c1741238096c","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\"Test class for Ironic SeaMicro driver.\"\"\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"import uuid"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from seamicroclient import exceptions as seamicro_client_exception"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F91AE%3D","line":15,"updated":"2014-02-03 16:33:08.000000000","message":"mock is not standard library\n\nImports should be grouped in the following order:\n1. standard library imports\n2. related third party imports\n3. local application/library specific imports\n\nhttp://www.python.org/dev/peps/pep-0008/","commit_id":"3b78f432f75c5e89235bb7322eee7fd114b4294e"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"a46757a15341be19a4c111eff7a5c1741238096c","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            _get_server.return_value \u003d server"},{"line_number":200,"context_line":"            pstate \u003d seamicro._reboot(self.node, timeout\u003d2)"},{"line_number":201,"context_line":"            self.assertEqual(pstate, states.ERROR)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def test__validate_fail(self):"},{"line_number":204,"context_line":"        info \u003d seamicro._parse_driver_info(self.node)"},{"line_number":205,"context_line":"        with mock.patch.object(seamicro, \"_get_volume\") as _get_volume:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F90ns%3D","line":202,"updated":"2014-02-03 16:33:08.000000000","message":"It would be better to use decorators for mock\n\n@mock.patch.object(seamicro, \"_get_volume\")\ndef test__validate_fail(self, mock_get_volume):\n        ...\n        mock_get_volume.return_value \u003d volume\n        ...\n\nand be used decorators for other tests","commit_id":"3b78f432f75c5e89235bb7322eee7fd114b4294e"}],"ironic/tests/drivers/test_seamicro.py":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"d0e41a0c0f4da2f911a2f97ea1aa4e18fc744eb7","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                                  shared\u003dTrue) as task:"},{"line_number":350,"context_line":"            self.assertRaises(exception.InvalidParameterValue,"},{"line_number":351,"context_line":"                              task.resources[0].driver.vendor.validate,"},{"line_number":352,"context_line":"                              self.node, method\u003d\u0027invalid_method\u0027)"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    @mock.patch.object(seamicro, \u0027_get_server\u0027)"},{"line_number":355,"context_line":"    def test_set_node_vlan_id_good(self, mock_get_server):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Bygs%3D","line":352,"updated":"2014-02-19 02:39:43.000000000","message":"This validate has ‘node’ and ‘**kwargs’ two parameters, we missing the last one here.","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"ac327dd99dfae49a93129b5cd502b28683444b43","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                                  shared\u003dTrue) as task:"},{"line_number":350,"context_line":"            self.assertRaises(exception.InvalidParameterValue,"},{"line_number":351,"context_line":"                              task.resources[0].driver.vendor.validate,"},{"line_number":352,"context_line":"                              self.node, method\u003d\u0027invalid_method\u0027)"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    @mock.patch.object(seamicro, \u0027_get_server\u0027)"},{"line_number":355,"context_line":"    def test_set_node_vlan_id_good(self, mock_get_server):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BwHo%3D","line":352,"in_reply_to":"AAAAUX%2F%2Bygs%3D","updated":"2014-02-19 12:12:16.000000000","message":"Done","commit_id":"6a1e494a2974c8f8bd29b309e4192286e18aae80"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"f2df0a563de9a9e3ee19e1c20c3d79a19459991d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"class Fake_Volume():"},{"line_number":65,"context_line":"    def __init__(self, id\u003dNone, *args, **kwargs):"},{"line_number":66,"context_line":"        if id is None:"},{"line_number":67,"context_line":"            self.id \u003d \"%s/%s/%s\" % (\"0\", \"ironic-p6-6\", str(uuid.uuid4()))"},{"line_number":68,"context_line":"        else:"},{"line_number":69,"context_line":"            self.id \u003d id"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2F1T0%3D","line":67,"updated":"2014-03-03 21:57:31.000000000","message":"We have a function in ironic.common to generate UUIDs and we should use it instead of the uuid lib from python \n\nfrom ironic.common import utils\n\nutils.generate_uuid()","commit_id":"952228b6e9fa42e4588ee8b7be5daba3eefc9236"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"8465f6db332b7958d53b5529e4903db1ec8f6e6a","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        get_pools_patcher.start()"},{"line_number":245,"context_line":"        mock_get_pools.return_value \u003d pools"},{"line_number":246,"context_line":"        seamicro._create_volume(info, 2)"},{"line_number":247,"context_line":"        get_pools_patcher.stop()"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class SeaMicroPowerDriverTestCase(db_base.DbTestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2F1KE%3D","line":247,"updated":"2014-03-03 23:54:37.000000000","message":"shouldn\u0027t this test be validating that","commit_id":"952228b6e9fa42e4588ee8b7be5daba3eefc9236"}]}
