#!/usr/bin/python3 # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. from cloudutils.networkConfig import networkConfig from cloudutils.utilities import bash import logging import re def isOldStyleBridge(brName): if brName.find("cloudVirBr") == 0: return True else: return False def upgradeBridgeName(brName, enslavedDev): print("upgrade bridge: %s, %s"%(brName, enslavedDev)) vlanId = brName.replace("cloudVirBr", "") print("find vlan Id: %s"%vlanId) phyDev = enslavedDev.split(".")[0] print("find physical device %s"%phyDev) newBrName = "br" + phyDev + "-" + vlanId print("new bridge name %s"%newBrName) bash("ip link set %s down"%brName) bash("ip link set %s name %s"%(brName, newBrName)) bash("ip link set %s up" %newBrName) cmd = "iptables-save | grep FORWARD | grep -w " + brName rules = bash(cmd).stdout.split('\n') rules.pop() for rule in rules: try: delrule = re.sub("-A", "-D", rule) newrule = re.sub(" " + brName + " ", " " + newBrName + " ", rule) bash("iptables " + delrule) bash("iptables " + newrule) except: logging.exception("Ignoring failure to update rules for rule " + rule + " on bridge " + brName) if __name__ == '__main__': netlib = networkConfig() bridges = netlib.listNetworks() bridges = list(filter(isOldStyleBridge, bridges)) for br in bridges: enslavedDev = netlib.getEnslavedDev(br, 1) if enslavedDev is not None: upgradeBridgeName(br, enslavedDev) bridges = netlib.listNetworks() bridges = list(filter(isOldStyleBridge, bridges)) if len(bridges) > 0: print("Warning: upgrade is not finished, still some bridges have the old style name:" + str(bridges)) else: print("Upgrade succeed")