#!/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. import cloudstack_pluginlib as lib import logging import os import sys import subprocess import time import XenAPIPlugin sys.path.append("/opt/xensource/sm/") import util from time import localtime as _localtime, asctime as _asctime xePath = "/opt/xensource/bin/xe" lib.setup_logging("/var/log/cloud/ovs-pvlan.log") dhcpSetupPath = "/opt/cloud/bin/ovs-pvlan-dhcp-host.sh" vmSetupPath = "/opt/cloud/bin/ovs-pvlan-vm.sh" getDhcpIfacePath = "/opt/cloud/bin/ovs-get-dhcp-iface.sh" pvlanCleanupPath = "/opt/cloud/bin/ovs-pvlan-cleanup.sh" getBridgePath = "/opt/cloud/bin/ovs-get-bridge.sh" def echo(fn): def wrapped(*v, **k): name = fn.__name__ logging.debug("#### VMOPS enter %s ####" % name) res = fn(*v, **k) logging.debug("#### VMOPS exit %s ####" % name) return res return wrapped @echo def setup_pvlan_dhcp(session, args): op = args.pop("op") nw_label = args.pop("nw-label") primary = args.pop("primary-pvlan") isolated = args.pop("isolated-pvlan") dhcp_name = args.pop("dhcp-name") dhcp_ip = args.pop("dhcp-ip") dhcp_mac = args.pop("dhcp-mac") res = lib.check_switch() if res != "SUCCESS": return "FAILURE:%s" % res logging.debug("Network is:%s" % (nw_label)) bridge = lib.do_cmd([getBridgePath, nw_label]) logging.debug("Determine bridge/switch is :%s" % (bridge)) if op == "add": logging.debug("Try to get dhcp vm %s port on the switch:%s" % (dhcp_name, bridge)) dhcp_iface = lib.do_cmd([getDhcpIfacePath, bridge, dhcp_name]) logging.debug("About to setup dhcp vm on the switch:%s" % bridge) res = lib.do_cmd([dhcpSetupPath, "-A", "-b", bridge, "-p", primary, "-i", isolated, "-n", dhcp_name, "-d", dhcp_ip, "-m", dhcp_mac, "-I", dhcp_iface]) if res: result = "FAILURE:%s" % res return result; logging.debug("Setup dhcp vm on switch program done") elif op == "delete": logging.debug("About to remove dhcp the switch:%s" % bridge) res = lib.do_cmd([dhcpSetupPath, "-D", "-b", bridge, "-p", primary, "-i", isolated, "-n", dhcp_name, "-d", dhcp_ip, "-m", dhcp_mac]) if res: result = "FAILURE:%s" % res return result; logging.debug("Remove DHCP on switch program done") result = "true" logging.debug("Setup_pvlan_dhcp completed with result:%s" % result) return result @echo def setup_pvlan_vm(session, args): op = args.pop("op") nw_label = args.pop("nw-label") primary = args.pop("primary-pvlan") isolated = args.pop("isolated-pvlan") vm_mac = args.pop("vm-mac") trunk_port = 1 res = lib.check_switch() if res != "SUCCESS": return "FAILURE:%s" % res bridge = lib.do_cmd([getBridgePath, nw_label]) logging.debug("Determine bridge/switch is :%s" % (bridge)) if op == "add": logging.debug("About to setup vm on the switch:%s" % bridge) res = lib.do_cmd([vmSetupPath, "-A", "-b", bridge, "-p", primary, "-i", isolated, "-v", vm_mac]) if res: result = "FAILURE:%s" % res return result; logging.debug("Setup vm on switch program done") elif op == "delete": logging.debug("About to remove vm on the switch:%s" % bridge) res = lib.do_cmd([vmSetupPath, "-D", "-b", bridge, "-p", primary, "-i", isolated, "-v", vm_mac]) if res: result = "FAILURE:%s" % res return result; logging.debug("Remove vm on switch program done") result = "true" logging.debug("Setup_pvlan_vm_alone completed with result:%s" % result) return result @echo def cleanup(session, args): res = lib.check_switch() if res != "SUCCESS": return "FAILURE:%s" % res res = lib.do_cmd([pvlanCleanUpPath]) if res: result = "FAILURE:%s" % res return result; result = "true" logging.debug("Setup_pvlan_vm_dhcp completed with result:%s" % result) return result if __name__ == "__main__": XenAPIPlugin.dispatch({"setup-pvlan-dhcp": setup_pvlan_dhcp, "setup-pvlan-vm": setup_pvlan_vm, "cleanup":cleanup})