)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"47cf134044d5688bb23d6de01ea3cc8ea4b4b092","unresolved":false,"context_lines":[{"line_number":21,"context_line":"PortgroupPhysnetInconsistent. This shouldn\u0027t ever happen."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"If the port has a physical network that is inconsistent with other ports"},{"line_number":24,"context_line":"in the portgroup, we raise exception.Conflict."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: I6a6d248155f98109dd36dba5837494f6974846e6"},{"line_number":27,"context_line":"Partial-Bug: #1666009"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7f231b9d_1a8c7d7d","line":24,"updated":"2017-06-14 15:16:48.000000000","message":"It might be useful in the commit, to mention what a physical network of None means. (I mean, it would have been useful for me when I first reviewed this patch :-))","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":21,"context_line":"PortgroupPhysnetInconsistent. This shouldn\u0027t ever happen."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"If the port has a physical network that is inconsistent with other ports"},{"line_number":24,"context_line":"in the portgroup, we raise exception.Conflict."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: I6a6d248155f98109dd36dba5837494f6974846e6"},{"line_number":27,"context_line":"Partial-Bug: #1666009"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7f231b9d_4539dba1","line":24,"in_reply_to":"7f231b9d_1a8c7d7d","updated":"2017-06-15 11:47:58.000000000","message":"Done","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"}],"ironic/common/exception.py":[{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"ff76f5b931a2a738cf1d58e7e114adc0e9df0d92","unresolved":false,"context_lines":[{"line_number":752,"context_line":"    _msg_fmt \u003d _(\"Redfish connection failed for node %(node)s: %(error)s\")"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"class PortgroupPhysnetInconsistent(IronicException):"},{"line_number":756,"context_line":"    _msg_fmt \u003d _(\"Port group %(portgroup)s has member ports with inconsistent \""},{"line_number":757,"context_line":"                 \"physical networks (%(physical_networks)s). All ports in a \""},{"line_number":758,"context_line":"                 \"port group must have the same physical network.\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_2f01cb6a","line":755,"range":{"start_line":755,"start_character":43,"end_line":755,"end_character":44},"updated":"2017-06-06 12:35:33.000000000","message":"this should be Invalid but definitely not 500.","commit_id":"bc31ea22f101c45133c253a76c1abccf9363a1cf"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1b96a7c03511b0b62c44d8d5477646be7114a536","unresolved":false,"context_lines":[{"line_number":752,"context_line":"    _msg_fmt \u003d _(\"Redfish connection failed for node %(node)s: %(error)s\")"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"class PortgroupPhysnetInconsistent(IronicException):"},{"line_number":756,"context_line":"    _msg_fmt \u003d _(\"Port group %(portgroup)s has member ports with inconsistent \""},{"line_number":757,"context_line":"                 \"physical networks (%(physical_networks)s). All ports in a \""},{"line_number":758,"context_line":"                 \"port group must have the same physical network.\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_35711ea9","line":755,"range":{"start_line":755,"start_character":43,"end_line":755,"end_character":44},"in_reply_to":"df140735_2f01cb6a","updated":"2017-06-06 12:55:48.000000000","message":"The validation logic is supposed to prevent this from ever happening, so it\u0027s a server-side error if it has happened rather than a client error. This exception just covers the possibility that it does happen somehow.","commit_id":"bc31ea22f101c45133c253a76c1abccf9363a1cf"}],"ironic/common/network.py":[{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"ff76f5b931a2a738cf1d58e7e114adc0e9df0d92","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    return vifs"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def get_portgroup_by_id(task, portgroup_id):"},{"line_number":48,"context_line":"    \"\"\"Lookup a portgroup by ID on a task object."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    :param task: a TaskManager instance"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_4a0ced92","line":47,"updated":"2017-06-06 12:35:33.000000000","message":"Might be add those methods to TaskManager object [0] so we can call something like task.get_portgroup_by_id(....)\nLets see what other people think.\n\n[0] https://github.com/openstack/ironic/blob/6f008ef91c4a7849acc98bcacfd822918efb63df/ironic/conductor/task_manager.py#L171","commit_id":"bc31ea22f101c45133c253a76c1abccf9363a1cf"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1b96a7c03511b0b62c44d8d5477646be7114a536","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    return vifs"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def get_portgroup_by_id(task, portgroup_id):"},{"line_number":48,"context_line":"    \"\"\"Lookup a portgroup by ID on a task object."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    :param task: a TaskManager instance"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_9530eaa0","line":47,"in_reply_to":"df140735_4a0ced92","updated":"2017-06-06 12:55:48.000000000","message":"Yes I thought about that but the TaskManager seemed quite slim and mostly concerned with synchronisation so I thought I\u0027d not clutter it. Open to moving these if people think it would be better though.","commit_id":"bc31ea22f101c45133c253a76c1abccf9363a1cf"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"4d59b9214e7ee4c3bd96d2ecb0b40223667c5a34","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    :param portgroup_id: ID of the portgroup."},{"line_number":52,"context_line":"    :returns: A Portgroup object or None."},{"line_number":53,"context_line":"    \"\"\""},{"line_number":54,"context_line":"    portgroups \u003d [pg for pg in task.portgroups if pg.id \u003d\u003d portgroup_id]"},{"line_number":55,"context_line":"    if portgroups:"},{"line_number":56,"context_line":"        return portgroups[0]"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_a5fde909","line":54,"updated":"2017-06-06 22:03:51.000000000","message":"i\u0027m not fond of this since it seems somewhat inefficient; we know there will be at most one so if found, we can stop traversing the list. I guess this can be a performance improvement in the future...","commit_id":"8535c073a5d6bf3a9171f74cb6045bd2001da65e"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"beadf169b59bd63d17ca57af137621ffc32242af","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    :param portgroup_id: ID of the portgroup."},{"line_number":52,"context_line":"    :returns: A Portgroup object or None."},{"line_number":53,"context_line":"    \"\"\""},{"line_number":54,"context_line":"    portgroups \u003d [pg for pg in task.portgroups if pg.id \u003d\u003d portgroup_id]"},{"line_number":55,"context_line":"    if portgroups:"},{"line_number":56,"context_line":"        return portgroups[0]"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_9cf35374","line":54,"in_reply_to":"df140735_a5fde909","updated":"2017-06-07 08:33:56.000000000","message":"You\u0027re right, a for/if construct would be more efficient here (checked using timeit). It\u0027s worth noting these should be very small lists though - a node shouldn\u0027t have a large number of portgroups.","commit_id":"8535c073a5d6bf3a9171f74cb6045bd2001da65e"}],"ironic/conductor/utils.py":[{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"ff76f5b931a2a738cf1d58e7e114adc0e9df0d92","unresolved":false,"context_lines":[{"line_number":520,"context_line":"             ports which are not all assigned the same physical network."},{"line_number":521,"context_line":"    \"\"\""},{"line_number":522,"context_line":"    if \u0027portgroup_id\u0027 not in port_obj or not port_obj.portgroup_id:"},{"line_number":523,"context_line":"        return"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    # Determine the current physical network of the portgroup."},{"line_number":526,"context_line":"    pg_ports \u003d network.get_ports_by_portgroup_id(task, port_obj.portgroup_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_aaa5c9a0","line":523,"updated":"2017-06-06 12:35:33.000000000","message":"we should skip validation if:\n 1. porgroup_id was removed\nOR\n 2. we didn\u0027t change portgroup_id or physycal_network","commit_id":"bc31ea22f101c45133c253a76c1abccf9363a1cf"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1b96a7c03511b0b62c44d8d5477646be7114a536","unresolved":false,"context_lines":[{"line_number":520,"context_line":"             ports which are not all assigned the same physical network."},{"line_number":521,"context_line":"    \"\"\""},{"line_number":522,"context_line":"    if \u0027portgroup_id\u0027 not in port_obj or not port_obj.portgroup_id:"},{"line_number":523,"context_line":"        return"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    # Determine the current physical network of the portgroup."},{"line_number":526,"context_line":"    pg_ports \u003d network.get_ports_by_portgroup_id(task, port_obj.portgroup_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_d5ee62eb","line":523,"in_reply_to":"df140735_aaa5c9a0","updated":"2017-06-06 12:55:48.000000000","message":"L522 should cover 1. We should be able to cover 2 using port.obj_what_changed().","commit_id":"bc31ea22f101c45133c253a76c1abccf9363a1cf"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"4d59b9214e7ee4c3bd96d2ecb0b40223667c5a34","unresolved":false,"context_lines":[{"line_number":533,"context_line":"    port_obj_id \u003d port_obj.id if \u0027id\u0027 in port_obj else None"},{"line_number":534,"context_line":"    # Don\u0027t include port_obj in the determination of the portgroup\u0027s physnet if"},{"line_number":535,"context_line":"    # its physical network is being updated."},{"line_number":536,"context_line":"    physnet_changed \u003d \u0027physical_network\u0027 in port_obj.obj_what_changed()"},{"line_number":537,"context_line":"    pg_physnets \u003d {port.physical_network"},{"line_number":538,"context_line":"                   for port in pg_ports"},{"line_number":539,"context_line":"                   if port.id !\u003d port_obj_id or not physnet_changed}"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_a51289b3","line":536,"updated":"2017-06-06 22:03:51.000000000","message":"just wondering, can someone set port_obj.physical_network to some value, then update it and set it to None? If so, I mean if it has changed to None, how much of this validation do you want to do?","commit_id":"8535c073a5d6bf3a9171f74cb6045bd2001da65e"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"beadf169b59bd63d17ca57af137621ffc32242af","unresolved":false,"context_lines":[{"line_number":533,"context_line":"    port_obj_id \u003d port_obj.id if \u0027id\u0027 in port_obj else None"},{"line_number":534,"context_line":"    # Don\u0027t include port_obj in the determination of the portgroup\u0027s physnet if"},{"line_number":535,"context_line":"    # its physical network is being updated."},{"line_number":536,"context_line":"    physnet_changed \u003d \u0027physical_network\u0027 in port_obj.obj_what_changed()"},{"line_number":537,"context_line":"    pg_physnets \u003d {port.physical_network"},{"line_number":538,"context_line":"                   for port in pg_ports"},{"line_number":539,"context_line":"                   if port.id !\u003d port_obj_id or not physnet_changed}"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_dc7b0bbc","line":536,"in_reply_to":"df140735_a51289b3","updated":"2017-06-07 08:33:56.000000000","message":"Yes:\n\nopenstack baremetal port unset --physical-network\n\nWhen the physnet is None we should use the previous behaviour for backwards compatibility.\n\nIMHO should treat None as just another physnet. If one port in a group has physnet\u003dNone then all others should too. Agree?","commit_id":"8535c073a5d6bf3a9171f74cb6045bd2001da65e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"4d59b9214e7ee4c3bd96d2ecb0b40223667c5a34","unresolved":false,"context_lines":[{"line_number":534,"context_line":"    # Don\u0027t include port_obj in the determination of the portgroup\u0027s physnet if"},{"line_number":535,"context_line":"    # its physical network is being updated."},{"line_number":536,"context_line":"    physnet_changed \u003d \u0027physical_network\u0027 in port_obj.obj_what_changed()"},{"line_number":537,"context_line":"    pg_physnets \u003d {port.physical_network"},{"line_number":538,"context_line":"                   for port in pg_ports"},{"line_number":539,"context_line":"                   if port.id !\u003d port_obj_id or not physnet_changed}"},{"line_number":540,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_e5c3e137","line":537,"updated":"2017-06-06 22:03:51.000000000","message":"i could be wrong, but isn\u0027t the default value of port.physical_network \u003d\u003d None? or \"\"? if so, do you want that added to the set of pg_physnets? Cuz then if you had a real physnet, this set would have 2 entries and you\u0027d flag it as an error at L543?","commit_id":"8535c073a5d6bf3a9171f74cb6045bd2001da65e"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"beadf169b59bd63d17ca57af137621ffc32242af","unresolved":false,"context_lines":[{"line_number":534,"context_line":"    # Don\u0027t include port_obj in the determination of the portgroup\u0027s physnet if"},{"line_number":535,"context_line":"    # its physical network is being updated."},{"line_number":536,"context_line":"    physnet_changed \u003d \u0027physical_network\u0027 in port_obj.obj_what_changed()"},{"line_number":537,"context_line":"    pg_physnets \u003d {port.physical_network"},{"line_number":538,"context_line":"                   for port in pg_ports"},{"line_number":539,"context_line":"                   if port.id !\u003d port_obj_id or not physnet_changed}"},{"line_number":540,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_9c3473fd","line":537,"in_reply_to":"df140735_e5c3e137","updated":"2017-06-07 08:33:56.000000000","message":"The default is None, correct. See my comment on L536.","commit_id":"8535c073a5d6bf3a9171f74cb6045bd2001da65e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"4d59b9214e7ee4c3bd96d2ecb0b40223667c5a34","unresolved":false,"context_lines":[{"line_number":543,"context_line":"    if len(pg_physnets) \u003e 1:"},{"line_number":544,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":545,"context_line":"        raise exception.PortgroupPhysnetInconsistent("},{"line_number":546,"context_line":"            portgroup\u003dportgroup.uuid, physical_networks\u003d\", \".join(pg_physnets))"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    if not pg_physnets:"},{"line_number":549,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_65e591dc","line":546,"updated":"2017-06-06 22:03:51.000000000","message":"just to be clear, by \u0027sanity check\u0027, this shouldn\u0027t ever happen right? cuz we\u0027re checking/validating?","commit_id":"8535c073a5d6bf3a9171f74cb6045bd2001da65e"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"beadf169b59bd63d17ca57af137621ffc32242af","unresolved":false,"context_lines":[{"line_number":543,"context_line":"    if len(pg_physnets) \u003e 1:"},{"line_number":544,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":545,"context_line":"        raise exception.PortgroupPhysnetInconsistent("},{"line_number":546,"context_line":"            portgroup\u003dportgroup.uuid, physical_networks\u003d\", \".join(pg_physnets))"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    if not pg_physnets:"},{"line_number":549,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_5037dfe4","line":546,"in_reply_to":"df140735_65e591dc","updated":"2017-06-07 08:33:56.000000000","message":"Correct. If this function does its job correctly we shouldn\u0027t get into this state. But the real world, bugs, unforeseen races etc. might get in the way.","commit_id":"8535c073a5d6bf3a9171f74cb6045bd2001da65e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"4d59b9214e7ee4c3bd96d2ecb0b40223667c5a34","unresolved":false,"context_lines":[{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    # Check that the port has the same physical network as any existing"},{"line_number":552,"context_line":"    # member ports."},{"line_number":553,"context_line":"    pg_physnet \u003d pg_physnets.pop()"},{"line_number":554,"context_line":"    port_physnet \u003d (port_obj.physical_network"},{"line_number":555,"context_line":"                    if \u0027physical_network\u0027 in port_obj else None)"},{"line_number":556,"context_line":"    if port_physnet !\u003d pg_physnet:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_c5ee9db3","line":553,"updated":"2017-06-06 22:03:51.000000000","message":"Don\u0027t you only need to do this if physnet_changed \u003d True? If it hasn\u0027t changed, then the port\u0027s physnet would have already been included in pg_physnet I think. So maybe L548 can be \u0027if not pg_pyhsnets or not physnet_changed\u0027 ?","commit_id":"8535c073a5d6bf3a9171f74cb6045bd2001da65e"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"beadf169b59bd63d17ca57af137621ffc32242af","unresolved":false,"context_lines":[{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    # Check that the port has the same physical network as any existing"},{"line_number":552,"context_line":"    # member ports."},{"line_number":553,"context_line":"    pg_physnet \u003d pg_physnets.pop()"},{"line_number":554,"context_line":"    port_physnet \u003d (port_obj.physical_network"},{"line_number":555,"context_line":"                    if \u0027physical_network\u0027 in port_obj else None)"},{"line_number":556,"context_line":"    if port_physnet !\u003d pg_physnet:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_10b4c734","line":553,"in_reply_to":"df140735_c5ee9db3","updated":"2017-06-07 08:33:56.000000000","message":"If the port is being added to the portgroup either by creation or an update setting portgroup_id then it won\u0027t be in pg_physnets and physnet_changed may be False.","commit_id":"8535c073a5d6bf3a9171f74cb6045bd2001da65e"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"beadf169b59bd63d17ca57af137621ffc32242af","unresolved":false,"context_lines":[{"line_number":552,"context_line":"    # member ports."},{"line_number":553,"context_line":"    pg_physnet \u003d pg_physnets.pop()"},{"line_number":554,"context_line":"    port_physnet \u003d (port_obj.physical_network"},{"line_number":555,"context_line":"                    if \u0027physical_network\u0027 in port_obj else None)"},{"line_number":556,"context_line":"    if port_physnet !\u003d pg_physnet:"},{"line_number":557,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":558,"context_line":"        msg \u003d _(\"Port group %(portgroup)s is in physical network \""}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_105047d4","line":555,"updated":"2017-06-07 08:33:56.000000000","message":"Just for the record, ideally here (and elsewhere) I\u0027d use the oslo_versionedobjects.base.VersionedObjectDictCompat.get() method here. However, ironic has hidden this method on the Port object with a method to get by ID/UUID/MAC.","commit_id":"8535c073a5d6bf3a9171f74cb6045bd2001da65e"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"a80bbf13ff8eceb9b4440debd0ba6c36b4f6e103","unresolved":false,"context_lines":[{"line_number":525,"context_line":"    # We can skip this step if the port\u0027s portgroup membership or physical"},{"line_number":526,"context_line":"    # network assignment is not being changed (during creation these will"},{"line_number":527,"context_line":"    # appear changed)."},{"line_number":528,"context_line":"    if not port_obj.obj_what_changed() \u0026 {\u0027portgroup_id\u0027, \u0027physical_network\u0027}:"},{"line_number":529,"context_line":"        return"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    # Determine the current physical network of the portgroup."}],"source_content_type":"text/x-python","patch_set":4,"id":"bf091321_6776a7db","line":528,"updated":"2017-06-08 11:47:46.000000000","message":"would be better to call obj_what_changed only once.\n\ndelta \u003d port_obj.obj_what_changed()\n\nand use delta here and on L536","commit_id":"2a45699e2b0d29e74cb9e55aa80f8f3cc4eeaedd"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"7952b03f628990b1a7420a45dd5c0ad3175ba932","unresolved":false,"context_lines":[{"line_number":525,"context_line":"    # We can skip this step if the port\u0027s portgroup membership or physical"},{"line_number":526,"context_line":"    # network assignment is not being changed (during creation these will"},{"line_number":527,"context_line":"    # appear changed)."},{"line_number":528,"context_line":"    if not port_obj.obj_what_changed() \u0026 {\u0027portgroup_id\u0027, \u0027physical_network\u0027}:"},{"line_number":529,"context_line":"        return"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    # Determine the current physical network of the portgroup."}],"source_content_type":"text/x-python","patch_set":4,"id":"7f231b9d_e8038d41","line":528,"in_reply_to":"bf091321_6776a7db","updated":"2017-06-12 14:10:39.000000000","message":"Good idea.","commit_id":"2a45699e2b0d29e74cb9e55aa80f8f3cc4eeaedd"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"a80bbf13ff8eceb9b4440debd0ba6c36b4f6e103","unresolved":false,"context_lines":[{"line_number":538,"context_line":"                   for port in pg_ports"},{"line_number":539,"context_line":"                   if port.id !\u003d port_obj_id or not physnet_changed}"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"    # Sanity check that all existing ports in the group have the same"},{"line_number":542,"context_line":"    # physical network."},{"line_number":543,"context_line":"    if len(pg_physnets) \u003e 1:"},{"line_number":544,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":545,"context_line":"        raise exception.PortgroupPhysnetInconsistent("},{"line_number":546,"context_line":"            portgroup\u003dportgroup.uuid, physical_networks\u003d\", \".join(pg_physnets))"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    if not pg_physnets:"},{"line_number":549,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf091321_aa98066a","line":546,"range":{"start_line":541,"start_character":4,"end_line":546,"end_character":79},"updated":"2017-06-08 11:47:46.000000000","message":"this situation is not possible, we can\u0027t update different ports for the same node concurrently as we lock whole node https://review.openstack.org/#/c/469932/4/ironic/conductor/manager.py@1860","commit_id":"2a45699e2b0d29e74cb9e55aa80f8f3cc4eeaedd"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"7952b03f628990b1a7420a45dd5c0ad3175ba932","unresolved":false,"context_lines":[{"line_number":538,"context_line":"                   for port in pg_ports"},{"line_number":539,"context_line":"                   if port.id !\u003d port_obj_id or not physnet_changed}"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"    # Sanity check that all existing ports in the group have the same"},{"line_number":542,"context_line":"    # physical network."},{"line_number":543,"context_line":"    if len(pg_physnets) \u003e 1:"},{"line_number":544,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":545,"context_line":"        raise exception.PortgroupPhysnetInconsistent("},{"line_number":546,"context_line":"            portgroup\u003dportgroup.uuid, physical_networks\u003d\", \".join(pg_physnets))"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    if not pg_physnets:"},{"line_number":549,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f231b9d_a880f58c","line":546,"range":{"start_line":541,"start_character":4,"end_line":546,"end_character":79},"in_reply_to":"bf091321_aa98066a","updated":"2017-06-12 14:10:39.000000000","message":"Theoretically it\u0027s not possible, I just wanted to be defensive.","commit_id":"2a45699e2b0d29e74cb9e55aa80f8f3cc4eeaedd"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"a80bbf13ff8eceb9b4440debd0ba6c36b4f6e103","unresolved":false,"context_lines":[{"line_number":555,"context_line":"                    if \u0027physical_network\u0027 in port_obj else None)"},{"line_number":556,"context_line":"    if port_physnet !\u003d pg_physnet:"},{"line_number":557,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":558,"context_line":"        msg \u003d _(\"Port group %(portgroup)s is in physical network \""},{"line_number":559,"context_line":"                \"%(physnet)s. This port cannot be a member of that port \""},{"line_number":560,"context_line":"                \"group while it has a different physical network.\")"},{"line_number":561,"context_line":"        raise exception.Conflict("},{"line_number":562,"context_line":"            msg % {\u0027portgroup\u0027: portgroup.uuid, \u0027physnet\u0027: pg_physnet})"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf091321_8a8782d8","line":560,"range":{"start_line":558,"start_character":16,"end_line":560,"end_character":66},"updated":"2017-06-08 11:47:46.000000000","message":"This a bit confusing. port group object doesn\u0027t have physical network attribute. Might be something like:\n\n\"Port with physical network %(physnet)s can\u0027t be added to \"\n\"portgroup %(portgroup)s as port group members have other physnet value %(pg_physnet)s\"","commit_id":"2a45699e2b0d29e74cb9e55aa80f8f3cc4eeaedd"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"7952b03f628990b1a7420a45dd5c0ad3175ba932","unresolved":false,"context_lines":[{"line_number":555,"context_line":"                    if \u0027physical_network\u0027 in port_obj else None)"},{"line_number":556,"context_line":"    if port_physnet !\u003d pg_physnet:"},{"line_number":557,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":558,"context_line":"        msg \u003d _(\"Port group %(portgroup)s is in physical network \""},{"line_number":559,"context_line":"                \"%(physnet)s. This port cannot be a member of that port \""},{"line_number":560,"context_line":"                \"group while it has a different physical network.\")"},{"line_number":561,"context_line":"        raise exception.Conflict("},{"line_number":562,"context_line":"            msg % {\u0027portgroup\u0027: portgroup.uuid, \u0027physnet\u0027: pg_physnet})"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f231b9d_6b84175f","line":560,"range":{"start_line":558,"start_character":16,"end_line":560,"end_character":66},"in_reply_to":"bf091321_8a8782d8","updated":"2017-06-12 14:10:39.000000000","message":"Done","commit_id":"2a45699e2b0d29e74cb9e55aa80f8f3cc4eeaedd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":529,"context_line":"    if not delta \u0026 {\u0027portgroup_id\u0027, \u0027physical_network\u0027}:"},{"line_number":530,"context_line":"        return"},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"    # Determine the current physical network of the portgroup."},{"line_number":533,"context_line":"    pg_ports \u003d network.get_ports_by_portgroup_id(task, port_obj.portgroup_id)"},{"line_number":534,"context_line":"    port_obj_id \u003d port_obj.id if \u0027id\u0027 in port_obj else None"},{"line_number":535,"context_line":"    # Don\u0027t include port_obj in the determination of the portgroup\u0027s physnet if"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_89860d13","line":532,"updated":"2017-06-14 15:15:11.000000000","message":"Somewhere, maybe here?, we should be explicit wrt what this means: physical_network \u003d None. That eg, all ports in a portgroup must have No physical network or the exact same physical network.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":529,"context_line":"    if not delta \u0026 {\u0027portgroup_id\u0027, \u0027physical_network\u0027}:"},{"line_number":530,"context_line":"        return"},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"    # Determine the current physical network of the portgroup."},{"line_number":533,"context_line":"    pg_ports \u003d network.get_ports_by_portgroup_id(task, port_obj.portgroup_id)"},{"line_number":534,"context_line":"    port_obj_id \u003d port_obj.id if \u0027id\u0027 in port_obj else None"},{"line_number":535,"context_line":"    # Don\u0027t include port_obj in the determination of the portgroup\u0027s physnet if"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_a5542f54","line":532,"in_reply_to":"7f231b9d_89860d13","updated":"2017-06-15 11:47:58.000000000","message":"I\u0027ll add something to the docstring.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"3727c66cb9b23ed77f6bd826d7f5e2d52ff79164","unresolved":false,"context_lines":[{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    # Sanity check that all existing ports in the group have the same"},{"line_number":543,"context_line":"    # physical network."},{"line_number":544,"context_line":"    if len(pg_physnets) \u003e 1:"},{"line_number":545,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":546,"context_line":"        raise exception.PortgroupPhysnetInconsistent("},{"line_number":547,"context_line":"            portgroup\u003dportgroup.uuid, physical_networks\u003d\", \".join(pg_physnets))"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_e69ed1b6","line":544,"updated":"2017-06-14 12:08:29.000000000","message":"Lets see what other thinks, but as for me if we block such situation on API/Conductor side, why we need to add a safe check here?","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"c536c85cba4c36869d27d8324a8b9b6ede96880d","unresolved":false,"context_lines":[{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    # Sanity check that all existing ports in the group have the same"},{"line_number":543,"context_line":"    # physical network."},{"line_number":544,"context_line":"    if len(pg_physnets) \u003e 1:"},{"line_number":545,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":546,"context_line":"        raise exception.PortgroupPhysnetInconsistent("},{"line_number":547,"context_line":"            portgroup\u003dportgroup.uuid, physical_networks\u003d\", \".join(pg_physnets))"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_fc3784af","line":544,"in_reply_to":"7f231b9d_e69ed1b6","updated":"2017-06-14 13:06:11.000000000","message":"I guess I\u0027m just wary of situations that \u0027should never happen\u0027 in a complex distributed system that relies on database locks for synchronisation.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    # Sanity check that all existing ports in the group have the same"},{"line_number":543,"context_line":"    # physical network."},{"line_number":544,"context_line":"    if len(pg_physnets) \u003e 1:"},{"line_number":545,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":546,"context_line":"        raise exception.PortgroupPhysnetInconsistent("},{"line_number":547,"context_line":"            portgroup\u003dportgroup.uuid, physical_networks\u003d\", \".join(pg_physnets))"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_66cd1e65","line":544,"in_reply_to":"7f231b9d_fc3784af","updated":"2017-06-14 15:15:11.000000000","message":"I\u0027m fine with or without this. Code changes over time, who knows. The \u0027Sanity check\u0027 part (although I asked for clarification) is meant to indicate that this shouldn\u0027t ever happen.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":547,"context_line":"            portgroup\u003dportgroup.uuid, physical_networks\u003d\", \".join(pg_physnets))"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"    if not pg_physnets:"},{"line_number":550,"context_line":"        return"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    # Check that the port has the same physical network as any existing"},{"line_number":553,"context_line":"    # member ports."}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_a90b097b","line":550,"updated":"2017-06-14 15:15:11.000000000","message":"just a nit, I guess you could move this above L542.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":547,"context_line":"            portgroup\u003dportgroup.uuid, physical_networks\u003d\", \".join(pg_physnets))"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"    if not pg_physnets:"},{"line_number":550,"context_line":"        return"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    # Check that the port has the same physical network as any existing"},{"line_number":553,"context_line":"    # member ports."}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_203ecd8b","line":550,"in_reply_to":"7f231b9d_a90b097b","updated":"2017-06-15 11:47:58.000000000","message":"Done","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":553,"context_line":"    # member ports."},{"line_number":554,"context_line":"    pg_physnet \u003d pg_physnets.pop()"},{"line_number":555,"context_line":"    port_physnet \u003d (port_obj.physical_network"},{"line_number":556,"context_line":"                    if \u0027physical_network\u0027 in port_obj else None)"},{"line_number":557,"context_line":"    if port_physnet !\u003d pg_physnet:"},{"line_number":558,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":559,"context_line":"        msg \u003d _(\"Port with physical network %(physnet)s cannot become a \""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_e929018a","line":556,"updated":"2017-06-14 15:15:11.000000000","message":"Just wondering -- at this point, won\u0027t port_obj.physical_network always exist? (Trying to remember if you need to do the if \u0027physical_network\u0027 in port_obj...)","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":553,"context_line":"    # member ports."},{"line_number":554,"context_line":"    pg_physnet \u003d pg_physnets.pop()"},{"line_number":555,"context_line":"    port_physnet \u003d (port_obj.physical_network"},{"line_number":556,"context_line":"                    if \u0027physical_network\u0027 in port_obj else None)"},{"line_number":557,"context_line":"    if port_physnet !\u003d pg_physnet:"},{"line_number":558,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":559,"context_line":"        msg \u003d _(\"Port with physical network %(physnet)s cannot become a \""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_20380ded","line":556,"in_reply_to":"7f231b9d_e929018a","updated":"2017-06-15 11:47:58.000000000","message":"We can get here when creating a port in a portgroup without setting an explicit physical network. The Port object won\u0027t have a physical_network field until it\u0027s been created in the DB, at which point it will take the default value of None.\n\nIf we try to access a non-existent field we get:\n\nNotImplementedError: Cannot load \u0027physical_network\u0027 in the base class\n\nThanks for pointing this out though, my test case wasn\u0027t actually covering this and has now been updated.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":558,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":559,"context_line":"        msg \u003d _(\"Port with physical network %(physnet)s cannot become a \""},{"line_number":560,"context_line":"                \"member of port group %(portgroup)s which has port group \""},{"line_number":561,"context_line":"                \"members in physical network %(pg_physnet)s.\")"},{"line_number":562,"context_line":"        raise exception.Conflict("},{"line_number":563,"context_line":"            msg % {\u0027portgroup\u0027: portgroup.uuid, \u0027physnet\u0027: port_physnet,"},{"line_number":564,"context_line":"                   \u0027pg_physnet\u0027: pg_physnet})"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_69d17123","line":561,"updated":"2017-06-14 15:15:11.000000000","message":"Do you think \u0027port group members\u0027 or \u0027ports\u0027 is easier to understand?","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":558,"context_line":"        portgroup \u003d network.get_portgroup_by_id(task, port_obj.portgroup_id)"},{"line_number":559,"context_line":"        msg \u003d _(\"Port with physical network %(physnet)s cannot become a \""},{"line_number":560,"context_line":"                \"member of port group %(portgroup)s which has port group \""},{"line_number":561,"context_line":"                \"members in physical network %(pg_physnet)s.\")"},{"line_number":562,"context_line":"        raise exception.Conflict("},{"line_number":563,"context_line":"            msg % {\u0027portgroup\u0027: portgroup.uuid, \u0027physnet\u0027: port_physnet,"},{"line_number":564,"context_line":"                   \u0027pg_physnet\u0027: pg_physnet})"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_40c9c923","line":561,"in_reply_to":"7f231b9d_69d17123","updated":"2017-06-15 11:47:58.000000000","message":"Perhaps just ports is better.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"2c606a6b69ea54af2dc092f356553293d15c5e23","unresolved":false,"context_lines":[{"line_number":544,"context_line":"    # We can skip this step if the port\u0027s portgroup membership or physical"},{"line_number":545,"context_line":"    # network assignment is not being changed (during creation these will"},{"line_number":546,"context_line":"    # appear changed)."},{"line_number":547,"context_line":"    if not delta \u0026 {\u0027portgroup_id\u0027, \u0027physical_network\u0027}:"},{"line_number":548,"context_line":"        return"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"    # Determine the current physical network of the portgroup."}],"source_content_type":"text/x-python","patch_set":6,"id":"7f231b9d_4cfa11bd","line":547,"range":{"start_line":547,"start_character":11,"end_line":547,"end_character":55},"updated":"2017-06-15 21:35:38.000000000","message":"parentheses around this would be appreciated. Or:\n\n if not delta.intersection({\u0027portgroup_id\u0027, \u0027physical_network\u0027}):\n\nI prefer to not have to think about operator precedence.","commit_id":"c3c47b6f96c121729a472c1da6051a65d31bcc02"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"dfc9a3df6027140a0c1e1b34175f95a498298ec0","unresolved":false,"context_lines":[{"line_number":544,"context_line":"    # We can skip this step if the port\u0027s portgroup membership or physical"},{"line_number":545,"context_line":"    # network assignment is not being changed (during creation these will"},{"line_number":546,"context_line":"    # appear changed)."},{"line_number":547,"context_line":"    if not delta \u0026 {\u0027portgroup_id\u0027, \u0027physical_network\u0027}:"},{"line_number":548,"context_line":"        return"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"    # Determine the current physical network of the portgroup."}],"source_content_type":"text/x-python","patch_set":6,"id":"7f231b9d_b1fb32bf","line":547,"range":{"start_line":547,"start_character":11,"end_line":547,"end_character":55},"in_reply_to":"7f231b9d_4cfa11bd","updated":"2017-06-16 08:08:23.000000000","message":"Fair enough, thanks for taking the initiative and making the change!","commit_id":"c3c47b6f96c121729a472c1da6051a65d31bcc02"}],"ironic/tests/unit/common/test_network.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                                           name\u003d\u0027pg2\u0027)"},{"line_number":167,"context_line":"        with task_manager.acquire(self.context, node.uuid) as task:"},{"line_number":168,"context_line":"            res \u003d network.get_portgroup_by_id(task, portgroup.id)"},{"line_number":169,"context_line":"        self.assertEqual(res.id, portgroup.id)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def test_portgroup_by_id_no_such_portgroup(self):"},{"line_number":172,"context_line":"        node \u003d object_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_e9646124","line":169,"updated":"2017-06-14 15:15:11.000000000","message":"This and the other self.assert*() below, look like they ought to be reversed. It should be self.assert*(expected, actual), so self.assertEqual(portgroup.id, res.id)","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                                           name\u003d\u0027pg2\u0027)"},{"line_number":167,"context_line":"        with task_manager.acquire(self.context, node.uuid) as task:"},{"line_number":168,"context_line":"            res \u003d network.get_portgroup_by_id(task, portgroup.id)"},{"line_number":169,"context_line":"        self.assertEqual(res.id, portgroup.id)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def test_portgroup_by_id_no_such_portgroup(self):"},{"line_number":172,"context_line":"        node \u003d object_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_0ae88fdf","line":169,"in_reply_to":"7f231b9d_e9646124","updated":"2017-06-15 11:47:58.000000000","message":"Doh.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"}],"ironic/tests/unit/conductor/test_manager.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":3169,"context_line":"        self.assertEqual({\u0027foo\u0027: \u0027bar\u0027}, res.extra)"},{"line_number":3170,"context_line":"        res \u003d objects.Port.get_by_uuid(self.context, port[\u0027uuid\u0027])"},{"line_number":3171,"context_line":"        self.assertEqual({\u0027foo\u0027: \u0027bar\u0027}, res.extra)"},{"line_number":3172,"context_line":"        mock_validate.assert_called_once_with(mock.ANY, mock.ANY)"},{"line_number":3173,"context_line":""},{"line_number":3174,"context_line":"    def test_create_port_node_locked(self):"},{"line_number":3175,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_e94d819a","line":3172,"updated":"2017-06-14 15:15:11.000000000","message":"isn\u0027t the 2nd mock.ANY \u003d\u003d port?","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":3169,"context_line":"        self.assertEqual({\u0027foo\u0027: \u0027bar\u0027}, res.extra)"},{"line_number":3170,"context_line":"        res \u003d objects.Port.get_by_uuid(self.context, port[\u0027uuid\u0027])"},{"line_number":3171,"context_line":"        self.assertEqual({\u0027foo\u0027: \u0027bar\u0027}, res.extra)"},{"line_number":3172,"context_line":"        mock_validate.assert_called_once_with(mock.ANY, mock.ANY)"},{"line_number":3173,"context_line":""},{"line_number":3174,"context_line":"    def test_create_port_node_locked(self):"},{"line_number":3175,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_4a968740","line":3172,"in_reply_to":"7f231b9d_e94d819a","updated":"2017-06-15 11:47:58.000000000","message":"Done","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":3247,"context_line":"        self.assertEqual(new_extra, res.extra)"},{"line_number":3248,"context_line":"        mock_val.assert_called_once_with(mock.ANY, mock.ANY)"},{"line_number":3249,"context_line":"        mock_pc.assert_called_once_with(mock.ANY, mock.ANY, port)"},{"line_number":3250,"context_line":"        mock_vpp.assert_called_once_with(mock.ANY, mock.ANY)"},{"line_number":3251,"context_line":""},{"line_number":3252,"context_line":"    def test_update_port_node_locked(self):"},{"line_number":3253,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_ac6d57cd","line":3250,"updated":"2017-06-14 15:15:11.000000000","message":"ditto","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":3247,"context_line":"        self.assertEqual(new_extra, res.extra)"},{"line_number":3248,"context_line":"        mock_val.assert_called_once_with(mock.ANY, mock.ANY)"},{"line_number":3249,"context_line":"        mock_pc.assert_called_once_with(mock.ANY, mock.ANY, port)"},{"line_number":3250,"context_line":"        mock_vpp.assert_called_once_with(mock.ANY, mock.ANY)"},{"line_number":3251,"context_line":""},{"line_number":3252,"context_line":"    def test_update_port_node_locked(self):"},{"line_number":3253,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_2a9b4b66","line":3250,"in_reply_to":"7f231b9d_ac6d57cd","updated":"2017-06-15 11:47:58.000000000","message":"Done","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":3453,"context_line":"                                self.service.update_port,"},{"line_number":3454,"context_line":"                                self.context, port)"},{"line_number":3455,"context_line":"        # Compare true exception hidden by @messaging.expected_exceptions"},{"line_number":3456,"context_line":"        self.assertEqual(exception.Conflict, exc.exc_info[0])"},{"line_number":3457,"context_line":""},{"line_number":3458,"context_line":"    @mock.patch.object(conductor_utils, \u0027validate_port_physnet\u0027)"},{"line_number":3459,"context_line":"    def test_update_port_physnet_validation_failure_inconsistent("}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_2c9ca768","line":3456,"updated":"2017-06-14 15:15:11.000000000","message":"it is probably fine, but would be good to check that mock_validate was called.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":3453,"context_line":"                                self.service.update_port,"},{"line_number":3454,"context_line":"                                self.context, port)"},{"line_number":3455,"context_line":"        # Compare true exception hidden by @messaging.expected_exceptions"},{"line_number":3456,"context_line":"        self.assertEqual(exception.Conflict, exc.exc_info[0])"},{"line_number":3457,"context_line":""},{"line_number":3458,"context_line":"    @mock.patch.object(conductor_utils, \u0027validate_port_physnet\u0027)"},{"line_number":3459,"context_line":"    def test_update_port_physnet_validation_failure_inconsistent("}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_ea5d5347","line":3456,"in_reply_to":"7f231b9d_2c9ca768","updated":"2017-06-15 11:47:58.000000000","message":"Done","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"}],"ironic/tests/unit/conductor/test_utils.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"        # a portgroup_id attribute in this case."},{"line_number":1002,"context_line":"        del port.portgroup_id"},{"line_number":1003,"context_line":"        with task_manager.acquire(self.context, node.uuid) as task:"},{"line_number":1004,"context_line":"            conductor_utils.validate_port_physnet(task, port)"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"    def test_validate_port_physnet_no_portgroup_update(self):"},{"line_number":1007,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_0c020b0c","line":1004,"updated":"2017-06-14 15:15:11.000000000","message":"Are you showing that the method doesn\u0027t get to the delta\u003dport_obj.obj_what_changed() call? If so, might be good to just mock that and check that it wasn\u0027t called...","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"        # a portgroup_id attribute in this case."},{"line_number":1002,"context_line":"        del port.portgroup_id"},{"line_number":1003,"context_line":"        with task_manager.acquire(self.context, node.uuid) as task:"},{"line_number":1004,"context_line":"            conductor_utils.validate_port_physnet(task, port)"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"    def test_validate_port_physnet_no_portgroup_update(self):"},{"line_number":1007,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_4a11e75c","line":1004,"in_reply_to":"7f231b9d_0c020b0c","updated":"2017-06-15 11:47:58.000000000","message":"I was treating it as more of a black box than that really, just showing that it\u0027s validated correctly. I\u0027ll add a check for the early returns.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":1008,"context_line":"        port \u003d obj_utils.create_test_port(self.context, node_id\u003dnode.id)"},{"line_number":1009,"context_line":"        port.extra \u003d {\u0027foo\u0027: \u0027bar\u0027}"},{"line_number":1010,"context_line":"        with task_manager.acquire(self.context, node.uuid) as task:"},{"line_number":1011,"context_line":"            conductor_utils.validate_port_physnet(task, port)"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"    def test_validate_port_physnet_inconsistent_physnets(self):"},{"line_number":1014,"context_line":"        # NOTE(mgoddard): This *shouldn\u0027t* happen, but let\u0027s make sure we can"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_ef00e103","line":1011,"updated":"2017-06-14 15:15:11.000000000","message":"I\u0027m guessing you\u0027re testing for the not delta \u0026 {\u0027portgroup_id\u0027, ...} line. You could mock/check that network.get_ports_by_portgroup_id() wasn\u0027t called.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":1008,"context_line":"        port \u003d obj_utils.create_test_port(self.context, node_id\u003dnode.id)"},{"line_number":1009,"context_line":"        port.extra \u003d {\u0027foo\u0027: \u0027bar\u0027}"},{"line_number":1010,"context_line":"        with task_manager.acquire(self.context, node.uuid) as task:"},{"line_number":1011,"context_line":"            conductor_utils.validate_port_physnet(task, port)"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"    def test_validate_port_physnet_inconsistent_physnets(self):"},{"line_number":1014,"context_line":"        # NOTE(mgoddard): This *shouldn\u0027t* happen, but let\u0027s make sure we can"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_0a0f6f37","line":1011,"in_reply_to":"7f231b9d_ef00e103","updated":"2017-06-15 11:47:58.000000000","message":"As above.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def test_validate_port_physnet_inconsistent_physnets_fix(self):"},{"line_number":1041,"context_line":"        # NOTE(mgoddard): This *shouldn\u0027t* happen, but let\u0027s make sure we can"},{"line_number":1042,"context_line":"        # handle it."},{"line_number":1043,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"},{"line_number":1044,"context_line":"        portgroup \u003d obj_utils.create_test_portgroup(self.context,"},{"line_number":1045,"context_line":"                                                    node_id\u003dnode.id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_4f20f548","line":1042,"updated":"2017-06-14 15:15:11.000000000","message":"it took me a few secs to figure out what the \u0027fix\u0027 meant. I don\u0027t actually think this test is useful because you put it in a bad state and then showed that this would work, but really, we don\u0027t care if it works or not, it is in a bad state which it shouldn\u0027t be.\n\nAnyway, if you want this test, I think this NOTE should be clearer, since it is the same NOTE as above, but the above test is explicitly covered in your code, and this isn\u0027t so there isn\u0027t any context as to what you are trying to test w/o reading in detail each line of this test.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def test_validate_port_physnet_inconsistent_physnets_fix(self):"},{"line_number":1041,"context_line":"        # NOTE(mgoddard): This *shouldn\u0027t* happen, but let\u0027s make sure we can"},{"line_number":1042,"context_line":"        # handle it."},{"line_number":1043,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"},{"line_number":1044,"context_line":"        portgroup \u003d obj_utils.create_test_portgroup(self.context,"},{"line_number":1045,"context_line":"                                                    node_id\u003dnode.id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_ada655aa","line":1042,"in_reply_to":"7f231b9d_4f20f548","updated":"2017-06-15 11:47:58.000000000","message":"I agree this is on the edge of what would be expected to work but as the code supports it it seems nice to test that we can resolve the condition without editing the DB (although I suppose you could always remove the port from the portgroup).\n\nFair point on the note, I\u0027ve updated it.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"        :param num_current_ports: Number of existing ports in the portgroup."},{"line_number":1070,"context_line":"        :param current_physnet: Physical network of existing ports in the"},{"line_number":1071,"context_line":"                                portgroup."},{"line_number":1072,"context_line":"        :param operation: The operation to perform. One of \u0027create\u0027, \u0027update\u0027,"},{"line_number":1073,"context_line":"                          or \u0027update_add\u0027. create creates a new port and adds"},{"line_number":1074,"context_line":"                          it to the portgroup. update updates one of the"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_6fcdf164","line":1071,"updated":"2017-06-14 15:15:11.000000000","message":"when do you use \u0027new_physnet\u0027?","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"        :param num_current_ports: Number of existing ports in the portgroup."},{"line_number":1070,"context_line":"        :param current_physnet: Physical network of existing ports in the"},{"line_number":1071,"context_line":"                                portgroup."},{"line_number":1072,"context_line":"        :param operation: The operation to perform. One of \u0027create\u0027, \u0027update\u0027,"},{"line_number":1073,"context_line":"                          or \u0027update_add\u0027. create creates a new port and adds"},{"line_number":1074,"context_line":"                          it to the portgroup. update updates one of the"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_6de39dda","line":1071,"in_reply_to":"7f231b9d_6fcdf164","updated":"2017-06-15 11:47:58.000000000","message":"Done","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":1073,"context_line":"                          or \u0027update_add\u0027. create creates a new port and adds"},{"line_number":1074,"context_line":"                          it to the portgroup. update updates one of the"},{"line_number":1075,"context_line":"                          existing ports. update_add updates a port and adds it"},{"line_number":1076,"context_line":"                          to the portgroup."},{"line_number":1077,"context_line":"        :param valid: Whether the operation is expected to succeed."},{"line_number":1078,"context_line":"        \"\"\""},{"line_number":1079,"context_line":"        # Prepare existing resources - a node, and optionally a portgroup with"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_efa221ae","line":1076,"updated":"2017-06-14 15:15:11.000000000","message":"nit, would be easier to read if you put \u0027\u0027 around \u0027create\u0027, \u0027update\u0027, and \u0027update_add\u0027 when you are referring to them as the value of the operation.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":1073,"context_line":"                          or \u0027update_add\u0027. create creates a new port and adds"},{"line_number":1074,"context_line":"                          it to the portgroup. update updates one of the"},{"line_number":1075,"context_line":"                          existing ports. update_add updates a port and adds it"},{"line_number":1076,"context_line":"                          to the portgroup."},{"line_number":1077,"context_line":"        :param valid: Whether the operation is expected to succeed."},{"line_number":1078,"context_line":"        \"\"\""},{"line_number":1079,"context_line":"        # Prepare existing resources - a node, and optionally a portgroup with"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_4de461e0","line":1076,"in_reply_to":"7f231b9d_efa221ae","updated":"2017-06-15 11:47:58.000000000","message":"Good point.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":1076,"context_line":"                          to the portgroup."},{"line_number":1077,"context_line":"        :param valid: Whether the operation is expected to succeed."},{"line_number":1078,"context_line":"        \"\"\""},{"line_number":1079,"context_line":"        # Prepare existing resources - a node, and optionally a portgroup with"},{"line_number":1080,"context_line":"        # existing ports."},{"line_number":1081,"context_line":"        port \u003d None"},{"line_number":1082,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_efdea10f","line":1079,"updated":"2017-06-14 15:15:11.000000000","message":"doesn\u0027t look like the portgroup is optional?","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":1076,"context_line":"                          to the portgroup."},{"line_number":1077,"context_line":"        :param valid: Whether the operation is expected to succeed."},{"line_number":1078,"context_line":"        \"\"\""},{"line_number":1079,"context_line":"        # Prepare existing resources - a node, and optionally a portgroup with"},{"line_number":1080,"context_line":"        # existing ports."},{"line_number":1081,"context_line":"        port \u003d None"},{"line_number":1082,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_cdd751ee","line":1079,"in_reply_to":"7f231b9d_efdea10f","updated":"2017-06-15 11:47:58.000000000","message":"Done","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"        # Prepare existing resources - a node, and optionally a portgroup with"},{"line_number":1080,"context_line":"        # existing ports."},{"line_number":1081,"context_line":"        port \u003d None"},{"line_number":1082,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"},{"line_number":1083,"context_line":"        portgroup \u003d obj_utils.create_test_portgroup(self.context,"},{"line_number":1084,"context_line":"                                                    node_id\u003dnode.id)"},{"line_number":1085,"context_line":"        macs \u003d (\"00:11:22:33:44:%02x\" % index for index in range(256))"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_6fa4d1a6","line":1082,"updated":"2017-06-14 15:15:11.000000000","message":"I did wonder why you didn\u0027t add a setUp() method with this, but maybe not worth it just to create the node.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"        # Prepare existing resources - a node, and optionally a portgroup with"},{"line_number":1080,"context_line":"        # existing ports."},{"line_number":1081,"context_line":"        port \u003d None"},{"line_number":1082,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"},{"line_number":1083,"context_line":"        portgroup \u003d obj_utils.create_test_portgroup(self.context,"},{"line_number":1084,"context_line":"                                                    node_id\u003dnode.id)"},{"line_number":1085,"context_line":"        macs \u003d (\"00:11:22:33:44:%02x\" % index for index in range(256))"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_6d683d1c","line":1082,"in_reply_to":"7f231b9d_6fa4d1a6","updated":"2017-06-15 11:47:58.000000000","message":"Pass - it now has one :)","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":1082,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"},{"line_number":1083,"context_line":"        portgroup \u003d obj_utils.create_test_portgroup(self.context,"},{"line_number":1084,"context_line":"                                                    node_id\u003dnode.id)"},{"line_number":1085,"context_line":"        macs \u003d (\"00:11:22:33:44:%02x\" % index for index in range(256))"},{"line_number":1086,"context_line":"        for _ in range(num_current_ports):"},{"line_number":1087,"context_line":"            port \u003d obj_utils.create_test_port("},{"line_number":1088,"context_line":"                self.context, node_id\u003dnode.id, portgroup_id\u003dportgroup.id,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_0f02fd0b","line":1085,"updated":"2017-06-14 15:15:11.000000000","message":"it probably doesn\u0027t matter, but we need at most num_current_ports+1 mac addresses. I\u0027m guessing in your tests, it doesn\u0027t exceed 256 but I had to wonder why you picked 256...","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":1082,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"},{"line_number":1083,"context_line":"        portgroup \u003d obj_utils.create_test_portgroup(self.context,"},{"line_number":1084,"context_line":"                                                    node_id\u003dnode.id)"},{"line_number":1085,"context_line":"        macs \u003d (\"00:11:22:33:44:%02x\" % index for index in range(256))"},{"line_number":1086,"context_line":"        for _ in range(num_current_ports):"},{"line_number":1087,"context_line":"            port \u003d obj_utils.create_test_port("},{"line_number":1088,"context_line":"                self.context, node_id\u003dnode.id, portgroup_id\u003dportgroup.id,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_cd8f51cb","line":1085,"in_reply_to":"7f231b9d_0f02fd0b","updated":"2017-06-15 11:47:58.000000000","message":"That\u0027s true, I guess 256 looked cleaner. Perhaps a little less intuitive though. I\u0027ve changed it.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"3727c66cb9b23ed77f6bd826d7f5e2d52ff79164","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"                uuid\u003duuidutils.generate_uuid())"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        # Perform the required operation - create or update a port."},{"line_number":1098,"context_line":"        if operation \u003d\u003d \u0027create\u0027:"},{"line_number":1099,"context_line":"            kwargs \u003d {}"},{"line_number":1100,"context_line":"            if new_physnet is not None:"},{"line_number":1101,"context_line":"                # NOTE(mgoddard): The port object passed to the conductor will"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_c4f638fa","line":1098,"range":{"start_line":1098,"start_character":8,"end_line":1098,"end_character":10},"updated":"2017-06-14 12:08:29.000000000","message":"nit: better to use elif as operation can be only one of.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"a29a31959b7755234ad55548611073527c3fb5f6","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"                uuid\u003duuidutils.generate_uuid())"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        # Perform the required operation - create or update a port."},{"line_number":1098,"context_line":"        if operation \u003d\u003d \u0027create\u0027:"},{"line_number":1099,"context_line":"            kwargs \u003d {}"},{"line_number":1100,"context_line":"            if new_physnet is not None:"},{"line_number":1101,"context_line":"                # NOTE(mgoddard): The port object passed to the conductor will"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_86483a87","line":1098,"range":{"start_line":1098,"start_character":8,"end_line":1098,"end_character":10},"in_reply_to":"7f231b9d_265286df","updated":"2017-06-14 13:51:21.000000000","message":"I could do, just conceptually it breaks the flow of the test IMHO. There are 3 phases:\n\n1. create existing resources\n2. perform the required create/update operation\n3. validate\n\nDoes that make sense to you?","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5c6cdd540b41e9b9bdeff4835b4145f7d3404d76","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"                uuid\u003duuidutils.generate_uuid())"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        # Perform the required operation - create or update a port."},{"line_number":1098,"context_line":"        if operation \u003d\u003d \u0027create\u0027:"},{"line_number":1099,"context_line":"            kwargs \u003d {}"},{"line_number":1100,"context_line":"            if new_physnet is not None:"},{"line_number":1101,"context_line":"                # NOTE(mgoddard): The port object passed to the conductor will"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_265286df","line":1098,"range":{"start_line":1098,"start_character":8,"end_line":1098,"end_character":10},"in_reply_to":"7f231b9d_7c3c94c7","updated":"2017-06-14 13:39:04.000000000","message":"hm... why not move L1111 after L1095?","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"39e73175488219bd84c14a123c66e9e96e3d5e22","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"                uuid\u003duuidutils.generate_uuid())"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        # Perform the required operation - create or update a port."},{"line_number":1098,"context_line":"        if operation \u003d\u003d \u0027create\u0027:"},{"line_number":1099,"context_line":"            kwargs \u003d {}"},{"line_number":1100,"context_line":"            if new_physnet is not None:"},{"line_number":1101,"context_line":"                # NOTE(mgoddard): The port object passed to the conductor will"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_fabd41d8","line":1098,"range":{"start_line":1098,"start_character":8,"end_line":1098,"end_character":10},"in_reply_to":"7f231b9d_86483a87","updated":"2017-06-14 15:23:55.000000000","message":"yes, but i think it makes more sense to 1. create existing resources that are needed for all three cases; 2. then do the special stuff needed for the three operations; 3. then validate :-)","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"c536c85cba4c36869d27d8324a8b9b6ede96880d","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"                uuid\u003duuidutils.generate_uuid())"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        # Perform the required operation - create or update a port."},{"line_number":1098,"context_line":"        if operation \u003d\u003d \u0027create\u0027:"},{"line_number":1099,"context_line":"            kwargs \u003d {}"},{"line_number":1100,"context_line":"            if new_physnet is not None:"},{"line_number":1101,"context_line":"                # NOTE(mgoddard): The port object passed to the conductor will"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_7c3c94c7","line":1098,"range":{"start_line":1098,"start_character":8,"end_line":1098,"end_character":10},"in_reply_to":"7f231b9d_c4f638fa","updated":"2017-06-14 13:06:11.000000000","message":"There are 3 possible values for \u0027operation\u0027 and we need to match update_add in the else block and the preceding if block.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"                uuid\u003duuidutils.generate_uuid())"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        # Perform the required operation - create or update a port."},{"line_number":1098,"context_line":"        if operation \u003d\u003d \u0027create\u0027:"},{"line_number":1099,"context_line":"            kwargs \u003d {}"},{"line_number":1100,"context_line":"            if new_physnet is not None:"},{"line_number":1101,"context_line":"                # NOTE(mgoddard): The port object passed to the conductor will"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_8d32790f","line":1098,"range":{"start_line":1098,"start_character":8,"end_line":1098,"end_character":10},"in_reply_to":"7f231b9d_fabd41d8","updated":"2017-06-15 11:47:58.000000000","message":"I disagree. It\u0027s good to frame things in terms of the flow of operations that we\u0027re modelling, not just the flow of the code. \n\nWe work in a democracy and it\u0027s just a unit test so I\u0027ll go with the majority here (ignores the urge to reference recent politics :-)).","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":1099,"context_line":"            kwargs \u003d {}"},{"line_number":1100,"context_line":"            if new_physnet is not None:"},{"line_number":1101,"context_line":"                # NOTE(mgoddard): The port object passed to the conductor will"},{"line_number":1102,"context_line":"                # not have a physical_network attribute in this case."},{"line_number":1103,"context_line":"                kwargs[\"physical_network\"] \u003d new_physnet"},{"line_number":1104,"context_line":"            port \u003d obj_utils.get_test_port("},{"line_number":1105,"context_line":"                self.context, node_id\u003dnode.id, portgroup_id\u003dportgroup.id,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_2ffb7947","line":1102,"updated":"2017-06-14 15:15:11.000000000","message":"I\u0027m not sure I understand, aren\u0027t you adding a physical network to the port?","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":1099,"context_line":"            kwargs \u003d {}"},{"line_number":1100,"context_line":"            if new_physnet is not None:"},{"line_number":1101,"context_line":"                # NOTE(mgoddard): The port object passed to the conductor will"},{"line_number":1102,"context_line":"                # not have a physical_network attribute in this case."},{"line_number":1103,"context_line":"                kwargs[\"physical_network\"] \u003d new_physnet"},{"line_number":1104,"context_line":"            port \u003d obj_utils.get_test_port("},{"line_number":1105,"context_line":"                self.context, node_id\u003dnode.id, portgroup_id\u003dportgroup.id,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_0d054946","line":1102,"in_reply_to":"7f231b9d_2ffb7947","updated":"2017-06-15 11:47:58.000000000","message":"I think this comment got forgotten during some refactoring. It\u0027s now gone after another refactor to better model the Port create use case.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"857ad6a8eb704ac3909c0805b91386bb296f78a8","unresolved":false,"context_lines":[{"line_number":1104,"context_line":"            port \u003d obj_utils.get_test_port("},{"line_number":1105,"context_line":"                self.context, node_id\u003dnode.id, portgroup_id\u003dportgroup.id,"},{"line_number":1106,"context_line":"                address\u003dnext(macs), uuid\u003duuidutils.generate_uuid(), **kwargs)"},{"line_number":1107,"context_line":"        else:"},{"line_number":1108,"context_line":"            if new_physnet !\u003d current_physnet:"},{"line_number":1109,"context_line":"                port.physical_network \u003d new_physnet"},{"line_number":1110,"context_line":"            if operation \u003d\u003d \u0027update_add\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_ef1b417e","line":1107,"updated":"2017-06-14 15:15:11.000000000","message":"I can see why Vasyl asked his question. I would suggest that you move L1091-1095 inside this else, and put L1111 inside the moved \u0027if\u0027. (Does that make sense?)","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"9542505dcf0ed0b3028ccff613dafe4b62310d5e","unresolved":false,"context_lines":[{"line_number":1104,"context_line":"            port \u003d obj_utils.get_test_port("},{"line_number":1105,"context_line":"                self.context, node_id\u003dnode.id, portgroup_id\u003dportgroup.id,"},{"line_number":1106,"context_line":"                address\u003dnext(macs), uuid\u003duuidutils.generate_uuid(), **kwargs)"},{"line_number":1107,"context_line":"        else:"},{"line_number":1108,"context_line":"            if new_physnet !\u003d current_physnet:"},{"line_number":1109,"context_line":"                port.physical_network \u003d new_physnet"},{"line_number":1110,"context_line":"            if operation \u003d\u003d \u0027update_add\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_d0b5a833","line":1107,"in_reply_to":"7f231b9d_ef1b417e","updated":"2017-06-15 11:47:58.000000000","message":"Done","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"3727c66cb9b23ed77f6bd826d7f5e2d52ff79164","unresolved":false,"context_lines":[{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"    def test_validate_port_physnet_2_port_portgroup_w_physnet_update_2(self):"},{"line_number":1286,"context_line":"        self._test_validate_port_physnet_update("},{"line_number":1287,"context_line":"            num_current_ports\u003d2,"},{"line_number":1288,"context_line":"            current_physnet\u003d\u0027physnet1\u0027,"},{"line_number":1289,"context_line":"            new_physnet\u003d\u0027physnet2\u0027,"},{"line_number":1290,"context_line":"            valid\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_464b4558","line":1287,"updated":"2017-06-14 12:08:29.000000000","message":"result of validate_physnet will be the seme for cases when portgroup has 1 and more ports. Not sure that we need a separate tests for this cases.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"c536c85cba4c36869d27d8324a8b9b6ede96880d","unresolved":false,"context_lines":[{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"    def test_validate_port_physnet_2_port_portgroup_w_physnet_update_2(self):"},{"line_number":1286,"context_line":"        self._test_validate_port_physnet_update("},{"line_number":1287,"context_line":"            num_current_ports\u003d2,"},{"line_number":1288,"context_line":"            current_physnet\u003d\u0027physnet1\u0027,"},{"line_number":1289,"context_line":"            new_physnet\u003d\u0027physnet2\u0027,"},{"line_number":1290,"context_line":"            valid\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_bc70eca6","line":1287,"in_reply_to":"7f231b9d_464b4558","updated":"2017-06-14 13:06:11.000000000","message":"It\u0027s not quite the same if we\u0027re updating an existing port. If there\u0027s only one port we can change it\u0027s physnet but if there are 2 we can\u0027t change one of their physnets.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"5c6cdd540b41e9b9bdeff4835b4145f7d3404d76","unresolved":false,"context_lines":[{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"    def test_validate_port_physnet_2_port_portgroup_w_physnet_update_2(self):"},{"line_number":1286,"context_line":"        self._test_validate_port_physnet_update("},{"line_number":1287,"context_line":"            num_current_ports\u003d2,"},{"line_number":1288,"context_line":"            current_physnet\u003d\u0027physnet1\u0027,"},{"line_number":1289,"context_line":"            new_physnet\u003d\u0027physnet2\u0027,"},{"line_number":1290,"context_line":"            valid\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f231b9d_a681f6fd","line":1287,"in_reply_to":"7f231b9d_bc70eca6","updated":"2017-06-14 13:39:04.000000000","message":"right my bad.","commit_id":"45026b83085bff9698af85c25a83760b0d3a18ed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7dace6429a2086c74308d92d609a41286c50330e","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"                                portgroup."},{"line_number":1080,"context_line":"        :param new_physnet: Physical network to set on the port that is being"},{"line_number":1081,"context_line":"                            created or updated."},{"line_number":1082,"context_line":"                            portgroup."},{"line_number":1083,"context_line":"        :param operation: The operation to perform. One of \u0027create\u0027, \u0027update\u0027,"},{"line_number":1084,"context_line":"                          or \u0027update_add\u0027. \u0027create\u0027 creates a new port and adds"},{"line_number":1085,"context_line":"                          it to the portgroup. \u0027update\u0027 updates one of the"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f231b9d_3eb01f8a","line":1082,"updated":"2017-06-15 20:17:15.000000000","message":"nit: i think you don\u0027t want this line.","commit_id":"c3c47b6f96c121729a472c1da6051a65d31bcc02"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"dba42cf8e0ec864b1e4b51e30608bb310e854f14","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"                                portgroup."},{"line_number":1080,"context_line":"        :param new_physnet: Physical network to set on the port that is being"},{"line_number":1081,"context_line":"                            created or updated."},{"line_number":1082,"context_line":"                            portgroup."},{"line_number":1083,"context_line":"        :param operation: The operation to perform. One of \u0027create\u0027, \u0027update\u0027,"},{"line_number":1084,"context_line":"                          or \u0027update_add\u0027. \u0027create\u0027 creates a new port and adds"},{"line_number":1085,"context_line":"                          it to the portgroup. \u0027update\u0027 updates one of the"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f231b9d_91c9565a","line":1082,"in_reply_to":"7f231b9d_3eb01f8a","updated":"2017-06-16 09:24:37.000000000","message":"Eagle-eyed as always Ruby. Removed here: https://review.openstack.org/#/c/474921/","commit_id":"c3c47b6f96c121729a472c1da6051a65d31bcc02"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7dace6429a2086c74308d92d609a41286c50330e","unresolved":false,"context_lines":[{"line_number":1104,"context_line":""},{"line_number":1105,"context_line":"        # Prepare the port on which we are performing the operation."},{"line_number":1106,"context_line":"        if operation \u003d\u003d \u0027create\u0027:"},{"line_number":1107,"context_line":"            # NOTE(mgoddard): We use utils here rather than obj_utils as it"},{"line_number":1108,"context_line":"            # allows us to create a Port without a physical_network field, more"},{"line_number":1109,"context_line":"            # closely matching what happens during creation of a port when a"},{"line_number":1110,"context_line":"            # physical_network is not specified."}],"source_content_type":"text/x-python","patch_set":6,"id":"7f231b9d_de4dab9a","line":1107,"updated":"2017-06-15 20:17:15.000000000","message":"could i shoot the person that used \u0027utils\u0027 instead of db_utils? :-)","commit_id":"c3c47b6f96c121729a472c1da6051a65d31bcc02"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"dba42cf8e0ec864b1e4b51e30608bb310e854f14","unresolved":false,"context_lines":[{"line_number":1104,"context_line":""},{"line_number":1105,"context_line":"        # Prepare the port on which we are performing the operation."},{"line_number":1106,"context_line":"        if operation \u003d\u003d \u0027create\u0027:"},{"line_number":1107,"context_line":"            # NOTE(mgoddard): We use utils here rather than obj_utils as it"},{"line_number":1108,"context_line":"            # allows us to create a Port without a physical_network field, more"},{"line_number":1109,"context_line":"            # closely matching what happens during creation of a port when a"},{"line_number":1110,"context_line":"            # physical_network is not specified."}],"source_content_type":"text/x-python","patch_set":6,"id":"7f231b9d_d1b34ee8","line":1107,"in_reply_to":"7f231b9d_de4dab9a","updated":"2017-06-16 09:24:37.000000000","message":"You could, but there are probably better causes...\n\nTo save you from prison time I\u0027ve changed it outside of the ironic.tests.unit.db submodules: https://review.openstack.org/#/c/474918.","commit_id":"c3c47b6f96c121729a472c1da6051a65d31bcc02"}]}
