neutron/neutron/cmd/ovn/migration_mtu.py
Lucas Alvares Gomes 349869096b [OVN] Migrate the OVN tools
This patch is migrating the OVN tools and adding its entry points.

Change-Id: Ia1575b2b7fb93b09d8e54f9230ea2f29c1d59c42
Signed-off-by: Lucas Alvares Gomes <lucasagomes@gmail.com>
2020-01-22 13:23:28 +00:00

120 lines
4.2 KiB
Python

# Copyright 2018 Red Hat, Inc.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
import sys
from openstack import connection
# TODO(dalvarez): support also GRE
GENEVE_TO_VXLAN_OVERHEAD = 8
def get_connection():
user_domain_id = os.environ.get('OS_USER_DOMAIN_ID', 'default')
project_domain_id = os.environ.get('OS_PROJECT_DOMAIN_ID', 'default')
conn = connection.Connection(auth_url=os.environ['OS_AUTH_URL'],
project_name=os.environ['OS_PROJECT_NAME'],
username=os.environ['OS_USERNAME'],
password=os.environ['OS_PASSWORD'],
user_domain_id=user_domain_id,
project_domain_id=project_domain_id)
return conn
def verify_network_mtu():
print("Verifying the tenant network mtu's")
conn = get_connection()
success = True
for network in conn.network.networks():
if network.provider_physical_network is None and (
network.provider_network_type == 'vxlan') and (
'adapted_mtu' not in network.tags):
print("adapted_mtu tag is not set for the Network "
"[" + str(network.name) + "]")
success = False
if success:
print("All the networks are set to expected mtu value")
else:
print("Some tenant networks need to have their MTU updated to a "
"lower value.")
return success
def update_network_mtu():
print("Updating the tenant network mtu")
conn = get_connection()
for network in conn.network.networks():
try:
if network.provider_physical_network is None and (
network.provider_network_type == 'vxlan') and (
'adapted_mtu' not in network.tags):
print("Updating the mtu and the tag 'adapted_mtu"
" of the network - " + str(network.name))
new_tags = list(network.tags)
new_tags.append('adapted_mtu')
conn.network.update_network(
network,
mtu=int(network.mtu) - GENEVE_TO_VXLAN_OVERHEAD)
conn.network.set_tags(network, new_tags)
except Exception as e:
print("Exception occured while updating the MTU:" + str(e))
return False
return True
def print_usage():
print('Invalid options:')
print('Usage: %s <update|verify> mtu' % sys.argv[0])
def main():
"""Tool for updating the networks MTU's pre migration.
This lowers the MTU of the pre migration VXLAN and GRE networks. The
tool will ignore non-VXLAN/GRE networks, so if you use VLAN for tenant
networks it will be fine if you find this step not doing anything.
This step will go network by network reducing the MTU, and tagging
with adapted_mtu the networks which have been already handled.
Every time a network is updated all the existing L3/DHCP agents
connected to such network will update their internal leg MTU,
instances will start fetching the new MTU as the DHCP T1 timer
expires. As explained before, instances not obeying the DHCP T1
parameter will need to be restarted, and instances with static IP
assignment will need to be manually updated.
"""
if len(sys.argv) < 3:
print_usage()
sys.exit(1)
retval = 1
if sys.argv[1] == "update" and sys.argv[2] == "mtu":
if update_network_mtu():
retval = 0
elif sys.argv[1] == "verify" and sys.argv[2] == "mtu":
if verify_network_mtu():
retval = 0
else:
print_usage()
sys.exit(retval)
if __name__ == "__main__":
main()