)]}'
{"ironic/common/driver_factory.py":[{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"d80d75d04c6efe62eec6adc5114fcd827fad4dd8","unresolved":false,"context_lines":[{"line_number":28,"context_line":"EM_SEMAPHORE \u003d \u0027extension_manager\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def get_driver(driver_name):"},{"line_number":32,"context_line":"    try:"},{"line_number":33,"context_line":"        factory \u003d DriverFactory()"},{"line_number":34,"context_line":"        return factory[driver_name].obj"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Be9s%3D","line":31,"updated":"2014-02-20 23:12:02.000000000","message":"Doc string may be helpful.\nAnd, is it only for tests?","commit_id":"4f426a44fb034f32a55f497654ea5580eab1fbac"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"80115785757ff4ef073c12690d9555c35043f73e","unresolved":false,"context_lines":[{"line_number":28,"context_line":"EM_SEMAPHORE \u003d \u0027extension_manager\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def get_driver(driver_name):"},{"line_number":32,"context_line":"    try:"},{"line_number":33,"context_line":"        factory \u003d DriverFactory()"},{"line_number":34,"context_line":"        return factory[driver_name].obj"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BWbg%3D","line":31,"in_reply_to":"AAAAUX%2F%2Be9s%3D","updated":"2014-02-21 17:57:40.000000000","message":"Done","commit_id":"4f426a44fb034f32a55f497654ea5580eab1fbac"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"93f63c4170a7fd309c5b9f9aff47ea23919b37a6","unresolved":false,"context_lines":[{"line_number":39,"context_line":"              ironic.drivers.base.BaseDriver"},{"line_number":40,"context_line":"    :raises: DriverNotFound if the requested driver_name could not be"},{"line_number":41,"context_line":"             found in the \"ironic.drivers\" namespace."},{"line_number":42,"context_line":"    "},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BVHg%3D","line":42,"updated":"2014-02-21 20:38:46.000000000","message":"Looks like the tab character..","commit_id":"215e72d6731f04880ecbeb0c609569732e859980"}],"ironic/conductor/resource_manager.py":[{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"b6e3a5dc1d57ad0bc11b163f0b4a31da8235db43","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from ironic.common import exception"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class NodeManager(object):"},{"line_number":34,"context_line":"    \"\"\"The data model, state, and drivers to manage a Node.\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self, node, ports, driver_name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F6m8%3D","line":33,"updated":"2014-02-09 23:37:25.000000000","message":"Maybe to rename it to NodeResource? Seems it\u0027s actually doesn\u0027t manage anything, it\u0027s more like a container for coupled objects..\n\nIf yes, then the module can be renamed to resources.py","commit_id":"bf91611de0f0fdfe7a88f7664fab27d9ec0c6fcf"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"fb71680095edcf477cfb2bd2b08666711dca6ae5","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from ironic.common import exception"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class NodeManager(object):"},{"line_number":34,"context_line":"    \"\"\"The data model, state, and drivers to manage a Node.\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self, node, ports, driver_name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F3EQ%3D","line":33,"in_reply_to":"AAAAUX%2F%2F6m8%3D","updated":"2014-02-10 11:23:42.000000000","message":"+1 for changing the name\n\nAbout renaming the module, maybe we want to move this class to the task_manager.py file (since it\u0027s just a helper class for the TaskManager), I think it might be clear to have the main and the helper class in the same module file","commit_id":"bf91611de0f0fdfe7a88f7664fab27d9ec0c6fcf"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"45fa3dab8308c9ba39aa6181e58c31a84598096b","unresolved":false,"context_lines":[{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":"Convenient wrapper to hold objects and driver(s) associated to a resource."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Currently only implements the NodeManager class."},{"line_number":23,"context_line":"Do not request a NodeManager directly; instead, you should use a TaskManager to"},{"line_number":24,"context_line":"manage the resource in a given context. See the documentation on TaskManager"},{"line_number":25,"context_line":"for an example."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Bkto%3D","line":22,"updated":"2014-02-20 13:25:30.000000000","message":"ditto renaming NodeManager","commit_id":"51759fb3c2b88769066f76d145d8e60258337d0f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bc38451e45e8f33a658d92f9219b8dbfc511bb0d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from ironic.common import exception"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class NodeManager(object):"},{"line_number":34,"context_line":"    \"\"\"The data model, state, and drivers to manage a Node.\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def __init__(self, node, ports, driver_name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2BmTo%3D","line":33,"updated":"2014-02-20 09:36:28.000000000","message":"Nit left from the previous patch-set (#2): What about renaming it to NodeResource since it\u0027s not managing anything anymore.","commit_id":"51759fb3c2b88769066f76d145d8e60258337d0f"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"45fa3dab8308c9ba39aa6181e58c31a84598096b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        driver_name \u003d driver_name or node.get(\u0027driver\u0027)"},{"line_number":42,"context_line":"        factory \u003d driver_factory.DriverFactory()"},{"line_number":43,"context_line":"        try:"},{"line_number":44,"context_line":"            self.driver \u003d factory[driver_name].obj"},{"line_number":45,"context_line":"        except KeyError:"},{"line_number":46,"context_line":"            raise exception.DriverNotFound(driver_name\u003ddriver_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Bkkk%3D","line":44,"updated":"2014-02-20 13:25:30.000000000","message":"So currently NodeManager (or better NodeResource) is supposed to be a simple container for associated objects. Driver loading seems a little outside of this abstraction, so how about to move it to Task manager, and pass loaded driver as a parameter similarly to node and ports","commit_id":"51759fb3c2b88769066f76d145d8e60258337d0f"}],"ironic/conductor/task_manager.py":[{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"b6e3a5dc1d57ad0bc11b163f0b4a31da8235db43","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"CONF \u003d cfg.CONF"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"exclusive_lock_sem \u003d threading.Semaphore()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def require_exclusive_lock(f):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F6tI%3D","line":82,"updated":"2014-02-09 23:37:25.000000000","message":"This probably can be replaced by threading.Lock. Since we need a mutual exclusion only, lock should perfectly serve for this.\n\nJust in case I asked on stack overflow\nhttp://stackoverflow.com/questions/21665657/python-binary-semaphore-vs-lock","commit_id":"bf91611de0f0fdfe7a88f7664fab27d9ec0c6fcf"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"f20c14bf8df0188872a39d51ed4e981237cf2b76","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"CONF \u003d cfg.CONF"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"exclusive_lock_sem \u003d threading.Semaphore()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def require_exclusive_lock(f):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F2KU%3D","line":82,"in_reply_to":"AAAAUX%2F%2F28A%3D","updated":"2014-02-10 13:13:46.000000000","message":"Indeed. Thanks!","commit_id":"bf91611de0f0fdfe7a88f7664fab27d9ec0c6fcf"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"fb71680095edcf477cfb2bd2b08666711dca6ae5","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"CONF \u003d cfg.CONF"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"exclusive_lock_sem \u003d threading.Semaphore()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def require_exclusive_lock(f):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F28A%3D","line":82,"in_reply_to":"AAAAUX%2F%2F6tI%3D","updated":"2014-02-10 11:23:42.000000000","message":"+1. If we only want to use a Semaphore with value\u003d1, the Lock would be good replacement for it (Simpler for who is reading the code as well)\n\nNote: On that answer, blocking\u003dFalse can also be passed to the Lock.acquire() method","commit_id":"bf91611de0f0fdfe7a88f7664fab27d9ec0c6fcf"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"b6e3a5dc1d57ad0bc11b163f0b4a31da8235db43","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    try:"},{"line_number":126,"context_line":"        if not shared:"},{"line_number":127,"context_line":"            # serialize to avoid potential races in the DB"},{"line_number":128,"context_line":"            exclusive_lock_sem.acquire()"},{"line_number":129,"context_line":"            try:"},{"line_number":130,"context_line":"                nodes \u003d t.dbapi.reserve_nodes(CONF.host, node_ids)"},{"line_number":131,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F6sg%3D","line":128,"updated":"2014-02-09 23:37:25.000000000","message":"I\u0027m wondering if really need this python lock here... If we look at the dbapi code https://github.com/openstack/ironic/blob/master/ironic/db/sqlalchemy/api.py#L244\n\nboth checking if the node already locked and reserving the node is done within single session which is represented as transaction in DB. So if execution is interrupted in the middle of those transaction and switched to another reserve_nodes call, db should block those query because of pending transaction, eventlet will switch execution context back to the first one and it will complete. So there is no need for lock. Am I right?\n\n- If I mistaken about this should be automatically handled by db transaction then we could have another problem, we could have race between two different conductors (I remember about hash ring routing, but what if that changed in future?). Hope I\u0027m not wrong :)\n\n- Again, If I mistaken, and you folks think that we should have this lock at least to prevent dummy switches between greenthreads it\u0027s probably better to move this lock down to the db layer.\n\n- It\u0027s handy to use \"with\" statements for locks and semaphores :-P","commit_id":"bf91611de0f0fdfe7a88f7664fab27d9ec0c6fcf"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"fb71680095edcf477cfb2bd2b08666711dca6ae5","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    try:"},{"line_number":126,"context_line":"        if not shared:"},{"line_number":127,"context_line":"            # serialize to avoid potential races in the DB"},{"line_number":128,"context_line":"            exclusive_lock_sem.acquire()"},{"line_number":129,"context_line":"            try:"},{"line_number":130,"context_line":"                nodes \u003d t.dbapi.reserve_nodes(CONF.host, node_ids)"},{"line_number":131,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F26k%3D","line":128,"in_reply_to":"AAAAUX%2F%2F6sg%3D","updated":"2014-02-10 11:23:42.000000000","message":"Hmm I\u0027m not very familiar with this part of the code but it makes sense for me.\n\nI agree that If the lock is really required we might want to move it to the db layer. The distributed hashing algorithm can guarantee that the rpc message will be routed to the same conductor, but the layers should be independent, it seems to be a db layer problem when acquiring the node so that the race condition should be prevented there.","commit_id":"bf91611de0f0fdfe7a88f7664fab27d9ec0c6fcf"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"45fa3dab8308c9ba39aa6181e58c31a84598096b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"each other."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"A shared lock is useful when performing non-interfering operations,"},{"line_number":37,"context_line":"such as checking the power state."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"An exclusive lock is stored in the database to coordinate between"},{"line_number":40,"context_line":":class:`ironic.conductor.manager` instances, even when deployed on different"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Bkoc%3D","line":37,"updated":"2014-02-20 13:25:30.000000000","message":"Seems not very good example, since AFAIR currently we don\u0027t have any part of code that checks power state through shared lock (we removing the last one https://review.openstack.org/#/c/73097/) Maybe to replace with \"such as checking node state (f.e. validate_driver_interfaces)\"","commit_id":"51759fb3c2b88769066f76d145d8e60258337d0f"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"de302c6e42fe7cc3a8c21dfc77c22591dc5d3a32","unresolved":false,"context_lines":[{"line_number":34,"context_line":"each other."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"A shared lock is useful when performing non-interfering operations,"},{"line_number":37,"context_line":"such as checking the power state."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"An exclusive lock is stored in the database to coordinate between"},{"line_number":40,"context_line":":class:`ironic.conductor.manager` instances, even when deployed on different"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2BhaE%3D","line":37,"in_reply_to":"AAAAUX%2F%2Bkoc%3D","updated":"2014-02-20 18:40:33.000000000","message":"Done","commit_id":"51759fb3c2b88769066f76d145d8e60258337d0f"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"45fa3dab8308c9ba39aa6181e58c31a84598096b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"such as checking the power state."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"An exclusive lock is stored in the database to coordinate between"},{"line_number":40,"context_line":":class:`ironic.conductor.manager` instances, even when deployed on different"},{"line_number":41,"context_line":"hosts."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":":class:`TaskManager` methods, as well as driver methods, may be decorated to"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2BknE%3D","line":40,"updated":"2014-02-20 13:25:30.000000000","message":"we don\u0027t really expect two or more conductors to be deployed on a single host, right? We\u0027re using host name as identifier. Let\u0027s change this to \"to coordinate between :class:`ironic.conductor.manager` instances that typically deployed on different hosts\"","commit_id":"51759fb3c2b88769066f76d145d8e60258337d0f"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"de302c6e42fe7cc3a8c21dfc77c22591dc5d3a32","unresolved":false,"context_lines":[{"line_number":37,"context_line":"such as checking the power state."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"An exclusive lock is stored in the database to coordinate between"},{"line_number":40,"context_line":":class:`ironic.conductor.manager` instances, even when deployed on different"},{"line_number":41,"context_line":"hosts."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":":class:`TaskManager` methods, as well as driver methods, may be decorated to"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Bhbc%3D","line":40,"in_reply_to":"AAAAUX%2F%2BknE%3D","updated":"2014-02-20 18:40:33.000000000","message":"Done","commit_id":"51759fb3c2b88769066f76d145d8e60258337d0f"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"45fa3dab8308c9ba39aa6181e58c31a84598096b","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    \"\"\"Context manager for tasks."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    This class wraps the locking, driver loading, and acquisition"},{"line_number":125,"context_line":"    of related resources (eg, Nodes and Ports) when beginning a unit of work."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    \"\"\""},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Bkjk%3D","line":125,"updated":"2014-02-20 13:25:30.000000000","message":"Driver loading is currently responsibility of the NodeResource, but looks like it\u0027s better suitable for task manager, and even already described in this doc string. As I proposed in comment for resource_manager.py, would it make sense to move it here","commit_id":"51759fb3c2b88769066f76d145d8e60258337d0f"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"de302c6e42fe7cc3a8c21dfc77c22591dc5d3a32","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    \"\"\"Context manager for tasks."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    This class wraps the locking, driver loading, and acquisition"},{"line_number":125,"context_line":"    of related resources (eg, Nodes and Ports) when beginning a unit of work."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    \"\"\""},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2BhM4%3D","line":125,"in_reply_to":"AAAAUX%2F%2Bkjk%3D","updated":"2014-02-20 18:40:33.000000000","message":"Done","commit_id":"51759fb3c2b88769066f76d145d8e60258337d0f"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"45fa3dab8308c9ba39aa6181e58c31a84598096b","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        was holding an exclusive lock."},{"line_number":177,"context_line":"        \"\"\""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        if not self.resources or self.shared:"},{"line_number":180,"context_line":"            # Nothing to release."},{"line_number":181,"context_line":"            return"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Bka8%3D","line":179,"updated":"2014-02-20 13:25:30.000000000","message":"\"or self.shared\" looks confusing because of the similar check below. Let\u0027s omit it","commit_id":"51759fb3c2b88769066f76d145d8e60258337d0f"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"de302c6e42fe7cc3a8c21dfc77c22591dc5d3a32","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        was holding an exclusive lock."},{"line_number":177,"context_line":"        \"\"\""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        if not self.resources or self.shared:"},{"line_number":180,"context_line":"            # Nothing to release."},{"line_number":181,"context_line":"            return"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2BhW4%3D","line":179,"in_reply_to":"AAAAUX%2F%2Bka8%3D","updated":"2014-02-20 18:40:33.000000000","message":"going to clean this up a little more","commit_id":"51759fb3c2b88769066f76d145d8e60258337d0f"}],"ironic/tests/conductor/test_node_manager.py":[{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"b6e3a5dc1d57ad0bc11b163f0b4a31da8235db43","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                                 driver_name\u003dself.existing_driver_name_2)"},{"line_number":124,"context_line":"            self.assertEqual(new_nm.driver, self.existing_driver_2.obj)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def test_load_existing_driver(self):"},{"line_number":127,"context_line":"        NodeManager \u003d resource_manager.NodeManager"},{"line_number":128,"context_line":"        DriverFactory \u003d driver_factory.DriverFactory"},{"line_number":129,"context_line":"        with contextlib.nested("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F6ks%3D","side":"PARENT","line":126,"updated":"2014-02-09 23:37:25.000000000","message":"Seems you missed this test..","commit_id":"1b15e6aafc5ccbf5beb0471ad1f65be931017158"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"f20c14bf8df0188872a39d51ed4e981237cf2b76","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                                 driver_name\u003dself.existing_driver_name_2)"},{"line_number":124,"context_line":"            self.assertEqual(new_nm.driver, self.existing_driver_2.obj)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def test_load_existing_driver(self):"},{"line_number":127,"context_line":"        NodeManager \u003d resource_manager.NodeManager"},{"line_number":128,"context_line":"        DriverFactory \u003d driver_factory.DriverFactory"},{"line_number":129,"context_line":"        with contextlib.nested("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F2HU%3D","side":"PARENT","line":126,"in_reply_to":"AAAAUX%2F%2F3Cc%3D","updated":"2014-02-10 13:13:46.000000000","message":"Ah, right, thank you","commit_id":"1b15e6aafc5ccbf5beb0471ad1f65be931017158"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"fb71680095edcf477cfb2bd2b08666711dca6ae5","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                                 driver_name\u003dself.existing_driver_name_2)"},{"line_number":124,"context_line":"            self.assertEqual(new_nm.driver, self.existing_driver_2.obj)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def test_load_existing_driver(self):"},{"line_number":127,"context_line":"        NodeManager \u003d resource_manager.NodeManager"},{"line_number":128,"context_line":"        DriverFactory \u003d driver_factory.DriverFactory"},{"line_number":129,"context_line":"        with contextlib.nested("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F3Cc%3D","side":"PARENT","line":126,"in_reply_to":"AAAAUX%2F%2F6ks%3D","updated":"2014-02-10 11:23:42.000000000","message":"I think this test is already being covered by the test_node_manager_init(). Before we had a different method that tried to get the driver from the DriverFactory (load_driver()) but now it\u0027s done by the TaskManager.__init__()","commit_id":"1b15e6aafc5ccbf5beb0471ad1f65be931017158"}],"ironic/tests/conductor/test_task_manager.py":[{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"b6e3a5dc1d57ad0bc11b163f0b4a31da8235db43","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def _task_uuids(task):"},{"line_number":44,"context_line":"        return sorted([r.node.uuid for r in task.resources])"},{"line_number":45,"context_line":"    return matchers.AfterPreprocessing("},{"line_number":46,"context_line":"            _task_uuids, matchers.Equals(uuids))"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class TaskManagerTestCase(base.DbTestCase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F6lU%3D","line":46,"updated":"2014-02-09 23:37:25.000000000","message":"Is this a related change? Why we didn\u0027t hit it before? :)","commit_id":"bf91611de0f0fdfe7a88f7664fab27d9ec0c6fcf"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"d80d75d04c6efe62eec6adc5114fcd827fad4dd8","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def test_task_manager_updates_db(self):"},{"line_number":75,"context_line":"        node_uuid \u003d self.uuids[0]"},{"line_number":76,"context_line":"        node \u003d self.dbapi.get_node(node_uuid)"},{"line_number":77,"context_line":"        self.assertEqual(None, node.reservation)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        with task_manager.acquire(self.context, node_uuid) as task:"},{"line_number":80,"context_line":"            self.assertEqual(node.uuid, task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Be%2FM%3D","line":77,"updated":"2014-02-20 23:12:02.000000000","message":"The order is correct, but\n\nself.assertIsNone(node.reservation) :)","commit_id":"4f426a44fb034f32a55f497654ea5580eab1fbac"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"80115785757ff4ef073c12690d9555c35043f73e","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def test_task_manager_updates_db(self):"},{"line_number":75,"context_line":"        node_uuid \u003d self.uuids[0]"},{"line_number":76,"context_line":"        node \u003d self.dbapi.get_node(node_uuid)"},{"line_number":77,"context_line":"        self.assertEqual(None, node.reservation)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        with task_manager.acquire(self.context, node_uuid) as task:"},{"line_number":80,"context_line":"            self.assertEqual(node.uuid, task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BWPw%3D","line":77,"in_reply_to":"AAAAUX%2F%2Be%2FM%3D","updated":"2014-02-21 17:57:40.000000000","message":"Done","commit_id":"4f426a44fb034f32a55f497654ea5580eab1fbac"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"d80d75d04c6efe62eec6adc5114fcd827fad4dd8","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            self.assertEqual(\u0027test-host\u0027, node.reservation)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        node.refresh(self.context)"},{"line_number":85,"context_line":"        self.assertEqual(None, node.reservation)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def test_get_many_nodes(self):"},{"line_number":88,"context_line":"        uuids \u003d self.uuids[1:3]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Be%2Fg%3D","line":85,"updated":"2014-02-20 23:12:02.000000000","message":"ditto","commit_id":"4f426a44fb034f32a55f497654ea5580eab1fbac"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"d80d75d04c6efe62eec6adc5114fcd827fad4dd8","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        # Ensure all reservations are cleared"},{"line_number":96,"context_line":"        for uuid in self.uuids:"},{"line_number":97,"context_line":"            node \u003d self.dbapi.get_node(uuid)"},{"line_number":98,"context_line":"            self.assertEqual(None, node.reservation)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def test_get_nodes_nested(self):"},{"line_number":101,"context_line":"        uuids \u003d self.uuids[0:2]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Be88%3D","line":98,"updated":"2014-02-20 23:12:02.000000000","message":"ditto","commit_id":"4f426a44fb034f32a55f497654ea5580eab1fbac"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"d80d75d04c6efe62eec6adc5114fcd827fad4dd8","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        self.assertEqual(\u0027test-host\u0027, node.reservation)"},{"line_number":152,"context_line":"        for uuid in unlocked_node_uuids:"},{"line_number":153,"context_line":"            node \u003d self.dbapi.get_node(uuid)"},{"line_number":154,"context_line":"            self.assertEqual(None, node.reservation)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def test_get_one_node_driver_load_exception(self):"},{"line_number":157,"context_line":"        node_uuid \u003d self.uuids[0]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Be84%3D","line":154,"updated":"2014-02-20 23:12:02.000000000","message":"ditto","commit_id":"4f426a44fb034f32a55f497654ea5580eab1fbac"}]}
