)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"280c16648cb9e427d8aa395d49e09fed6a45e574","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Spec available at:"},{"line_number":22,"context_line":"http://specs.openstack.org/openstack/ironic-specs/specs/liberty/"},{"line_number":23,"context_line":"ironic-ml2-integration.html"},{"line_number":24,"context_line":"Note: this is an initial draft only and is still work in progress."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Partial-bug: #1526403"},{"line_number":27,"context_line":"DocImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"1a7b0d38_cc03a20e","line":24,"updated":"2015-12-23 12:34:06.000000000","message":"ditto should be removed.","commit_id":"3743bec767e3a4c034e69fccb02b80f68d6daae3"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5725e4c8e229f71d7f0267a80c15ed7b1dd9ba9b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Spec available at:"},{"line_number":22,"context_line":"http://specs.openstack.org/openstack/ironic-specs/specs/liberty/"},{"line_number":23,"context_line":"ironic-ml2-integration.html"},{"line_number":24,"context_line":"Note: this is an initial draft only and is still work in progress."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Partial-bug: #1526403"},{"line_number":27,"context_line":"DocImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"1a7b0d38_391c78c0","line":24,"in_reply_to":"1a7b0d38_cc03a20e","updated":"2016-01-05 17:47:56.000000000","message":"Done","commit_id":"3743bec767e3a4c034e69fccb02b80f68d6daae3"}],"ironic/conductor/manager.py":[{"author":{"_account_id":10375,"name":"Om Kumar","email":"om.kumar@hpe.com","username":"lazy_prince"},"change_message_id":"2eb7a1ecdeb027d182dc370ec6a9d0a5ab92e4cd","unresolved":false,"context_lines":[{"line_number":1621,"context_line":""},{"line_number":1622,"context_line":"            return port_obj"},{"line_number":1623,"context_line":""},{"line_number":1624,"context_line":"        def update_portgroup(self, context, portgroup_obj):"},{"line_number":1625,"context_line":"            \"\"\"Update a portgroup."},{"line_number":1626,"context_line":""},{"line_number":1627,"context_line":"            :param context: request context."}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_6bad8987","line":1624,"updated":"2015-08-24 13:06:37.000000000","message":"should it be 4 space indent..?","commit_id":"9156471529f325c39c75bdd24cc52937f2e1d055"},{"author":{"_account_id":10375,"name":"Om Kumar","email":"om.kumar@hpe.com","username":"lazy_prince"},"change_message_id":"d206feff4ed3f893f24d2b1731e4445da658f94b","unresolved":false,"context_lines":[{"line_number":212,"context_line":"    \"\"\"Ironic Conductor manager main class.\"\"\""},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    # NOTE(rloo): This must be in sync with rpcapi.ConductorAPI\u0027s."},{"line_number":215,"context_line":"    RPC_API_VERSION \u003d \u00271.31\u0027"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    target \u003d messaging.Target(version\u003dRPC_API_VERSION)"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"9a1a9d01_73af9294","line":215,"updated":"2015-09-28 15:58:15.000000000","message":"1.32","commit_id":"b288265152f56656842d5cc06b4681b367633f41"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"8f367f5edc1807eecbd68bcf53d07286090bedf6","unresolved":false,"context_lines":[{"line_number":1775,"context_line":"        LOG.debug(\"RPC update_portgroup called for portgroup %s.\","},{"line_number":1776,"context_line":"                  portgroup_uuid)"},{"line_number":1777,"context_line":""},{"line_number":1778,"context_line":"        with task_manager.acquire(context, portgroup_obj.node_id) as task:"},{"line_number":1779,"context_line":"            node \u003d task.node"},{"line_number":1780,"context_line":"            if \u0027address\u0027 in portgroup_obj.obj_what_changed():"},{"line_number":1781,"context_line":"                vif \u003d portgroup_obj.extra.get(\u0027vif_portgroup_id\u0027)"}],"source_content_type":"text/x-python","patch_set":36,"id":"da85f559_1b4ad055","line":1778,"updated":"2015-11-11 07:31:25.000000000","message":"could add \u0027purpose\u0027 parameter for the debug logs?","commit_id":"e7452c2e6f8989093a6dc5a2b780ece8f5152d36"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"ad7aba1029dd74bdc547912dc2ade78b96ba649c","unresolved":false,"context_lines":[{"line_number":1775,"context_line":"        LOG.debug(\"RPC update_portgroup called for portgroup %s.\","},{"line_number":1776,"context_line":"                  portgroup_uuid)"},{"line_number":1777,"context_line":""},{"line_number":1778,"context_line":"        with task_manager.acquire(context, portgroup_obj.node_id) as task:"},{"line_number":1779,"context_line":"            node \u003d task.node"},{"line_number":1780,"context_line":"            if \u0027address\u0027 in portgroup_obj.obj_what_changed():"},{"line_number":1781,"context_line":"                vif \u003d portgroup_obj.extra.get(\u0027vif_portgroup_id\u0027)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_c54b7c58","line":1778,"in_reply_to":"da85f559_1b4ad055","updated":"2016-01-05 17:47:49.000000000","message":"Done","commit_id":"e7452c2e6f8989093a6dc5a2b780ece8f5152d36"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"280c16648cb9e427d8aa395d49e09fed6a45e574","unresolved":false,"context_lines":[{"line_number":1548,"context_line":"            # or modifying the local_link_connection or pxe_enabled flags then"},{"line_number":1549,"context_line":"            # check if the node is not in a MANAGEABLE or INSPECTING or ENROLL"},{"line_number":1550,"context_line":"            # state"},{"line_number":1551,"context_line":"            connectivity_attr \u003d {\u0027portgroup_uuid\u0027,"},{"line_number":1552,"context_line":"                                 \u0027pxe_enabled\u0027,"},{"line_number":1553,"context_line":"                                 \u0027local_link_connection\u0027}"},{"line_number":1554,"context_line":"            if set(port_obj.obj_what_changed()) \u0026 connectivity_attr and \\"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a7b0d38_4c17b251","line":1551,"updated":"2015-12-23 12:34:06.000000000","message":"This new logic is not tested in test_manager.","commit_id":"3743bec767e3a4c034e69fccb02b80f68d6daae3"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5725e4c8e229f71d7f0267a80c15ed7b1dd9ba9b","unresolved":false,"context_lines":[{"line_number":1548,"context_line":"            # or modifying the local_link_connection or pxe_enabled flags then"},{"line_number":1549,"context_line":"            # check if the node is not in a MANAGEABLE or INSPECTING or ENROLL"},{"line_number":1550,"context_line":"            # state"},{"line_number":1551,"context_line":"            connectivity_attr \u003d {\u0027portgroup_uuid\u0027,"},{"line_number":1552,"context_line":"                                 \u0027pxe_enabled\u0027,"},{"line_number":1553,"context_line":"                                 \u0027local_link_connection\u0027}"},{"line_number":1554,"context_line":"            if set(port_obj.obj_what_changed()) \u0026 connectivity_attr and \\"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a7b0d38_6a96a094","line":1551,"in_reply_to":"1a7b0d38_4c17b251","updated":"2016-01-05 17:47:56.000000000","message":"Done","commit_id":"3743bec767e3a4c034e69fccb02b80f68d6daae3"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"280c16648cb9e427d8aa395d49e09fed6a45e574","unresolved":false,"context_lines":[{"line_number":1551,"context_line":"            connectivity_attr \u003d {\u0027portgroup_uuid\u0027,"},{"line_number":1552,"context_line":"                                 \u0027pxe_enabled\u0027,"},{"line_number":1553,"context_line":"                                 \u0027local_link_connection\u0027}"},{"line_number":1554,"context_line":"            if set(port_obj.obj_what_changed()) \u0026 connectivity_attr and \\"},{"line_number":1555,"context_line":"               task.node.provision_state not in [states.ENROLL,"},{"line_number":1556,"context_line":"                                                 states.INSPECTING,"},{"line_number":1557,"context_line":"                                                 states.MANAGEABLE]:"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a7b0d38_4c3a5238","line":1554,"updated":"2015-12-23 12:34:06.000000000","message":"Please don\u0027t use \\ at the end of line.","commit_id":"3743bec767e3a4c034e69fccb02b80f68d6daae3"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5725e4c8e229f71d7f0267a80c15ed7b1dd9ba9b","unresolved":false,"context_lines":[{"line_number":1551,"context_line":"            connectivity_attr \u003d {\u0027portgroup_uuid\u0027,"},{"line_number":1552,"context_line":"                                 \u0027pxe_enabled\u0027,"},{"line_number":1553,"context_line":"                                 \u0027local_link_connection\u0027}"},{"line_number":1554,"context_line":"            if set(port_obj.obj_what_changed()) \u0026 connectivity_attr and \\"},{"line_number":1555,"context_line":"               task.node.provision_state not in [states.ENROLL,"},{"line_number":1556,"context_line":"                                                 states.INSPECTING,"},{"line_number":1557,"context_line":"                                                 states.MANAGEABLE]:"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a7b0d38_79b0c08a","line":1554,"in_reply_to":"1a7b0d38_4c3a5238","updated":"2016-01-05 17:47:56.000000000","message":"Done","commit_id":"3743bec767e3a4c034e69fccb02b80f68d6daae3"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5725e4c8e229f71d7f0267a80c15ed7b1dd9ba9b","unresolved":false,"context_lines":[{"line_number":1561,"context_line":"                           \"unless node %(node)s is in \""},{"line_number":1562,"context_line":"                           \"a MANAGEABLE or ENROLL or INSPECTING state. \")"},{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":1565,"context_line":"                    {\u0027action\u0027: action % {\u0027port\u0027: port_uuid,"},{"line_number":1566,"context_line":"                                         \u0027node\u0027: task.node.uuid},"},{"line_number":1567,"context_line":"                     \u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a7b0d38_acea68aa","line":1564,"range":{"start_line":1564,"start_character":17,"end_line":1564,"end_character":54},"updated":"2016-01-05 17:47:56.000000000","message":"I think that more suitable exception is NotAcceptable","commit_id":"3743bec767e3a4c034e69fccb02b80f68d6daae3"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"280c16648cb9e427d8aa395d49e09fed6a45e574","unresolved":false,"context_lines":[{"line_number":1561,"context_line":"                           \"unless node %(node)s is in \""},{"line_number":1562,"context_line":"                           \"a MANAGEABLE or ENROLL or INSPECTING state. \")"},{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"                raise exception.InvalidStateRequested("},{"line_number":1565,"context_line":"                    {\u0027action\u0027: action % {\u0027port\u0027: port_uuid,"},{"line_number":1566,"context_line":"                                         \u0027node\u0027: task.node.uuid},"},{"line_number":1567,"context_line":"                     \u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a7b0d38_ecdbfeeb","line":1564,"updated":"2015-12-23 12:34:06.000000000","message":"Not sure if it\u0027s a good exception to use, as state change is not requested here.","commit_id":"3743bec767e3a4c034e69fccb02b80f68d6daae3"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"90330ab34b215a75fed776670d1e1f2d12d6684e","unresolved":false,"context_lines":[{"line_number":1561,"context_line":"                           \"unless node %(node)s is in \""},{"line_number":1562,"context_line":"                           \"a MANAGEABLE or ENROLL or INSPECTING state. \")"},{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"                raise exception.NotAcceptable("},{"line_number":1565,"context_line":"                    {\u0027action\u0027: action % {\u0027port\u0027: port_uuid,"},{"line_number":1566,"context_line":"                                         \u0027node\u0027: task.node.uuid},"},{"line_number":1567,"context_line":"                     \u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":43,"id":"da6ed579_b886c511","line":1564,"updated":"2016-01-12 00:42:26.000000000","message":"this is the wrong exception class to use, and will result in the client failing to parse the error properly. Please use InvalidState instead.\n\nI\u0027ve worked out a patch to correct this so I could test it, here: http://paste.openstack.org/show/483513/","commit_id":"927dbbcc98ece11e8e438230a09c62b9df82998e"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"b3a21ecac4844ef169bdf1e70ed377a682391fb4","unresolved":false,"context_lines":[{"line_number":1561,"context_line":"                           \"unless node %(node)s is in \""},{"line_number":1562,"context_line":"                           \"a MANAGEABLE or ENROLL or INSPECTING state. \")"},{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"                raise exception.NotAcceptable("},{"line_number":1565,"context_line":"                    {\u0027action\u0027: action % {\u0027port\u0027: port_uuid,"},{"line_number":1566,"context_line":"                                         \u0027node\u0027: task.node.uuid},"},{"line_number":1567,"context_line":"                     \u0027node\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":43,"id":"da6ed579_b9fe4fac","line":1564,"in_reply_to":"da6ed579_b886c511","updated":"2016-01-13 23:22:32.000000000","message":"Done","commit_id":"927dbbcc98ece11e8e438230a09c62b9df82998e"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"09bb3f911565a5dd7d1089897e644dc787184b74","unresolved":false,"context_lines":[{"line_number":1512,"context_line":"                     {\u0027port\u0027: port.uuid, \u0027node\u0027: task.node.uuid})"},{"line_number":1513,"context_line":""},{"line_number":1514,"context_line":"    @messaging.expected_exceptions(exception.NodeLocked,"},{"line_number":1515,"context_line":"                                   exception.NodeNotFound)"},{"line_number":1516,"context_line":"    def destroy_portgroup(self, context, portgroup):"},{"line_number":1517,"context_line":"        \"\"\"Delete a portgroup."},{"line_number":1518,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_91bd09da","line":1515,"range":{"start_line":1515,"start_character":0,"end_line":1515,"end_character":58},"updated":"2016-01-15 09:26:49.000000000","message":"should add PortgroupNotEmpty to messaging expected exceptions.","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7fb0193fc9369d6dd520cfbbd9b224accf56de9d","unresolved":false,"context_lines":[{"line_number":1512,"context_line":"                     {\u0027port\u0027: port.uuid, \u0027node\u0027: task.node.uuid})"},{"line_number":1513,"context_line":""},{"line_number":1514,"context_line":"    @messaging.expected_exceptions(exception.NodeLocked,"},{"line_number":1515,"context_line":"                                   exception.NodeNotFound)"},{"line_number":1516,"context_line":"    def destroy_portgroup(self, context, portgroup):"},{"line_number":1517,"context_line":"        \"\"\"Delete a portgroup."},{"line_number":1518,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_2b0854d9","line":1515,"range":{"start_line":1515,"start_character":0,"end_line":1515,"end_character":58},"in_reply_to":"da6ed579_91bd09da","updated":"2016-01-18 17:34:23.000000000","message":"Done","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d3f18d6bde4cd6fc408bbf101c1e3c99e6d4462","unresolved":false,"context_lines":[{"line_number":1517,"context_line":"        \"\"\"Delete a portgroup."},{"line_number":1518,"context_line":""},{"line_number":1519,"context_line":"        :param context: request context."},{"line_number":1520,"context_line":"        :param portgroup: portgroup object"},{"line_number":1521,"context_line":"        :raises: NodeLocked if node is locked by another conductor."},{"line_number":1522,"context_line":"        :raises: NodeNotFound if the node associated with the portgroup does"},{"line_number":1523,"context_line":"                 not exist."}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_3bce8f63","line":1520,"updated":"2016-01-14 22:19:41.000000000","message":"Oh. There must be something special about portgroups? Because I would have thought we\u0027d just pass the portgroup uuid here.","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"72a0b99c0dcdb19b1b75331d90f1b97896b2a93f","unresolved":false,"context_lines":[{"line_number":1517,"context_line":"        \"\"\"Delete a portgroup."},{"line_number":1518,"context_line":""},{"line_number":1519,"context_line":"        :param context: request context."},{"line_number":1520,"context_line":"        :param portgroup: portgroup object"},{"line_number":1521,"context_line":"        :raises: NodeLocked if node is locked by another conductor."},{"line_number":1522,"context_line":"        :raises: NodeNotFound if the node associated with the portgroup does"},{"line_number":1523,"context_line":"                 not exist."}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_20ec17f2","line":1520,"in_reply_to":"da6ed579_3bce8f63","updated":"2016-01-14 23:35:22.000000000","message":"+1","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7fb0193fc9369d6dd520cfbbd9b224accf56de9d","unresolved":false,"context_lines":[{"line_number":1517,"context_line":"        \"\"\"Delete a portgroup."},{"line_number":1518,"context_line":""},{"line_number":1519,"context_line":"        :param context: request context."},{"line_number":1520,"context_line":"        :param portgroup: portgroup object"},{"line_number":1521,"context_line":"        :raises: NodeLocked if node is locked by another conductor."},{"line_number":1522,"context_line":"        :raises: NodeNotFound if the node associated with the portgroup does"},{"line_number":1523,"context_line":"                 not exist."}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_db4de0c4","line":1520,"in_reply_to":"da6ed579_3bce8f63","updated":"2016-01-18 17:34:23.000000000","message":"We passing object to destroy_port https://github.com/openstack/ironic/blob/master/ironic/conductor/manager.py#L1498, so I\u0027m not sure that we should add something special here.","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c2806dc53476de20dabb9e4a767d1abdcdf81c28","unresolved":false,"context_lines":[{"line_number":1517,"context_line":"        \"\"\"Delete a portgroup."},{"line_number":1518,"context_line":""},{"line_number":1519,"context_line":"        :param context: request context."},{"line_number":1520,"context_line":"        :param portgroup: portgroup object"},{"line_number":1521,"context_line":"        :raises: NodeLocked if node is locked by another conductor."},{"line_number":1522,"context_line":"        :raises: NodeNotFound if the node associated with the portgroup does"},{"line_number":1523,"context_line":"                 not exist."}],"source_content_type":"text/x-python","patch_set":44,"id":"ba63e191_3d2b9984","line":1520,"in_reply_to":"da6ed579_db4de0c4","updated":"2016-01-18 23:05:45.000000000","message":"Hmm, that doesn\u0027t seem ideal but as you mention, it is consistent with port. But inconsistent with node. I\u0027d prefer if the uuid was passed and we got an updated object at the conductor end. Let\u0027s see what others think.","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"09bb3f911565a5dd7d1089897e644dc787184b74","unresolved":false,"context_lines":[{"line_number":1520,"context_line":"        :param portgroup: portgroup object"},{"line_number":1521,"context_line":"        :raises: NodeLocked if node is locked by another conductor."},{"line_number":1522,"context_line":"        :raises: NodeNotFound if the node associated with the portgroup does"},{"line_number":1523,"context_line":"                 not exist."},{"line_number":1524,"context_line":""},{"line_number":1525,"context_line":"        \"\"\""},{"line_number":1526,"context_line":"        LOG.debug(\u0027RPC destroy_portgroup called for portgroup %(portgroup)s\u0027,"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_31c9bd59","line":1523,"range":{"start_line":1523,"start_character":0,"end_line":1523,"end_character":27},"updated":"2016-01-15 09:26:49.000000000","message":"raises: PortgroupNotEmpty.","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7fb0193fc9369d6dd520cfbbd9b224accf56de9d","unresolved":false,"context_lines":[{"line_number":1520,"context_line":"        :param portgroup: portgroup object"},{"line_number":1521,"context_line":"        :raises: NodeLocked if node is locked by another conductor."},{"line_number":1522,"context_line":"        :raises: NodeNotFound if the node associated with the portgroup does"},{"line_number":1523,"context_line":"                 not exist."},{"line_number":1524,"context_line":""},{"line_number":1525,"context_line":"        \"\"\""},{"line_number":1526,"context_line":"        LOG.debug(\u0027RPC destroy_portgroup called for portgroup %(portgroup)s\u0027,"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_ae94518a","line":1523,"range":{"start_line":1523,"start_character":0,"end_line":1523,"end_character":27},"in_reply_to":"da6ed579_31c9bd59","updated":"2016-01-18 17:34:23.000000000","message":"Done","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d3f18d6bde4cd6fc408bbf101c1e3c99e6d4462","unresolved":false,"context_lines":[{"line_number":1525,"context_line":"        \"\"\""},{"line_number":1526,"context_line":"        LOG.debug(\u0027RPC destroy_portgroup called for portgroup %(portgroup)s\u0027,"},{"line_number":1527,"context_line":"                  {\u0027portgroup\u0027: portgroup.uuid})"},{"line_number":1528,"context_line":"        with task_manager.acquire(context, portgroup.node_id) as task:"},{"line_number":1529,"context_line":"            portgroup.destroy()"},{"line_number":1530,"context_line":"            LOG.info(_LI(\u0027Successfully deleted portgroup %(portgroup)s. \u0027"},{"line_number":1531,"context_line":"                         \u0027The node associated with the portgroup was \u0027"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_1b494bb7","line":1528,"updated":"2016-01-14 22:19:41.000000000","message":"Why do we need to lock the node_id associated with the portgroup?\n\nWhy do we even need the task_manager?\n\nWhy can\u0027t we just do \u0027portgroup.destroy()\u0027?\n\nAnd if we do need the task_manager, maybe add in .acquire(.., purpose\u003d\"...\")","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7fb0193fc9369d6dd520cfbbd9b224accf56de9d","unresolved":false,"context_lines":[{"line_number":1525,"context_line":"        \"\"\""},{"line_number":1526,"context_line":"        LOG.debug(\u0027RPC destroy_portgroup called for portgroup %(portgroup)s\u0027,"},{"line_number":1527,"context_line":"                  {\u0027portgroup\u0027: portgroup.uuid})"},{"line_number":1528,"context_line":"        with task_manager.acquire(context, portgroup.node_id) as task:"},{"line_number":1529,"context_line":"            portgroup.destroy()"},{"line_number":1530,"context_line":"            LOG.info(_LI(\u0027Successfully deleted portgroup %(portgroup)s. \u0027"},{"line_number":1531,"context_line":"                         \u0027The node associated with the portgroup was \u0027"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_9bf1a86d","line":1528,"in_reply_to":"da6ed579_00c8f372","updated":"2016-01-18 17:34:23.000000000","message":"Jim, you are right, we don\u0027t want to delete portgroup on node that we are working on.","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"72a0b99c0dcdb19b1b75331d90f1b97896b2a93f","unresolved":false,"context_lines":[{"line_number":1525,"context_line":"        \"\"\""},{"line_number":1526,"context_line":"        LOG.debug(\u0027RPC destroy_portgroup called for portgroup %(portgroup)s\u0027,"},{"line_number":1527,"context_line":"                  {\u0027portgroup\u0027: portgroup.uuid})"},{"line_number":1528,"context_line":"        with task_manager.acquire(context, portgroup.node_id) as task:"},{"line_number":1529,"context_line":"            portgroup.destroy()"},{"line_number":1530,"context_line":"            LOG.info(_LI(\u0027Successfully deleted portgroup %(portgroup)s. \u0027"},{"line_number":1531,"context_line":"                         \u0027The node associated with the portgroup was \u0027"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_00c8f372","line":1528,"in_reply_to":"da6ed579_1b494bb7","updated":"2016-01-14 23:35:22.000000000","message":"I would think we don\u0027t want to delete a portgroup on a node that we\u0027re actively doing work on (like setting DHCP options). We do the same thing for destroy_port (IIRC), I assume for that reason.","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d3f18d6bde4cd6fc408bbf101c1e3c99e6d4462","unresolved":false,"context_lines":[{"line_number":1675,"context_line":"                           \"attributes such as portgroup_uuid, \""},{"line_number":1676,"context_line":"                           \"local_link_connection or pxe_enabled updated \""},{"line_number":1677,"context_line":"                           \"unless node %(node)s is in \""},{"line_number":1678,"context_line":"                           \"a MANAGEABLE or ENROLL or INSPECTING state. \")"},{"line_number":1679,"context_line":""},{"line_number":1680,"context_line":"                raise exception.InvalidState("},{"line_number":1681,"context_line":"                    action % {\u0027port\u0027: port_uuid,"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_d68e2a2d","line":1678,"updated":"2016-01-14 22:19:41.000000000","message":"you probably want the user-visible strings for these: manageable, enroll, inspecting.","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7fb0193fc9369d6dd520cfbbd9b224accf56de9d","unresolved":false,"context_lines":[{"line_number":1675,"context_line":"                           \"attributes such as portgroup_uuid, \""},{"line_number":1676,"context_line":"                           \"local_link_connection or pxe_enabled updated \""},{"line_number":1677,"context_line":"                           \"unless node %(node)s is in \""},{"line_number":1678,"context_line":"                           \"a MANAGEABLE or ENROLL or INSPECTING state. \")"},{"line_number":1679,"context_line":""},{"line_number":1680,"context_line":"                raise exception.InvalidState("},{"line_number":1681,"context_line":"                    action % {\u0027port\u0027: port_uuid,"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_2c3960d7","line":1678,"in_reply_to":"da6ed579_d68e2a2d","updated":"2016-01-18 17:34:23.000000000","message":"Done","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d3f18d6bde4cd6fc408bbf101c1e3c99e6d4462","unresolved":false,"context_lines":[{"line_number":1711,"context_line":"        :raises: DHCPLoadError if the dhcp_provider cannot be loaded."},{"line_number":1712,"context_line":"        :raises: FailedToUpdateMacOnPort if MAC address changed and update"},{"line_number":1713,"context_line":"                 failed."},{"line_number":1714,"context_line":"        :raises: PortgroupMACAlreadyExists if the update is setting a MAC which"},{"line_number":1715,"context_line":"                 is registered on another portgroup already."},{"line_number":1716,"context_line":"        \"\"\""},{"line_number":1717,"context_line":"        portgroup_uuid \u003d portgroup_obj.uuid"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_f6c32e36","line":1714,"updated":"2016-01-14 22:19:41.000000000","message":"the exceptions raised/documented here aren\u0027t the same as the ones in the messaging.expected_exceptions() above.","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"72a0b99c0dcdb19b1b75331d90f1b97896b2a93f","unresolved":false,"context_lines":[{"line_number":1711,"context_line":"        :raises: DHCPLoadError if the dhcp_provider cannot be loaded."},{"line_number":1712,"context_line":"        :raises: FailedToUpdateMacOnPort if MAC address changed and update"},{"line_number":1713,"context_line":"                 failed."},{"line_number":1714,"context_line":"        :raises: PortgroupMACAlreadyExists if the update is setting a MAC which"},{"line_number":1715,"context_line":"                 is registered on another portgroup already."},{"line_number":1716,"context_line":"        \"\"\""},{"line_number":1717,"context_line":"        portgroup_uuid \u003d portgroup_obj.uuid"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_c07c1bee","line":1714,"in_reply_to":"da6ed579_f6c32e36","updated":"2016-01-14 23:35:22.000000000","message":"++","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7fb0193fc9369d6dd520cfbbd9b224accf56de9d","unresolved":false,"context_lines":[{"line_number":1711,"context_line":"        :raises: DHCPLoadError if the dhcp_provider cannot be loaded."},{"line_number":1712,"context_line":"        :raises: FailedToUpdateMacOnPort if MAC address changed and update"},{"line_number":1713,"context_line":"                 failed."},{"line_number":1714,"context_line":"        :raises: PortgroupMACAlreadyExists if the update is setting a MAC which"},{"line_number":1715,"context_line":"                 is registered on another portgroup already."},{"line_number":1716,"context_line":"        \"\"\""},{"line_number":1717,"context_line":"        portgroup_uuid \u003d portgroup_obj.uuid"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_db05e013","line":1714,"in_reply_to":"da6ed579_f6c32e36","updated":"2016-01-18 17:34:23.000000000","message":"Done","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d3f18d6bde4cd6fc408bbf101c1e3c99e6d4462","unresolved":false,"context_lines":[{"line_number":1735,"context_line":"                elif node.instance_uuid:"},{"line_number":1736,"context_line":"                    LOG.warning(_LW("},{"line_number":1737,"context_line":"                        \"No VIF found for instance %(instance)s \""},{"line_number":1738,"context_line":"                        \"portgroup %(portgroup)s when attempting to update\""},{"line_number":1739,"context_line":"                        \" portgroup MAC address.\"),"},{"line_number":1740,"context_line":"                        {\u0027portgroup\u0027: portgroup_uuid,"},{"line_number":1741,"context_line":"                         \u0027instance\u0027: node.instance_uuid})"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_16e04295","line":1738,"updated":"2016-01-14 22:19:41.000000000","message":"This will look like \u0027No VIF found for instance foo portgroup bar when...\u0027. Grammatically it seems odd, and i was wondering if it would help to have the node uuid too.","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7fb0193fc9369d6dd520cfbbd9b224accf56de9d","unresolved":false,"context_lines":[{"line_number":1735,"context_line":"                elif node.instance_uuid:"},{"line_number":1736,"context_line":"                    LOG.warning(_LW("},{"line_number":1737,"context_line":"                        \"No VIF found for instance %(instance)s \""},{"line_number":1738,"context_line":"                        \"portgroup %(portgroup)s when attempting to update\""},{"line_number":1739,"context_line":"                        \" portgroup MAC address.\"),"},{"line_number":1740,"context_line":"                        {\u0027portgroup\u0027: portgroup_uuid,"},{"line_number":1741,"context_line":"                         \u0027instance\u0027: node.instance_uuid})"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_9108a9db","line":1738,"in_reply_to":"da6ed579_16e04295","updated":"2016-01-18 17:34:23.000000000","message":"The message has been mirrored from update_port method.\nhttps://github.com/openstack/ironic/blob/master/ironic/conductor/manager.py#L1647-L1649.\nI\u0027m not native English speaker, what do you think about:\n\u0027No VIF was found for instance XXX which is spawned on node YYY, when attempting to update portgroup PPP MAC address\u0027","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c2806dc53476de20dabb9e4a767d1abdcdf81c28","unresolved":false,"context_lines":[{"line_number":1735,"context_line":"                elif node.instance_uuid:"},{"line_number":1736,"context_line":"                    LOG.warning(_LW("},{"line_number":1737,"context_line":"                        \"No VIF found for instance %(instance)s \""},{"line_number":1738,"context_line":"                        \"portgroup %(portgroup)s when attempting to update\""},{"line_number":1739,"context_line":"                        \" portgroup MAC address.\"),"},{"line_number":1740,"context_line":"                        {\u0027portgroup\u0027: portgroup_uuid,"},{"line_number":1741,"context_line":"                         \u0027instance\u0027: node.instance_uuid})"}],"source_content_type":"text/x-python","patch_set":44,"id":"ba63e191_9d6de534","line":1738,"in_reply_to":"da6ed579_9108a9db","updated":"2016-01-18 23:05:45.000000000","message":"That looks good to me. You probably don\u0027t need the \u0027which is spawned\u0027 (I don\u0027t think any of our error messages mention that, just instance X on node Y.)","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"167d54166c0e8b686288eb61921907f1f43082b0","unresolved":false,"context_lines":[{"line_number":1527,"context_line":"        \"\"\""},{"line_number":1528,"context_line":"        LOG.debug(\u0027RPC destroy_portgroup called for portgroup %(portgroup)s\u0027,"},{"line_number":1529,"context_line":"                  {\u0027portgroup\u0027: portgroup.uuid})"},{"line_number":1530,"context_line":"        with task_manager.acquire(context, portgroup.node_id) as task:"},{"line_number":1531,"context_line":"            portgroup.destroy()"},{"line_number":1532,"context_line":"            LOG.info(_LI(\u0027Successfully deleted portgroup %(portgroup)s. \u0027"},{"line_number":1533,"context_line":"                         \u0027The node associated with the portgroup was \u0027"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba63e191_9d4ba52b","line":1530,"updated":"2016-01-18 23:05:29.000000000","message":"if you do another revision, maybe add purpose\u003d\u0027portgroup deletion\u0027","commit_id":"f86cc4d2882dd14671981c267f5907a756a4f13a"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"c01d2f31c68f71b4c7f8a754b65cd7d0f5ea1650","unresolved":false,"context_lines":[{"line_number":1527,"context_line":"        \"\"\""},{"line_number":1528,"context_line":"        LOG.debug(\u0027RPC destroy_portgroup called for portgroup %(portgroup)s\u0027,"},{"line_number":1529,"context_line":"                  {\u0027portgroup\u0027: portgroup.uuid})"},{"line_number":1530,"context_line":"        with task_manager.acquire(context, portgroup.node_id) as task:"},{"line_number":1531,"context_line":"            portgroup.destroy()"},{"line_number":1532,"context_line":"            LOG.info(_LI(\u0027Successfully deleted portgroup %(portgroup)s. \u0027"},{"line_number":1533,"context_line":"                         \u0027The node associated with the portgroup was \u0027"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba63e191_0acc3b88","line":1530,"in_reply_to":"ba63e191_9d4ba52b","updated":"2016-01-19 09:26:15.000000000","message":"Done","commit_id":"f86cc4d2882dd14671981c267f5907a756a4f13a"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"c2e26e3ac53323bea93d341a179ca872d16028aa","unresolved":false,"context_lines":[{"line_number":1672,"context_line":"            if (set(port_obj.obj_what_changed()) \u0026 connectivity_attr"},{"line_number":1673,"context_line":"               and task.node.provision_state not in [states.ENROLL,"},{"line_number":1674,"context_line":"                                                     states.INSPECTING,"},{"line_number":1675,"context_line":"                                                     states.MANAGEABLE]):"},{"line_number":1676,"context_line":"                action \u003d _(\"Port %(port)s can not have any connectivity \""},{"line_number":1677,"context_line":"                           \"attributes such as portgroup_uuid, \""},{"line_number":1678,"context_line":"                           \"local_link_connection or pxe_enabled updated \""}],"source_content_type":"text/x-python","patch_set":45,"id":"ba63e191_46f31174","line":1675,"range":{"start_line":1675,"start_character":53,"end_line":1675,"end_character":73},"updated":"2016-01-19 07:16:54.000000000","message":"I think we should allow modify connective attributes when the node is in maintenance state in case of the hardware switch failure, and the node is already deployed. otherwise we need to tear down the node and create the port again to fix the issue.","commit_id":"f86cc4d2882dd14671981c267f5907a756a4f13a"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"c01d2f31c68f71b4c7f8a754b65cd7d0f5ea1650","unresolved":false,"context_lines":[{"line_number":1672,"context_line":"            if (set(port_obj.obj_what_changed()) \u0026 connectivity_attr"},{"line_number":1673,"context_line":"               and task.node.provision_state not in [states.ENROLL,"},{"line_number":1674,"context_line":"                                                     states.INSPECTING,"},{"line_number":1675,"context_line":"                                                     states.MANAGEABLE]):"},{"line_number":1676,"context_line":"                action \u003d _(\"Port %(port)s can not have any connectivity \""},{"line_number":1677,"context_line":"                           \"attributes such as portgroup_uuid, \""},{"line_number":1678,"context_line":"                           \"local_link_connection or pxe_enabled updated \""}],"source_content_type":"text/x-python","patch_set":45,"id":"ba63e191_7e4d7571","line":1675,"range":{"start_line":1675,"start_character":53,"end_line":1675,"end_character":73},"in_reply_to":"ba63e191_46f31174","updated":"2016-01-19 09:26:15.000000000","message":"Done","commit_id":"f86cc4d2882dd14671981c267f5907a756a4f13a"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":1679,"context_line":"                             or task.node.maintenance)):"},{"line_number":1680,"context_line":"                action \u003d _(\"Port %(port)s can not have any connectivity \""},{"line_number":1681,"context_line":"                           \"attributes such as portgroup_uuid, \""},{"line_number":1682,"context_line":"                           \"local_link_connection or pxe_enabled updated \""},{"line_number":1683,"context_line":"                           \"unless node %(node)s is in \""},{"line_number":1684,"context_line":"                           \"a %(enroll)s/%(inspecting)s/%(manageable)s state \""},{"line_number":1685,"context_line":"                           \"or in maintenance mode.\")"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_d3c48541","line":1682,"updated":"2016-01-19 15:40:13.000000000","message":"I was just thinking that these three strings are available in the connectivity_attr above, so you could do something like \u0027... any connectivity attributes(%(connect)s) updated unless...\u0027. And connect could be something like \u0027, \u0027.join(connectivity_attr)","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":1679,"context_line":"                             or task.node.maintenance)):"},{"line_number":1680,"context_line":"                action \u003d _(\"Port %(port)s can not have any connectivity \""},{"line_number":1681,"context_line":"                           \"attributes such as portgroup_uuid, \""},{"line_number":1682,"context_line":"                           \"local_link_connection or pxe_enabled updated \""},{"line_number":1683,"context_line":"                           \"unless node %(node)s is in \""},{"line_number":1684,"context_line":"                           \"a %(enroll)s/%(inspecting)s/%(manageable)s state \""},{"line_number":1685,"context_line":"                           \"or in maintenance mode.\")"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_016e1c95","line":1682,"in_reply_to":"ba63e191_d3c48541","updated":"2016-01-20 12:20:10.000000000","message":"Done","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":1681,"context_line":"                           \"attributes such as portgroup_uuid, \""},{"line_number":1682,"context_line":"                           \"local_link_connection or pxe_enabled updated \""},{"line_number":1683,"context_line":"                           \"unless node %(node)s is in \""},{"line_number":1684,"context_line":"                           \"a %(enroll)s/%(inspecting)s/%(manageable)s state \""},{"line_number":1685,"context_line":"                           \"or in maintenance mode.\")"},{"line_number":1686,"context_line":""},{"line_number":1687,"context_line":"                raise exception.InvalidState("}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_d3f2459a","line":1684,"updated":"2016-01-19 15:40:13.000000000","message":"similar thing here, \u0027unless node.. is in a %(allowed)s state..\u0027 where allowed is \u0027/\u0027.join(allowed_update_states)","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":1681,"context_line":"                           \"attributes such as portgroup_uuid, \""},{"line_number":1682,"context_line":"                           \"local_link_connection or pxe_enabled updated \""},{"line_number":1683,"context_line":"                           \"unless node %(node)s is in \""},{"line_number":1684,"context_line":"                           \"a %(enroll)s/%(inspecting)s/%(manageable)s state \""},{"line_number":1685,"context_line":"                           \"or in maintenance mode.\")"},{"line_number":1686,"context_line":""},{"line_number":1687,"context_line":"                raise exception.InvalidState("}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_2169e08b","line":1684,"in_reply_to":"ba63e191_d3f2459a","updated":"2016-01-20 12:20:10.000000000","message":"Done","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":1746,"context_line":"                    LOG.warning(_LW("},{"line_number":1747,"context_line":"                        \"No VIF found for instance %(instance)s \""},{"line_number":1748,"context_line":"                        \"portgroup %(portgroup)s when attempting to update\""},{"line_number":1749,"context_line":"                        \" portgroup MAC address.\"),"},{"line_number":1750,"context_line":"                        {\u0027portgroup\u0027: portgroup_uuid,"},{"line_number":1751,"context_line":"                         \u0027instance\u0027: node.instance_uuid})"},{"line_number":1752,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_13421d3f","line":1749,"updated":"2016-01-19 15:40:13.000000000","message":"Carrying forward comment from revision 44. Maybe\n\n\u0027No VIF was found for instance XXX on node YYY, when attempting to update portgroup PPP MAC address\u0027","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":1746,"context_line":"                    LOG.warning(_LW("},{"line_number":1747,"context_line":"                        \"No VIF found for instance %(instance)s \""},{"line_number":1748,"context_line":"                        \"portgroup %(portgroup)s when attempting to update\""},{"line_number":1749,"context_line":"                        \" portgroup MAC address.\"),"},{"line_number":1750,"context_line":"                        {\u0027portgroup\u0027: portgroup_uuid,"},{"line_number":1751,"context_line":"                         \u0027instance\u0027: node.instance_uuid})"},{"line_number":1752,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_01ca9c6d","line":1749,"in_reply_to":"ba63e191_13421d3f","updated":"2016-01-20 12:20:10.000000000","message":"Done","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d700c747da42f162fa2887e8a0220128477ef41a","unresolved":false,"context_lines":[{"line_number":1687,"context_line":"                              \u0027node\u0027: task.node.uuid,"},{"line_number":1688,"context_line":"                              \u0027enroll\u0027: states.ENROLL,"},{"line_number":1689,"context_line":"                              \u0027inspecting\u0027: states.INSPECTING,"},{"line_number":1690,"context_line":"                              \u0027manageable\u0027: states.MANAGEABLE,"},{"line_number":1691,"context_line":"                              \u0027connect\u0027: \u0027, \u0027.join(connectivity_attr),"},{"line_number":1692,"context_line":"                              \u0027allowed\u0027: \u0027, \u0027.join(allowed_update_states)})"},{"line_number":1693,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"9a68dd71_53bbe70e","line":1690,"updated":"2016-01-20 14:52:57.000000000","message":"you can delete the above 3 lines","commit_id":"73260ae6036c9665bf64772c28309b5d1688c187"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"e9ec1ecbf0f99e00d831a1d52ec73335ebdd55e4","unresolved":false,"context_lines":[{"line_number":1687,"context_line":"                              \u0027node\u0027: task.node.uuid,"},{"line_number":1688,"context_line":"                              \u0027enroll\u0027: states.ENROLL,"},{"line_number":1689,"context_line":"                              \u0027inspecting\u0027: states.INSPECTING,"},{"line_number":1690,"context_line":"                              \u0027manageable\u0027: states.MANAGEABLE,"},{"line_number":1691,"context_line":"                              \u0027connect\u0027: \u0027, \u0027.join(connectivity_attr),"},{"line_number":1692,"context_line":"                              \u0027allowed\u0027: \u0027, \u0027.join(allowed_update_states)})"},{"line_number":1693,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"9a68dd71_8af815e7","line":1690,"in_reply_to":"9a68dd71_53bbe70e","updated":"2016-01-25 12:32:09.000000000","message":"I totally forgot about them","commit_id":"73260ae6036c9665bf64772c28309b5d1688c187"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"1f79a44abbbd87446c6a4ceec562ceed74f30d67","unresolved":false,"context_lines":[{"line_number":1676,"context_line":"                                     states.MANAGEABLE]"},{"line_number":1677,"context_line":"            if (set(port_obj.obj_what_changed()) \u0026 connectivity_attr"},{"line_number":1678,"context_line":"                    and not (task.node.provision_state in allowed_update_states"},{"line_number":1679,"context_line":"                             or task.node.maintenance)):"},{"line_number":1680,"context_line":"                action \u003d _(\"Port %(port)s can not have any connectivity \""},{"line_number":1681,"context_line":"                           \"attributes (%(connect)s) updated unless \""},{"line_number":1682,"context_line":"                           \"node %(node)s is in a %(allowed)s state \""}],"source_content_type":"text/x-python","patch_set":49,"id":"7a5de9d1_839d2d5b","line":1679,"range":{"start_line":1679,"start_character":42,"end_line":1679,"end_character":53},"updated":"2016-01-29 02:10:57.000000000","message":"thanks for adding the \u0027maintenance\u0027 here, which makes it possible to update port for an deployed node in case of hardware switch port broken.\n\nI think in this case, we have to set the node to maintenance state first, and change the hardware switch port to an available one, then update port with the new local link connection to make it work again. but I don\u0027t see any logic to request neutron to update the port if the \u0027vif_port_id\u0027 has set.","commit_id":"2812bd2b3634e9b2b13eeccaf947c287b2cb3698"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"02cf48e20f90d1876876428bb1b2d679d29c6e12","unresolved":false,"context_lines":[{"line_number":1676,"context_line":"                                     states.MANAGEABLE]"},{"line_number":1677,"context_line":"            if (set(port_obj.obj_what_changed()) \u0026 connectivity_attr"},{"line_number":1678,"context_line":"                    and not (task.node.provision_state in allowed_update_states"},{"line_number":1679,"context_line":"                             or task.node.maintenance)):"},{"line_number":1680,"context_line":"                action \u003d _(\"Port %(port)s can not have any connectivity \""},{"line_number":1681,"context_line":"                           \"attributes (%(connect)s) updated unless \""},{"line_number":1682,"context_line":"                           \"node %(node)s is in a %(allowed)s state \""}],"source_content_type":"text/x-python","patch_set":49,"id":"5a5ae5dd_e1ca06a1","line":1679,"range":{"start_line":1679,"start_character":42,"end_line":1679,"end_character":53},"in_reply_to":"5a5ae5dd_c3ccbb37","updated":"2016-02-04 02:41:07.000000000","message":"hi Vasyl Saienko, I agree that recovery can be done via manual neutron port update in this case, but I\u0027m also concerned about the ironic port local link info which bonds to a broken TOR switch port and after recovery, why local link info may left the same? change to the fixed port and manually update neutron port again? if so, why not directly call the neutron port on ironic port update like below L1691.","commit_id":"2812bd2b3634e9b2b13eeccaf947c287b2cb3698"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"a793ab6f1e4b067c2c7e7eb4de8d9ea776276438","unresolved":false,"context_lines":[{"line_number":1676,"context_line":"                                     states.MANAGEABLE]"},{"line_number":1677,"context_line":"            if (set(port_obj.obj_what_changed()) \u0026 connectivity_attr"},{"line_number":1678,"context_line":"                    and not (task.node.provision_state in allowed_update_states"},{"line_number":1679,"context_line":"                             or task.node.maintenance)):"},{"line_number":1680,"context_line":"                action \u003d _(\"Port %(port)s can not have any connectivity \""},{"line_number":1681,"context_line":"                           \"attributes (%(connect)s) updated unless \""},{"line_number":1682,"context_line":"                           \"node %(node)s is in a %(allowed)s state \""}],"source_content_type":"text/x-python","patch_set":49,"id":"5a5ae5dd_c3ccbb37","line":1679,"range":{"start_line":1679,"start_character":42,"end_line":1679,"end_character":53},"in_reply_to":"7a5de9d1_839d2d5b","updated":"2016-02-03 21:38:11.000000000","message":"Zhenguo, thank you for rising this question. As for now recovery can be done via manual neutron port update. After recovery local link info may left the same, so I doubt that calling neutron port update on ironic port update is good option here (it will not work in this case). I\u0027m thinking about special node state (network-rebuild or something else), that will update neutron ports for node, but is should be discussed.","commit_id":"2812bd2b3634e9b2b13eeccaf947c287b2cb3698"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"faa7279f85cd3c80292af759df8e30396f3175ef","unresolved":false,"context_lines":[{"line_number":1654,"context_line":"                 registered on another port already."},{"line_number":1655,"context_line":"        :raises: InvalidState if port connectivity attributes"},{"line_number":1656,"context_line":"                 are updated while not in a MANAGEABLE or ENROLL or"},{"line_number":1657,"context_line":"                 INSPECTING state."},{"line_number":1658,"context_line":"        \"\"\""},{"line_number":1659,"context_line":"        port_uuid \u003d port_obj.uuid"},{"line_number":1660,"context_line":"        LOG.debug(\"RPC update_port called for port %s.\", port_uuid)"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_aad86c54","line":1657,"updated":"2016-02-03 23:52:37.000000000","message":"We should add maintenance mode to this","commit_id":"85588e3f956b820f534af8c155df5937fc157df0"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"1fd48111bd349bc83e627cae18f42cccc8c7e3a7","unresolved":false,"context_lines":[{"line_number":1654,"context_line":"                 registered on another port already."},{"line_number":1655,"context_line":"        :raises: InvalidState if port connectivity attributes"},{"line_number":1656,"context_line":"                 are updated while not in a MANAGEABLE or ENROLL or"},{"line_number":1657,"context_line":"                 INSPECTING state."},{"line_number":1658,"context_line":"        \"\"\""},{"line_number":1659,"context_line":"        port_uuid \u003d port_obj.uuid"},{"line_number":1660,"context_line":"        LOG.debug(\"RPC update_port called for port %s.\", port_uuid)"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_bb0d1240","line":1657,"in_reply_to":"5a5ae5dd_aad86c54","updated":"2016-02-04 18:12:54.000000000","message":"Done","commit_id":"85588e3f956b820f534af8c155df5937fc157df0"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ad6d28c8a3adb157922edb3e77da740ad235eab","unresolved":false,"context_lines":[{"line_number":1638,"context_line":"        finally:"},{"line_number":1639,"context_line":"            node.save()"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"    @messaging.expected_exceptions(exception.NodeLocked,"},{"line_number":1642,"context_line":"                                   exception.FailedToUpdateMacOnPort,"},{"line_number":1643,"context_line":"                                   exception.MACAlreadyExists,"},{"line_number":1644,"context_line":"                                   exception.InvalidState)"}],"source_content_type":"text/x-python","patch_set":53,"id":"5a5ae5dd_e232a30f","line":1641,"updated":"2016-02-05 18:58:29.000000000","message":"NodeNotFound too? Although I\u0027m not sure whether we should mention it. I guess it only happens when a node is deleted manually in DB? Because otherwise ports and portgroups corresponding to a node are deleted too.","commit_id":"a603e3c12c62e29e12e45283d8602f9aa5acfc0f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ad6d28c8a3adb157922edb3e77da740ad235eab","unresolved":false,"context_lines":[{"line_number":1707,"context_line":""},{"line_number":1708,"context_line":"            return port_obj"},{"line_number":1709,"context_line":""},{"line_number":1710,"context_line":"    @messaging.expected_exceptions(exception.NodeLocked,"},{"line_number":1711,"context_line":"                                   exception.FailedToUpdateMacOnPort,"},{"line_number":1712,"context_line":"                                   exception.PortgroupMACAlreadyExists)"},{"line_number":1713,"context_line":"    def update_portgroup(self, context, portgroup_obj):"}],"source_content_type":"text/x-python","patch_set":53,"id":"5a5ae5dd_8225ef09","line":1710,"updated":"2016-02-05 18:58:29.000000000","message":"NodeNotFound too?","commit_id":"a603e3c12c62e29e12e45283d8602f9aa5acfc0f"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"394fc7acd5e657ddbd7308e526f9ce5d46b010fd","unresolved":false,"context_lines":[{"line_number":1710,"context_line":"    @messaging.expected_exceptions(exception.NodeLocked,"},{"line_number":1711,"context_line":"                                   exception.FailedToUpdateMacOnPort,"},{"line_number":1712,"context_line":"                                   exception.PortgroupMACAlreadyExists)"},{"line_number":1713,"context_line":"    def update_portgroup(self, context, portgroup_obj):"},{"line_number":1714,"context_line":"        \"\"\"Update a portgroup."},{"line_number":1715,"context_line":""},{"line_number":1716,"context_line":"        :param context: request context."}],"source_content_type":"text/x-python","patch_set":53,"id":"dae33548_7a0d7de7","line":1713,"updated":"2016-02-17 03:35:46.000000000","message":"Bug introduced here: https://bugs.launchpad.net/ironic/+bug/1546371","commit_id":"a603e3c12c62e29e12e45283d8602f9aa5acfc0f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ad6d28c8a3adb157922edb3e77da740ad235eab","unresolved":false,"context_lines":[{"line_number":1715,"context_line":""},{"line_number":1716,"context_line":"        :param context: request context."},{"line_number":1717,"context_line":"        :param portgroup_obj: a changed (but not saved) portgroup object."},{"line_number":1718,"context_line":"        :raises: DHCPLoadError if the dhcp_provider cannot be loaded."},{"line_number":1719,"context_line":"        :raises: FailedToUpdateMacOnPort if MAC address changed and update"},{"line_number":1720,"context_line":"                 failed."},{"line_number":1721,"context_line":"        :raises: PortgroupMACAlreadyExists if the update is setting a MAC which"}],"source_content_type":"text/x-python","patch_set":53,"id":"5a5ae5dd_c200c768","line":1718,"updated":"2016-02-05 18:58:29.000000000","message":"This should be added to expected exceptions and I guess it might be worth updating here rather than in a followup.","commit_id":"a603e3c12c62e29e12e45283d8602f9aa5acfc0f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ad6d28c8a3adb157922edb3e77da740ad235eab","unresolved":false,"context_lines":[{"line_number":1718,"context_line":"        :raises: DHCPLoadError if the dhcp_provider cannot be loaded."},{"line_number":1719,"context_line":"        :raises: FailedToUpdateMacOnPort if MAC address changed and update"},{"line_number":1720,"context_line":"                 failed."},{"line_number":1721,"context_line":"        :raises: PortgroupMACAlreadyExists if the update is setting a MAC which"},{"line_number":1722,"context_line":"                 is registered on another portgroup already."},{"line_number":1723,"context_line":"        \"\"\""},{"line_number":1724,"context_line":"        portgroup_uuid \u003d portgroup_obj.uuid"}],"source_content_type":"text/x-python","patch_set":53,"id":"5a5ae5dd_62979348","line":1721,"updated":"2016-02-05 18:58:29.000000000","message":"PortgroupDuplicateName too?","commit_id":"a603e3c12c62e29e12e45283d8602f9aa5acfc0f"}],"ironic/conductor/rpcapi.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"280c16648cb9e427d8aa395d49e09fed6a45e574","unresolved":false,"context_lines":[{"line_number":689,"context_line":"        return cctxt.call(context, \u0027object_backport_versions\u0027, objinst\u003dobjinst,"},{"line_number":690,"context_line":"                          object_versions\u003dobject_versions)"},{"line_number":691,"context_line":""},{"line_number":692,"context_line":"    def destroy_portgroup(self, context, portgroup, topic\u003dNone):"},{"line_number":693,"context_line":"        \"\"\"Delete a portgroup."},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"        :param context: request context."}],"source_content_type":"text/x-python","patch_set":39,"id":"1a7b0d38_cc55e21d","line":692,"updated":"2015-12-23 12:34:06.000000000","message":"No test for this.","commit_id":"3743bec767e3a4c034e69fccb02b80f68d6daae3"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5725e4c8e229f71d7f0267a80c15ed7b1dd9ba9b","unresolved":false,"context_lines":[{"line_number":689,"context_line":"        return cctxt.call(context, \u0027object_backport_versions\u0027, objinst\u003dobjinst,"},{"line_number":690,"context_line":"                          object_versions\u003dobject_versions)"},{"line_number":691,"context_line":""},{"line_number":692,"context_line":"    def destroy_portgroup(self, context, portgroup, topic\u003dNone):"},{"line_number":693,"context_line":"        \"\"\"Delete a portgroup."},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"        :param context: request context."}],"source_content_type":"text/x-python","patch_set":39,"id":"1a7b0d38_fec244e8","line":692,"in_reply_to":"1a7b0d38_cc55e21d","updated":"2016-01-05 17:47:56.000000000","message":"Done","commit_id":"3743bec767e3a4c034e69fccb02b80f68d6daae3"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d3f18d6bde4cd6fc408bbf101c1e3c99e6d4462","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    |           object_class_action_versions, object_action and"},{"line_number":80,"context_line":"    |           object_backport_versions"},{"line_number":81,"context_line":"    |    1.32 - Add do_node_clean"},{"line_number":82,"context_line":"    |    1.33 - Added update and destroy portgroup"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    \"\"\""},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_b69e16b7","line":82,"updated":"2016-01-14 22:19:41.000000000","message":"also modified update_port (new exception); not sure if that needs to be mentioned or not.","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"72a0b99c0dcdb19b1b75331d90f1b97896b2a93f","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    |           object_class_action_versions, object_action and"},{"line_number":80,"context_line":"    |           object_backport_versions"},{"line_number":81,"context_line":"    |    1.32 - Add do_node_clean"},{"line_number":82,"context_line":"    |    1.33 - Added update and destroy portgroup"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    \"\"\""},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_00779302","line":82,"in_reply_to":"da6ed579_b69e16b7","updated":"2016-01-14 23:35:22.000000000","message":"+1","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7fb0193fc9369d6dd520cfbbd9b224accf56de9d","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    |           object_class_action_versions, object_action and"},{"line_number":80,"context_line":"    |           object_backport_versions"},{"line_number":81,"context_line":"    |    1.32 - Add do_node_clean"},{"line_number":82,"context_line":"    |    1.33 - Added update and destroy portgroup"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    \"\"\""},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_ec66e8b9","line":82,"in_reply_to":"da6ed579_b69e16b7","updated":"2016-01-18 17:34:23.000000000","message":"Done","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d3f18d6bde4cd6fc408bbf101c1e3c99e6d4462","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        :returns: updated portgroup object, including all fields."},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        \"\"\""},{"line_number":453,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.32\u0027)"},{"line_number":454,"context_line":"        return cctxt.call(context, \u0027update_portgroup\u0027,"},{"line_number":455,"context_line":"                          portgroup_obj\u003dportgroup_obj)"},{"line_number":456,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_76f2de07","line":453,"updated":"2016-01-14 22:19:41.000000000","message":"s/1.32/1.33/","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7fb0193fc9369d6dd520cfbbd9b224accf56de9d","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        :returns: updated portgroup object, including all fields."},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        \"\"\""},{"line_number":453,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.32\u0027)"},{"line_number":454,"context_line":"        return cctxt.call(context, \u0027update_portgroup\u0027,"},{"line_number":455,"context_line":"                          portgroup_obj\u003dportgroup_obj)"},{"line_number":456,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_2cf880c2","line":453,"in_reply_to":"da6ed579_76f2de07","updated":"2016-01-18 17:34:23.000000000","message":"Done","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7d3f18d6bde4cd6fc408bbf101c1e3c99e6d4462","unresolved":false,"context_lines":[{"line_number":719,"context_line":"        :raises: NodeNotFound if the node associated with the portgroup does"},{"line_number":720,"context_line":"                 not exist."},{"line_number":721,"context_line":"        \"\"\""},{"line_number":722,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.32\u0027)"},{"line_number":723,"context_line":"        return cctxt.call(context, \u0027destroy_portgroup\u0027, portgroup\u003dportgroup)"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_36e1c62d","line":722,"updated":"2016-01-14 22:19:41.000000000","message":"s/1.32/1.33/","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7fb0193fc9369d6dd520cfbbd9b224accf56de9d","unresolved":false,"context_lines":[{"line_number":719,"context_line":"        :raises: NodeNotFound if the node associated with the portgroup does"},{"line_number":720,"context_line":"                 not exist."},{"line_number":721,"context_line":"        \"\"\""},{"line_number":722,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.32\u0027)"},{"line_number":723,"context_line":"        return cctxt.call(context, \u0027destroy_portgroup\u0027, portgroup\u003dportgroup)"}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_cc0204b4","line":722,"in_reply_to":"da6ed579_36e1c62d","updated":"2016-01-18 17:34:23.000000000","message":"Done","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":710,"context_line":"        return cctxt.call(context, \u0027object_backport_versions\u0027, objinst\u003dobjinst,"},{"line_number":711,"context_line":"                          object_versions\u003dobject_versions)"},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"    def destroy_portgroup(self, context, portgroup, topic\u003dNone):"},{"line_number":714,"context_line":"        \"\"\"Delete a portgroup."},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        :param context: request context."}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_565ac384","line":713,"updated":"2016-01-19 15:40:13.000000000","message":"If you don\u0027t mind, I\u0027d prefer if this was put after (or before) update_portgroup() above. (Unless folks prefer that we add new methods to the bottom of this file, but it seems like they should both be together.)","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":710,"context_line":"        return cctxt.call(context, \u0027object_backport_versions\u0027, objinst\u003dobjinst,"},{"line_number":711,"context_line":"                          object_versions\u003dobject_versions)"},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"    def destroy_portgroup(self, context, portgroup, topic\u003dNone):"},{"line_number":714,"context_line":"        \"\"\"Delete a portgroup."},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        :param context: request context."}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_a102b06d","line":713,"in_reply_to":"ba63e191_565ac384","updated":"2016-01-20 12:20:10.000000000","message":"Yes, I think it would be better to group related methods together.","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":718,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":719,"context_line":"        :raises: NodeLocked if node is locked by another conductor."},{"line_number":720,"context_line":"        :raises: NodeNotFound if the node associated with the portgroup does"},{"line_number":721,"context_line":"                 not exist."},{"line_number":722,"context_line":"        \"\"\""},{"line_number":723,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.33\u0027)"},{"line_number":724,"context_line":"        return cctxt.call(context, \u0027destroy_portgroup\u0027, portgroup\u003dportgroup)"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_560c0394","line":721,"updated":"2016-01-19 15:40:13.000000000","message":"and raises PortgroupNotEmpty","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":718,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":719,"context_line":"        :raises: NodeLocked if node is locked by another conductor."},{"line_number":720,"context_line":"        :raises: NodeNotFound if the node associated with the portgroup does"},{"line_number":721,"context_line":"                 not exist."},{"line_number":722,"context_line":"        \"\"\""},{"line_number":723,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.33\u0027)"},{"line_number":724,"context_line":"        return cctxt.call(context, \u0027destroy_portgroup\u0027, portgroup\u003dportgroup)"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_c105647a","line":721,"in_reply_to":"ba63e191_560c0394","updated":"2016-01-20 12:20:10.000000000","message":"Done","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"faa7279f85cd3c80292af759df8e30396f3175ef","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    |           object_backport_versions"},{"line_number":81,"context_line":"    |    1.32 - Add do_node_clean"},{"line_number":82,"context_line":"    |    1.33 - Added update and destroy portgroup."},{"line_number":83,"context_line":"                Added new exception to update_port"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"\"\""},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_aa65cc45","line":83,"updated":"2016-02-03 23:52:37.000000000","message":"Can you fix this comment in a follow-up patch? We\u0027re no longer adding an exception.","commit_id":"85588e3f956b820f534af8c155df5937fc157df0"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"1fd48111bd349bc83e627cae18f42cccc8c7e3a7","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    |           object_backport_versions"},{"line_number":81,"context_line":"    |    1.32 - Add do_node_clean"},{"line_number":82,"context_line":"    |    1.33 - Added update and destroy portgroup."},{"line_number":83,"context_line":"                Added new exception to update_port"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"\"\""},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_5b141d43","line":83,"in_reply_to":"5a5ae5dd_aa65cc45","updated":"2016-02-04 18:12:54.000000000","message":"Done","commit_id":"85588e3f956b820f534af8c155df5937fc157df0"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ad6d28c8a3adb157922edb3e77da740ad235eab","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        :param portgroup: portgroup object"},{"line_number":462,"context_line":"        :param topic: RPC topic. Defaults to self.topic."},{"line_number":463,"context_line":"        :raises: NodeLocked if node is locked by another conductor."},{"line_number":464,"context_line":"        :raises: NodeNotFound if the node associated with the portgroup does"},{"line_number":465,"context_line":"                 not exist."},{"line_number":466,"context_line":"        :raises: PortgroupNotEmpty if portgroup is not empty"},{"line_number":467,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":53,"id":"5a5ae5dd_a29cab0e","line":464,"updated":"2016-02-05 18:58:29.000000000","message":"Please check that all exceptions that are listed in manager are here too.","commit_id":"a603e3c12c62e29e12e45283d8602f9aa5acfc0f"}],"ironic/conductor/task_manager.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"72a0b99c0dcdb19b1b75331d90f1b97896b2a93f","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"            self.ports \u003d objects.Port.list_by_node_id(context, self.node.id)"},{"line_number":209,"context_line":"            self.portgroups \u003d objects.Portgroup.list_by_node_id(context,"},{"line_number":210,"context_line":"                                                                self.node.id)"},{"line_number":211,"context_line":"            self.driver \u003d driver_factory.get_driver(driver_name or"},{"line_number":212,"context_line":"                                                    self.node.driver)"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_60da0fea","line":210,"updated":"2016-01-14 23:35:22.000000000","message":"I noticed task.portgroups isn\u0027t used anywhere - I\u0027d rather not do this extra query if we aren\u0027t using it. Can you remove this?","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7fb0193fc9369d6dd520cfbbd9b224accf56de9d","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"            self.ports \u003d objects.Port.list_by_node_id(context, self.node.id)"},{"line_number":209,"context_line":"            self.portgroups \u003d objects.Portgroup.list_by_node_id(context,"},{"line_number":210,"context_line":"                                                                self.node.id)"},{"line_number":211,"context_line":"            self.driver \u003d driver_factory.get_driver(driver_name or"},{"line_number":212,"context_line":"                                                    self.node.driver)"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_5843366c","line":210,"in_reply_to":"da6ed579_60da0fea","updated":"2016-01-18 17:34:23.000000000","message":"It is used in next commit, please have look at L23 https://review.openstack.org/#/c/206245/45/ironic/common/network.py. Do you think we should move this code there?","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"65c3abfe420a73707778993abc08ce0b77dbc1cc","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"            self.ports \u003d objects.Port.list_by_node_id(context, self.node.id)"},{"line_number":209,"context_line":"            self.portgroups \u003d objects.Portgroup.list_by_node_id(context,"},{"line_number":210,"context_line":"                                                                self.node.id)"},{"line_number":211,"context_line":"            self.driver \u003d driver_factory.get_driver(driver_name or"},{"line_number":212,"context_line":"                                                    self.node.driver)"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"da6ed579_0cdfbcd9","line":210,"in_reply_to":"da6ed579_60da0fea","updated":"2016-01-15 09:31:29.000000000","message":"Jim, we use task.portgroups in another patch, https://review.openstack.org/#/c/206245/45/ironic/common/network.py","commit_id":"ff6c86ea0deb3b2ddd42d6dd93fc28a396edfffa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                self.node \u003d objects.Node.get(context, node_id)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"            self.ports \u003d objects.Port.list_by_node_id(context, self.node.id)"},{"line_number":209,"context_line":"            self.portgroups \u003d objects.Portgroup.list_by_node_id(context,"},{"line_number":210,"context_line":"                                                                self.node.id)"},{"line_number":211,"context_line":"            self.driver \u003d driver_factory.get_driver(driver_name or"},{"line_number":212,"context_line":"                                                    self.node.driver)"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_330ac127","line":209,"updated":"2016-01-19 15:40:13.000000000","message":"It occurred to me that we should probably update the associated tests [1] so that objects.Portgroup.list_by_node_id is mocked (similar to objects.Port).\n\nAlso, I see there are test_excl_lock_get_ports_exception() and test_shared_lock_get_ports_exception() tests, so I suppose we should have corresponding tests for the portgroups.\n\n[1] https://github.com/openstack/ironic/blob/30ea86d00539aae3580f06fe0c3b34eb8073541f/ironic/tests/unit/conductor/test_task_manager.py#L41","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                self.node \u003d objects.Node.get(context, node_id)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"            self.ports \u003d objects.Port.list_by_node_id(context, self.node.id)"},{"line_number":209,"context_line":"            self.portgroups \u003d objects.Portgroup.list_by_node_id(context,"},{"line_number":210,"context_line":"                                                                self.node.id)"},{"line_number":211,"context_line":"            self.driver \u003d driver_factory.get_driver(driver_name or"},{"line_number":212,"context_line":"                                                    self.node.driver)"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_dd4c6072","line":209,"in_reply_to":"ba63e191_330ac127","updated":"2016-01-20 12:20:10.000000000","message":"Done","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"}],"ironic/tests/unit/conductor/test_manager.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":2587,"context_line":"        port \u003d obj_utils.create_test_port(self.context,"},{"line_number":2588,"context_line":"                                          node_id\u003dnode.id,"},{"line_number":2589,"context_line":"                                          extra\u003d{\u0027foo\u0027: \u0027bar\u0027})"},{"line_number":2590,"context_line":""},{"line_number":2591,"context_line":"        port.pxe_enabled \u003d True"},{"line_number":2592,"context_line":""},{"line_number":2593,"context_line":"        exc \u003d self.assertRaises(messaging.rpc.ExpectedException,"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_7187d10f","line":2590,"updated":"2016-01-19 15:40:13.000000000","message":"nits: I don\u0027t see the need for these extra blank spaces, it seems inconsistent with most of the other tests here and this file is large enough as it is :)","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":2587,"context_line":"        port \u003d obj_utils.create_test_port(self.context,"},{"line_number":2588,"context_line":"                                          node_id\u003dnode.id,"},{"line_number":2589,"context_line":"                                          extra\u003d{\u0027foo\u0027: \u0027bar\u0027})"},{"line_number":2590,"context_line":""},{"line_number":2591,"context_line":"        port.pxe_enabled \u003d True"},{"line_number":2592,"context_line":""},{"line_number":2593,"context_line":"        exc \u003d self.assertRaises(messaging.rpc.ExpectedException,"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_136f4f2c","line":2590,"in_reply_to":"ba63e191_7187d10f","updated":"2016-01-20 12:20:10.000000000","message":"Done","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":2604,"context_line":"                                          extra\u003d{\u0027foo\u0027: \u0027bar\u0027})"},{"line_number":2605,"context_line":"        port.pxe_enabled \u003d True"},{"line_number":2606,"context_line":"        res \u003d self.service.update_port(self.context, port)"},{"line_number":2607,"context_line":"        self.assertEqual(True, res.pxe_enabled)"},{"line_number":2608,"context_line":""},{"line_number":2609,"context_line":"    def test_update_port_node_active_state_and_maintenance(self):"},{"line_number":2610,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_b136a901","line":2607,"updated":"2016-01-19 15:40:13.000000000","message":"It is probably better to do something like port.refresh(), and assert on that instead of res because it is consistent with the above test_update_port_address_fail(), and it tests that the port was saved to the database.","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":2604,"context_line":"                                          extra\u003d{\u0027foo\u0027: \u0027bar\u0027})"},{"line_number":2605,"context_line":"        port.pxe_enabled \u003d True"},{"line_number":2606,"context_line":"        res \u003d self.service.update_port(self.context, port)"},{"line_number":2607,"context_line":"        self.assertEqual(True, res.pxe_enabled)"},{"line_number":2608,"context_line":""},{"line_number":2609,"context_line":"    def test_update_port_node_active_state_and_maintenance(self):"},{"line_number":2610,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_d307771a","line":2607,"in_reply_to":"ba63e191_b136a901","updated":"2016-01-20 12:20:10.000000000","message":"Done","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":2616,"context_line":"                                          extra\u003d{\u0027foo\u0027: \u0027bar\u0027})"},{"line_number":2617,"context_line":"        port.pxe_enabled \u003d True"},{"line_number":2618,"context_line":"        res \u003d self.service.update_port(self.context, port)"},{"line_number":2619,"context_line":"        self.assertEqual(True, res.pxe_enabled)"},{"line_number":2620,"context_line":""},{"line_number":2621,"context_line":"    def test__filter_out_unsupported_types_all(self):"},{"line_number":2622,"context_line":"        self._start_service()"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_0c143e42","line":2619,"updated":"2016-01-19 15:40:13.000000000","message":"ditto","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":2616,"context_line":"                                          extra\u003d{\u0027foo\u0027: \u0027bar\u0027})"},{"line_number":2617,"context_line":"        port.pxe_enabled \u003d True"},{"line_number":2618,"context_line":"        res \u003d self.service.update_port(self.context, port)"},{"line_number":2619,"context_line":"        self.assertEqual(True, res.pxe_enabled)"},{"line_number":2620,"context_line":""},{"line_number":2621,"context_line":"    def test__filter_out_unsupported_types_all(self):"},{"line_number":2622,"context_line":"        self._start_service()"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_5621359e","line":2619,"in_reply_to":"ba63e191_0c143e42","updated":"2016-01-20 12:20:10.000000000","message":"Done","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":2830,"context_line":"        new_extra \u003d {\u0027foo\u0027: \u0027baz\u0027}"},{"line_number":2831,"context_line":"        portgroup.extra \u003d new_extra"},{"line_number":2832,"context_line":"        res \u003d self.service.update_portgroup(self.context, portgroup)"},{"line_number":2833,"context_line":"        self.assertEqual(new_extra, res.extra)"},{"line_number":2834,"context_line":""},{"line_number":2835,"context_line":"    def test_update_portgroup_node_locked(self):"},{"line_number":2836,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_6cf85ae6","line":2833,"updated":"2016-01-19 15:40:13.000000000","message":"ditto about doing portgroup.refresh() and asserting with that. (eg if we forgot to do a .save() in the code, I think that this would not fail)","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":2830,"context_line":"        new_extra \u003d {\u0027foo\u0027: \u0027baz\u0027}"},{"line_number":2831,"context_line":"        portgroup.extra \u003d new_extra"},{"line_number":2832,"context_line":"        res \u003d self.service.update_portgroup(self.context, portgroup)"},{"line_number":2833,"context_line":"        self.assertEqual(new_extra, res.extra)"},{"line_number":2834,"context_line":""},{"line_number":2835,"context_line":"    def test_update_portgroup_node_locked(self):"},{"line_number":2836,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_d60445c1","line":2833,"in_reply_to":"ba63e191_6cf85ae6","updated":"2016-01-20 12:20:10.000000000","message":"Definitely, I think that other similar update_* tests should be updated.","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":2836,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"},{"line_number":2837,"context_line":"                                          reservation\u003d\u0027fake-reserv\u0027)"},{"line_number":2838,"context_line":""},{"line_number":2839,"context_line":"        portgroup \u003d obj_utils.create_test_port(self.context, node_id\u003dnode.id)"},{"line_number":2840,"context_line":"        portgroup.extra \u003d {\u0027foo\u0027: \u0027baz\u0027}"},{"line_number":2841,"context_line":"        exc \u003d self.assertRaises(messaging.rpc.ExpectedException,"},{"line_number":2842,"context_line":"                                self.service.update_portgroup,"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_4c41d60a","line":2839,"updated":"2016-01-19 15:40:13.000000000","message":"I think you want .create_test_portgroup :)","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":2836,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"},{"line_number":2837,"context_line":"                                          reservation\u003d\u0027fake-reserv\u0027)"},{"line_number":2838,"context_line":""},{"line_number":2839,"context_line":"        portgroup \u003d obj_utils.create_test_port(self.context, node_id\u003dnode.id)"},{"line_number":2840,"context_line":"        portgroup.extra \u003d {\u0027foo\u0027: \u0027baz\u0027}"},{"line_number":2841,"context_line":"        exc \u003d self.assertRaises(messaging.rpc.ExpectedException,"},{"line_number":2842,"context_line":"                                self.service.update_portgroup,"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_16e97de6","line":2839,"in_reply_to":"ba63e191_4c41d60a","updated":"2016-01-20 12:20:10.000000000","message":"Done","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"12992872157e5fd8e617062608b4fb0847bba9a4","unresolved":false,"context_lines":[{"line_number":2843,"context_line":"                                self.context, portgroup)"},{"line_number":2844,"context_line":"        # Compare true exception hidden by @messaging.expected_exceptions"},{"line_number":2845,"context_line":"        self.assertEqual(exception.NodeLocked, exc.exc_info[0])"},{"line_number":2846,"context_line":""},{"line_number":2847,"context_line":""},{"line_number":2848,"context_line":"@mgr_utils.mock_record_keepalive"},{"line_number":2849,"context_line":"class RaidTestCases(mgr_utils.ServiceSetUpMixin, tests_db_base.DbTestCase):"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_0c7d1e1c","line":2846,"updated":"2016-01-19 15:40:13.000000000","message":"I think we should have some tests to test the logic in \"if \u0027address\u0027 in portgroup_obj.obj_what_changed\"...","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"aabac2f7272945a15cfefcf0a04fe06f5f105425","unresolved":false,"context_lines":[{"line_number":2843,"context_line":"                                self.context, portgroup)"},{"line_number":2844,"context_line":"        # Compare true exception hidden by @messaging.expected_exceptions"},{"line_number":2845,"context_line":"        self.assertEqual(exception.NodeLocked, exc.exc_info[0])"},{"line_number":2846,"context_line":""},{"line_number":2847,"context_line":""},{"line_number":2848,"context_line":"@mgr_utils.mock_record_keepalive"},{"line_number":2849,"context_line":"class RaidTestCases(mgr_utils.ServiceSetUpMixin, tests_db_base.DbTestCase):"}],"source_content_type":"text/x-python","patch_set":46,"id":"ba63e191_76b8f9e5","line":2846,"in_reply_to":"ba63e191_0c7d1e1c","updated":"2016-01-20 12:20:10.000000000","message":"Done","commit_id":"b9269030b708eda05b0dfd9ca48b69b4923d7f1d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d700c747da42f162fa2887e8a0220128477ef41a","unresolved":false,"context_lines":[{"line_number":2846,"context_line":"        self.assertEqual(exception.NodeLocked, exc.exc_info[0])"},{"line_number":2847,"context_line":"        portgroup.refresh()"},{"line_number":2848,"context_line":"        self.assertEqual(old_extra, portgroup.extra)"},{"line_number":2849,"context_line":""},{"line_number":2850,"context_line":""},{"line_number":2851,"context_line":"@mgr_utils.mock_record_keepalive"},{"line_number":2852,"context_line":"class RaidTestCases(mgr_utils.ServiceSetUpMixin, tests_db_base.DbTestCase):"}],"source_content_type":"text/x-python","patch_set":47,"id":"9a68dd71_e649fb8f","line":2849,"updated":"2016-01-20 14:52:57.000000000","message":"Tests for testing logic in  \"if \u0027address\u0027 in portgroup_obj.obj_what_changed\"... ?","commit_id":"73260ae6036c9665bf64772c28309b5d1688c187"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"e9ec1ecbf0f99e00d831a1d52ec73335ebdd55e4","unresolved":false,"context_lines":[{"line_number":2846,"context_line":"        self.assertEqual(exception.NodeLocked, exc.exc_info[0])"},{"line_number":2847,"context_line":"        portgroup.refresh()"},{"line_number":2848,"context_line":"        self.assertEqual(old_extra, portgroup.extra)"},{"line_number":2849,"context_line":""},{"line_number":2850,"context_line":""},{"line_number":2851,"context_line":"@mgr_utils.mock_record_keepalive"},{"line_number":2852,"context_line":"class RaidTestCases(mgr_utils.ServiceSetUpMixin, tests_db_base.DbTestCase):"}],"source_content_type":"text/x-python","patch_set":47,"id":"9a68dd71_747343b2","line":2849,"in_reply_to":"9a68dd71_e649fb8f","updated":"2016-01-25 12:32:09.000000000","message":"Done","commit_id":"73260ae6036c9665bf64772c28309b5d1688c187"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5ad6d28c8a3adb157922edb3e77da740ad235eab","unresolved":false,"context_lines":[{"line_number":2848,"context_line":"        self.assertEqual(old_extra, portgroup.extra)"},{"line_number":2849,"context_line":""},{"line_number":2850,"context_line":"    @mock.patch(\u0027ironic.dhcp.neutron.NeutronDHCPApi.update_port_address\u0027)"},{"line_number":2851,"context_line":"    def test_update_portgroup_address(self, mac_update_mock):"},{"line_number":2852,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"},{"line_number":2853,"context_line":"        pg \u003d obj_utils.create_test_portgroup("},{"line_number":2854,"context_line":"            self.context, node_id\u003dnode.id,"}],"source_content_type":"text/x-python","patch_set":53,"id":"5a5ae5dd_253205f3","line":2851,"updated":"2016-02-05 18:58:29.000000000","message":"Same holds for name.","commit_id":"a603e3c12c62e29e12e45283d8602f9aa5acfc0f"}],"ironic/tests/unit/conductor/test_task_manager.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d700c747da42f162fa2887e8a0220128477ef41a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"@mock.patch.object(objects.Node, \u0027release\u0027)"},{"line_number":38,"context_line":"@mock.patch.object(objects.Node, \u0027reserve\u0027)"},{"line_number":39,"context_line":"@mock.patch.object(driver_factory, \u0027get_driver\u0027)"},{"line_number":40,"context_line":"@mock.patch.object(objects.Port, \u0027list_by_node_id\u0027)"},{"line_number":41,"context_line":"class TaskManagerTestCase(tests_db_base.DbTestCase):"},{"line_number":42,"context_line":"    def setUp(self):"},{"line_number":43,"context_line":"        super(TaskManagerTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":47,"id":"9a68dd71_866a7f19","line":40,"updated":"2016-01-20 14:52:57.000000000","message":"I should have been clearer. I think, just to be consistent with the other objects, that we should mock the portgroup too.","commit_id":"73260ae6036c9665bf64772c28309b5d1688c187"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"e9ec1ecbf0f99e00d831a1d52ec73335ebdd55e4","unresolved":false,"context_lines":[{"line_number":37,"context_line":"@mock.patch.object(objects.Node, \u0027release\u0027)"},{"line_number":38,"context_line":"@mock.patch.object(objects.Node, \u0027reserve\u0027)"},{"line_number":39,"context_line":"@mock.patch.object(driver_factory, \u0027get_driver\u0027)"},{"line_number":40,"context_line":"@mock.patch.object(objects.Port, \u0027list_by_node_id\u0027)"},{"line_number":41,"context_line":"class TaskManagerTestCase(tests_db_base.DbTestCase):"},{"line_number":42,"context_line":"    def setUp(self):"},{"line_number":43,"context_line":"        super(TaskManagerTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":47,"id":"9a68dd71_12145742","line":40,"in_reply_to":"9a68dd71_866a7f19","updated":"2016-01-25 12:32:09.000000000","message":"Done","commit_id":"73260ae6036c9665bf64772c28309b5d1688c187"}]}
