)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"cf6dd2de8d16fa24842a6bcfa3955fb677acddfc","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2014-12-08 19:08:20 +0100"},{"line_number":4,"context_line":"Commit:     Jakub Libosvar \u003clibosvar@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-19 14:37:19 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] DB migration from Nova to Neutron"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ie6cf4c0579c87902621829878bd6f61312dbb4b1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_f435d3dc","line":6,"updated":"2015-01-20 03:28:12.000000000","message":"Have you considered what is the desired behavior for partial failures? For example you create networks and routers, then something horrible happens when you create VIFs, the script exits and you never create SGs. You can also get the classic network/power/other type of errors, not due to a software bug.\n\nWhat kind of failure would be shown? How would the admin know what resources were migrated and what resources weren\u0027t? Has this been discussed on the ML or elsewhere before? Are we worried about this type of \u0027SLA\u0027 or general admin quality of life issues? Should the script first output a list of resources that are going to be migrated, then output what resources were successfully migrated? Should this be via separate invocations?\n\nI know you\u0027re still in the \u0027Getting this shit to work\u0027 phase, but there\u0027s the matter of testing, and I\u0027m wondering what your plan is. I think it wouldn\u0027t be too difficult to test this with high-ish level unit/functional tests that would setup a Nova DB with prepared data, run the migration, then assert a new desired state.","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"3090955ca6712b5da0f22698a6b355a541355d43","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2014-12-08 19:08:20 +0100"},{"line_number":4,"context_line":"Commit:     Jakub Libosvar \u003clibosvar@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-19 14:37:19 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] DB migration from Nova to Neutron"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ie6cf4c0579c87902621829878bd6f61312dbb4b1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1a930d6b_112c4c4a","line":6,"in_reply_to":"3a961159_7f1e0276","updated":"2015-01-20 20:47:58.000000000","message":"With respect to testing, I don\u0027t think you need any libraries. You can do this via two in-memory DBs, similar to unit testing infrastructure. Setup two DBs, fill the first one with data (Not in any special way, just a bunch of inserts), migrate and assert. It would really quicken your dev cycles too.","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e043be32c873ede55ae17ddeceda768ad06e3a67","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2014-12-08 19:08:20 +0100"},{"line_number":4,"context_line":"Commit:     Jakub Libosvar \u003clibosvar@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-19 14:37:19 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] DB migration from Nova to Neutron"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ie6cf4c0579c87902621829878bd6f61312dbb4b1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_7f1e0276","line":6,"in_reply_to":"3a961159_f435d3dc","updated":"2015-01-20 18:28:55.000000000","message":"In following patch implements session within db instance (i.e. once db enters into session, every execution goes into this session until context is left). This will lead into state - either migration will succeed, or it does nothing. As nova db serves as read-only, no data is corrupted in case of failure.\n\nTesting will be done as sideways grenade job. Javelin will prepare actual data and after migration things will be validated by javelin. The idea about prepared data sounds interesting, I remember some project called turbo-hipster capable of loading such things into db but IIRC it was only due to sensitive data inside. I\u0027ll think about that.","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"8af9d0da4b54f4b2129fe3223c3569462b529f30","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-01-19 14:37:19 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] DB migration from Nova to Neutron"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ie6cf4c0579c87902621829878bd6f61312dbb4b1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_16c1994e","line":8,"updated":"2015-01-19 15:33:21.000000000","message":"please reference blueprint here","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e9d95027cfef8697220547084545f3fa079c814e","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-01-19 14:37:19 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] DB migration from Nova to Neutron"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ie6cf4c0579c87902621829878bd6f61312dbb4b1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_673869a0","line":8,"in_reply_to":"3a961159_16c1994e","updated":"2015-01-19 16:39:47.000000000","message":"Done","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"}],"neutron/db/migration/migrate_nova_network_to_neutron.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"8af9d0da4b54f4b2129fe3223c3569462b529f30","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    ip_version \u003d None"},{"line_number":34,"context_line":"    if network[\u0027cidr\u0027]:"},{"line_number":35,"context_line":"        ip_version \u003d 4"},{"line_number":36,"context_line":"    elif network[\u0027cidr_v6\u0027]:"},{"line_number":37,"context_line":"        ip_version \u003d 6"},{"line_number":38,"context_line":"    else:"},{"line_number":39,"context_line":"        LOG.warning(\u0027Unknown ip_version from network %s\u0027, network)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_6cc6909e","line":36,"updated":"2015-01-19 15:33:21.000000000","message":"nova-network may have 2 subnets in a network at the same time - one ipv4 and one ipv6, so I think it\u0027s not correct to use elif. I think we need to check corresponding attributes (cidr and cidr_v6) get both subnets.","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e9d95027cfef8697220547084545f3fa079c814e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    ip_version \u003d None"},{"line_number":34,"context_line":"    if network[\u0027cidr\u0027]:"},{"line_number":35,"context_line":"        ip_version \u003d 4"},{"line_number":36,"context_line":"    elif network[\u0027cidr_v6\u0027]:"},{"line_number":37,"context_line":"        ip_version \u003d 6"},{"line_number":38,"context_line":"    else:"},{"line_number":39,"context_line":"        LOG.warning(\u0027Unknown ip_version from network %s\u0027, network)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_87a1d5f9","line":36,"in_reply_to":"3a961159_6cc6909e","updated":"2015-01-19 16:39:47.000000000","message":"Aha, didn\u0027t know about that. Thanks.","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"8af9d0da4b54f4b2129fe3223c3569462b529f30","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    subnet \u003d {\u0027tenant_id\u0027: network[\u0027project_id\u0027],"},{"line_number":44,"context_line":"              \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":45,"context_line":"              \u0027name\u0027: \u0027subnet_%s\u0027 % cidr,"},{"line_number":46,"context_line":"              \u0027ip_version\u0027: ip_version,"},{"line_number":47,"context_line":"              \u0027cidr\u0027: cidr,"},{"line_number":48,"context_line":"              \u0027gateway_ip\u0027: (network[\u0027gateway_v6\u0027] if network[\u0027gateway_v6\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_6c3db08e","line":45,"updated":"2015-01-19 15:33:21.000000000","message":"I\u0027d suggest to use network\u0027s \u0027label\u0027 attribute","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e043be32c873ede55ae17ddeceda768ad06e3a67","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    subnet \u003d {\u0027tenant_id\u0027: network[\u0027project_id\u0027],"},{"line_number":44,"context_line":"              \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":45,"context_line":"              \u0027name\u0027: \u0027subnet_%s\u0027 % cidr,"},{"line_number":46,"context_line":"              \u0027ip_version\u0027: ip_version,"},{"line_number":47,"context_line":"              \u0027cidr\u0027: cidr,"},{"line_number":48,"context_line":"              \u0027gateway_ip\u0027: (network[\u0027gateway_v6\u0027] if network[\u0027gateway_v6\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_3f855acf","line":45,"in_reply_to":"3a961159_6c3db08e","updated":"2015-01-20 18:28:55.000000000","message":"Done","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"8af9d0da4b54f4b2129fe3223c3569462b529f30","unresolved":false,"context_lines":[{"line_number":47,"context_line":"              \u0027cidr\u0027: cidr,"},{"line_number":48,"context_line":"              \u0027gateway_ip\u0027: (network[\u0027gateway_v6\u0027] if network[\u0027gateway_v6\u0027]"},{"line_number":49,"context_line":"                             else network[\u0027gateway\u0027]),"},{"line_number":50,"context_line":"              \u0027enable_dhcp\u0027: True,"},{"line_number":51,"context_line":"              \u0027shared\u0027: True}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    return subnet"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_2ccf288d","line":50,"updated":"2015-01-19 15:33:21.000000000","message":"This depends on the network manager: if using Flat instead of FlatDhcp dhcp should be disabled","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e9d95027cfef8697220547084545f3fa079c814e","unresolved":false,"context_lines":[{"line_number":47,"context_line":"              \u0027cidr\u0027: cidr,"},{"line_number":48,"context_line":"              \u0027gateway_ip\u0027: (network[\u0027gateway_v6\u0027] if network[\u0027gateway_v6\u0027]"},{"line_number":49,"context_line":"                             else network[\u0027gateway\u0027]),"},{"line_number":50,"context_line":"              \u0027enable_dhcp\u0027: True,"},{"line_number":51,"context_line":"              \u0027shared\u0027: True}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    return subnet"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_07b5e531","line":50,"in_reply_to":"3a961159_2ccf288d","updated":"2015-01-19 16:39:47.000000000","message":"Right, I just wanted to use some value before I move forward.","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"8af9d0da4b54f4b2129fe3223c3569462b529f30","unresolved":false,"context_lines":[{"line_number":48,"context_line":"              \u0027gateway_ip\u0027: (network[\u0027gateway_v6\u0027] if network[\u0027gateway_v6\u0027]"},{"line_number":49,"context_line":"                             else network[\u0027gateway\u0027]),"},{"line_number":50,"context_line":"              \u0027enable_dhcp\u0027: True,"},{"line_number":51,"context_line":"              \u0027shared\u0027: True}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    return subnet"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_ccc6a469","line":51,"updated":"2015-01-19 15:33:21.000000000","message":"Seems once we have \u0027project_id\u0027 set on the network shared should be False","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e9d95027cfef8697220547084545f3fa079c814e","unresolved":false,"context_lines":[{"line_number":48,"context_line":"              \u0027gateway_ip\u0027: (network[\u0027gateway_v6\u0027] if network[\u0027gateway_v6\u0027]"},{"line_number":49,"context_line":"                             else network[\u0027gateway\u0027]),"},{"line_number":50,"context_line":"              \u0027enable_dhcp\u0027: True,"},{"line_number":51,"context_line":"              \u0027shared\u0027: True}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    return subnet"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_c7911d9d","line":51,"in_reply_to":"3a961159_ccc6a469","updated":"2015-01-19 16:39:47.000000000","message":"Done","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"8af9d0da4b54f4b2129fe3223c3569462b529f30","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def make_network_from_nova_network(nova_network):"},{"line_number":57,"context_line":"    neutron_network \u003d {"},{"line_number":58,"context_line":"        \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":59,"context_line":"        \u0027tenant_id\u0027: nova_network[\u0027project_id\u0027],"},{"line_number":60,"context_line":"        \u0027name\u0027: \u0027nova_network_%s\u0027 % nova_network[\u0027id\u0027],"},{"line_number":61,"context_line":"        \u0027status\u0027: neutron_constants.NET_STATUS_ACTIVE,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_ac9eb853","line":58,"updated":"2015-01-19 15:33:21.000000000","message":"since we will be using proxy in nova it\u0027s better to take uuid from nova db","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e9d95027cfef8697220547084545f3fa079c814e","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def make_network_from_nova_network(nova_network):"},{"line_number":57,"context_line":"    neutron_network \u003d {"},{"line_number":58,"context_line":"        \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":59,"context_line":"        \u0027tenant_id\u0027: nova_network[\u0027project_id\u0027],"},{"line_number":60,"context_line":"        \u0027name\u0027: \u0027nova_network_%s\u0027 % nova_network[\u0027id\u0027],"},{"line_number":61,"context_line":"        \u0027status\u0027: neutron_constants.NET_STATUS_ACTIVE,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_07e32535","line":58,"in_reply_to":"3a961159_ac9eb853","updated":"2015-01-19 16:39:47.000000000","message":"I think it doesn\u0027t matter as once db will be translated when we won\u0027t be using proxy, in this case id is just an internal neutron think. But I agree it won\u0027t cause any harm if we would use nova\u0027s id.","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"8af9d0da4b54f4b2129fe3223c3569462b529f30","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    neutron_network \u003d {"},{"line_number":58,"context_line":"        \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":59,"context_line":"        \u0027tenant_id\u0027: nova_network[\u0027project_id\u0027],"},{"line_number":60,"context_line":"        \u0027name\u0027: \u0027nova_network_%s\u0027 % nova_network[\u0027id\u0027],"},{"line_number":61,"context_line":"        \u0027status\u0027: neutron_constants.NET_STATUS_ACTIVE,"},{"line_number":62,"context_line":"        \u0027admin_state_up\u0027: True,"},{"line_number":63,"context_line":"        \u0027shared\u0027: False"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_cc9b0463","line":60,"updated":"2015-01-19 15:33:21.000000000","message":"label?","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e9d95027cfef8697220547084545f3fa079c814e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    neutron_network \u003d {"},{"line_number":58,"context_line":"        \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":59,"context_line":"        \u0027tenant_id\u0027: nova_network[\u0027project_id\u0027],"},{"line_number":60,"context_line":"        \u0027name\u0027: \u0027nova_network_%s\u0027 % nova_network[\u0027id\u0027],"},{"line_number":61,"context_line":"        \u0027status\u0027: neutron_constants.NET_STATUS_ACTIVE,"},{"line_number":62,"context_line":"        \u0027admin_state_up\u0027: True,"},{"line_number":63,"context_line":"        \u0027shared\u0027: False"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_27e02126","line":60,"in_reply_to":"3a961159_cc9b0463","updated":"2015-01-19 16:39:47.000000000","message":"Done","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"8af9d0da4b54f4b2129fe3223c3569462b529f30","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \u0027name\u0027: \u0027nova_network_%s\u0027 % nova_network[\u0027id\u0027],"},{"line_number":61,"context_line":"        \u0027status\u0027: neutron_constants.NET_STATUS_ACTIVE,"},{"line_number":62,"context_line":"        \u0027admin_state_up\u0027: True,"},{"line_number":63,"context_line":"        \u0027shared\u0027: False"},{"line_number":64,"context_line":"    }"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    return neutron_network"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_2cb2c8e8","line":63,"updated":"2015-01-19 15:33:21.000000000","message":"why False?","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e9d95027cfef8697220547084545f3fa079c814e","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \u0027name\u0027: \u0027nova_network_%s\u0027 % nova_network[\u0027id\u0027],"},{"line_number":61,"context_line":"        \u0027status\u0027: neutron_constants.NET_STATUS_ACTIVE,"},{"line_number":62,"context_line":"        \u0027admin_state_up\u0027: True,"},{"line_number":63,"context_line":"        \u0027shared\u0027: False"},{"line_number":64,"context_line":"    }"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    return neutron_network"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_67d14956","line":63,"in_reply_to":"3a961159_2cb2c8e8","updated":"2015-01-19 16:39:47.000000000","message":"Just to test this script with some data. I should have put TODO in such places.","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"cf6dd2de8d16fa24842a6bcfa3955fb677acddfc","unresolved":false,"context_lines":[{"line_number":152,"context_line":"class Migrator(object):"},{"line_number":153,"context_line":"    def __init__(self, nova_db_url, neutron_db_url):"},{"line_number":154,"context_line":"        self.neutron_db \u003d NeutronDatabase(neutron_db_url)"},{"line_number":155,"context_line":"        self.nova_db \u003d NovaDatabase(nova_db_url)"},{"line_number":156,"context_line":"        self.migrated_networks \u003d list()"},{"line_number":157,"context_line":"        self.migrated_subnets \u003d list()"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_34e11b9c","line":155,"updated":"2015-01-20 03:28:12.000000000","message":"I would probably go for pure functions and remove state from the Migrator class. Easier to test and both approaches are perfectly interchangeable, it\u0027s really a matter of (Your) taste.","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e043be32c873ede55ae17ddeceda768ad06e3a67","unresolved":false,"context_lines":[{"line_number":152,"context_line":"class Migrator(object):"},{"line_number":153,"context_line":"    def __init__(self, nova_db_url, neutron_db_url):"},{"line_number":154,"context_line":"        self.neutron_db \u003d NeutronDatabase(neutron_db_url)"},{"line_number":155,"context_line":"        self.nova_db \u003d NovaDatabase(nova_db_url)"},{"line_number":156,"context_line":"        self.migrated_networks \u003d list()"},{"line_number":157,"context_line":"        self.migrated_subnets \u003d list()"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_1fcede2d","line":155,"in_reply_to":"3a961159_34e11b9c","updated":"2015-01-20 18:28:55.000000000","message":"I disagree. In following patch I need to store more state and implementing functions will just end in passing databases all around the code.","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"cf6dd2de8d16fa24842a6bcfa3955fb677acddfc","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        self.nova_db \u003d NovaDatabase(nova_db_url)"},{"line_number":156,"context_line":"        self.migrated_networks \u003d list()"},{"line_number":157,"context_line":"        self.migrated_subnets \u003d list()"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def migrate(self):"},{"line_number":160,"context_line":"        self.migrate_networks()"},{"line_number":161,"context_line":"        create_routers(self.migrated_networks, self.migrated_subnets)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_94ef2f86","line":158,"updated":"2015-01-20 03:28:12.000000000","message":"Perhaps \u0027migrate\u0027 should be a DB transaction that would be commited only at the very end of the function.","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e043be32c873ede55ae17ddeceda768ad06e3a67","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        self.nova_db \u003d NovaDatabase(nova_db_url)"},{"line_number":156,"context_line":"        self.migrated_networks \u003d list()"},{"line_number":157,"context_line":"        self.migrated_subnets \u003d list()"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def migrate(self):"},{"line_number":160,"context_line":"        self.migrate_networks()"},{"line_number":161,"context_line":"        create_routers(self.migrated_networks, self.migrated_subnets)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_df5c5683","line":158,"in_reply_to":"3a961159_94ef2f86","updated":"2015-01-20 18:28:55.000000000","message":"Done","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"cf6dd2de8d16fa24842a6bcfa3955fb677acddfc","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    def migrate_security_groups(self):"},{"line_number":207,"context_line":"        pass"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"def parse_arguments():"},{"line_number":211,"context_line":"    parser \u003d argparse.ArgumentParser()"},{"line_number":212,"context_line":"    parser.add_argument(\u0027nova_db_cs\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_94c80f23","line":209,"updated":"2015-01-20 03:28:12.000000000","message":"This should probably use Oslo config?","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e043be32c873ede55ae17ddeceda768ad06e3a67","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    def migrate_security_groups(self):"},{"line_number":207,"context_line":"        pass"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"def parse_arguments():"},{"line_number":211,"context_line":"    parser \u003d argparse.ArgumentParser()"},{"line_number":212,"context_line":"    parser.add_argument(\u0027nova_db_cs\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_5f50665f","line":209,"in_reply_to":"3a961159_94c80f23","updated":"2015-01-20 18:28:55.000000000","message":"I don\u0027t think it\u0027s necessary as this provided tool has quite simple inputs (I got inspired by migrate_to_ml2).","commit_id":"06582ebd195558375f3f9616acdf8d546c50e1a3"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"a015d6ca73b79bf97afc5dc66150ca303aa451d8","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    def create_type_allocation(self, network):"},{"line_number":145,"context_line":"        pass"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def migrate(self):"},{"line_number":148,"context_line":"        with self.neutron_db:"},{"line_number":149,"context_line":"            self.migrate_networks()"},{"line_number":150,"context_line":"            self.migrate_security_groups()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_91711c7a","line":147,"updated":"2015-01-20 20:47:54.000000000","message":"+1","commit_id":"711f6d1b3385d1a2dee2b2bcc420cb4a24dfb860"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"9fd269588dce58501633a6ff973a7453612343ab","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    try:"},{"line_number":37,"context_line":"        ip_version \u003d netaddr.IPNetwork(cidr).version"},{"line_number":38,"context_line":"    except TypeError:"},{"line_number":39,"context_line":"        return \u0027IPv4\u0027"},{"line_number":40,"context_line":"    if ip_version \u003d\u003d 4:"},{"line_number":41,"context_line":"        return \u0027IPv4\u0027"},{"line_number":42,"context_line":"    if ip_version \u003d\u003d 6:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_04095131","line":39,"updated":"2015-01-28 11:07:11.000000000","message":"what are the cases where returning ipv4 in case of failure is needed? A comment would be good I think","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"afdd3643b2e32dc0df03cdbdfa2f2f02d3dec358","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    try:"},{"line_number":37,"context_line":"        ip_version \u003d netaddr.IPNetwork(cidr).version"},{"line_number":38,"context_line":"    except TypeError:"},{"line_number":39,"context_line":"        return \u0027IPv4\u0027"},{"line_number":40,"context_line":"    if ip_version \u003d\u003d 4:"},{"line_number":41,"context_line":"        return \u0027IPv4\u0027"},{"line_number":42,"context_line":"    if ip_version \u003d\u003d 6:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_e688b7e9","line":39,"in_reply_to":"fa81d914_04095131","updated":"2015-01-28 14:50:37.000000000","message":"I took this function from nova code and updated it accordingly. When nova communicates with neutron, it does similar thing: https://github.com/openstack/nova/blob/master/nova/network/security_group/neutron_driver.py#L247","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"00f48b044d6b7280a6f682444b59191136f798cb","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    try:"},{"line_number":37,"context_line":"        ip_version \u003d netaddr.IPNetwork(cidr).version"},{"line_number":38,"context_line":"    except TypeError:"},{"line_number":39,"context_line":"        return \u0027IPv4\u0027"},{"line_number":40,"context_line":"    if ip_version \u003d\u003d 4:"},{"line_number":41,"context_line":"        return \u0027IPv4\u0027"},{"line_number":42,"context_line":"    if ip_version \u003d\u003d 6:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_2a726649","line":39,"in_reply_to":"fa81d914_e688b7e9","updated":"2015-01-29 09:42:03.000000000","message":"ok, looks like any nova rule with grantee (remote) security group as a source (rather than cidr) is assumed IPv4 rule","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"9fd269588dce58501633a6ff973a7453612343ab","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def _create_default_security_group(default_tenant):"},{"line_number":47,"context_line":"    default_sg \u003d {\u0027tenant_id\u0027: default_tenant,"},{"line_number":48,"context_line":"                  \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":49,"context_line":"                  \u0027name\u0027: \u0027default\u0027,"},{"line_number":50,"context_line":"                  \u0027description\u0027: \u0027Default security group\u0027}"},{"line_number":51,"context_line":"    return default_sg"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_299390fb","line":48,"updated":"2015-01-28 11:07:11.000000000","message":"we should try to keep nova-net uuids as much as possible to make nova-net proxy transparent","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"b166e3a72b83283727ce669f04490a67a4106099","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def _create_default_security_group(default_tenant):"},{"line_number":47,"context_line":"    default_sg \u003d {\u0027tenant_id\u0027: default_tenant,"},{"line_number":48,"context_line":"                  \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":49,"context_line":"                  \u0027name\u0027: \u0027default\u0027,"},{"line_number":50,"context_line":"                  \u0027description\u0027: \u0027Default security group\u0027}"},{"line_number":51,"context_line":"    return default_sg"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_4a64fa21","line":48,"in_reply_to":"fa81d914_07abdb1d","updated":"2015-01-29 14:12:40.000000000","message":"Aaah, now I get the reason we need to keep it. We could create a new table in neutron db with the needed mappings for such cases.","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"afdd3643b2e32dc0df03cdbdfa2f2f02d3dec358","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def _create_default_security_group(default_tenant):"},{"line_number":47,"context_line":"    default_sg \u003d {\u0027tenant_id\u0027: default_tenant,"},{"line_number":48,"context_line":"                  \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":49,"context_line":"                  \u0027name\u0027: \u0027default\u0027,"},{"line_number":50,"context_line":"                  \u0027description\u0027: \u0027Default security group\u0027}"},{"line_number":51,"context_line":"    return default_sg"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_2c6d5b33","line":48,"in_reply_to":"fa81d914_299390fb","updated":"2015-01-28 14:50:37.000000000","message":"we can discuss this as I think it\u0027s better to keep with Neutron\u0027s uuid concept. Nova uses long integer counters (i.e. first network has id 1, second is 2 etc.) while Neutron has hashes.","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"00f48b044d6b7280a6f682444b59191136f798cb","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def _create_default_security_group(default_tenant):"},{"line_number":47,"context_line":"    default_sg \u003d {\u0027tenant_id\u0027: default_tenant,"},{"line_number":48,"context_line":"                  \u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":49,"context_line":"                  \u0027name\u0027: \u0027default\u0027,"},{"line_number":50,"context_line":"                  \u0027description\u0027: \u0027Default security group\u0027}"},{"line_number":51,"context_line":"    return default_sg"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_07abdb1d","line":48,"in_reply_to":"fa81d914_2c6d5b33","updated":"2015-01-29 09:42:03.000000000","message":"I think we need to find a way to keep both. As I mentioned in the spec review [1], most probably we\u0027ll need a new neutron extension to store/return nova data for which there is no place in current neutron db, unless someone can come up with a better idea. When switching to proxy mode in nova, changes in ids may lead to mess.\n\n[1] https://review.openstack.org/#/c/142456/8/specs/kilo/migration-from-nova-net.rst","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"9fd269588dce58501633a6ff973a7453612343ab","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @classmethod"},{"line_number":84,"context_line":"    def create_target_resource(cls, source):"},{"line_number":85,"context_line":"        network_id \u003d uuidutils.generate_uuid()"},{"line_number":86,"context_line":"        network \u003d {"},{"line_number":87,"context_line":"            \u0027id\u0027: network_id,"},{"line_number":88,"context_line":"            \u0027tenant_id\u0027: source[\u0027project_id\u0027] or cls.default_tenant,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_e2d9d957","line":85,"updated":"2015-01-28 11:07:11.000000000","message":"ditto","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"9fd269588dce58501633a6ff973a7453612343ab","unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @classmethod"},{"line_number":236,"context_line":"    def create_target_resource(cls, source):"},{"line_number":237,"context_line":"        port_id \u003d uuidutils.generate_uuid()"},{"line_number":238,"context_line":"        port \u003d {\u0027tenant_id\u0027: source[\u0027project_id\u0027],"},{"line_number":239,"context_line":"                \u0027id\u0027: port_id,"},{"line_number":240,"context_line":"                # TODO(jlibosva): what to put in here?"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_09b169f8","line":237,"updated":"2015-01-28 11:07:11.000000000","message":"ditto","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"9fd269588dce58501633a6ff973a7453612343ab","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        port_id \u003d uuidutils.generate_uuid()"},{"line_number":238,"context_line":"        port \u003d {\u0027tenant_id\u0027: source[\u0027project_id\u0027],"},{"line_number":239,"context_line":"                \u0027id\u0027: port_id,"},{"line_number":240,"context_line":"                # TODO(jlibosva): what to put in here?"},{"line_number":241,"context_line":"                \u0027name\u0027: \u0027\u0027,"},{"line_number":242,"context_line":"                \u0027network_id\u0027: NetworksMigration.MAPPINGS[source[\u0027network_id\u0027]],"},{"line_number":243,"context_line":"                \u0027mac_address\u0027: source[\u0027address\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_49cb6172","line":240,"updated":"2015-01-28 11:07:11.000000000","message":"nothing I guess","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"9fd269588dce58501633a6ff973a7453612343ab","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        target_resources \u003d super("},{"line_number":261,"context_line":"            SecurityGroupsMigration, cls).create_new_resources("},{"line_number":262,"context_line":"                database)"},{"line_number":263,"context_line":"        target_resources.insert(0, cls.default_sg)"},{"line_number":264,"context_line":"        return target_resources"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_a9b69dda","line":263,"updated":"2015-01-28 11:07:11.000000000","message":"what\u0027s the reason for adding default security group? what if nova has one?","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"00f48b044d6b7280a6f682444b59191136f798cb","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        target_resources \u003d super("},{"line_number":261,"context_line":"            SecurityGroupsMigration, cls).create_new_resources("},{"line_number":262,"context_line":"                database)"},{"line_number":263,"context_line":"        target_resources.insert(0, cls.default_sg)"},{"line_number":264,"context_line":"        return target_resources"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_8affd266","line":263,"in_reply_to":"fa81d914_704ba1b0","updated":"2015-01-29 09:42:03.000000000","message":"not sure why we need to create new group in neutron. why you think just fetching security groups from nova will not work?","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"b166e3a72b83283727ce669f04490a67a4106099","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        target_resources \u003d super("},{"line_number":261,"context_line":"            SecurityGroupsMigration, cls).create_new_resources("},{"line_number":262,"context_line":"                database)"},{"line_number":263,"context_line":"        target_resources.insert(0, cls.default_sg)"},{"line_number":264,"context_line":"        return target_resources"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_a3abd4d4","line":263,"in_reply_to":"fa81d914_8affd266","updated":"2015-01-29 14:12:40.000000000","message":"Because nova has special table \"security_group_default_rules\". I assume it\u0027s the same as Neutron\u0027s \"default\" security group.","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"188a9068cafe17148c971b6526025a016c142507","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        target_resources \u003d super("},{"line_number":261,"context_line":"            SecurityGroupsMigration, cls).create_new_resources("},{"line_number":262,"context_line":"                database)"},{"line_number":263,"context_line":"        target_resources.insert(0, cls.default_sg)"},{"line_number":264,"context_line":"        return target_resources"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_11be80b4","line":263,"in_reply_to":"fa81d914_a3abd4d4","updated":"2015-01-30 11:59:16.000000000","message":"Patch https://review.openstack.org/#/c/142101/31 solves this problem.","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"afdd3643b2e32dc0df03cdbdfa2f2f02d3dec358","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        target_resources \u003d super("},{"line_number":261,"context_line":"            SecurityGroupsMigration, cls).create_new_resources("},{"line_number":262,"context_line":"                database)"},{"line_number":263,"context_line":"        target_resources.insert(0, cls.default_sg)"},{"line_number":264,"context_line":"        return target_resources"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_704ba1b0","line":263,"in_reply_to":"fa81d914_a9b69dda","updated":"2015-01-28 14:50:37.000000000","message":"Hmm, I didn\u0027t think about that. For default rules nova has its own table. I\u0027m not sure how to proceed here, maybe we should warn deployer and rename default nova network to something else and also hack this for all instances using nova security group called \u0027default\u0027.","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"9fd269588dce58501633a6ff973a7453612343ab","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                           \u0027protocol\u0027: source[\u0027protocol\u0027],"},{"line_number":294,"context_line":"                           \u0027port_range_min\u0027: source[\u0027from_port\u0027],"},{"line_number":295,"context_line":"                           \u0027port_range_max\u0027: source[\u0027to_port\u0027]}"},{"line_number":296,"context_line":"        #TODO(jlibosva): what is remote_group_id and remote_ip_prefix"},{"line_number":297,"context_line":"        return neutron_sg_rule"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_c9659146","line":296,"updated":"2015-01-28 11:07:11.000000000","message":"should it be mapped with grantee_group?","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"00f48b044d6b7280a6f682444b59191136f798cb","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                           \u0027protocol\u0027: source[\u0027protocol\u0027],"},{"line_number":294,"context_line":"                           \u0027port_range_min\u0027: source[\u0027from_port\u0027],"},{"line_number":295,"context_line":"                           \u0027port_range_max\u0027: source[\u0027to_port\u0027]}"},{"line_number":296,"context_line":"        #TODO(jlibosva): what is remote_group_id and remote_ip_prefix"},{"line_number":297,"context_line":"        return neutron_sg_rule"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_6a645e49","line":296,"in_reply_to":"fa81d914_03b05d8a","updated":"2015-01-29 09:42:03.000000000","message":"So it\u0027s the same as in neutron: each rule in nova may have either cidr (\u003d\u003dremote_ip_prefix in neutron) or grantee_group (\u003d\u003dremote_group in neutron).\n\nhttps://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/models.py#L696-L703","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"afdd3643b2e32dc0df03cdbdfa2f2f02d3dec358","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                           \u0027protocol\u0027: source[\u0027protocol\u0027],"},{"line_number":294,"context_line":"                           \u0027port_range_min\u0027: source[\u0027from_port\u0027],"},{"line_number":295,"context_line":"                           \u0027port_range_max\u0027: source[\u0027to_port\u0027]}"},{"line_number":296,"context_line":"        #TODO(jlibosva): what is remote_group_id and remote_ip_prefix"},{"line_number":297,"context_line":"        return neutron_sg_rule"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa81d914_03b05d8a","line":296,"in_reply_to":"fa81d914_c9659146","updated":"2015-01-28 14:50:37.000000000","message":"What\u0027s that?","commit_id":"b8304f34bb921c994e127424531112427ebacf54"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d3719e23834efcbd37d944358f46c8918c2daefb","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @classmethod"},{"line_number":116,"context_line":"    def _check_dependencies(cls):"},{"line_number":117,"context_line":"        if cls.DEPENDENCIES:"},{"line_number":118,"context_line":"            for dependency in cls.DEPENDENCIES:"},{"line_number":119,"context_line":"                if not dependency.has_run:"},{"line_number":120,"context_line":"                    raise MigrationException("}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_92bc2f07","line":117,"updated":"2015-05-21 08:51:53.000000000","message":"This is retarded ...","commit_id":"305b471f7e8f780c6e445c56720e21412f5e69d1"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"7fbff08d959407895c7f65332b5092896c4d93c9","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        network \u003d {"},{"line_number":198,"context_line":"            \u0027id\u0027: network_id,"},{"line_number":199,"context_line":"            \u0027tenant_id\u0027: source[\u0027project_id\u0027] or cls.default_tenant,"},{"line_number":200,"context_line":"            \u0027name\u0027: \u0027nn_%s\u0027 % source[\u0027label\u0027],"},{"line_number":201,"context_line":"            \u0027status\u0027: neutron_constants.NET_STATUS_ACTIVE,"},{"line_number":202,"context_line":"            \u0027admin_state_up\u0027: True,"},{"line_number":203,"context_line":"            \u0027shared\u0027: source[\u0027project_id\u0027] is None"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_212436ae","line":200,"updated":"2015-03-03 14:29:35.000000000","message":"why nn_ prefix? better to preserve orig names for transparency","commit_id":"305b471f7e8f780c6e445c56720e21412f5e69d1"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"7fbff08d959407895c7f65332b5092896c4d93c9","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                    subnets.append(subnet)"},{"line_number":287,"context_line":"                    cls.MAPPINGS[network[\u0027uuid\u0027]].append(subnet[\u0027id\u0027])"},{"line_number":288,"context_line":"                    LOG.debug(\u0027Subnet %(subnet)s was created based on \u0027"},{"line_number":289,"context_line":"                              \u0027%(network)\u0027, {\u0027subnet\u0027: subnet,"},{"line_number":290,"context_line":"                                             \u0027network\u0027: network})"},{"line_number":291,"context_line":"        if FloatingNetworkMigration.has_run:"},{"line_number":292,"context_line":"            cls._create_subnets_from_fips(subnets)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_e1ecde2b","line":289,"updated":"2015-03-03 14:29:35.000000000","message":"%(network)s","commit_id":"305b471f7e8f780c6e445c56720e21412f5e69d1"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"7fbff08d959407895c7f65332b5092896c4d93c9","unresolved":false,"context_lines":[{"line_number":327,"context_line":"               WHERE deleted_at IS NULL\"\"\""},{"line_number":328,"context_line":"    TABLE_NAME \u003d \u0027ipallocationpools\u0027"},{"line_number":329,"context_line":"    DEPENDENCIES \u003d [NetworksMigration, SubnetsMigration]"},{"line_number":330,"context_line":"    enable_dhcp \u003d None"},{"line_number":331,"context_line":"    MAPPINGS \u003d dict()"},{"line_number":332,"context_line":"    POOLS \u003d dict()"},{"line_number":333,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_61638edd","line":330,"updated":"2015-03-03 14:29:35.000000000","message":"is it used?","commit_id":"305b471f7e8f780c6e445c56720e21412f5e69d1"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"7fbff08d959407895c7f65332b5092896c4d93c9","unresolved":false,"context_lines":[{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    @classmethod"},{"line_number":368,"context_line":"    def create_target_resource(cls, source):"},{"line_number":369,"context_line":"        port_id \u003d uuidutils.generate_uuid()"},{"line_number":370,"context_line":"        port \u003d {\u0027tenant_id\u0027: source[\u0027project_id\u0027],"},{"line_number":371,"context_line":"                \u0027id\u0027: port_id,"},{"line_number":372,"context_line":"                \u0027name\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_7b37844d","line":369,"updated":"2015-03-03 14:29:35.000000000","message":"please use vif.uuid","commit_id":"305b471f7e8f780c6e445c56720e21412f5e69d1"}]}
