)]}'
{"neutron/db/migration/alembic_migrations/versions/HEADS":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"500489967915c73c33ff2451d8f2ee8a15946d89","unresolved":false,"context_lines":[{"line_number":1,"context_line":"2e5352a0ad4d"},{"line_number":2,"context_line":"b6fcda956b37"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"fa80f949_bb7c6221","line":2,"updated":"2015-11-03 19:58:39.000000000","message":"HEADS file doesn\u0027t exist anymore.  Revision ID should go in neutron/db/migration/alembic_migrations/EXPAND_HEAD.","commit_id":"fd1bbda2b1fd416d341941e0b9510b77b556911b"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"8d6d92b0c0e8cdd7babc6ea889782ec0fa4025c5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"2e5352a0ad4d"},{"line_number":2,"context_line":"b6fcda956b37"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"da85f559_ae19378a","line":2,"in_reply_to":"fa80f949_bb7c6221","updated":"2015-11-10 09:58:35.000000000","message":"+1","commit_id":"fd1bbda2b1fd416d341941e0b9510b77b556911b"}],"neutron/db/migration/alembic_migrations/versions/liberty/expand/b6fcda956b37_trunk_port.py":[{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"a3f95d0b817fe2dd0d59cc127e0ed8122fd463d5","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            sa.String(length\u003d32),"},{"line_number":35,"context_line":"            nullable\u003dFalse,"},{"line_number":36,"context_line":"            unique\u003dTrue),"},{"line_number":37,"context_line":"        sa.Column(\u0027device_id\u0027,"},{"line_number":38,"context_line":"            sa.String(length\u003dattr.DEVICE_ID_MAX_LEN),"},{"line_number":39,"context_line":"            nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.Column(\u0027device_owner\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_790f7ce1","line":37,"updated":"2015-08-25 07:04:06.000000000","message":"is the device_id suppose to be the port_id in Neutron?\nor is that just one case of device id?\n\nIf not, what  does the connection to the Neutron port id, for example for OVN there is a use case that the trunk port is the VM port, and sub ports for nested containers inside the VM.","commit_id":"c5a3632cff70575ae2c190a3e448e015c35b9248"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"d556038e6d5ee755f2381d106293704ecbf6cf25","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            sa.String(length\u003d32),"},{"line_number":35,"context_line":"            nullable\u003dFalse,"},{"line_number":36,"context_line":"            unique\u003dTrue),"},{"line_number":37,"context_line":"        sa.Column(\u0027device_id\u0027,"},{"line_number":38,"context_line":"            sa.String(length\u003dattr.DEVICE_ID_MAX_LEN),"},{"line_number":39,"context_line":"            nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.Column(\u0027device_owner\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_4fe8a37c","line":37,"in_reply_to":"fa1b9901_790f7ce1","updated":"2015-08-25 09:11:35.000000000","message":"The plan is to use the device_owner and device_id attributes of a trunk port as they were used for plain old ports. So they express the relation between the trunk port and the VM using this trunk port. For example\n\n trunk port attributes:\n device_owner\u003dnova:compute\n device_id\u003dUUID_OF_THE_INSTANCE\n\nThe relation between a trunk port and its subports will be expressed in the attributes of the same name of the _subport_. For example:\n\n subport attributes (for all relevant subports):\n device_owner\u003dnetwork:trunk-port\n device_id\u003dUUID_OF_THE_TRUNK_PORT","commit_id":"c5a3632cff70575ae2c190a3e448e015c35b9248"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"d845d9f8f33bdfe45616f905a0f1d5fff09fbde4","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            sa.String(length\u003d16),"},{"line_number":51,"context_line":"            nullable\u003dFalse),"},{"line_number":52,"context_line":"        sa.Column(\u0027tenant_id\u0027,"},{"line_number":53,"context_line":"            sa.String(length\u003d255),"},{"line_number":54,"context_line":"            nullable\u003dTrue,"},{"line_number":55,"context_line":"            index\u003dTrue),"},{"line_number":56,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_00058b44","line":53,"updated":"2015-11-10 22:23:07.000000000","message":"There is a TENANT_ID_MAX_LEN","commit_id":"fd1bbda2b1fd416d341941e0b9510b77b556911b"}],"neutron/db/trunk_port_models.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ed04d88d111002927b7dc0eacaf07a5f190625a8","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    __tablename__ \u003d \u0027trunk_ports\u0027"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    admin_state_up \u003d sa.Column("},{"line_number":26,"context_line":"        sa.Boolean(),"},{"line_number":27,"context_line":"        nullable\u003dFalse)"},{"line_number":28,"context_line":"    mac_address \u003d sa.Column("}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_2ec28134","line":25,"updated":"2015-08-13 13:42:41.000000000","message":"A line can accommodate max of 80 chars. Request you to avoid unnecessary line breaks.","commit_id":"d8a6842d2505b9031a7cf1d1883b7f686b2c3c39"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"dfc1597013c18d39ca7331eb27fb36a43f7a1593","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    __tablename__ \u003d \u0027trunk_ports\u0027"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    admin_state_up \u003d sa.Column("},{"line_number":26,"context_line":"        sa.Boolean(),"},{"line_number":27,"context_line":"        nullable\u003dFalse)"},{"line_number":28,"context_line":"    mac_address \u003d sa.Column("}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_3075c3ca","line":25,"in_reply_to":"1a4dcd0f_2ec28134","updated":"2015-08-18 13:05:55.000000000","message":"Done","commit_id":"d8a6842d2505b9031a7cf1d1883b7f686b2c3c39"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"a3f95d0b817fe2dd0d59cc127e0ed8122fd463d5","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    # gre                | 32"},{"line_number":79,"context_line":"    #"},{"line_number":80,"context_line":"    # To support all, we need at least a 32-bit unsigned int."},{"line_number":81,"context_line":"    # FIXME(bence romsics): How big is BigInteger?"},{"line_number":82,"context_line":"    segmentation_id \u003d sa.Column(sa.BigInteger, nullable\u003dTrue)"},{"line_number":83,"context_line":"    # FIXME(bence romsics): Could be an Enum."},{"line_number":84,"context_line":"    segmentation_type \u003d sa.Column(sa.String(32), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_99b7f0f4","line":81,"updated":"2015-08-25 07:04:06.000000000","message":"I dont think we should limit this here to 32, there are newer protocols (STT, Geneve) which are bigger and might even by dynamic in size.\n\nMaybe use string for that","commit_id":"c5a3632cff70575ae2c190a3e448e015c35b9248"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"d556038e6d5ee755f2381d106293704ecbf6cf25","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    # gre                | 32"},{"line_number":79,"context_line":"    #"},{"line_number":80,"context_line":"    # To support all, we need at least a 32-bit unsigned int."},{"line_number":81,"context_line":"    # FIXME(bence romsics): How big is BigInteger?"},{"line_number":82,"context_line":"    segmentation_id \u003d sa.Column(sa.BigInteger, nullable\u003dTrue)"},{"line_number":83,"context_line":"    # FIXME(bence romsics): Could be an Enum."},{"line_number":84,"context_line":"    segmentation_type \u003d sa.Column(sa.String(32), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_8f31db0d","line":81,"in_reply_to":"fa1b9901_99b7f0f4","updated":"2015-08-25 09:11:35.000000000","message":"I happily go for a string, just keep in mind (as IIRC Akihiro suggested before) that we should keep this in sync with the provider:segmentation_* attributes.","commit_id":"c5a3632cff70575ae2c190a3e448e015c35b9248"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"d845d9f8f33bdfe45616f905a0f1d5fff09fbde4","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    # gre                | 32"},{"line_number":79,"context_line":"    #"},{"line_number":80,"context_line":"    # To support all, we need at least a 32-bit unsigned int."},{"line_number":81,"context_line":"    # FIXME(bence romsics): How big is BigInteger?"},{"line_number":82,"context_line":"    segmentation_id \u003d sa.Column(sa.BigInteger, nullable\u003dTrue)"},{"line_number":83,"context_line":"    # FIXME(bence romsics): Could be an Enum."},{"line_number":84,"context_line":"    segmentation_type \u003d sa.Column(sa.String(32), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_c3b78d38","line":81,"updated":"2015-11-10 22:23:07.000000000","message":"Looks like it maps to BIGINT. For MySQL that is an 8 byte integer (versus 4 byte for INT).","commit_id":"fd1bbda2b1fd416d341941e0b9510b77b556911b"}],"neutron/db/trunk_port_trunk.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"c1133f136d55e1088c804e663e22947ff1894e94","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class DefaultMacAddressInUse(n_exc.InUse):"},{"line_number":39,"context_line":"    message \u003d _(\"Unable to complete operation for trunk port: \""},{"line_number":40,"context_line":"                \"The mac address %(mac)s is in use.\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class TrunkPort(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_aacc536a","line":40,"updated":"2015-08-13 05:36:09.000000000","message":"These exception definitions are not related to DB model. It is better to define them in the extension module if it is referred to from the service plugin too.","commit_id":"dd0d6eb30b1dfe46ac26674af01e9d042a764a46"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"c1133f136d55e1088c804e663e22947ff1894e94","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    mac_address \u003d sa.Column("},{"line_number":51,"context_line":"        sa.String(length\u003d32),"},{"line_number":52,"context_line":"        nullable\u003dFalse,"},{"line_number":53,"context_line":"        unique\u003dTrue)"},{"line_number":54,"context_line":"    device_id \u003d sa.Column("},{"line_number":55,"context_line":"        sa.String(length\u003dattr.DEVICE_ID_MAX_LEN),"},{"line_number":56,"context_line":"        nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_ca23df03","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":19},"updated":"2015-08-13 05:36:09.000000000","message":"Is it globally unique?\nIn Neutron, mac_address overlapping is allowed between tenants.\nYou can check the unique constraint for Port table in db/models_v2.py.","commit_id":"dd0d6eb30b1dfe46ac26674af01e9d042a764a46"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"b39ff872c39d4ff6fa82f19dbae7cc524f7ef485","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    mac_address \u003d sa.Column("},{"line_number":51,"context_line":"        sa.String(length\u003d32),"},{"line_number":52,"context_line":"        nullable\u003dFalse,"},{"line_number":53,"context_line":"        unique\u003dTrue)"},{"line_number":54,"context_line":"    device_id \u003d sa.Column("},{"line_number":55,"context_line":"        sa.String(length\u003dattr.DEVICE_ID_MAX_LEN),"},{"line_number":56,"context_line":"        nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_a993f8a1","line":53,"in_reply_to":"1a4dcd0f_ca23df03","updated":"2015-08-13 12:39:05.000000000","message":"Generally speaking it shouldn\u0027t be globally unique. I hope to clean up the currently messy mac address handling code along the lines:\n\nThe mac address of a single-tenant trunk port (the trunk port and all of its belong to the same tenant) should be unique per tenant. That is it should be checked against mac addresses of trunk ports (same tenant) and mac addresses of all ports (all nets of same tenant). Why? Because we cannot predict which networks will be connected by subports added later.\n\nThe converse should be true too: When generating a plain old port, its mac address should be checked not only against other ports on the same net, but trunk ports of the same tenant.\n\nThen there is the special case of the cross-tenant trunk port when the trunk port belongs to admin, but some subports belong to other tenants.\n\n(Note: IMO we should not have a cross-tenant trunk port where the owner the trunk port is not admin, because then we would be leaking mac usage information between two non-admin tenants.)\n\nIn this case we cannot even predict which tenants will be involved, so the mac address of the trunk port should be globally unique (ie. unique in a neutron db). And again the converse: when allocating mac addresses for plain old ports, they should be checked against all global mac addresses.\n\nSo in short I believe we need three levels of uniqueness: per net, per tenant, per db.\n\nWhat do you think?\n\nps. One more note: The spec (bp/vlan-aware-vms) says the mac address of a subport should default to the mac address of the trunk port, but the user should be able to override it. I don\u0027t think this override is a good idea, because we lack (likely by design) the mechanism to tell the guest OS what mac it should use when bringing up a vlan interface.","commit_id":"dd0d6eb30b1dfe46ac26674af01e9d042a764a46"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"c1133f136d55e1088c804e663e22947ff1894e94","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    # FIXME(bence romsics): subport_count: should be a computed field"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class TrunkPortDbMixin(trunk_ext.TrunkPortPluginBase, base_db.CommonDbMixin):"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @property"},{"line_number":72,"context_line":"    def _core_plugin(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_4d04c913","line":69,"updated":"2015-08-13 05:36:09.000000000","message":"It seems this class can be a normal class.","commit_id":"dd0d6eb30b1dfe46ac26674af01e9d042a764a46"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9b7d0adbb97488ebfae19d1570dd67cd2fbad014","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    # FIXME(bence romsics): subport_count: should be a computed field"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class TrunkPortDbMixin(trunk_ext.TrunkPortPluginBase, base_db.CommonDbMixin):"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @property"},{"line_number":72,"context_line":"    def _core_plugin(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_cd3779e1","line":69,"in_reply_to":"1a4dcd0f_4d04c913","updated":"2015-08-13 05:38:49.000000000","message":"After looking at the service plugin, it looks good.","commit_id":"dd0d6eb30b1dfe46ac26674af01e9d042a764a46"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"a3f95d0b817fe2dd0d59cc127e0ed8122fd463d5","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _check_mac_uniqueness_for_ports(self, context, mac):"},{"line_number":82,"context_line":"        # TODO(Lajos Katona): Something similar is needed for plain old ports,"},{"line_number":83,"context_line":"        # or we have to create a common mac table where the mac must be unique"},{"line_number":84,"context_line":"        filters \u003d {\u0027mac_address\u0027: [mac]}"},{"line_number":85,"context_line":"        ports \u003d self._core_plugin.get_ports(context.elevated(), filters)"},{"line_number":86,"context_line":"        if ports:"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_d98b281d","line":83,"updated":"2015-08-25 07:04:06.000000000","message":"Why the MAC need to be unique across networks?","commit_id":"c5a3632cff70575ae2c190a3e448e015c35b9248"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"d556038e6d5ee755f2381d106293704ecbf6cf25","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _check_mac_uniqueness_for_ports(self, context, mac):"},{"line_number":82,"context_line":"        # TODO(Lajos Katona): Something similar is needed for plain old ports,"},{"line_number":83,"context_line":"        # or we have to create a common mac table where the mac must be unique"},{"line_number":84,"context_line":"        filters \u003d {\u0027mac_address\u0027: [mac]}"},{"line_number":85,"context_line":"        ports \u003d self._core_plugin.get_ports(context.elevated(), filters)"},{"line_number":86,"context_line":"        if ports:"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_3264b6e3","line":83,"in_reply_to":"fa1b9901_d98b281d","updated":"2015-08-25 09:11:35.000000000","message":"In short because we can\u0027t predict which networks will be attached to a trunk port and (at least by default) a subport inherits the trunk port\u0027s mac.\n\nAlso please see the long code comment in neutron/db/trunk_port_models.py, line 26.","commit_id":"c5a3632cff70575ae2c190a3e448e015c35b9248"}],"neutron/services/trunk_port/plugin.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"500489967915c73c33ff2451d8f2ee8a15946d89","unresolved":false,"context_lines":[{"line_number":19,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TrunkPortPlugin(trunk_port_trunk.TrunkPortDbMixin):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    # FIXME(bence romsics): Shall we move path_prefix to the base class?"},{"line_number":25,"context_line":"    path_prefix \u003d \u0027trunk\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa80f949_3bddd214","line":22,"updated":"2015-11-03 19:58:39.000000000","message":"I probably missed the discussion about this, but why are we implementing as a service plugin and not having ML2 implement this extension?","commit_id":"fd1bbda2b1fd416d341941e0b9510b77b556911b"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"500489967915c73c33ff2451d8f2ee8a15946d89","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def delete_trunk_port(self, context, id):"},{"line_number":47,"context_line":"        super(TrunkPortPlugin, self).delete_trunk_port("},{"line_number":48,"context_line":"            context, id)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def get_trunk_port(self, context, id, fields\u003dNone):"},{"line_number":51,"context_line":"        return super(TrunkPortPlugin, self).get_trunk_port("}],"source_content_type":"text/x-python","patch_set":9,"id":"fa80f949_9b4b9eb0","line":48,"updated":"2015-11-03 19:58:39.000000000","message":"What\u0027s the rationale behind invoking super in these methods?  It seems like we don\u0027t even need to define these methods at all since the TrunkPortDbMixin has implementations for them.","commit_id":"fd1bbda2b1fd416d341941e0b9510b77b556911b"}],"neutron/tests/unit/db/test_trunk_port_trunk.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"d845d9f8f33bdfe45616f905a0f1d5fff09fbde4","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        data \u003d {\u0027trunk_port\u0027: {\u0027name\u0027: name,"},{"line_number":32,"context_line":"                               \u0027admin_state_up\u0027: admin_state_up,"},{"line_number":33,"context_line":"                               \u0027tenant_id\u0027: self._tenant_id}}"},{"line_number":34,"context_line":"        for k, v in six.iteritems(kwargs):"},{"line_number":35,"context_line":"            data[\u0027trunk_port\u0027][k] \u003d v"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        req \u003d self.new_create_request(\u0027trunk/trunk-ports\u0027, data, fmt)"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_c39d4d67","line":34,"updated":"2015-11-10 22:23:07.000000000","message":"data[\u0027trunk_port\u0027].update(kwargs) ?","commit_id":"fd1bbda2b1fd416d341941e0b9510b77b556911b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"d845d9f8f33bdfe45616f905a0f1d5fff09fbde4","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        keys \u003d [(\u0027name\u0027, name), (\u0027mac_address\u0027, mac)]"},{"line_number":79,"context_line":"        with self.trunk_port(name\u003dname, **{\u0027mac_address\u0027: mac}) as tp:"},{"line_number":80,"context_line":"            for k, v in keys:"},{"line_number":81,"context_line":"                self.assertEqual(tp[\u0027trunk_port\u0027][k], v)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def test_create_trunk_ports_with_same_name(self):"},{"line_number":84,"context_line":"        name \u003d \u0027trunk_port\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_a3bda9b8","line":81,"updated":"2015-11-10 22:23:07.000000000","message":"Assert should have args (expected, actual), so swap.","commit_id":"fd1bbda2b1fd416d341941e0b9510b77b556911b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"d845d9f8f33bdfe45616f905a0f1d5fff09fbde4","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                res \u003d self._list(\u0027trunk/trunk-ports\u0027)"},{"line_number":114,"context_line":"                self.assertItemsEqual("},{"line_number":115,"context_line":"                    [i[\u0027id\u0027] for i in res[\u0027trunk_ports\u0027]],"},{"line_number":116,"context_line":"                    [i[\u0027trunk_port\u0027][\u0027id\u0027] for i in tps])"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def test_show_trunk_port(self):"},{"line_number":119,"context_line":"        name \u003d \u0027trunk_port\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_83f0a568","line":116,"updated":"2015-11-10 22:23:07.000000000","message":"so tps has expected? Reverse?","commit_id":"fd1bbda2b1fd416d341941e0b9510b77b556911b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"d845d9f8f33bdfe45616f905a0f1d5fff09fbde4","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        with self.trunk_port(name\u003dname) as tp:"},{"line_number":121,"context_line":"            res \u003d self._show(\u0027trunk/trunk-ports\u0027, tp[\u0027trunk_port\u0027][\u0027id\u0027])"},{"line_number":122,"context_line":"            self.assertItemsEqual("},{"line_number":123,"context_line":"                res[\u0027trunk_port\u0027].values(), tp[\u0027trunk_port\u0027].values())"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def test_update_trunk_port(self):"},{"line_number":126,"context_line":"        name \u003d \u0027trunk_port\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_a3f5a957","line":123,"updated":"2015-11-10 22:23:07.000000000","message":"ditto","commit_id":"fd1bbda2b1fd416d341941e0b9510b77b556911b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"d845d9f8f33bdfe45616f905a0f1d5fff09fbde4","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            res \u003d self._update("},{"line_number":131,"context_line":"                \u0027trunk/trunk-ports\u0027, tp[\u0027trunk_port\u0027][\u0027id\u0027], new_data)"},{"line_number":132,"context_line":"            self.assertEqual("},{"line_number":133,"context_line":"                res[\u0027trunk_port\u0027][\u0027name\u0027], new_data[\u0027trunk_port\u0027][\u0027name\u0027])"},{"line_number":134,"context_line":"            self.assertEqual("},{"line_number":135,"context_line":"                res[\u0027trunk_port\u0027][\u0027mac_address\u0027],"},{"line_number":136,"context_line":"                new_data[\u0027trunk_port\u0027][\u0027mac_address\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_839745eb","line":133,"updated":"2015-11-10 22:23:07.000000000","message":"Use expected, actual in both of these.","commit_id":"fd1bbda2b1fd416d341941e0b9510b77b556911b"}]}
