diff --git a/nova/tests/test_migrations.py b/nova/tests/test_migrations.py index e71b97513..fb7411cd0 100644 --- a/nova/tests/test_migrations.py +++ b/nova/tests/test_migrations.py @@ -507,28 +507,52 @@ class TestMigrations(BaseMigrationTestCase): # migration 149, changes IPAddr storage format def _prerun_149(self, engine): provider_fw_rules = get_table(engine, 'provider_fw_rules') - data = [ - {'protocol': 'tcp', 'from_port': 1234, - 'to_port': 1234, 'cidr': "127.0.0.1"}, - {'protocol': 'tcp', 'from_port': 1234, - 'to_port': 1234, 'cidr': "255.255.255.255"}, - {'protocol': 'tcp', 'from_port': 1234, - 'to_port': 1234, 'cidr': "2001:db8::1:2"}, - {'protocol': 'tcp', 'from_port': 1234, - 'to_port': 1234, 'cidr': "::1"} - ] - engine.execute(provider_fw_rules.insert(), data) + console_pools = get_table(engine, 'console_pools') + data = { + 'provider_fw_rules': + [ + {'protocol': 'tcp', 'from_port': 1234, + 'to_port': 1234, 'cidr': "127.0.0.1/30"}, + {'protocol': 'tcp', 'from_port': 1234, + 'to_port': 1234, 'cidr': "128.128.128.128/16"}, + {'protocol': 'tcp', 'from_port': 1234, + 'to_port': 1234, 'cidr': "2001:db8::1:2/48"}, + {'protocol': 'tcp', 'from_port': 1234, + 'to_port': 1234, 'cidr': "::1/64"} + ], + 'console_pools': + [ + {'address': '10.10.10.10'}, + {'address': '128.100.100.100'}, + {'address': '2002:2002:2002:2002:2002:2002:2002:2002'}, + {'address': '::1'}, + ] + } + + engine.execute(provider_fw_rules.insert(), data['provider_fw_rules']) + + for pool in data['console_pools']: + engine.execute(console_pools.insert(), pool) + return data def _check_149(self, engine, data): provider_fw_rules = get_table(engine, 'provider_fw_rules') result = provider_fw_rules.select().execute() - iplist = map(lambda x: x['cidr'], data) + iplist = map(lambda x: x['cidr'], data['provider_fw_rules']) for row in result: self.assertIn(row['cidr'], iplist) + console_pools = get_table(engine, 'console_pools') + result = console_pools.select().execute() + + iplist = map(lambda x: x['address'], data['console_pools']) + + for row in result: + self.assertIn(row['address'], iplist) + # migration 151 - changes period_beginning and period_ending to DateTime def _prerun_151(self, engine): task_log = get_table(engine, 'task_log') @@ -703,3 +727,32 @@ class TestMigrations(BaseMigrationTestCase): # override __eq__, but if we stringify them then they do. self.assertEqual(str(base_column.type), str(shadow_column.type)) + + # migration 156 - introduce CIDR type + def _prerun_156(self, engine): + # assume the same data as from 149 + data = { + 'provider_fw_rules': + [ + {'protocol': 'tcp', 'from_port': 1234, + 'to_port': 1234, 'cidr': "127.0.0.1/30"}, + {'protocol': 'tcp', 'from_port': 1234, + 'to_port': 1234, 'cidr': "128.128.128.128/16"}, + {'protocol': 'tcp', 'from_port': 1234, + 'to_port': 1234, 'cidr': "2001:db8::1:2/48"}, + {'protocol': 'tcp', 'from_port': 1234, + 'to_port': 1234, 'cidr': "::1/64"} + ], + 'console_pools': + [ + {'address': '10.10.10.10'}, + {'address': '128.100.100.100'}, + {'address': '2002:2002:2002:2002:2002:2002:2002:2002'}, + {'address': '::1'}, + ] + } + return data + + def _check_156(self, engine, data): + # recheck the 149 data + self._check_149(engine, data) diff --git a/nova/utils.py b/nova/utils.py index aaf258142..126e3c7e4 100644 --- a/nova/utils.py +++ b/nova/utils.py @@ -896,11 +896,24 @@ def is_valid_ipv6(address): return netaddr.valid_ipv6(address) +def is_valid_ipv6_cidr(address): + try: + str(netaddr.IPNetwork(address, version=6).cidr) + return True + except Exception: + return False + + def get_shortened_ipv6(address): addr = netaddr.IPAddress(address, version=6) return str(addr.ipv6()) +def get_shortened_ipv6_cidr(address): + net = netaddr.IPNetwork(address, version=6) + return str(net.cidr) + + def is_valid_cidr(address): """Check if the provided ipv4 or ipv6 address is a valid CIDR address or not"""