--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openvswitch/files/ovs-clean.py Mon Nov 16 16:49:19 2015 -0500
@@ -0,0 +1,197 @@
+#!/usr/bin/python2.7
+#
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+
+#
+# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+#
+
+from rad.bindings.com.oracle.solaris.rad.dlmgr import *
+import rad.client as radcli
+import rad.connect as radcon
+
+def dlvalue_to_propval(adict):
+ pval = None
+ for key, value in adict.iteritems():
+ for k, v in vars(value).iteritems():
+ if k == 'type':
+ continue
+ if v is not None:
+ pval = v
+ break
+ return pval
+
+def printError(ex):
+ dlerr = ex.get_payload()
+ if dlerr != None:
+ print "Error: %s" % dlerr.errmsg
+ else:
+ print "Exception: %s" % ex
+
+def deleteVNIC(argv, numargs, dm):
+ if numargs != 3:
+ print "usage: %s delete-vnic vnicname" % (argv[0])
+ return False
+
+ try:
+ dm.deleteVNIC(argv[2])
+ except radcli.ObjectError as ex:
+ printError(ex)
+ return False
+
+ return True
+
+def resetOFPorts(argv, numargs, rc):
+ if numargs != 2:
+ print "usage: %s reset-ofports" % (argv[0])
+ return False
+
+ # Enumerate all the datalinks and reset any ofports that are set
+ rval = True
+ datalink_name_list = rc.list_objects(Datalink())
+ for datalink_name in datalink_name_list:
+ datalink = rc.get_object(datalink_name)
+
+ try:
+ props = datalink.getProperties(["ofport", "temporary"], ["current"])
+ except radcli.ObjectError as ex:
+ dlerr = ex.get_payload()
+ # ignore if not a supported property
+ if dlerr.err == DLSTATUS.INVALID_ARGUMENT._value:
+ continue
+ printError(ex)
+ rval = False
+ continue
+
+ prop = props[0]
+ pval = dlvalue_to_propval(prop.map)
+ if pval == None or pval == 0:
+ continue
+ prop = props[1]
+ pval = dlvalue_to_propval(prop.map)
+ try:
+ datalink.setProperties({
+ 'temporary': DLValue(type=DLValueType.BOOLEAN, bval=pval),
+ 'ofport': DLValue(type=DLValueType.ULONG, ulval=None)
+ })
+ except radcli.ObjectError as ex:
+ dlerr = ex.get_payload()
+ printError(ex)
+ rval = False
+
+ return rval
+
+def removeFlows(argv, numargs, rc):
+ if numargs != 2:
+ print "usage: %s remove-flows" % (argv[0])
+ return False
+
+ # Enumerate all the datalinks and look for OF links
+ rval = True
+ datalink_list = rc.list_objects(Datalink())
+ for datalink_name in datalink_list:
+ datalink = rc.get_object(datalink_name)
+ linkname = datalink_name._kvpairs["name"]
+
+ try:
+ props = datalink.getProperties(["openvswitch"], ["current"])
+ except radcli.ObjectError as ex:
+ dlerr = ex.get_payload()
+ # ignore if not a supported property
+ if dlerr.err == DLSTATUS.INVALID_ARGUMENT._value:
+ continue
+ printError(ex)
+ rval = False
+ continue
+
+ prop = props[0]
+ pval = dlvalue_to_propval(prop.map)
+ if pval == str("off"):
+ continue
+
+ # Enumerate all the flows for the datalink and remove them
+ flow_list = rc.list_objects(Flow(), ADRGlobPattern({'linkname': linkname}))
+ for flow_name in flow_list:
+ try:
+ datalink.removeFlow(flow_name._kvpairs["name"])
+ except radcli.ObjectError as ex:
+ dlerr = ex.get_payload()
+ # ignore if the flow is no longer found
+ if dlerr.err == DLSTATUS.NOT_FOUND._value:
+ continue
+ printError(ex)
+ rval = False
+
+ return rval
+
+def deleteEtherstub(argv, numargs, rc, dm):
+ if numargs != 3:
+ print "usage: %s delete-etherstub etherstub-name" % (argv[0])
+ return False
+
+ name = argv[2]
+ try:
+ etherstub = rc.get_object(Etherstub(), ADRGlobPattern({'name': name}))
+ etherstub.setProperties({
+ 'temporary': DLValue(type=DLValueType.BOOLEAN, bval="True"),
+ 'openvswitch': DLValue(type=DLValueType.BOOLEAN, bval=None)
+ })
+ dm.deleteEtherstub(name)
+ except radcli.NotFoundError as ex:
+ pass
+ except radcli.ObjectError as ex:
+ dlerr = ex.get_payload()
+ printError(ex)
+ return False
+
+ return True
+
+def main():
+ numargs = len(sys.argv)
+ if numargs < 2:
+ print "usage: %s command [args]" % (sys.argv[0])
+ print " %s delete-vnic vnic-name" % (sys.argv[0])
+ print " %s reset-ofports" % (sys.argv[0])
+ print " %s remove-flows" % (sys.argv[0])
+ print " %s delete-etherstub etherstub-name" % (sys.argv[0])
+ sys.exit(1)
+
+ rc = radcon.connect_unix()
+ dm = rc.get_object(DatalinkManager())
+
+ if sys.argv[1] == "delete-vnic":
+ rval = deleteVNIC(sys.argv, numargs, dm)
+ elif sys.argv[1] == "reset-ofports":
+ rval = resetOFPorts(sys.argv, numargs, rc)
+ elif sys.argv[1] == "remove-flows":
+ rval = removeFlows(sys.argv, numargs, rc)
+ elif sys.argv[1] == "delete-etherstub":
+ rval = deleteEtherstub(sys.argv, numargs, rc, dm)
+ else:
+ print "\nInvalid ovs shutdown function"
+ rval = False;
+
+ sys.exit(rval == False)
+
+if __name__ == "__main__":
+ main()