Remove downgrade from existing migrations
Remove downgrade from all existing migrations. Create a test that verifies that no migration has a downgrade. Related cross-project spec: https://review.openstack.org/152337 Closes-Bug: 1434103 Change-Id: I2aad5f40f9aec9aea7ea869c9f30bc5ea586f3fe
This commit is contained in:
parent
132f1be686
commit
b2cbb2d4af
|
@ -37,7 +37,3 @@ def upgrade():
|
|||
sa.Column('description', sa.String(length=255), nullable=True),
|
||||
sa.Column('configurations', sa.String(length=4095), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('agents')
|
||||
|
|
|
@ -36,8 +36,3 @@ def upgrade():
|
|||
sa.Column('tenant_id', sa.String(length=36), nullable=True),
|
||||
sa.ForeignKeyConstraint(['network_id'], ['brocadenetworks.id'], ),
|
||||
sa.PrimaryKeyConstraint('port_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('brocadeports')
|
||||
op.drop_table('brocadenetworks')
|
||||
|
|
|
@ -153,23 +153,3 @@ def upgrade():
|
|||
ondelete='CASCADE'),
|
||||
sa.ForeignKeyConstraint(['profile_id'], ['cisco_policy_profiles.id']),
|
||||
sa.PrimaryKeyConstraint('port_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('cisco_n1kv_port_bindings')
|
||||
op.drop_table('cisco_n1kv_network_bindings')
|
||||
op.drop_table('cisco_n1kv_multi_segments')
|
||||
op.drop_table('cisco_provider_networks')
|
||||
op.drop_table('cisco_n1kv_trunk_segments')
|
||||
op.drop_table('cisco_n1kv_vmnetworks')
|
||||
op.drop_table('cisco_n1kv_profile_bindings')
|
||||
op.drop_table('cisco_nexusport_bindings')
|
||||
op.drop_table('cisco_qos_policies')
|
||||
op.drop_table('cisco_credentials')
|
||||
op.drop_table('cisco_n1kv_vxlan_allocations')
|
||||
op.drop_table('cisco_network_profiles')
|
||||
op.drop_table('cisco_n1kv_vlan_allocations')
|
||||
op.drop_table('cisco_policy_profiles')
|
||||
# generate DDL for dropping enumns
|
||||
segment_type.drop(op.get_bind(), checkfirst=False)
|
||||
profile_type.drop(op.get_bind(), checkfirst=False)
|
||||
|
|
|
@ -115,15 +115,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['network_id'], ['networks.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('network_id', 'dhcp_agent_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('networkdhcpagentbindings')
|
||||
op.drop_table('ipavailabilityranges')
|
||||
op.drop_table('ipallocations')
|
||||
op.drop_table('subnetroutes')
|
||||
op.drop_table('ipallocationpools')
|
||||
op.drop_table('dnsnameservers')
|
||||
op.drop_table('subnets')
|
||||
op.drop_table('ports')
|
||||
op.drop_table('networks')
|
||||
|
|
|
@ -73,10 +73,3 @@ def upgrade():
|
|||
['firewall_policies.id'],
|
||||
name='firewall_rules_ibfk_1'),
|
||||
sa.PrimaryKeyConstraint('id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('firewall_rules')
|
||||
op.drop_table('firewalls')
|
||||
op.drop_table('firewall_policies')
|
||||
action_types.drop(op.get_bind(), checkfirst=False)
|
||||
|
|
|
@ -78,11 +78,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['router_id'], ['routers.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('routerl3agentbindings')
|
||||
op.drop_table('routerroutes')
|
||||
op.drop_table('floatingips')
|
||||
op.drop_table('routers')
|
||||
op.drop_table('externalnetworks')
|
||||
|
|
|
@ -36,8 +36,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['network_id'], ['networks.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('network_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('network_bindings')
|
||||
op.drop_table('network_states')
|
||||
|
|
|
@ -130,18 +130,3 @@ def upgrade():
|
|||
sa.Column('total_connections', sa.Integer(), nullable=False),
|
||||
sa.ForeignKeyConstraint(['pool_id'], ['pools.id'], ),
|
||||
sa.PrimaryKeyConstraint('pool_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('poolstatisticss')
|
||||
op.drop_table('poolmonitorassociations')
|
||||
op.drop_table('members')
|
||||
op.drop_table('poolloadbalanceragentbindings')
|
||||
op.drop_table('sessionpersistences')
|
||||
op.drop_table('pools')
|
||||
op.drop_table('vips')
|
||||
op.drop_table('healthmonitors')
|
||||
protocols.drop(op.get_bind(), checkfirst=False)
|
||||
session_persistence_type.drop(op.get_bind(), checkfirst=False)
|
||||
lb_methods.drop(op.get_bind(), checkfirst=False)
|
||||
health_monitor_type.drop(op.get_bind(), checkfirst=False)
|
||||
|
|
|
@ -48,9 +48,3 @@ def upgrade():
|
|||
['meteringlabels.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('meteringlabelrules')
|
||||
op.drop_table('meteringlabels')
|
||||
direction.drop(op.get_bind(), checkfirst=False)
|
||||
|
|
|
@ -134,19 +134,3 @@ def upgrade():
|
|||
sa.Column('tenant_id', sa.String(length=255), nullable=True),
|
||||
sa.Column('id', sa.String(length=36), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('arista_provisioned_tenants')
|
||||
op.drop_table('arista_provisioned_vms')
|
||||
op.drop_table('arista_provisioned_nets')
|
||||
op.drop_table('cisco_ml2_credentials')
|
||||
op.drop_table('cisco_ml2_nexusport_bindings')
|
||||
op.drop_table('ml2_port_bindings')
|
||||
op.drop_table('ml2_network_segments')
|
||||
op.drop_table('ml2_flat_allocations')
|
||||
op.drop_table('ml2_gre_allocations')
|
||||
op.drop_table('ml2_vxlan_allocations')
|
||||
op.drop_table('ml2_gre_endpoints')
|
||||
op.drop_table('ml2_vxlan_endpoints')
|
||||
op.drop_table('ml2_vlan_allocations')
|
||||
|
|
|
@ -45,9 +45,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['port_id'], ['ports.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('port_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('port_profile')
|
||||
op.drop_table('mlnx_network_bindings')
|
||||
op.drop_table('segmentation_id_allocation')
|
||||
|
|
|
@ -122,18 +122,3 @@ def upgrade():
|
|||
sa.Column('mac', sa.String(length=32), nullable=False),
|
||||
sa.ForeignKeyConstraint(['id'], ['ports.id'], ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('portinfos')
|
||||
op.drop_table('packetfilters')
|
||||
op.drop_table('ofctenants')
|
||||
op.drop_table('ofcports')
|
||||
op.drop_table('ofcfilters')
|
||||
op.drop_table('ofcnetworkmappings')
|
||||
op.drop_table('ofcfiltermappings')
|
||||
op.drop_table('ofctenantmappings')
|
||||
op.drop_table('ofcnetworks')
|
||||
op.drop_table('routerproviders')
|
||||
op.drop_table('ofcroutermappings')
|
||||
op.drop_table('ofcportmappings')
|
||||
|
|
|
@ -82,13 +82,3 @@ def upgrade():
|
|||
sa.Column('router_id', sa.String(length=36), nullable=False),
|
||||
sa.ForeignKeyConstraint(['router_id'], ['routers.id'], ),
|
||||
sa.PrimaryKeyConstraint('resource_id', 'resource_type'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('servicerouterbindings')
|
||||
op.drop_table('routerservicetypebindings')
|
||||
op.drop_table('extradhcpopts')
|
||||
op.drop_table('portbindingports')
|
||||
op.drop_table('allowedaddresspairs')
|
||||
op.drop_table('quotas')
|
||||
op.drop_table('providerresourceassociations')
|
||||
|
|
|
@ -79,12 +79,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['rule_id'], ['routerrules.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('rule_id', 'nexthop'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('nexthops')
|
||||
op.drop_table('routerrules')
|
||||
op.drop_table('routerflavors')
|
||||
op.drop_table('networkflavors')
|
||||
op.drop_table('hyperv_network_bindings')
|
||||
op.drop_table('hyperv_vlan_allocations')
|
||||
|
|
|
@ -52,10 +52,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['network_id'], ['networks.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('network_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('ovs_network_bindings')
|
||||
op.drop_table('ovs_vlan_allocations')
|
||||
op.drop_table('ovs_tunnel_allocations')
|
||||
op.drop_table('ovs_tunnel_endpoints')
|
||||
|
|
|
@ -36,8 +36,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['port_id'], ['ports.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('port_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('portsecuritybindings')
|
||||
op.drop_table('networksecuritybindings')
|
||||
|
|
|
@ -33,8 +33,3 @@ def upgrade():
|
|||
nullable=False),
|
||||
sa.ForeignKeyConstraint(['network_id'], ['networks.id'], ),
|
||||
sa.PrimaryKeyConstraint('tunnel_key'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('tunnelkeys')
|
||||
op.drop_table('tunnelkeylasts')
|
||||
|
|
|
@ -56,10 +56,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['port_id'], ['ports.id'], ondelete='CASCADE'),
|
||||
sa.ForeignKeyConstraint(['security_group_id'], ['securitygroups.id']),
|
||||
sa.PrimaryKeyConstraint('port_id', 'security_group_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('securitygroupportbindings')
|
||||
op.drop_table('securitygrouprules')
|
||||
op.drop_table('securitygroups')
|
||||
rule_direction_enum.drop(op.get_bind(), checkfirst=False)
|
||||
|
|
|
@ -51,8 +51,3 @@ def upgrade():
|
|||
# if another plugin was configured before the nuage one
|
||||
if not migration.schema_has_table('routerroutes'):
|
||||
l3_init_ops.create_routerroutes()
|
||||
|
||||
|
||||
def downgrade():
|
||||
# The routerroutes table should not be dropped
|
||||
op.drop_table('routerroutes_mapping')
|
||||
|
|
|
@ -172,7 +172,3 @@ def upgrade():
|
|||
op.drop_table('ofcnetworks')
|
||||
op.drop_table('ofcports')
|
||||
op.drop_table('ofcfilters')
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -52,7 +52,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['lsn_id'], ['lsn.lsn_id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('lsn_port_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -63,10 +63,6 @@ def upgrade():
|
|||
op.execute(ins)
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('default_security_group')
|
||||
|
||||
|
||||
def check_sanity(connection):
|
||||
res = get_duplicate_default_security_groups(connection)
|
||||
if res:
|
||||
|
|
|
@ -36,7 +36,3 @@ def upgrade():
|
|||
op.add_column('ml2_port_bindings',
|
||||
sa.Column('profile', sa.String(length=4095),
|
||||
nullable=False, server_default=''))
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -26,28 +26,11 @@ revision = '1680e1f0c4dc'
|
|||
down_revision = '3c346828361e'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
def upgrade(active_plugins=None, options=None):
|
||||
def upgrade():
|
||||
op.execute('INSERT INTO cisco_ml2_nexusport_bindings (port_id, '
|
||||
'vlan_id, switch_ip, instance_id) SELECT '
|
||||
'port_id, vlan_id, switch_ip, instance_id FROM '
|
||||
'cisco_nexusport_bindings')
|
||||
op.drop_table('cisco_nexusport_bindings')
|
||||
|
||||
|
||||
def downgrade(active_plugins=None, options=None):
|
||||
op.create_table(
|
||||
'cisco_nexusport_bindings',
|
||||
sa.Column('id', sa.Integer(), primary_key=True, autoincrement=True),
|
||||
sa.Column('port_id', sa.String(255)),
|
||||
sa.Column('vlan_id', sa.Integer(), nullable=False),
|
||||
sa.Column('switch_ip', sa.String(255), nullable=False),
|
||||
sa.Column('instance_id', sa.String(255), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.execute('INSERT INTO cisco_nexusport_bindings (port_id, '
|
||||
'vlan_id, switch_ip, instance_id) SELECT '
|
||||
'port_id, vlan_id, switch_ip, instance_id FROM '
|
||||
'cisco_ml2_nexusport_bindings')
|
||||
|
|
|
@ -75,12 +75,3 @@ def upgrade(active_plugins=None, options=None):
|
|||
primary_key=True),
|
||||
sa.ForeignKeyConstraint(['network_id'], ['networks.id'],
|
||||
ondelete='CASCADE'))
|
||||
|
||||
|
||||
def downgrade(active_plugins=None, options=None):
|
||||
op.drop_table('ha_router_vrid_allocations')
|
||||
op.drop_table('ha_router_networks')
|
||||
op.drop_table('ha_router_agent_port_bindings')
|
||||
l3_ha_states.drop(op.get_bind(), checkfirst=False)
|
||||
op.drop_column('router_extra_attributes', 'ha_vr_id')
|
||||
op.drop_column('router_extra_attributes', 'ha')
|
||||
|
|
|
@ -52,19 +52,3 @@ def upgrade():
|
|||
source='extradhcpopts',
|
||||
local_cols=['port_id', 'opt_name', 'ip_version']
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
with migration.remove_fks_from_table(TABLE_NAME):
|
||||
op.drop_constraint(
|
||||
name=CONSTRAINT_NAME_NEW,
|
||||
table_name='extradhcpopts',
|
||||
type_='unique'
|
||||
)
|
||||
op.drop_column('extradhcpopts', 'ip_version')
|
||||
|
||||
op.create_unique_constraint(
|
||||
name=CONSTRAINT_NAME_OLD,
|
||||
source='extradhcpopts',
|
||||
local_cols=['port_id', 'opt_name']
|
||||
)
|
||||
|
|
|
@ -70,7 +70,3 @@ def upgrade():
|
|||
"FROM networkgatewaydevicereferences AS gw_dev_ref "
|
||||
"INNER JOIN networkgateways AS net_gw ON "
|
||||
"gw_dev_ref.network_gateway_id=net_gw.id")
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -33,7 +33,3 @@ def upgrade():
|
|||
op.add_column('agents',
|
||||
sa.Column('load', sa.Integer(),
|
||||
server_default='0', nullable=False))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_column('agents', 'load')
|
||||
|
|
|
@ -48,7 +48,3 @@ def upgrade():
|
|||
# each record in securitygroups
|
||||
op.execute("INSERT INTO neutron_nsx_security_group_mappings SELECT id,id "
|
||||
"from securitygroups")
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -55,9 +55,3 @@ def upgrade():
|
|||
sa.Column('contract_id', sa.String(length=64), nullable=False),
|
||||
sa.Column('filter_id', sa.String(length=64), nullable=False),
|
||||
sa.PrimaryKeyConstraint('tenant_id'))
|
||||
|
||||
|
||||
def downgrade(active_plugins=None, options=None):
|
||||
op.drop_table('cisco_ml2_apic_contracts')
|
||||
op.drop_table('cisco_ml2_apic_port_profiles')
|
||||
op.drop_table('cisco_ml2_apic_epgs')
|
||||
|
|
|
@ -30,7 +30,3 @@ from neutron.db.migration.alembic_migrations import heal_script
|
|||
|
||||
def upgrade():
|
||||
heal_script.heal()
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -48,23 +48,3 @@ def upgrade():
|
|||
'poolstatisticss', 'total_connections',
|
||||
nullable=False,
|
||||
existing_type=sa.BigInteger())
|
||||
|
||||
|
||||
@migration.skip_if_offline
|
||||
def downgrade():
|
||||
migration.alter_column_if_exists(
|
||||
'poolstatisticss', 'bytes_in',
|
||||
nullable=True,
|
||||
existing_type=sa.BigInteger())
|
||||
migration.alter_column_if_exists(
|
||||
'poolstatisticss', 'bytes_out',
|
||||
nullable=True,
|
||||
existing_type=sa.BigInteger())
|
||||
migration.alter_column_if_exists(
|
||||
'poolstatisticss', 'active_connections',
|
||||
nullable=True,
|
||||
existing_type=sa.BigInteger())
|
||||
migration.alter_column_if_exists(
|
||||
'poolstatisticss', 'total_connections',
|
||||
nullable=True,
|
||||
existing_type=sa.BigInteger())
|
||||
|
|
|
@ -34,7 +34,3 @@ def upgrade():
|
|||
op.add_column('ml2_network_segments',
|
||||
sa.Column('segment_index', sa.Integer(), nullable=False,
|
||||
server_default='0'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_column('ml2_network_segments', 'segment_index')
|
||||
|
|
|
@ -46,7 +46,3 @@ def upgrade():
|
|||
source=TABLE_NAME,
|
||||
local_cols=['agent_type', 'host']
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -60,8 +60,3 @@ def upgrade():
|
|||
ondelete='SET NULL'),
|
||||
sa.PrimaryKeyConstraint('port_id', 'host')
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('ml2_dvr_port_bindings')
|
||||
op.drop_table('dvr_host_macs')
|
||||
|
|
|
@ -34,8 +34,3 @@ def upgrade():
|
|||
op.add_column('ml2_network_segments',
|
||||
sa.Column('is_dynamic', sa.Boolean(), nullable=False,
|
||||
server_default=sa.sql.false()))
|
||||
|
||||
|
||||
def downgrade():
|
||||
|
||||
op.drop_column('ml2_network_segments', 'is_dynamic')
|
||||
|
|
|
@ -53,7 +53,3 @@ def upgrade():
|
|||
name='ipv6_address_modes'),
|
||||
nullable=True)
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -45,7 +45,3 @@ def upgrade():
|
|||
['ipsec_site_connections.id'],
|
||||
ondelete='CASCADE')
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -39,12 +39,3 @@ def upgrade():
|
|||
op.f('ix_ml2_vlan_allocations_physical_network_allocated'),
|
||||
'ml2_vlan_allocations', ['physical_network', 'allocated'],
|
||||
unique=False)
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_index(op.f('ix_ml2_vxlan_allocations_allocated'),
|
||||
table_name='ml2_vxlan_allocations')
|
||||
op.drop_index(op.f('ix_ml2_gre_allocations_allocated'),
|
||||
table_name='ml2_gre_allocations')
|
||||
op.drop_index(op.f('ix_ml2_vlan_allocations_physical_network_allocated'),
|
||||
table_name='ml2_vlan_allocations')
|
||||
|
|
|
@ -37,7 +37,3 @@ def upgrade():
|
|||
sa.Column('vnic_type', sa.String(length=64),
|
||||
nullable=False,
|
||||
server_default='normal'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -26,50 +26,9 @@ revision = '28c0ffb8ebbd'
|
|||
down_revision = '408cfbf6923c'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
def upgrade():
|
||||
op.drop_table('mlnx_network_bindings')
|
||||
op.drop_table('segmentation_id_allocation')
|
||||
op.drop_table('port_profile')
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.create_table(
|
||||
'port_profile',
|
||||
sa.Column(
|
||||
'port_id', sa.String(length=36), nullable=False),
|
||||
sa.Column(
|
||||
'vnic_type', sa.String(length=32), nullable=False),
|
||||
sa.ForeignKeyConstraint(['port_id'], ['ports.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('port_id'),
|
||||
)
|
||||
op.create_table(
|
||||
'segmentation_id_allocation',
|
||||
sa.Column('physical_network',
|
||||
sa.String(length=64),
|
||||
nullable=False),
|
||||
sa.Column('segmentation_id',
|
||||
sa.Integer(),
|
||||
autoincrement=False,
|
||||
nullable=False),
|
||||
sa.Column('allocated',
|
||||
sa.Boolean(),
|
||||
server_default=sa.sql.false(),
|
||||
nullable=False),
|
||||
sa.PrimaryKeyConstraint('physical_network', 'segmentation_id')
|
||||
)
|
||||
op.create_table(
|
||||
'mlnx_network_bindings',
|
||||
sa.Column('network_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('network_type', sa.String(length=32), nullable=False),
|
||||
sa.Column('physical_network', sa.String(length=64), nullable=True),
|
||||
sa.Column('segmentation_id',
|
||||
sa.Integer(),
|
||||
autoincrement=False, nullable=False),
|
||||
sa.ForeignKeyConstraint(['network_id'],
|
||||
['networks.id']),
|
||||
sa.PrimaryKeyConstraint('network_id'),
|
||||
)
|
||||
|
|
|
@ -27,8 +27,6 @@ down_revision = '41662e32bce2'
|
|||
|
||||
from alembic import op
|
||||
|
||||
from neutron.db import migration
|
||||
|
||||
TABLE_NAME = 'ports'
|
||||
CONSTRAINT_NAME = 'uniq_ports0network_id0mac_address'
|
||||
|
||||
|
@ -39,12 +37,3 @@ def upgrade():
|
|||
source=TABLE_NAME,
|
||||
local_cols=['network_id', 'mac_address']
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
with migration.remove_fks_from_table(TABLE_NAME):
|
||||
op.drop_constraint(
|
||||
CONSTRAINT_NAME,
|
||||
TABLE_NAME,
|
||||
type_='unique'
|
||||
)
|
||||
|
|
|
@ -32,7 +32,6 @@ revision = '2b801560a332'
|
|||
down_revision = '2d2a8a565438'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.sql import expression as sa_expr
|
||||
|
||||
from neutron.extensions import portbindings
|
||||
|
@ -133,23 +132,3 @@ def upgrade():
|
|||
|
||||
op.drop_table('hyperv_vlan_allocations')
|
||||
op.drop_table('hyperv_network_bindings')
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.create_table(
|
||||
'hyperv_vlan_allocations',
|
||||
sa.Column('physical_network', sa.String(length=64), nullable=False),
|
||||
sa.Column('vlan_id', sa.Integer(), autoincrement=False,
|
||||
nullable=False),
|
||||
sa.Column('allocated', sa.Boolean(), nullable=False),
|
||||
sa.PrimaryKeyConstraint('physical_network', 'vlan_id'))
|
||||
|
||||
op.create_table(
|
||||
'hyperv_network_bindings',
|
||||
sa.Column('network_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('network_type', sa.String(length=32), nullable=False),
|
||||
sa.Column('physical_network', sa.String(length=64), nullable=True),
|
||||
sa.Column('segmentation_id', sa.Integer(), nullable=True),
|
||||
sa.ForeignKeyConstraint(['network_id'], ['networks.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('network_id'))
|
||||
|
|
|
@ -72,52 +72,3 @@ def upgrade():
|
|||
op.drop_constraint(fk_name[0], 'ml2_port_bindings', 'foreignkey')
|
||||
op.drop_column('ml2_port_bindings', 'driver')
|
||||
op.drop_column('ml2_port_bindings', 'segment')
|
||||
|
||||
|
||||
def downgrade():
|
||||
|
||||
dialect = op.get_context().bind.dialect.name
|
||||
|
||||
op.add_column('ml2_port_bindings',
|
||||
sa.Column('segment', sa.String(length=36), nullable=True))
|
||||
op.add_column('ml2_port_bindings',
|
||||
sa.Column('driver', sa.String(length=64), nullable=True))
|
||||
op.create_foreign_key(
|
||||
name=None,
|
||||
source='ml2_port_bindings', referent='ml2_network_segments',
|
||||
local_cols=['segment'], remote_cols=['id'], ondelete='SET NULL'
|
||||
)
|
||||
|
||||
op.add_column('ml2_dvr_port_bindings',
|
||||
sa.Column('driver', sa.String(length=64), nullable=True))
|
||||
op.add_column('ml2_dvr_port_bindings',
|
||||
sa.Column('segment', sa.String(length=36), nullable=True))
|
||||
op.add_column('ml2_dvr_port_bindings',
|
||||
sa.Column('cap_port_filter', sa.Boolean, nullable=False))
|
||||
op.create_foreign_key(
|
||||
name=None,
|
||||
source='ml2_dvr_port_bindings', referent='ml2_network_segments',
|
||||
local_cols=['segment'], remote_cols=['id'], ondelete='SET NULL'
|
||||
)
|
||||
|
||||
for table in port_binding_tables:
|
||||
if dialect == 'postgresql':
|
||||
op.execute((
|
||||
"UPDATE %s pb "
|
||||
"SET driver = pbl.driver, segment = pbl.segment_id "
|
||||
"FROM ml2_port_binding_levels pbl "
|
||||
"WHERE pb.port_id = pbl.port_id "
|
||||
"AND pb.host = pbl.host "
|
||||
"AND pbl.level = 0;"
|
||||
) % table)
|
||||
else:
|
||||
op.execute((
|
||||
"UPDATE %s pb "
|
||||
"INNER JOIN ml2_port_binding_levels pbl "
|
||||
"ON pb.port_id = pbl.port_id "
|
||||
"AND pb.host = pbl.host "
|
||||
"AND pbl.level = 0 "
|
||||
"SET pb.driver = pbl.driver, pb.segment = pbl.segment_id;"
|
||||
) % table)
|
||||
|
||||
op.drop_table('ml2_port_binding_levels')
|
||||
|
|
|
@ -78,19 +78,3 @@ def upgrade():
|
|||
'nuage_port_mapping')
|
||||
migration.rename_table_if_exists('routerroutes_mapping',
|
||||
'nuage_routerroutes_mapping')
|
||||
|
||||
|
||||
@migration.skip_if_offline
|
||||
def downgrade():
|
||||
migration.drop_table_if_exists('nuage_floatingip_mapping')
|
||||
migration.drop_table_if_exists('nuage_floatingip_pool_mapping')
|
||||
migration.rename_table_if_exists('nuage_net_partitions', 'net_partitions')
|
||||
migration.rename_table_if_exists('nuage_net_partition_router_mapping',
|
||||
'net_partition_router_mapping')
|
||||
migration.rename_table_if_exists('nuage_router_zone_mapping',
|
||||
'router_zone_mapping')
|
||||
migration.rename_table_if_exists('nuage_subnet_l2dom_mapping',
|
||||
'subnet_l2dom_mapping')
|
||||
migration.rename_table_if_exists('nuage_port_mapping', 'port_mapping')
|
||||
migration.rename_table_if_exists('nuage_routerroutes_mapping',
|
||||
'routerroutes_mapping')
|
||||
|
|
|
@ -46,7 +46,3 @@ def upgrade():
|
|||
sa.Column('status',
|
||||
sa.String(length=16),
|
||||
nullable=True))
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -26,7 +26,6 @@ revision = '31d7f831a591'
|
|||
down_revision = '37f322991f59'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
from neutron.db import migration
|
||||
|
||||
|
@ -75,35 +74,3 @@ def upgrade():
|
|||
table_name=TABLE_NAME,
|
||||
cols=['router_id', 'l3_agent_id']
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
|
||||
context = op.get_context()
|
||||
dialect = context.bind.dialect.name
|
||||
|
||||
op.drop_constraint(
|
||||
name=PK_NAME,
|
||||
table_name=TABLE_NAME,
|
||||
type_='primary'
|
||||
)
|
||||
|
||||
op.add_column(
|
||||
TABLE_NAME,
|
||||
sa.Column('id', sa.String(32))
|
||||
)
|
||||
|
||||
if dialect == 'ibm_db_sa':
|
||||
# DB2 doesn't support nullable column in primary key
|
||||
op.alter_column(
|
||||
table_name=TABLE_NAME,
|
||||
column_name='id',
|
||||
nullable=False
|
||||
)
|
||||
|
||||
with migration.remove_fks_from_table(TABLE_NAME):
|
||||
op.create_primary_key(
|
||||
name=PK_NAME,
|
||||
table_name=TABLE_NAME,
|
||||
cols=['id']
|
||||
)
|
||||
|
|
|
@ -38,7 +38,3 @@ def upgrade():
|
|||
if op.get_bind().dialect.name == 'mysql':
|
||||
for table in TABLES:
|
||||
op.execute("ALTER TABLE %s ENGINE=InnoDB" % table)
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -48,19 +48,3 @@ def upgrade():
|
|||
sa.Column('neutron_type', sa.String(length=32), nullable=False),
|
||||
sa.Column('apic_name', sa.String(length=255), nullable=False),
|
||||
sa.PrimaryKeyConstraint('neutron_id', 'neutron_type'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
|
||||
op.drop_table('cisco_ml2_apic_names')
|
||||
op.drop_table('cisco_ml2_apic_host_links')
|
||||
|
||||
op.create_table(
|
||||
'cisco_ml2_apic_port_profiles',
|
||||
sa.Column('node_id', sa.String(length=255), nullable=False),
|
||||
sa.Column('profile_id', sa.String(length=64), nullable=False),
|
||||
sa.Column('hpselc_id', sa.String(length=64), nullable=False),
|
||||
sa.Column('module', sa.String(length=10), nullable=False),
|
||||
sa.Column('from_port', sa.Integer(), nullable=False),
|
||||
sa.Column('to_port', sa.Integer(), nullable=False),
|
||||
sa.PrimaryKeyConstraint('node_id'))
|
||||
|
|
|
@ -38,7 +38,3 @@ def upgrade():
|
|||
existing_nullable=True)
|
||||
else:
|
||||
metering_init_ops.create_meteringlabels()
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -44,7 +44,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['port_id'], [u'ports.id'],
|
||||
name=u'embrane_pool_port_ibfk_2'),
|
||||
sa.PrimaryKeyConstraint(u'pool_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -65,12 +65,3 @@ def upgrade():
|
|||
op.add_column('cisco_ml2_nexusport_bindings', sa.Column(
|
||||
'is_provider_vlan', sa.Boolean(), nullable=False,
|
||||
server_default=sa.sql.false()))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('ml2_nexus_vxlan_mcast_groups')
|
||||
op.drop_table('ml2_nexus_vxlan_allocations')
|
||||
op.drop_table('cisco_ml2_nexus_nve')
|
||||
|
||||
op.drop_column('cisco_ml2_nexusport_bindings', 'vni')
|
||||
op.drop_column('cisco_ml2_nexusport_bindings', 'is_provider_vlan')
|
||||
|
|
|
@ -38,7 +38,3 @@ def upgrade():
|
|||
'port_security_enabled) SELECT id, True FROM ports '
|
||||
'WHERE id NOT IN (SELECT port_id FROM '
|
||||
'portsecuritybindings);')
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -26,7 +26,6 @@ revision = '37f322991f59'
|
|||
down_revision = '2026156eab2f'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
def upgrade():
|
||||
|
@ -35,53 +34,3 @@ def upgrade():
|
|||
op.drop_table('nuage_routerroutes_mapping')
|
||||
op.drop_table('nuage_port_mapping')
|
||||
op.drop_table('nuage_router_zone_mapping')
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.create_table(
|
||||
'nuage_router_zone_mapping',
|
||||
sa.Column('router_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('nuage_zone_id', sa.String(length=36), nullable=True),
|
||||
sa.Column('nuage_user_id', sa.String(length=36), nullable=True),
|
||||
sa.Column('nuage_group_id', sa.String(length=36), nullable=True),
|
||||
sa.ForeignKeyConstraint(['router_id'], ['routers.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('router_id'),
|
||||
)
|
||||
op.create_table(
|
||||
'nuage_port_mapping',
|
||||
sa.Column('port_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('nuage_vport_id', sa.String(length=36), nullable=True),
|
||||
sa.Column('nuage_vif_id', sa.String(length=36), nullable=True),
|
||||
sa.Column('static_ip', sa.Boolean(), nullable=True),
|
||||
sa.ForeignKeyConstraint(['port_id'], ['ports.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('port_id'),
|
||||
)
|
||||
op.create_table(
|
||||
'nuage_routerroutes_mapping',
|
||||
sa.Column('router_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('nuage_route_id', sa.String(length=36), nullable=True),
|
||||
sa.ForeignKeyConstraint(['router_id'], ['routers.id'],
|
||||
ondelete='CASCADE'),
|
||||
)
|
||||
op.create_table(
|
||||
'nuage_floatingip_pool_mapping',
|
||||
sa.Column('fip_pool_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('net_id', sa.String(length=36), nullable=True),
|
||||
sa.Column('router_id', sa.String(length=36), nullable=True),
|
||||
sa.ForeignKeyConstraint(['net_id'], ['networks.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.ForeignKeyConstraint(['router_id'], ['routers.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('fip_pool_id'),
|
||||
)
|
||||
op.create_table(
|
||||
'nuage_floatingip_mapping',
|
||||
sa.Column('fip_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('router_id', sa.String(length=36), nullable=True),
|
||||
sa.Column('nuage_fip_id', sa.String(length=36), nullable=True),
|
||||
sa.ForeignKeyConstraint(['fip_id'], ['floatingips.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('fip_id'),
|
||||
)
|
||||
|
|
|
@ -49,20 +49,3 @@ def upgrade():
|
|||
source='ml2_vxlan_endpoints',
|
||||
local_cols=['host']
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
|
||||
op.drop_constraint(
|
||||
name=CONSTRAINT_NAME_VXLAN,
|
||||
table_name='ml2_vxlan_endpoints',
|
||||
type_='unique'
|
||||
)
|
||||
op.drop_column('ml2_vxlan_endpoints', 'host')
|
||||
|
||||
op.drop_constraint(
|
||||
name=CONSTRAINT_NAME_GRE,
|
||||
table_name='ml2_gre_endpoints',
|
||||
type_='unique'
|
||||
)
|
||||
op.drop_column('ml2_gre_endpoints', 'host')
|
||||
|
|
|
@ -48,7 +48,3 @@ def upgrade():
|
|||
op.execute("INSERT INTO router_extra_attributes "
|
||||
"SELECT id as router_id, "
|
||||
"False as distributed from routers")
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('router_extra_attributes')
|
||||
|
|
|
@ -38,11 +38,3 @@ def upgrade():
|
|||
for table in ('servicedefinitions', 'servicetypes'):
|
||||
if migration.schema_has_table(table):
|
||||
op.drop_table(table)
|
||||
|
||||
|
||||
def downgrade():
|
||||
"""Don't create the tables
|
||||
|
||||
These tables would be created during downgrade at correct place in
|
||||
migration timeline at revision 557edfc53098.
|
||||
"""
|
||||
|
|
|
@ -29,11 +29,7 @@ from alembic import op
|
|||
import sqlalchemy as sa
|
||||
|
||||
|
||||
def upgrade(active_plugins=None, options=None):
|
||||
def upgrade():
|
||||
op.add_column('meteringlabels', sa.Column('shared', sa.Boolean(),
|
||||
server_default=sa.sql.false(),
|
||||
nullable=True))
|
||||
|
||||
|
||||
def downgrade(active_plugins=None, options=None):
|
||||
op.drop_column('meteringlabels', 'shared')
|
||||
|
|
|
@ -44,7 +44,3 @@ def upgrade():
|
|||
if engine.name == 'postgresql':
|
||||
op.execute("ALTER TYPE nvp_network_bindings_binding_type "
|
||||
"RENAME TO tz_network_bindings_binding_type;")
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -38,7 +38,3 @@ def upgrade():
|
|||
# There might be multiple switches for a neutron network
|
||||
sa.PrimaryKeyConstraint('neutron_id', 'nsx_id'),
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -26,23 +26,8 @@ revision = '408cfbf6923c'
|
|||
down_revision = '1f71e54a85e7'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
def upgrade():
|
||||
op.drop_table('tunnelkeylasts')
|
||||
op.drop_table('tunnelkeys')
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.create_table(
|
||||
'tunnelkeylasts',
|
||||
sa.Column('last_key', sa.Integer(), nullable=False),
|
||||
sa.PrimaryKeyConstraint('last_key'))
|
||||
op.create_table(
|
||||
'tunnelkeys',
|
||||
sa.Column('network_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('tunnel_key', sa.Integer(), autoincrement=False,
|
||||
nullable=False),
|
||||
sa.ForeignKeyConstraint(['network_id'], ['networks.id'], ),
|
||||
sa.PrimaryKeyConstraint('tunnel_key'))
|
||||
|
|
|
@ -40,9 +40,3 @@ def upgrade():
|
|||
for table in TABLES:
|
||||
op.create_index(op.f('ix_%s_tenant_id' % table),
|
||||
table, ['tenant_id'], unique=False)
|
||||
|
||||
|
||||
def downgrade():
|
||||
for table in TABLES:
|
||||
op.drop_index(op.f('ix_%s_tenant_id' % table),
|
||||
table_name=table)
|
||||
|
|
|
@ -47,18 +47,3 @@ def upgrade():
|
|||
op.create_primary_key(name=None,
|
||||
table_name=TABLE_NAME,
|
||||
cols=['router_id', 'l3_agent_id'])
|
||||
|
||||
|
||||
def downgrade():
|
||||
inspector = reflection.Inspector.from_engine(op.get_bind())
|
||||
prev_pk_const = inspector.get_pk_constraint(TABLE_NAME)
|
||||
prev_pk_name = prev_pk_const.get('name')
|
||||
|
||||
with migration.remove_fks_from_table(TABLE_NAME):
|
||||
op.drop_constraint(name=prev_pk_name,
|
||||
table_name=TABLE_NAME,
|
||||
type_='primary')
|
||||
|
||||
op.create_primary_key(name=None,
|
||||
table_name=TABLE_NAME,
|
||||
cols=['router_id'])
|
||||
|
|
|
@ -32,7 +32,3 @@ import sqlalchemy as sa
|
|||
def upgrade():
|
||||
op.add_column('networks', sa.Column('mtu', sa.Integer(),
|
||||
nullable=True))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_column('networks', 'mtu')
|
||||
|
|
|
@ -45,17 +45,3 @@ def upgrade():
|
|||
source=TABLE_NAME,
|
||||
local_cols=['last_ip', 'allocation_pool_id']
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_constraint(
|
||||
name=UC_1_NAME,
|
||||
table_name=TABLE_NAME,
|
||||
type_='unique'
|
||||
)
|
||||
|
||||
op.drop_constraint(
|
||||
name=UC_2_NAME,
|
||||
table_name=TABLE_NAME,
|
||||
type_='unique'
|
||||
)
|
||||
|
|
|
@ -49,7 +49,3 @@ def upgrade():
|
|||
sa.Column('tenant_id', sa.String(length=255), nullable=True),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.ForeignKeyConstraint(['network_id'], ['ml2_brocadenetworks.id']))
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -49,7 +49,3 @@ def upgrade():
|
|||
# each record in routers
|
||||
op.execute("INSERT INTO neutron_nsx_router_mappings SELECT id,id "
|
||||
"from routers")
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -146,25 +146,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['router_id'], ['routers.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('router_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('nsxv_router_ext_attributes')
|
||||
op.drop_table('nsxv_rule_mappings')
|
||||
op.drop_table('nsxv_port_index_mappings')
|
||||
op.drop_table('nsxv_port_vnic_mappings')
|
||||
op.drop_table('nsxv_tz_network_bindings')
|
||||
op.drop_table('nsxv_security_group_section_mappings')
|
||||
op.drop_table('nsxv_spoofguard_policy_network_mappings')
|
||||
op.drop_table('nsxv_edge_vnic_bindings')
|
||||
op.drop_table('nsxv_edge_dhcp_static_bindings')
|
||||
op.drop_table('nsxv_firewall_rule_bindings')
|
||||
op.drop_table('nsxv_internal_edges')
|
||||
op.drop_table('nsxv_internal_networks')
|
||||
op.drop_table('nsxv_router_bindings')
|
||||
appliance_sizes_enum.drop(op.get_bind(), checkfirst=False)
|
||||
edge_types_enum.drop(op.get_bind(), checkfirst=False)
|
||||
internal_network_purpose_enum.drop(op.get_bind(), checkfirst=False)
|
||||
internal_edge_purpose_enum.drop(op.get_bind(), checkfirst=False)
|
||||
tz_binding_type_enum.drop(op.get_bind(), checkfirst=False)
|
||||
router_types_enum.drop(op.get_bind(), checkfirst=False)
|
||||
|
|
|
@ -36,8 +36,3 @@ PK_NAME = 'ml2_vxlan_endpoints_pkey'
|
|||
def upgrade():
|
||||
op.drop_constraint(PK_NAME, TABLE_NAME, type_='primary')
|
||||
op.create_primary_key(PK_NAME, TABLE_NAME, cols=['ip_address'])
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_constraint(PK_NAME, TABLE_NAME, type_='primary')
|
||||
op.create_primary_key(PK_NAME, TABLE_NAME, cols=['ip_address', 'udp_port'])
|
||||
|
|
|
@ -29,8 +29,6 @@ down_revision = '33c3db036fe4'
|
|||
from alembic import op
|
||||
|
||||
from neutron.db import migration
|
||||
from neutron.db.migration.alembic_migrations import ml2_init_ops
|
||||
|
||||
|
||||
TABLE = 'cisco_ml2_credentials'
|
||||
|
||||
|
@ -38,8 +36,3 @@ TABLE = 'cisco_ml2_credentials'
|
|||
def upgrade():
|
||||
if migration.schema_has_table(TABLE):
|
||||
op.drop_table(TABLE)
|
||||
|
||||
|
||||
def downgrade():
|
||||
if not migration.schema_has_table(TABLE):
|
||||
ml2_init_ops.create_cisco_ml2_credentials()
|
||||
|
|
|
@ -62,7 +62,3 @@ def upgrade():
|
|||
op.drop_column('ml2_port_bindings', 'cap_port_filter')
|
||||
if op.get_bind().engine.name == 'ibm_db_sa':
|
||||
op.execute("CALL SYSPROC.ADMIN_CMD('REORG TABLE ml2_port_bindings')")
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -49,7 +49,3 @@ def upgrade():
|
|||
"neutron_id, nvp_id as nsx_port_id, null as nsx_switch_id from"
|
||||
" quantum_nvp_port_mapping")
|
||||
op.drop_table('quantum_nvp_port_mapping')
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -55,8 +55,3 @@ def upgrade():
|
|||
['subnetpools.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('cidr', 'subnetpool_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('subnetpoolprefixes')
|
||||
op.drop_table('subnetpools')
|
||||
|
|
|
@ -46,7 +46,3 @@ def upgrade():
|
|||
new_column_name='neutron_id',
|
||||
existing_type=sa.String(length=36),
|
||||
existing_nullable=False)
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -59,7 +59,3 @@ def upgrade():
|
|||
)
|
||||
|
||||
op.execute(SQL_STATEMENT)
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('routerports')
|
||||
|
|
|
@ -48,37 +48,32 @@ from neutron.plugins.cisco.common import cisco_constants
|
|||
# ml2_vxlan_allocations.allocated
|
||||
# This migration will be skipped when executed offline mode.
|
||||
|
||||
default = sqlalchemy.sql.false()
|
||||
|
||||
|
||||
def upgrade():
|
||||
run(True)
|
||||
|
||||
|
||||
def downgrade():
|
||||
run()
|
||||
|
||||
|
||||
@migration.skip_if_offline
|
||||
def run(default=None):
|
||||
set_default_ml2(default)
|
||||
set_default_mlnx(default)
|
||||
set_default_brocade(default)
|
||||
set_default_cisco(default)
|
||||
set_default_vmware(default)
|
||||
set_default_agents(default)
|
||||
def run():
|
||||
set_default_ml2()
|
||||
set_default_mlnx()
|
||||
set_default_brocade()
|
||||
set_default_cisco()
|
||||
set_default_vmware()
|
||||
set_default_agents()
|
||||
|
||||
|
||||
def set_default_brocade(default):
|
||||
if default:
|
||||
default = ''
|
||||
def set_default_brocade():
|
||||
default = ''
|
||||
migration.alter_column_if_exists(
|
||||
'brocadeports', 'port_id',
|
||||
server_default=default,
|
||||
existing_type=sa.String(36))
|
||||
|
||||
|
||||
def set_default_mlnx(default):
|
||||
if default:
|
||||
default = sqlalchemy.sql.false()
|
||||
def set_default_mlnx():
|
||||
migration.alter_column_if_exists(
|
||||
'segmentation_id_allocation', 'allocated',
|
||||
server_default=default,
|
||||
|
@ -86,12 +81,9 @@ def set_default_mlnx(default):
|
|||
existing_type=sa.Boolean)
|
||||
|
||||
|
||||
def set_default_cisco(default):
|
||||
profile_binding_default = (cisco_constants.TENANT_ID_NOT_SET
|
||||
if default else None)
|
||||
profile_default = '0' if default else None
|
||||
if default:
|
||||
default = sqlalchemy.sql.false()
|
||||
def set_default_cisco():
|
||||
profile_binding_default = cisco_constants.TENANT_ID_NOT_SET
|
||||
profile_default = '0'
|
||||
migration.alter_column_if_exists(
|
||||
'cisco_n1kv_profile_bindings', 'tenant_id',
|
||||
existing_type=sa.String(length=36),
|
||||
|
@ -108,9 +100,7 @@ def set_default_cisco(default):
|
|||
existing_nullable=False)
|
||||
|
||||
|
||||
def set_default_vmware(default=None):
|
||||
if default:
|
||||
default = sqlalchemy.sql.false()
|
||||
def set_default_vmware():
|
||||
migration.alter_column_if_exists(
|
||||
'nsxrouterextattributess', 'service_router',
|
||||
server_default=default,
|
||||
|
@ -127,9 +117,8 @@ def set_default_vmware(default=None):
|
|||
existing_type=sa.Boolean)
|
||||
|
||||
|
||||
def set_default_agents(default=None):
|
||||
if default:
|
||||
default = sqlalchemy.sql.true()
|
||||
def set_default_agents():
|
||||
default = sqlalchemy.sql.true()
|
||||
migration.alter_column_if_exists(
|
||||
'agents', 'admin_state_up',
|
||||
server_default=default,
|
||||
|
@ -137,9 +126,7 @@ def set_default_agents(default=None):
|
|||
existing_type=sa.Boolean)
|
||||
|
||||
|
||||
def set_default_ml2(default=None):
|
||||
if default:
|
||||
default = sqlalchemy.sql.false()
|
||||
def set_default_ml2():
|
||||
migration.alter_column_if_exists(
|
||||
'ml2_gre_allocations', 'allocated',
|
||||
server_default=default,
|
||||
|
|
|
@ -41,11 +41,3 @@ def upgrade():
|
|||
'ipsec_site_connections', 'peer_address',
|
||||
existing_type=sa.String(255),
|
||||
nullable=False)
|
||||
|
||||
|
||||
@migration.skip_if_offline
|
||||
def downgrade():
|
||||
migration.alter_column_if_exists(
|
||||
'ipsec_site_connections', 'peer_address',
|
||||
nullable=True,
|
||||
existing_type=sa.String(255))
|
||||
|
|
|
@ -44,7 +44,3 @@ def upgrade():
|
|||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('router_id')
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('csnat_l3_agent_bindings')
|
||||
|
|
|
@ -26,7 +26,6 @@ revision = '57086602ca0a'
|
|||
down_revision = '28c0ffb8ebbd'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
def upgrade():
|
||||
|
@ -36,54 +35,3 @@ def upgrade():
|
|||
op.drop_table('vcns_edge_vip_bindings')
|
||||
op.drop_table(u'routerservicetypebindings')
|
||||
op.drop_table(u'servicerouterbindings')
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.create_table(
|
||||
'servicerouterbindings',
|
||||
sa.Column('resource_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('resource_type', sa.String(length=36), nullable=False),
|
||||
sa.Column('router_id', sa.String(length=36), nullable=False),
|
||||
sa.ForeignKeyConstraint(['router_id'], [u'routers.id'],
|
||||
name='servicerouterbindings_ibfk_1'),
|
||||
sa.PrimaryKeyConstraint('resource_id', 'resource_type'))
|
||||
op.create_table(
|
||||
'routerservicetypebindings',
|
||||
sa.Column('router_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('service_type_id', sa.String(length=36), nullable=False),
|
||||
sa.ForeignKeyConstraint(['router_id'], ['routers.id'],
|
||||
name='routerservicetypebindings_ibfk_1'),
|
||||
sa.PrimaryKeyConstraint(u'router_id'))
|
||||
op.create_table(
|
||||
'vcns_edge_vip_bindings',
|
||||
sa.Column('vip_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('edge_id', sa.String(length=36), nullable=True),
|
||||
sa.Column('vip_vseid', sa.String(length=36), nullable=True),
|
||||
sa.Column('app_profileid', sa.String(length=36), nullable=True),
|
||||
sa.ForeignKeyConstraint(['vip_id'], ['vips.id'],
|
||||
name='vcns_edge_vip_bindings_ibfk_1'),
|
||||
sa.PrimaryKeyConstraint('vip_id'))
|
||||
op.create_table(
|
||||
'vcns_edge_monitor_bindings',
|
||||
sa.Column('monitor_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('edge_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('monitor_vseid', sa.String(length=36), nullable=True),
|
||||
sa.ForeignKeyConstraint(['monitor_id'], ['healthmonitors.id'],
|
||||
name='vcns_edge_monitor_bindings_ibfk_1'),
|
||||
sa.PrimaryKeyConstraint('monitor_id', 'edge_id'))
|
||||
op.create_table(
|
||||
'vcns_firewall_rule_bindings',
|
||||
sa.Column('rule_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('edge_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('rule_vseid', sa.String(length=36), nullable=True),
|
||||
sa.ForeignKeyConstraint(['rule_id'], ['firewall_rules.id'],
|
||||
name='vcns_firewall_rule_bindings_ibfk_1'),
|
||||
sa.PrimaryKeyConstraint('rule_id', u'edge_id'))
|
||||
op.create_table(
|
||||
'vcns_edge_pool_bindings',
|
||||
sa.Column('pool_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('edge_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('pool_vseid', sa.String(length=36), nullable=True),
|
||||
sa.ForeignKeyConstraint(['pool_id'], ['pools.id'],
|
||||
name='vcns_edge_pool_bindings_ibfk_1'),
|
||||
sa.PrimaryKeyConstraint('pool_id', 'edge_id'))
|
||||
|
|
|
@ -51,17 +51,3 @@ def upgrade():
|
|||
name=CONSTRAINT_NAME_NS,
|
||||
source='nuage_subnet_l2dom_mapping',
|
||||
local_cols=['nuage_subnet_id'])
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_column('nuage_net_partition_router_mapping', 'nuage_rtr_rt')
|
||||
op.drop_column('nuage_net_partition_router_mapping', 'nuage_rtr_rd')
|
||||
op.drop_column('nuage_net_partitions', 'isolated_zone')
|
||||
op.drop_column('nuage_net_partitions', 'shared_zone')
|
||||
op.drop_column('nuage_subnet_l2dom_mapping', 'nuage_managed_subnet')
|
||||
op.drop_constraint(CONSTRAINT_NAME_NS,
|
||||
'nuage_subnet_l2dom_mapping',
|
||||
type_='unique')
|
||||
op.drop_constraint(CONSTRAINT_NAME_NR,
|
||||
'nuage_net_partition_router_mapping',
|
||||
type_='unique')
|
||||
|
|
|
@ -71,9 +71,3 @@ def upgrade():
|
|||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('router_id')
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('cisco_router_mappings')
|
||||
op.drop_table('cisco_port_mappings')
|
||||
op.drop_table('cisco_hosting_devices')
|
||||
|
|
|
@ -64,7 +64,3 @@ def upgrade():
|
|||
local_cols=['network_profile_id'], remote_cols=['id'],
|
||||
ondelete='CASCADE'
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -40,11 +40,3 @@ def upgrade():
|
|||
'cisco_nexusport_bindings', 'vlan_id',
|
||||
nullable=False,
|
||||
existing_type=sa.Integer)
|
||||
|
||||
|
||||
@migration.skip_if_offline
|
||||
def downgrade():
|
||||
migration.alter_column_if_exists(
|
||||
'cisco_nexusport_bindings', 'vlan_id',
|
||||
nullable=True,
|
||||
existing_type=sa.Integer)
|
||||
|
|
|
@ -35,7 +35,3 @@ def upgrade():
|
|||
sa.Column('hash_id', sa.String(255), primary_key=True),
|
||||
sa.Column('hash', sa.String(255), nullable=False)
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -41,24 +41,3 @@ def upgrade():
|
|||
sa.Column('router_id', sa.String(length=64), nullable=False),
|
||||
sa.ForeignKeyConstraint(['router_id'], ['routers.id']),
|
||||
sa.PrimaryKeyConstraint('router_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
|
||||
op.drop_table('cisco_ml2_apic_contracts')
|
||||
|
||||
op.create_table(
|
||||
'cisco_ml2_apic_epgs',
|
||||
sa.Column('network_id', sa.String(length=255), nullable=False),
|
||||
sa.Column('epg_id', sa.String(length=64), nullable=False),
|
||||
sa.Column('segmentation_id', sa.String(length=64), nullable=False),
|
||||
sa.Column('provider', sa.Boolean(), server_default=sa.sql.false(),
|
||||
nullable=False),
|
||||
sa.PrimaryKeyConstraint('network_id'))
|
||||
|
||||
op.create_table(
|
||||
'cisco_ml2_apic_contracts',
|
||||
sa.Column('tenant_id', sa.String(length=255)),
|
||||
sa.Column('contract_id', sa.String(length=64), nullable=False),
|
||||
sa.Column('filter_id', sa.String(length=64), nullable=False),
|
||||
sa.PrimaryKeyConstraint('tenant_id'))
|
||||
|
|
|
@ -61,20 +61,3 @@ def upgrade():
|
|||
server_default=sa.sql.false()))
|
||||
_migrate_data('router_extra_attributes', 'nsxrouterextattributess')
|
||||
op.drop_table('nsxrouterextattributess')
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.create_table(
|
||||
'nsxrouterextattributess',
|
||||
sa.Column('router_id', sa.String(length=36), nullable=False),
|
||||
sa.Column('distributed', sa.Boolean(), nullable=False,
|
||||
server_default=sa.sql.false()),
|
||||
sa.Column('service_router', sa.Boolean(), nullable=False,
|
||||
server_default=sa.sql.false()),
|
||||
sa.ForeignKeyConstraint(
|
||||
['router_id'], ['routers.id'], ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('router_id')
|
||||
)
|
||||
op.execute(("INSERT INTO nsxrouterextattributess "
|
||||
"SELECT * from router_extra_attributes"))
|
||||
op.drop_column('router_extra_attributes', 'service_router')
|
||||
|
|
|
@ -39,7 +39,3 @@ def upgrade():
|
|||
['network_id'], ['networks.id'], ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('network_id')
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('nuage_provider_net_bindings')
|
||||
|
|
|
@ -42,7 +42,3 @@ def upgrade():
|
|||
type_=sa.BigInteger(), existing_type=sa.Integer())
|
||||
op.alter_column('poolstatisticss', 'total_connections',
|
||||
type_=sa.BigInteger(), existing_type=sa.Integer())
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -40,7 +40,3 @@ def upgrade():
|
|||
'firewall_rules', 'protocol',
|
||||
type_=sa.String(40),
|
||||
existing_nullable=True)
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -32,7 +32,3 @@ import sqlalchemy as sa
|
|||
def upgrade():
|
||||
op.add_column('networks', sa.Column('vlan_transparent', sa.Boolean(),
|
||||
nullable=True))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_column('networks', 'vlan_transparent')
|
||||
|
|
|
@ -41,11 +41,3 @@ def upgrade():
|
|||
'ml2_brocadeports', 'admin_state_up',
|
||||
nullable=False,
|
||||
existing_type=sa.Boolean)
|
||||
|
||||
|
||||
@migration.skip_if_offline
|
||||
def downgrade():
|
||||
migration.alter_column_if_exists(
|
||||
'ml2_brocadeports', 'admin_state_up',
|
||||
nullable=True,
|
||||
existing_type=sa.Boolean)
|
||||
|
|
|
@ -41,7 +41,3 @@ def upgrade():
|
|||
source=TABLE_NAME,
|
||||
local_cols=['pool_id', 'address', 'protocol_port']
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -92,7 +92,3 @@ def upgrade():
|
|||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('router_id'),
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
|
|
|
@ -44,12 +44,3 @@ def upgrade():
|
|||
source='floatingips', referent='ports',
|
||||
local_cols=['floating_port_id'], remote_cols=['id'], ondelete='CASCADE'
|
||||
)
|
||||
|
||||
|
||||
def downgrade():
|
||||
_drop_constraint()
|
||||
op.create_foreign_key(
|
||||
name=None,
|
||||
source='floatingips', referent='ports',
|
||||
local_cols=['floating_port_id'], remote_cols=['id']
|
||||
)
|
||||
|
|
|
@ -68,26 +68,3 @@ def upgrade():
|
|||
other_plugins_init_ops.upgrade()
|
||||
ryu_init_ops.upgrade()
|
||||
vmware_init_ops.upgrade()
|
||||
|
||||
|
||||
def downgrade():
|
||||
vmware_init_ops.downgrade()
|
||||
ryu_init_ops.downgrade()
|
||||
other_plugins_init_ops.downgrade()
|
||||
nec_init_ops.downgrade()
|
||||
mlnx_init_ops.downgrade()
|
||||
cisco_init_ops.downgrade()
|
||||
brocade_init_ops.downgrade()
|
||||
metering_init_ops.downgrade()
|
||||
vpn_init_ops.downgrade()
|
||||
loadbalancer_init_ops.downgrade()
|
||||
firewall_init_ops.downgrade()
|
||||
ovs_init_ops.downgrade()
|
||||
ml2_init_ops.downgrade()
|
||||
lb_init_ops.downgrade()
|
||||
other_extensions_init_ops.downgrade()
|
||||
portsec_init_ops.downgrade()
|
||||
secgroup_init_ops.downgrade()
|
||||
l3_init_ops.downgrade()
|
||||
core_init_ops.downgrade()
|
||||
agent_init_ops.downgrade()
|
||||
|
|
|
@ -29,15 +29,3 @@ down_revision = '5ac1c354a051'
|
|||
def upgrade():
|
||||
"""A no-op migration for marking the Icehouse release."""
|
||||
pass
|
||||
|
||||
|
||||
def downgrade():
|
||||
# We are purging all downgrade methods from icehouse to havana because:
|
||||
# 1) havana is going to become unsupported during Kilo cycle.
|
||||
# 2) most people will upgrade from icehouse, while a minor percentage
|
||||
# from havana
|
||||
# 3) downgrade use cases are mostly to revert after failed upgrades
|
||||
# See discussion in https://review.openstack.org/109952 for details
|
||||
|
||||
raise NotImplementedError("Downgrade from icehouse to havana not "
|
||||
"supported")
|
||||
|
|
|
@ -29,8 +29,3 @@ down_revision = '544673ac99ab'
|
|||
def upgrade():
|
||||
"""A no-op migration for marking the Juno release."""
|
||||
pass
|
||||
|
||||
|
||||
def downgrade():
|
||||
"""A no-op migration for marking the Juno release."""
|
||||
pass
|
||||
|
|
|
@ -181,25 +181,3 @@ def upgrade():
|
|||
sa.ForeignKeyConstraint(['port_id'], ['ports.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('port_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('maclearningstates')
|
||||
op.drop_table('portqueuemappings')
|
||||
op.drop_table('networkqueuemappings')
|
||||
op.drop_table('qosqueues')
|
||||
op.drop_table('networkconnections')
|
||||
op.drop_table('networkgatewaydevices')
|
||||
op.drop_table('networkgateways')
|
||||
op.drop_table('vcns_edge_vip_bindings')
|
||||
op.drop_table('vcns_firewall_rule_bindings')
|
||||
op.drop_table('vcns_edge_monitor_bindings')
|
||||
op.drop_table('vcns_edge_pool_bindings')
|
||||
op.drop_table('vcns_router_bindings')
|
||||
op.drop_table('nsxrouterextattributess')
|
||||
op.drop_table('nvp_multi_provider_networks')
|
||||
op.drop_table('nvp_network_bindings')
|
||||
op.drop_table('quantum_nvp_port_mapping')
|
||||
l2gw_segmentation_type.drop(op.get_bind(), checkfirst=False)
|
||||
qos_marking.drop(op.get_bind(), checkfirst=False)
|
||||
net_binding_type.drop(op.get_bind(), checkfirst=False)
|
||||
|
|
|
@ -122,21 +122,3 @@ def upgrade():
|
|||
['ipsec_site_connections.id'],
|
||||
ondelete='CASCADE'),
|
||||
sa.PrimaryKeyConstraint('cidr', 'ipsec_site_connection_id'))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('ipsecpeercidrs')
|
||||
op.drop_table('ipsec_site_connections')
|
||||
op.drop_table('vpnservices')
|
||||
op.drop_table('ikepolicies')
|
||||
op.drop_table('ipsecpolicies')
|
||||
auth_algorithms.drop(op.get_bind(), checkfirst=False)
|
||||
encryption_algorithms.drop(op.get_bind(), checkfirst=False)
|
||||
encapsulation_modes.drop(op.get_bind(), checkfirst=False)
|
||||
lifetime_unit_types.drop(op.get_bind(), checkfirst=False)
|
||||
transform_protocols.drop(op.get_bind(), checkfirst=False)
|
||||
pfs_types.drop(op.get_bind(), checkfirst=False)
|
||||
phase1_negotiation_modes.drop(op.get_bind(), checkfirst=False)
|
||||
ike_versions.drop(op.get_bind(), checkfirst=False)
|
||||
initiator_types.drop(op.get_bind(), checkfirst=False)
|
||||
dpd_actions.drop(op.get_bind(), checkfirst=False)
|
||||
|
|
|
@ -261,3 +261,24 @@ class TestSanityCheck(test_base.DbTestCase):
|
|||
script = script_dir.get_revision("14be42f3d0a5").module
|
||||
self.assertRaises(script.DuplicateSecurityGroupsNamedDefault,
|
||||
script.check_sanity, conn)
|
||||
|
||||
|
||||
class TestWalkMigrations(test_base.DbTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestWalkMigrations, self).setUp()
|
||||
self.alembic_config = migration.get_alembic_config()
|
||||
self.alembic_config.neutron_config = cfg.CONF
|
||||
|
||||
def test_no_downgrade(self):
|
||||
script_dir = alembic_script.ScriptDirectory.from_config(
|
||||
self.alembic_config)
|
||||
versions = [v for v in script_dir.walk_revisions(base='base',
|
||||
head='heads')]
|
||||
failed_revisions = []
|
||||
for version in versions:
|
||||
if hasattr(version.module, 'downgrade'):
|
||||
failed_revisions.append(version.revision)
|
||||
|
||||
if failed_revisions:
|
||||
self.fail('Migrations %s have downgrade' % failed_revisions)
|
||||
|
|
Loading…
Reference in New Issue