)]}'
{"ironic/drivers/modules/fake.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"b26ae8e30b2f2f3c745b01a9203024c0d21cd865","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"class MultipleVendorInterface(base.VendorInterface):"},{"line_number":128,"context_line":"    def __init__(self, a, b):"},{"line_number":129,"context_line":"        self.interfaces \u003d [a, b]"},{"line_number":130,"context_line":"        self.interface_a \u003d a"},{"line_number":131,"context_line":"        self.interface_b \u003d b"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9wc4%3D","line":128,"updated":"2014-02-04 11:10:39.000000000","message":"Wondering if we should make it more flexible to accept multiple N interface instead of two:\n\ne.g\n\ndef __init__(self, *interfaces):\n    self.interfaces \u003d interfaces","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"ca997412bdfe46b2396f7ce2428434e91473e61d","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"class MultipleVendorInterface(base.VendorInterface):"},{"line_number":128,"context_line":"    def __init__(self, a, b):"},{"line_number":129,"context_line":"        self.interfaces \u003d [a, b]"},{"line_number":130,"context_line":"        self.interface_a \u003d a"},{"line_number":131,"context_line":"        self.interface_b \u003d b"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9stk%3D","line":128,"in_reply_to":"AAAAUH%2F9to4%3D","updated":"2014-02-04 21:15:46.000000000","message":"I agree that custom mixed interface is more flexible. There is not much logic to reuse in generic, so custom should be easier to understand an follow","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"fe956fc2972a24222a23840bc7bbaaeb9efc5ca0","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"class MultipleVendorInterface(base.VendorInterface):"},{"line_number":128,"context_line":"    def __init__(self, a, b):"},{"line_number":129,"context_line":"        self.interfaces \u003d [a, b]"},{"line_number":130,"context_line":"        self.interface_a \u003d a"},{"line_number":131,"context_line":"        self.interface_b \u003d b"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9to4%3D","line":128,"in_reply_to":"AAAAUH%2F9wJU%3D","updated":"2014-02-04 18:47:19.000000000","message":"I thought about both of these approaches, and initially tried a more generic one as in Lucas\u0027 suggestion.\n\nHowever, I think there needs to be logic specific to the combination of interfaces being mixed. A generic mixing is not going to provide any benefit, because driver authors know when each interface should be called, and may need to add some particular logic around that (eg, if hardware supports X, call interface A, otherwise fall back to B).","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"b13003930985a669308b880095a7100e6c945609","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"class MultipleVendorInterface(base.VendorInterface):"},{"line_number":128,"context_line":"    def __init__(self, a, b):"},{"line_number":129,"context_line":"        self.interfaces \u003d [a, b]"},{"line_number":130,"context_line":"        self.interface_a \u003d a"},{"line_number":131,"context_line":"        self.interface_b \u003d b"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9wJU%3D","line":128,"in_reply_to":"AAAAUH%2F9wc4%3D","updated":"2014-02-04 11:30:36.000000000","message":"Good catch. I\u0027m just wondering how we will use it in vendor_passthru method. Will need to depend of the order of the args, e.g.\n\n     if method \u003d\u003d \u0027first_method\u0027:\n            return self.interfaces[0]. ...\n\nAlso I assume such class will be implemented by each developer who want\u0027s multiple vendor interfaces. In other words it won\u0027t be provided by Ironic, instead each time when some developer want to mix vendor interfaces he will create such class, right? And this one is just example.\n\nOr do we want to make it generic? In this case we will need some automatic routing in vendor_passthru (to route call to the proper vend interface). This will raise a new question - what to do if two interfaces support method with the same name? :)","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"b26ae8e30b2f2f3c745b01a9203024c0d21cd865","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        errors \u003d []"},{"line_number":135,"context_line":"        for i in self.interfaces:"},{"line_number":136,"context_line":"            try:"},{"line_number":137,"context_line":"                return i.validate(*args, **kwargs)"},{"line_number":138,"context_line":"            except Exception as e:"},{"line_number":139,"context_line":"                errors.append(e)"},{"line_number":140,"context_line":"        if errors:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9wL8%3D","line":137,"updated":"2014-02-04 11:10:39.000000000","message":"I think this return is incorrect, because if the first interface validation succeed it\u0027s going to return and skip the validation on the next interface.","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"2fb13b43f13932425bae3527ea96783c2bbffbdb","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        errors \u003d []"},{"line_number":135,"context_line":"        for i in self.interfaces:"},{"line_number":136,"context_line":"            try:"},{"line_number":137,"context_line":"                return i.validate(*args, **kwargs)"},{"line_number":138,"context_line":"            except Exception as e:"},{"line_number":139,"context_line":"                errors.append(e)"},{"line_number":140,"context_line":"        if errors:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9xA0%3D","line":137,"updated":"2014-02-04 07:15:16.000000000","message":"Is \"validate\" intended to change the driver state somehow (e.g. obligatorily should be called for each of the interfaces)? If no, I think we can use:\n\n    \n    validation_results \u003d []\n    for i in self.interfaces:\n        validation_results.append(i.validate(*args, **kwargs))\n    return all(validation_results)\n\nAlso, I didn\u0027t noticed this before, but our fake validate method will either raise exception or return True, there are no cases for False. I think that could be changed to \"raise Exception or return None\"like it\u0027s actually done in real drivers. The code for multiple vendor validate than will be \n\n    for i in self.interfaces:\n       i.validate(*args, **kwargs)","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"dbf6102afa6f2bf0bd63710ea5ae7100895baa7a","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        errors \u003d []"},{"line_number":135,"context_line":"        for i in self.interfaces:"},{"line_number":136,"context_line":"            try:"},{"line_number":137,"context_line":"                return i.validate(*args, **kwargs)"},{"line_number":138,"context_line":"            except Exception as e:"},{"line_number":139,"context_line":"                errors.append(e)"},{"line_number":140,"context_line":"        if errors:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9wEo%3D","line":137,"in_reply_to":"AAAAUH%2F9wG4%3D","updated":"2014-02-04 11:39:06.000000000","message":"This makes sense if methods are unique in all drivers set. And read my comment about mapping.","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"b13003930985a669308b880095a7100e6c945609","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        errors \u003d []"},{"line_number":135,"context_line":"        for i in self.interfaces:"},{"line_number":136,"context_line":"            try:"},{"line_number":137,"context_line":"                return i.validate(*args, **kwargs)"},{"line_number":138,"context_line":"            except Exception as e:"},{"line_number":139,"context_line":"                errors.append(e)"},{"line_number":140,"context_line":"        if errors:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9wG4%3D","line":137,"in_reply_to":"AAAAUH%2F9wL8%3D","updated":"2014-02-04 11:30:36.000000000","message":"Totally true :) Seems like a misprint","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"fe956fc2972a24222a23840bc7bbaaeb9efc5ca0","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        errors \u003d []"},{"line_number":135,"context_line":"        for i in self.interfaces:"},{"line_number":136,"context_line":"            try:"},{"line_number":137,"context_line":"                return i.validate(*args, **kwargs)"},{"line_number":138,"context_line":"            except Exception as e:"},{"line_number":139,"context_line":"                errors.append(e)"},{"line_number":140,"context_line":"        if errors:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9tn4%3D","line":137,"in_reply_to":"AAAAUH%2F9xA0%3D","updated":"2014-02-04 18:47:19.000000000","message":"That\u0027s a fair point. This should mimic the behaviour of real drivers.","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"8b54588c25354de147a0f18bbf21a6c79a0fb5ee","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        if errors:"},{"line_number":141,"context_line":"            # if more than one interface failed and none suceeded,"},{"line_number":142,"context_line":"            # just re-raise the first exception."},{"line_number":143,"context_line":"            raise errors[0]"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def vendor_passthru(self, task, node, **kwargs):"},{"line_number":146,"context_line":"        method \u003d kwargs.get(\u0027method\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9wtI%3D","line":143,"updated":"2014-02-04 09:05:16.000000000","message":"Method not supported (wrong) and invalid parameter (right) messages can be here. IMO two different exceptions should be for this cases.","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"8b54588c25354de147a0f18bbf21a6c79a0fb5ee","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def vendor_passthru(self, task, node, **kwargs):"},{"line_number":146,"context_line":"        method \u003d kwargs.get(\u0027method\u0027)"},{"line_number":147,"context_line":"        if method \u003d\u003d \u0027first_method\u0027:"},{"line_number":148,"context_line":"            return self.interface_a.vendor_passthru(task, node, **kwargs)"},{"line_number":149,"context_line":"        if method \u003d\u003d \u0027second_method\u0027:"},{"line_number":150,"context_line":"            return self.interface_b.vendor_passthru(task, node, **kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9wrE%3D","line":147,"updated":"2014-02-04 09:05:16.000000000","message":"Aha, we have method -\u003e interface mapping. This can also solve a problem above.\n\nWhat about\n\n class FakeVendorA(base.VendorInterface):\n    @staticmethod\n    def methods():\n        return [\u0027a_first_method\u0027, \u0027a_second_method\u0027]","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"fe956fc2972a24222a23840bc7bbaaeb9efc5ca0","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def vendor_passthru(self, task, node, **kwargs):"},{"line_number":146,"context_line":"        method \u003d kwargs.get(\u0027method\u0027)"},{"line_number":147,"context_line":"        if method \u003d\u003d \u0027first_method\u0027:"},{"line_number":148,"context_line":"            return self.interface_a.vendor_passthru(task, node, **kwargs)"},{"line_number":149,"context_line":"        if method \u003d\u003d \u0027second_method\u0027:"},{"line_number":150,"context_line":"            return self.interface_b.vendor_passthru(task, node, **kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9tnQ%3D","line":147,"in_reply_to":"AAAAUH%2F9wrE%3D","updated":"2014-02-04 18:47:19.000000000","message":"Ahh... that\u0027s an interesting suggestion. But it doesn\u0027t really address the issue -- what if both FakeVendorA and FakeVendorB implement a method with the same name?\n\nThe logic to multiplex them must still reside in the class which wraps them both.","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"dbf6102afa6f2bf0bd63710ea5ae7100895baa7a","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def vendor_passthru(self, task, node, **kwargs):"},{"line_number":146,"context_line":"        method \u003d kwargs.get(\u0027method\u0027)"},{"line_number":147,"context_line":"        if method \u003d\u003d \u0027first_method\u0027:"},{"line_number":148,"context_line":"            return self.interface_a.vendor_passthru(task, node, **kwargs)"},{"line_number":149,"context_line":"        if method \u003d\u003d \u0027second_method\u0027:"},{"line_number":150,"context_line":"            return self.interface_b.vendor_passthru(task, node, **kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9wGo%3D","line":147,"in_reply_to":"AAAAUH%2F9wrE%3D","updated":"2014-02-04 11:39:06.000000000","message":"And driver can also provide own methods !\u003d methods in a, b\n\n if method \u003d\u003d \u0027own_first_method\u0027:\n    kwargs[\u0027method\u0027] \u003d \u0027a_first_method\u0027\n    self.interface_a.validate(*args, **kwargs)\n ...\n\nmapping possible in MultipleVendorInterface.validate","commit_id":"967241b358015c57009b839acc7fef941d4468a5"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"bad86637a74a777b7c9b393e41096a09e9da7036","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        pass"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def _unsupported(method):"},{"line_number":77,"context_line":"    if method:"},{"line_number":78,"context_line":"        raise exception.InvalidParameterValue(_("},{"line_number":79,"context_line":"            \"Unsupported method (%s) passed through to vendor extension.\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9sVI%3D","line":76,"updated":"2014-02-04 23:49:04.000000000","message":"If we leaving this as an example, would it make sense to rename to _raise_unsupproted?","commit_id":"c380a837ae0d7e23e8378031b5f10ae2385190fb"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"49069a6d9cc5c8310bae39161c1b75977858e18d","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        pass"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def _unsupported(method):"},{"line_number":77,"context_line":"    if method:"},{"line_number":78,"context_line":"        raise exception.InvalidParameterValue(_("},{"line_number":79,"context_line":"            \"Unsupported method (%s) passed through to vendor extension.\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9mzk%3D","line":76,"in_reply_to":"AAAAUH%2F9sVI%3D","updated":"2014-02-05 17:58:02.000000000","message":"Done","commit_id":"c380a837ae0d7e23e8378031b5f10ae2385190fb"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"bad86637a74a777b7c9b393e41096a09e9da7036","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        raise exception.InvalidParameterValue(_("},{"line_number":79,"context_line":"            \"Unsupported method (%s) passed through to vendor extension.\")"},{"line_number":80,"context_line":"            % method)"},{"line_number":81,"context_line":"    else:"},{"line_number":82,"context_line":"        raise exception.InvalidParameterValue(_("},{"line_number":83,"context_line":"            \"Method not specified when calling vendor extension.\"))"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9sVA%3D","line":81,"updated":"2014-02-04 23:49:04.000000000","message":"This else is redundant","commit_id":"c380a837ae0d7e23e8378031b5f10ae2385190fb"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"49069a6d9cc5c8310bae39161c1b75977858e18d","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        raise exception.InvalidParameterValue(_("},{"line_number":79,"context_line":"            \"Unsupported method (%s) passed through to vendor extension.\")"},{"line_number":80,"context_line":"            % method)"},{"line_number":81,"context_line":"    else:"},{"line_number":82,"context_line":"        raise exception.InvalidParameterValue(_("},{"line_number":83,"context_line":"            \"Method not specified when calling vendor extension.\"))"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9mzo%3D","line":81,"in_reply_to":"AAAAUH%2F9sVA%3D","updated":"2014-02-05 17:58:02.000000000","message":"Done","commit_id":"c380a837ae0d7e23e8378031b5f10ae2385190fb"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"bad86637a74a777b7c9b393e41096a09e9da7036","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        self.first \u003d first"},{"line_number":139,"context_line":"        self.second \u003d second"},{"line_number":140,"context_line":"        self.mapping \u003d {\u0027first_method\u0027: self.first,"},{"line_number":141,"context_line":"                        \u0027second_method\u0027: self.second}"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _map(self, **kwargs):"},{"line_number":144,"context_line":"        \"\"\"Map methods to interfaces."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9sFA%3D","line":141,"updated":"2014-02-04 23:49:04.000000000","message":"would be great to change to \n\n# mapping between method name \u003c--\u003e method owner\nself.mapping \u003d {\u0027first_method\u0027: self.first, \n                \u0027second_method\u0027: self.first,\n                \u0027third_method\u0027: self.second}","commit_id":"c380a837ae0d7e23e8378031b5f10ae2385190fb"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"154d90afaec824fb36c33b5c0d098d43526f4a57","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        self.first \u003d first"},{"line_number":139,"context_line":"        self.second \u003d second"},{"line_number":140,"context_line":"        self.mapping \u003d {\u0027first_method\u0027: self.first,"},{"line_number":141,"context_line":"                        \u0027second_method\u0027: self.second}"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _map(self, **kwargs):"},{"line_number":144,"context_line":"        \"\"\"Map methods to interfaces."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9hLE%3D","line":141,"in_reply_to":"AAAAUH%2F9mzs%3D","updated":"2014-02-06 11:07:43.000000000","message":"To me this clears that we storing mapping to the method owner but not to the method itself. Because when I seen this the first time \"first_method\u0027: self.first\" I thought this must be an error - there must be a reference to the method instead of class, like if our vendor_passthru would directly call appropriate method from the child interface, instead of calling child\u0027s vendor_passthru :) It\u0027s just a bit confusing","commit_id":"c380a837ae0d7e23e8378031b5f10ae2385190fb"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"49069a6d9cc5c8310bae39161c1b75977858e18d","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        self.first \u003d first"},{"line_number":139,"context_line":"        self.second \u003d second"},{"line_number":140,"context_line":"        self.mapping \u003d {\u0027first_method\u0027: self.first,"},{"line_number":141,"context_line":"                        \u0027second_method\u0027: self.second}"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _map(self, **kwargs):"},{"line_number":144,"context_line":"        \"\"\"Map methods to interfaces."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9mzs%3D","line":141,"in_reply_to":"AAAAUH%2F9sFA%3D","updated":"2014-02-05 17:58:02.000000000","message":"what additional information does this convey?","commit_id":"c380a837ae0d7e23e8378031b5f10ae2385190fb"},{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"8887629b6a41a28e58ed7d6b61310980abf1d17a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from ironic.drivers import base"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def _raise_unsupported_error(method\u003dNone):"},{"line_number":34,"context_line":"    if method:"},{"line_number":35,"context_line":"        raise exception.InvalidParameterValue(_("},{"line_number":36,"context_line":"            \"Unsupported method (%s) passed through to vendor extension.\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2F2tw%3D","line":33,"updated":"2014-02-10 11:53:32.000000000","message":"This could be used my other multiplex implementations.","commit_id":"098e61fb7d67528d96c09f93bfb9c933345d00ec"}],"ironic/tests/conductor/test_manager.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0d5e58a7881cbb194fa05b4bbddc7dea09f19cf1","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        # verify change did not happen"},{"line_number":287,"context_line":"        res \u003d objects.Node.get_by_uuid(self.context, node[\u0027uuid\u0027])"},{"line_number":288,"context_line":"        self.assertEqual(res[\u0027driver\u0027], existing_driver)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def test_vendor_action(self):"},{"line_number":291,"context_line":"        n \u003d utils.get_test_node(driver\u003d\u0027fake\u0027)"},{"line_number":292,"context_line":"        self.dbapi.create_node(n)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2F3P8%3D","line":289,"updated":"2014-02-10 10:22:40.000000000","message":"Maybe we should add some tests to stress the \"second_method\" here as well, one that pass and another that fail would be enough","commit_id":"098e61fb7d67528d96c09f93bfb9c933345d00ec"}]}
