#!/usr/bin/python
# 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 = filter(isOldStyleBridge, bridges)
   for br in bridges:
       enslavedDev = netlib.getEnslavedDev(br, 1)
       if enslavedDev is not None:
           upgradeBridgeName(br, enslavedDev)
   
   bridges = netlib.listNetworks()
   bridges = 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")
