| #!/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/ovs-pvlan.log") | |
| dhcpSetupPath = "/opt/xensource/bin/ovs-pvlan-dhcp-host.sh" | |
| vmSetupPath = "/opt/xensource/bin/ovs-pvlan-vm.sh" | |
| getDhcpIfacePath = "/opt/xensource/bin/ovs-get-dhcp-iface.sh" | |
| pvlanCleanupPath = "/opt/xensource/bin/ovs-pvlan-cleanup.sh" | |
| getBridgePath = "/opt/xensource/bin/ovs-get-bridge.sh" | |
| def echo(fn): | |
| def wrapped(*v, **k): | |
| name = fn.__name__ | |
| util.SMlog("#### VMOPS enter %s ####" % name) | |
| res = fn(*v, **k) | |
| util.SMlog("#### 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}) |