)]}'
{"nova/db/sqlalchemy/migrate_repo/versions/348_add_vlan_to_vifs.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8dad487e260a3b4de6028e05d0b7c640d4330861","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, String(255))"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_43f2cd70","line":29,"updated":"2016-12-19 14:41:22.000000000","message":"Why 255? If this is a comma-delimited list of VLAN identifiers, that would only allow for a maximum of ~115 VLANs.","commit_id":"4440b14300083383764033fef59f332a80901706"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"79630b9d8fc8c6c36518dd8613d896b76f56a471","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, String(255))"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_621cecc1","line":29,"in_reply_to":"1a6eadb0_43f2cd70","updated":"2016-12-20 13:53:25.000000000","message":"Done","commit_id":"4440b14300083383764033fef59f332a80901706"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"121f4e5067493dcada3190c1bb27ce50359c87ea","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, String(255))"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_7634bcdd","line":29,"in_reply_to":"1a6eadb0_43f2cd70","updated":"2016-12-20 09:23:40.000000000","message":"Yes it\u0027s true it seems that the limitation is 4094 vlans, probably no reason to add our own limitation [1].\n\n\u003e VLAN identifier (VID): a 12-bit field specifying the VLAN to which the frame belongs. The hexadecimal values of 0x000 and 0xFFF are reserved. All other values may be used as VLAN identifiers, allowing up to 4,094 VLANs. The reserved value 0x000 indicates that the frame does not carry a VLAN ID; in this case, the 802.1Q tag specifies only a priority and is referred to as a priority tag. On bridges, VID 0x001 (the default VLAN ID) is often reserved for a management VLAN; this is vendor-specific. The VID value 0xFFF is reserved for implementation use; it must not be configured or transmitted. 0xFFF can be used to indicate a wildcard match in management operations or filtering database entries.[5]\n\n[1] https://en.wikipedia.org/wiki/IEEE_802.1Q#Frame_format","commit_id":"4440b14300083383764033fef59f332a80901706"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"8bbc7de81decc64af8bd7de0312dfa59a2cbc77d","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def upgrade(migrate_engine):"},{"line_number":25,"context_line":"    meta \u003d MetaData()"},{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_a67e57ac","line":25,"updated":"2016-12-29 16:12:35.000000000","message":"nit: meta is not used anywhere below","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a43a675f6de2e1f52eafe5ef77a19cda92cfa0c8","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"da4df55a_62bf4461","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":32},"updated":"2016-12-29 00:19:11.000000000","message":"will text be big enough? we use mediumtext for other columns storing json blobs.","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"aadb0cefc93b3e466e869f35e5dbb28030461dab","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_55a61ac2","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":32},"in_reply_to":"ba5201f7_0deca6c6","updated":"2016-12-31 00:31:51.000000000","message":"I guess we can talk more about this after the holiday, but if neutron isn\u0027t supporting a list right now, and we just get a single value back (which is a string in the port\u0027s vif details dict), then I\u0027d rather avoid future proofing this with a TEXT column and json blob when it could just be a regular old String field - we could alter the column later to change the type if needed and make it a TEXT field, but that would also require data migrations from string to json blob in the object model, so maybe that\u0027s not worth it if we know this is eventually going to be something neutron supports, and in the way we need to model it. I\u0027m just never crazy about \u0027future proofing\u0027 things, especially wrt the NFV type features because if it turns out a year from now it\u0027s not implemented, or implemented differently, we\u0027re left with some weird code in nova.","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9b546d195bd787343d014433df80ab355656adb8","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_243458fa","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":32},"in_reply_to":"ba5201f7_4405dc0e","updated":"2017-01-06 17:23:48.000000000","message":"@vladikr: with regards to the concern about being difficult to correlate to the correct device, I don\u0027t believe it will be. The InstanceInfoCache\u0027s network model has a ports collection and it is those port objects that will have the vlans attribute created after reading the port_binding:details:vlans attribute from the Neutron GET /ports API call.\n\nSound reasonable?","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"c35710f641b6a5e05d77b2aba6499a86e802b887","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_a40f6835","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":32},"in_reply_to":"ba5201f7_4405dc0e","updated":"2017-01-06 17:25:24.000000000","message":"Device tags are a distinctly Nova concept - Neutron doesn\u0027t, and shouldn\u0027t, care about them. VLANs, on the other hand, are purely in Neutron, and Nova only cares about them to shuffle the information around. So in that sense I agree with Dan - we put tags in virtual_interfaces, but should put vlans in network_info, along with everything else we get from Neutron. I think it makes the code more complex, because we now have another source of information about device metadata (libvirt XML, virtual_interfaces, and now network_info), but it\u0027s probably the right thing to do.\n\nAlso, why are we storing the vlan info at all? Could we just get it from Neutron when we\u0027re building the device metadata? We\u0027re already calling the network API [1] from the metadata service for one thing, could we call it for this as well and lose the DB migration entirely?\n\n[1] https://github.com/openstack/nova/blob/master/nova/api/metadata/base.py#L654","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"e5c1ba67f22ebd838e6731e2ba06d10fccd308ed","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_301bb682","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":32},"in_reply_to":"ba5201f7_55a61ac2","updated":"2017-01-06 17:06:10.000000000","message":"This was one of the arguments on the spec. People insisted that we should present it as a list, since in the future we will support trunk ports, which will be a list of ports.\nDuring the spec review everyone has agreed this should a list of integers. I\u0027ve also commented that his is just a single integer at the moment.\nhttps://review.openstack.org/#/c/381370/","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f5af03dae8a0327bb93e8c207e0539dbd9f8f8d0","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_be4c5e71","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":32},"in_reply_to":"ba5201f7_55a61ac2","updated":"2017-01-03 16:26:43.000000000","message":"We already have a serialized blob of data to mirror stuff from neutron that aren\u0027t really relevant details for nova to query on (networkinfo). Can\u0027t we just put this in there? We already barf things out of that into metadata for the instances, so this seems like a reasonable thing to add to that.","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dc84d8d29de52aae9182ad60f4433e80274d5a6b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_f765961d","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":32},"in_reply_to":"ba5201f7_a40f6835","updated":"2017-01-06 23:59:47.000000000","message":"I\u0027m not sure I want the metadata API calling back into Neutron just to get this when we already have the port details when regenerating the network info cache at which point we can store that in the nova.network.model.VIF object (correlates to a port) and the network info cache is already passed to the InstanceMetadata object (or pulled):\n\nhttps://github.com/openstack/nova/blob/ff8a2b2b35d3b8ac13b37cb7a6974e26a187750a/nova/api/metadata/base.py#L162\n\nStashing it as meta on the VIF model object automatically gets it persisted in the nova database for us.","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"e5c1ba67f22ebd838e6731e2ba06d10fccd308ed","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_4405dc0e","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":32},"in_reply_to":"ba5201f7_be4c5e71","updated":"2017-01-06 17:06:10.000000000","message":"@Dan, this is not just a random blob of data, but a list of vlans. \n \nI\u0027m not sure how will it all work if I\u0027ll separate only the vlans field from the VirtualInterface.\nIIRC, we have enhanced the VirtualInterface to pass VIF devices data to the metadata service - It seems natural to me to have the vlans (or vlan) field associated with this object.\n\nAlso, If I will store the vlans in the InstanceInfoCache.network_info, I think it will be very difficult to correlate it to the correct device.","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2d9bdd2ecdbcf26556038dc84ed49ee2efde5a7e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_747855c5","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":32},"in_reply_to":"ba5201f7_be4c5e71","updated":"2017-01-03 17:36:48.000000000","message":"@dansmith: I suppose I\u0027d be fine with dumping this information into InstanceInfoCache.network_info, sure.","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"57d1467cda89bc48ec3b2573f740b879d6f6838c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_6a343bde","line":29,"in_reply_to":"da4df55a_4d46f14f","updated":"2016-12-29 10:11:17.000000000","message":"So we pass the pf, a port could be configured with multiple-vlans (trunk mode), Neutron does not seem to implement it right now but we should probably consider how hardware work and so base our implementation on that point since it will be difficult for us to change the type of that field in the future. I think that is why Vladik choose to use this datastructure to store the vlans.\n\nBased on [1], it seems that a vlan is a 12bits integer.\n\nhttps://en.wikipedia.org/wiki/IEEE_802.1Q\n\nYes mediumtext should be largely enough I don\u0027t think there are use case where this is going to be so big but Vladik can have more output on that","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9ac174f36b0fc8f7f7570fdc55322997877a5144","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"da4df55a_4d46f14f","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":32},"in_reply_to":"da4df55a_62bf4461","updated":"2016-12-29 00:40:19.000000000","message":"Also, as noted in https://review.openstack.org/#/c/405953/ - it looks like this isn\u0027t a list in practice:\n\nhttps://github.com/openstack/neutron/blob/63f27ec5c4e8a81860db617e2dc20a553514fcc6/neutron/plugins/ml2/drivers/mech_sriov/mech_driver/mech_driver.py#L164\n\nThe vif_details from the port has a \u0027vlan\u0027 entry with a single int value (as a string):\n\nhttps://github.com/openstack/neutron/blob/63f27ec5c4e8a81860db617e2dc20a553514fcc6/neutron/plugins/ml2/drivers/mech_sriov/mech_driver/mech_driver.py#L164\n\nSo I\u0027m not sure why we\u0027re handling this as a big json blob, it looks like it would be a single int field per virtual_interface (or string field if the vlan id can be a non-integer).","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b3d1c88936284ffa4ff8a97bb840bfb5c9068498","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    shadow_prefix \u003d api._SHADOW_TABLE_PREFIX"},{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_0deca6c6","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":32},"in_reply_to":"da4df55a_62bf4461","updated":"2016-12-29 13:25:16.000000000","message":"TEXT is 64kb. More than enough:\n\n\u003e\u003e\u003e len(\u0027,\u0027.join([str(d) for d in range(4096)]))\n19369","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a43a675f6de2e1f52eafe5ef77a19cda92cfa0c8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    shadow_vifs \u003d utils.get_table(migrate_engine,"},{"line_number":35,"context_line":"                                  \u0027%svirtual_interfaces\u0027 % shadow_prefix)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da4df55a_428ec0d0","line":32,"range":{"start_line":32,"start_character":33,"end_line":32,"end_character":37},"updated":"2016-12-29 00:19:11.000000000","message":"not sure why we need to copy the column object for this","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"8bbc7de81decc64af8bd7de0312dfa59a2cbc77d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    vlans \u003d Column(\u0027vlans\u0027, Text)"},{"line_number":30,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":31,"context_line":"    if not hasattr(vifs.c, \u0027vlans\u0027):"},{"line_number":32,"context_line":"        vifs.create_column(vlans.copy())"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    shadow_vifs \u003d utils.get_table(migrate_engine,"},{"line_number":35,"context_line":"                                  \u0027%svirtual_interfaces\u0027 % shadow_prefix)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_c6bb5b74","line":32,"range":{"start_line":32,"start_character":33,"end_line":32,"end_character":37},"in_reply_to":"da4df55a_428ec0d0","updated":"2016-12-29 16:12:35.000000000","message":"it\u0027s one of the migrate \"quirks\":\n\n\u003e\u003e\u003e meta \u003d sa.MetaData()\n\u003e\u003e\u003e c \u003d sa.Column(\u0027test\u0027, sa.Integer)\n\u003e\u003e\u003e tbl1 \u003d sa.Table(\u0027testtbl1\u0027, meta)\n\u003e\u003e\u003e tbl2 \u003d sa.Table(\u0027testtbl2\u0027, meta)\n\u003e\u003e\u003e tbl1.append_column(c)\n\u003e\u003e\u003e tbl2.append_column(c)\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/schema.py\", line 679, in append_column\n    column._set_parent_with_dispatch(self)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/base.py\", line 433, in _set_parent_with_dispatch\n    self._set_parent(parent)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/schema.py\", line 1305, in _set_parent\n    existing.description\nsqlalchemy.exc.ArgumentError: Column object \u0027test\u0027 already assigned to Table \u0027testtbl1\u0027\n\u003e\u003e\u003e tbl2.append_column(c.copy())\n\u003e\u003e\u003e\n\nwhere append_column() is triggered down the column.create() path https://github.com/openstack/sqlalchemy-migrate/blob/e9175a37ce0b0b0e87ad728c8a6a10bed100065b/migrate/changeset/schema.py#L603\n\n_set_parent() would also fail:\n\n\u003e\u003e\u003e c._set_parent(tbl1)\n\u003e\u003e\u003e c._set_parent(tbl2)\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/schema.py\", line 1305, in _set_parent\n    existing.description\nsqlalchemy.exc.ArgumentError: Column object \u0027test\u0027 already assigned to Table \u0027testtbl1\u0027\n\ncolumn.copy() create an \"unbound\" copy of a column:\n\n\u003e\u003e\u003e c.copy()\nColumn(\u0027test\u0027, Integer(), table\u003dNone)\n\u003e\u003e\u003e c\nColumn(\u0027test\u0027, Integer(), table\u003d\u003ctesttbl1\u003e)\n\nhttps://github.com/zzzeek/sqlalchemy/blob/55ad10370f9eb50795e136aac595193168982e92/lib/sqlalchemy/sql/schema.py#L1381","commit_id":"fc66e56cb8e5fd4d70fefdfbdc48bad67c55a37b"}]}
