)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"8d3ebbc79e23871729bc37b950f93852372f47cb","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Artom Lifshitz \u003califshit@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-11 18:16:18 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"vNIC tagging: virtual interface tags DB table"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"A cloud user boots a VM with two network interfaces. One is connected"},{"line_number":10,"context_line":"to a private network, the other to the public Internet. There is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"da6ed579_a3d8c31e","line":7,"range":{"start_line":7,"start_character":32,"end_line":7,"end_character":36},"updated":"2016-01-12 10:42:30.000000000","message":"BTW, adding \u0027vNIC tagging\u0027 as a prefix to all these commit messages isn\u0027t really very helpful. First this is about general device tagging, not just NIC tagging, second, the \u0027blueprint\u0027 tag is already there to refer to the blueprint name","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"94cc7f910e224cb65304464b60a87924a523cb4a","unresolved":false,"context_lines":[{"line_number":1564,"context_line":"        vif_tag_ref \u003d models.VirtualInterfaceTag()"},{"line_number":1565,"context_line":"        vif_tag_ref.update(values)"},{"line_number":1566,"context_line":"        vif_tag_ref.save()"},{"line_number":1567,"context_line":"    except db_exc.DBError:"},{"line_number":1568,"context_line":"        raise exception.VirtualInterfaceTagCreateException()"},{"line_number":1569,"context_line":""},{"line_number":1570,"context_line":"    return vif_tag_ref"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_20a75751","line":1567,"range":{"start_line":1567,"start_character":11,"end_line":1567,"end_character":24},"updated":"2016-01-11 13:33:20.000000000","message":"I am assuming this happens only on FK constraint violation, so we want to give more info instead of just dropping all the useful information here.\n\nTBH I think that propagating the DB exception is the best thing to do here as this should almost never happen, and when it does, the info is useful.","commit_id":"b848e45fdbcbb3da7c9b8d924857574cf0fa773e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"1d2bc781ccae58dde0133863652cd4ce10177f79","unresolved":false,"context_lines":[{"line_number":1564,"context_line":"        vif_tag_ref \u003d models.VirtualInterfaceTag()"},{"line_number":1565,"context_line":"        vif_tag_ref.update(values)"},{"line_number":1566,"context_line":"        vif_tag_ref.save()"},{"line_number":1567,"context_line":"    except db_exc.DBError:"},{"line_number":1568,"context_line":"        raise exception.VirtualInterfaceTagCreateException()"},{"line_number":1569,"context_line":""},{"line_number":1570,"context_line":"    return vif_tag_ref"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_a1d25bfe","line":1567,"range":{"start_line":1567,"start_character":11,"end_line":1567,"end_character":24},"in_reply_to":"fa69d971_20a75751","updated":"2016-01-11 19:01:56.000000000","message":"Done","commit_id":"b848e45fdbcbb3da7c9b8d924857574cf0fa773e"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"94cc7f910e224cb65304464b60a87924a523cb4a","unresolved":false,"context_lines":[{"line_number":1571,"context_line":""},{"line_number":1572,"context_line":""},{"line_number":1573,"context_line":"@require_context"},{"line_number":1574,"context_line":"def virtual_interface_tag_get_by_instance(context, instance_uuid):"},{"line_number":1575,"context_line":"    \"\"\"Get all virtual interface tags for the instance.\"\"\""},{"line_number":1576,"context_line":"    return model_query(context, models.VirtualInterfaceTag, read_deleted\u003d\"no\").\\"},{"line_number":1577,"context_line":"                filter_by(instance_uuid\u003dinstance_uuid).all()"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_a00b47d4","line":1574,"range":{"start_line":1574,"start_character":4,"end_line":1574,"end_character":41},"updated":"2016-01-11 13:33:20.000000000","message":"Seeing that we only ever get these per instance, and never really query any of the data inside I almost think that this could have easily been a json field in the instance_extra table.\n\nBut this is fine as well.","commit_id":"b848e45fdbcbb3da7c9b8d924857574cf0fa773e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"1d2bc781ccae58dde0133863652cd4ce10177f79","unresolved":false,"context_lines":[{"line_number":1571,"context_line":""},{"line_number":1572,"context_line":""},{"line_number":1573,"context_line":"@require_context"},{"line_number":1574,"context_line":"def virtual_interface_tag_get_by_instance(context, instance_uuid):"},{"line_number":1575,"context_line":"    \"\"\"Get all virtual interface tags for the instance.\"\"\""},{"line_number":1576,"context_line":"    return model_query(context, models.VirtualInterfaceTag, read_deleted\u003d\"no\").\\"},{"line_number":1577,"context_line":"                filter_by(instance_uuid\u003dinstance_uuid).all()"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_ed87efb2","line":1574,"range":{"start_line":1574,"start_character":4,"end_line":1574,"end_character":41},"in_reply_to":"fa69d971_a00b47d4","updated":"2016-01-11 19:01:56.000000000","message":"So, the real reason for putting this in a separate table is that I wasn\u0027t aware that instance-extra existed. But we can say it\u0027s to provide more flexibility for future features around tags ;)","commit_id":"b848e45fdbcbb3da7c9b8d924857574cf0fa773e"}],"nova/db/sqlalchemy/migrate_repo/versions/314_add_tag_to_vifs_and_bdm.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9afe31185cc3e72fcafc4be2a4c646794f4184ba","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    tag \u003d Column(\u0027tag\u0027, String(255))"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    vifs \u003d utils.get_table(migrate_engine, \u0027virtual_interfaces\u0027)"},{"line_number":32,"context_line":"    vifs.create_column(tag.copy())"},{"line_number":33,"context_line":"    shadow_vifs \u003d utils.get_table(migrate_engine,"},{"line_number":34,"context_line":"                                  \u0027%svirtual_interfaces\u0027 % shadow_prefix)"},{"line_number":35,"context_line":"    shadow_vifs.create_column(tag.copy())"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_d430c103","line":32,"range":{"start_line":32,"start_character":4,"end_line":32,"end_character":34},"updated":"2016-01-22 00:17:51.000000000","message":"This is not idempotent, which DB migrations are expected to be:\n\nhttp://docs.openstack.org/developer/nova/upgrade.html?highlight\u003didempotent#migration-policy","commit_id":"741934300ddcee5e2000aec2052e5f466a5b942f"}],"nova/db/sqlalchemy/migrate_repo/versions/314_add_virtual_interface_tags_table.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"1c5bd2bf26f1c4a7fcdaab69f935fc62c10fc36e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    columns \u003d ["},{"line_number":34,"context_line":"        ((\u0027created_at\u0027, DateTime), {}),"},{"line_number":35,"context_line":"        ((\u0027updated_at\u0027, DateTime), {}),"},{"line_number":36,"context_line":"        ((\u0027deleted_at\u0027, DateTime), {}),"},{"line_number":37,"context_line":"        ((\u0027id\u0027, Integer), dict(primary_key\u003dTrue, nullable\u003dFalse)),"},{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_b496bb92","line":36,"updated":"2016-01-12 11:22:12.000000000","message":"o","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f6997b5fd52f58ccf14f406e74a0d2c6305610dd","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        ((\u0027id\u0027, Integer), dict(primary_key\u003dTrue, nullable\u003dFalse)),"},{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_118a8e64","line":40,"updated":"2016-01-11 22:02:30.000000000","message":"And why is this tag a Text field?","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"67593df81853f3b8c9453906eb802478e57c821c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        ((\u0027id\u0027, Integer), dict(primary_key\u003dTrue, nullable\u003dFalse)),"},{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_29aa8d71","line":40,"in_reply_to":"da6ed579_099f8960","updated":"2016-01-11 22:19:04.000000000","message":"Yeah, varchar of some length. 255 chars is common for a thing like this.  50 tag limit, where each tag is 1GB of random data defeats the purpose of the cap :)","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"8633aeac93eed1dc2e6f4b26a994ff2ce6798995","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        ((\u0027id\u0027, Integer), dict(primary_key\u003dTrue, nullable\u003dFalse)),"},{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_099f8960","line":40,"in_reply_to":"fa69d971_118a8e64","updated":"2016-01-11 22:14:23.000000000","message":"What should it be? A String with some fixed length?","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5ec66384d78e101a09931985076a6c9c75481d79","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    for prefix in (\u0027\u0027, api._SHADOW_TABLE_PREFIX):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_b1014207","line":41,"updated":"2016-01-11 21:56:14.000000000","message":"Why are we adding another soft-deletable table for tags? Can\u0027t we just add a tag column to the existing virtual_interfaces table and reduce quite a bit of extra complexity here with the foreign key?","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"97ca6256019a6c22732af27da8116fb65cb7947f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    for prefix in (\u0027\u0027, api._SHADOW_TABLE_PREFIX):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_ac80cb47","line":41,"in_reply_to":"da6ed579_0920e9f6","updated":"2016-01-11 22:25:43.000000000","message":"I *think* using the existing virtual_interfaces would mean two different code paths for when Neutron is in use vs nova-network. For Neutron we\u0027d have to create the record in virtual_interfaces from scratch, whereas with nova-network we just need to insert the tag into a record that nova-network creates for us. Also, eventually nova-network will get deprecated, so virtual_interfaces will get removed?","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dcf5f50b6fb83bd9ab5c40ef6d240afb804d69d3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    for prefix in (\u0027\u0027, api._SHADOW_TABLE_PREFIX):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_6e306257","line":41,"in_reply_to":"da6ed579_190ee034","updated":"2016-01-12 14:36:46.000000000","message":"IMHO, it\u0027s not a completely different thing. It\u0027s the model we use for vNIC tracking in nova. The fact that we store basically nothing about those interfaces when we\u0027re using neutron is part of the reason we\u0027re in this mess right now.","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"67593df81853f3b8c9453906eb802478e57c821c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    for prefix in (\u0027\u0027, api._SHADOW_TABLE_PREFIX):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_0920e9f6","line":41,"in_reply_to":"da6ed579_29c5ad5a","updated":"2016-01-11 22:19:04.000000000","message":"Yep, I think it is (only used by nova-network today). However, we already have that model which has almost everything we need here already (right?) except for the actual tag value. If there is a reason not to use that then that\u0027s cool, but ... is there?","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0143d7f6ab8ef3a5f2d61c9dae84f0073110b5b8","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    for prefix in (\u0027\u0027, api._SHADOW_TABLE_PREFIX):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_ec4ec395","line":41,"in_reply_to":"da6ed579_4c54af53","updated":"2016-01-11 22:48:07.000000000","message":"-1 for this being soft-deletable, that\u0027s a stance we\u0027ve taken since the YVR summit on new tables.\n\nI haven\u0027t dug into the details yet, but agree with -1 on duplicating virtual_interfaces if all we need is to add a tag column and update the object (and use it in the neutronv2 API in nova). If we have a table in the model that we can use, let\u0027s use it, rather than duplicate it for nova-network vs neutron impls.","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"597be3a40af593026b4e85940477fe390248fb2b","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    for prefix in (\u0027\u0027, api._SHADOW_TABLE_PREFIX):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_84b9f730","line":41,"in_reply_to":"da6ed579_6e306257","updated":"2016-01-12 14:55:16.000000000","message":"Philosophically, I\u0027m still in favour of how it\u0027s done in this patch. The virtual_interfaces is how the NaaS system tracks interfaces. It just to happens that in the case of nova-network, this table is in the same database as the compute stuff. In the case of Neutron, virtual_interfaces is completely unused. What we\u0027re doing here is tracking tags, independently of the NaaS system, because tags only makes sense in the context of compute. Also, do one thing and do it well, etc etc.\n\nThat being said, I care more about getting this merged than about philosophical correctness. So unless the above paragraph convinced either Dan Smith or Matt, I\u0027ll eat my words and rework this patch.","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"67e4e15c76ef42ec6f5903d1b1cec17c49dd1a6f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    for prefix in (\u0027\u0027, api._SHADOW_TABLE_PREFIX):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_4c54af53","line":41,"in_reply_to":"da6ed579_ac80cb47","updated":"2016-01-11 22:37:01.000000000","message":"There will be a little difference between nova-network and neutron, yeah, but nothing on the order of magnitude of having two nearly identical database tables and object models for each case.\n\nYes, some day nova-network will eventually be removed probably. We can probably avoid making major code decisions until that\u0027s a more likely reality though. Certainly, any tables that are still used (such as virtual_interfaces if you go that route) wouldn\u0027t need to be removed.\n\nSo, I\u0027m not sure how strongly I feel about this issue, but I have a hard time thinking of any justification to go ahead and duplicate the schema and introduce a new soft-deletable object like you\u0027re doing here.","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"1c5bd2bf26f1c4a7fcdaab69f935fc62c10fc36e","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    for prefix in (\u0027\u0027, api._SHADOW_TABLE_PREFIX):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_190ee034","line":41,"in_reply_to":"da6ed579_ec4ec395","updated":"2016-01-12 11:22:12.000000000","message":"Currently the code does not really touch the networking API code at all, it waits for NetworkInfo and builds the models we see here based on it.\n\nNetwork ID field of the original VirtualInterface model would not make a lot of sense for this use and it\u0027s not nullable (and indexed).\n\nIMHO we should be explicit and not try to shoehorn this into a model that happens to look similar but is used for a completely different thing - what are we trying to achieve here?\n\nAs for the soft delete thing - while I agree with the general sentiment, it\u0027s a bit disingenuine to \"enforce\" it a week from FF since we didn\u0027t actually care about it enough to even write a simple test.\n\nIMHO this is good to go so keeping my +2","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"8633aeac93eed1dc2e6f4b26a994ff2ce6798995","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        ((\u0027address\u0027, String(length\u003d255)), dict(nullable\u003dFalse)),"},{"line_number":39,"context_line":"        ((\u0027instance_uuid\u0027, String(length\u003d36)), dict(nullable\u003dFalse)),"},{"line_number":40,"context_line":"        ((\u0027tag\u0027, Text), {}),"},{"line_number":41,"context_line":"        ((\u0027deleted\u0027, Integer), {}),"},{"line_number":42,"context_line":"    ]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    for prefix in (\u0027\u0027, api._SHADOW_TABLE_PREFIX):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_29c5ad5a","line":41,"in_reply_to":"fa69d971_b1014207","updated":"2016-01-11 22:14:23.000000000","message":"Isn\u0027t virtual_interfaces only used when nova-network is in use? When it\u0027s Neutron, we need a way to independently track tags.","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"}],"nova/objects/block_device.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2e70a1f5895aeee645ee994da8cc4457ca8c0e6b","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    # Version 1.16: Deprecate get_by_volume_id(), add"},{"line_number":62,"context_line":"    #               get_by_volume() and get_by_volume_and_instance()"},{"line_number":63,"context_line":"    # Version 1.17: Added tag field"},{"line_number":64,"context_line":"    VERSION \u003d \u00271.17\u0027"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    fields \u003d {"},{"line_number":67,"context_line":"        \u0027id\u0027: fields.IntegerField(),"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba63e191_52a7614f","line":64,"updated":"2016-01-18 20:03:39.000000000","message":"You need an obj_make_compatible() backport rule to remove tag from \u003c1.17","commit_id":"c8861e0b5fe8081d91f977179961d202ad423cad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9afe31185cc3e72fcafc4be2a4c646794f4184ba","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":87,"context_line":"    }"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":90,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":91,"context_line":"        if target_version \u003c (1, 17) and \u0027tag\u0027 in primitive:"},{"line_number":92,"context_line":"            del primitive[\u0027tag\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_9727abb5","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":27},"updated":"2016-01-22 00:17:51.000000000","message":"This change needs a unit test.","commit_id":"741934300ddcee5e2000aec2052e5f466a5b942f"}],"nova/objects/virtual_interface.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2e70a1f5895aeee645ee994da8cc4457ca8c0e6b","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class VirtualInterface(base.NovaPersistentObject, base.NovaObject):"},{"line_number":24,"context_line":"    # Version 1.0: Initial version"},{"line_number":25,"context_line":"    # Version 1.1: Add tag field"},{"line_number":26,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    fields \u003d {"},{"line_number":29,"context_line":"        \u0027id\u0027: fields.IntegerField(),"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba63e191_9274f9cf","line":26,"updated":"2016-01-18 20:03:39.000000000","message":"Same backport rule needed here.","commit_id":"c8861e0b5fe8081d91f977179961d202ad423cad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9afe31185cc3e72fcafc4be2a4c646794f4184ba","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \u0027tag\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":40,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":41,"context_line":"        if target_version \u003c (1, 1) and \u0027tag\u0027 in primitive:"},{"line_number":42,"context_line":"            del primitive[\u0027tag\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a68dd71_570a9322","line":39,"updated":"2016-01-22 00:17:51.000000000","message":"You should have a unit test for this.","commit_id":"741934300ddcee5e2000aec2052e5f466a5b942f"}],"nova/objects/virtual_interface_tag.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0143d7f6ab8ef3a5f2d61c9dae84f0073110b5b8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (C) 2014, Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_ef78f591","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"updated":"2016-01-11 22:48:07.000000000","message":"I\u0027m assuming this should be 2016?","commit_id":"16d7742180907a011eccea9123f1a9bc763c62e0"}],"nova/tests/unit/db/test_migrations.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"94cc7f910e224cb65304464b60a87924a523cb4a","unresolved":false,"context_lines":[{"line_number":803,"context_line":"                                \u0027instance_uuid\u0027, [\u0027instance_uuid\u0027])"},{"line_number":804,"context_line":""},{"line_number":805,"context_line":"    def _check_313(self, engine, data):"},{"line_number":806,"context_line":""},{"line_number":807,"context_line":"        self.assertColumnExists(engine, \u0027pci_devices\u0027, \u0027parent_addr\u0027)"},{"line_number":808,"context_line":"        self.assertColumnExists(engine, \u0027shadow_pci_devices\u0027, \u0027parent_addr\u0027)"},{"line_number":809,"context_line":"        pci_devices \u003d oslodbutils.get_table(engine, \u0027pci_devices\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_e0313f0c","side":"PARENT","line":806,"updated":"2016-01-11 13:33:20.000000000","message":"random whitespace change....","commit_id":"bff71e602ba437e482c696f208d01d6814a8af7b"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"1d2bc781ccae58dde0133863652cd4ce10177f79","unresolved":false,"context_lines":[{"line_number":803,"context_line":"                                \u0027instance_uuid\u0027, [\u0027instance_uuid\u0027])"},{"line_number":804,"context_line":""},{"line_number":805,"context_line":"    def _check_313(self, engine, data):"},{"line_number":806,"context_line":""},{"line_number":807,"context_line":"        self.assertColumnExists(engine, \u0027pci_devices\u0027, \u0027parent_addr\u0027)"},{"line_number":808,"context_line":"        self.assertColumnExists(engine, \u0027shadow_pci_devices\u0027, \u0027parent_addr\u0027)"},{"line_number":809,"context_line":"        pci_devices \u003d oslodbutils.get_table(engine, \u0027pci_devices\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_44cdad2f","side":"PARENT","line":806,"in_reply_to":"fa69d971_e0313f0c","updated":"2016-01-11 19:01:56.000000000","message":"Done","commit_id":"bff71e602ba437e482c696f208d01d6814a8af7b"}],"nova/tests/unit/fake_network.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2e70a1f5895aeee645ee994da8cc4457ca8c0e6b","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                 \u0027network_id\u0027: 31,"},{"line_number":82,"context_line":"                 \u0027uuid\u0027: uuids.vifs_3,"},{"line_number":83,"context_line":"                 \u0027address\u0027: \u0027DC:AD:BE:FF:EF:03\u0027,"},{"line_number":84,"context_line":"                 \u0027tag\u0027: \u0027fake-tag3\u0027}]"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        floating_ips \u003d [dict(address\u003d\u0027172.16.1.1\u0027,"},{"line_number":87,"context_line":"                             fixed_ip_id\u003d100),"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba63e191_c50dcd38","line":84,"updated":"2016-01-18 20:03:39.000000000","message":"How about making one of these None so that we can confirm the nullability at least a little?","commit_id":"c8861e0b5fe8081d91f977179961d202ad423cad"}],"nova/tests/unit/objects/test_block_device.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"28600ac4edf3e7aa9916e2c96eda8b0ef4c9f293","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                  \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":368,"context_line":"                  \u0027instance_uuid\u0027: \u0027fake-instance\u0027}"},{"line_number":369,"context_line":"        bdm \u003d objects.BlockDeviceMapping(context\u003dself.context, **values)"},{"line_number":370,"context_line":"        fake_bdm \u003d fake_block_device.FakeDbBlockDeviceDict(values)"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"        bdm.obj_make_compatible(fake_bdm, \u00271.16\u0027)"},{"line_number":373,"context_line":"        self.assertNotIn(\u0027tag\u0027, fake_bdm)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba0121b8_ee30b2ea","line":370,"range":{"start_line":370,"start_character":8,"end_line":370,"end_character":66},"updated":"2016-03-30 14:12:52.000000000","message":"This is not the input to obj_make_compatible(). It\u0027s working because the fields are the same (currently) but would break later if something else changed. You want to just do:\n\n bdm.obj_to_primitive(target_version\u003d\u00271.16\u0027)","commit_id":"784917076a876a0d71628f25dd5b3dd599d377e7"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"a56274da30f367b1dc7c2d8d7aebd2ad9ed03e9c","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                  \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":368,"context_line":"                  \u0027instance_uuid\u0027: \u0027fake-instance\u0027}"},{"line_number":369,"context_line":"        bdm \u003d objects.BlockDeviceMapping(context\u003dself.context, **values)"},{"line_number":370,"context_line":"        fake_bdm \u003d fake_block_device.FakeDbBlockDeviceDict(values)"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"        bdm.obj_make_compatible(fake_bdm, \u00271.16\u0027)"},{"line_number":373,"context_line":"        self.assertNotIn(\u0027tag\u0027, fake_bdm)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba0121b8_17540efd","line":370,"range":{"start_line":370,"start_character":8,"end_line":370,"end_character":66},"in_reply_to":"ba0121b8_ee30b2ea","updated":"2016-03-30 16:22:52.000000000","message":"Done","commit_id":"784917076a876a0d71628f25dd5b3dd599d377e7"}],"nova/tests/unit/objects/test_virtual_interface.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"28600ac4edf3e7aa9916e2c96eda8b0ef4c9f293","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        vif.uuid \u003d \u0027fake-uuid-2\u0027"},{"line_number":102,"context_line":"        vif.tag \u003d \u0027fake-tag\u0027"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        vif.obj_make_compatible(fake_vif_copy, \u00271.0\u0027)"},{"line_number":105,"context_line":"        self.assertNotIn(\u0027tag\u0027, fake_vif_copy)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ba0121b8_6e5b022f","line":104,"updated":"2016-03-30 14:12:52.000000000","message":"Same here.","commit_id":"784917076a876a0d71628f25dd5b3dd599d377e7"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"a56274da30f367b1dc7c2d8d7aebd2ad9ed03e9c","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        vif.uuid \u003d \u0027fake-uuid-2\u0027"},{"line_number":102,"context_line":"        vif.tag \u003d \u0027fake-tag\u0027"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        vif.obj_make_compatible(fake_vif_copy, \u00271.0\u0027)"},{"line_number":105,"context_line":"        self.assertNotIn(\u0027tag\u0027, fake_vif_copy)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ba0121b8_77cf4a29","line":104,"in_reply_to":"ba0121b8_6e5b022f","updated":"2016-03-30 16:22:52.000000000","message":"Done","commit_id":"784917076a876a0d71628f25dd5b3dd599d377e7"}]}
