Tunnel loadbalancing policy: phase2 support
diff --git a/cli/c_actions.py b/cli/c_actions.py
index b2ab1f8..debece3 100755
--- a/cli/c_actions.py
+++ b/cli/c_actions.py
@@ -95,8 +95,9 @@
 
 tunnelset_id=None
 tunnelset_dict=[]
+tunnelset_remove_tunnels=[]
 def tunnelset_create(data=None):
-    global tunnelset_id,tunnelset_dict
+    global tunnelset_id,tunnelset_dict,tunnelset_remove_tunnels
     if sdnsh.description:   # description debugging
         print "tunnelset_create:" , data
     if data.has_key('tunnelset-id'):
@@ -105,22 +106,27 @@
                 print "tunnelset_create: previous data is not cleaned up"
             tunnelset_id=None
             tunnelset_dict=[]
+            tunnelset_remove_dict=[]
         tunnelset_id=data['tunnelset-id']
         tunnelset_dict=[]
+        tunnelset_remove_dict=[]
     if sdnsh.description:   # description debugging
         print "tunnelset_create:" , tunnelset_id
 
 def tunnelset_config_exit():
-    global tunnelset_id,tunnelset_dict
+    global tunnelset_id,tunnelset_dict,tunnelset_remove_tunnels
     if sdnsh.description:   # description debugging
         print "tunnelset_config_exit entered", tunnelset_dict
-    if tunnelset_dict:
+    if (len(tunnelset_dict) > 0) or (len(tunnelset_remove_tunnels)>0):
         url_str = ""
         entries = tunnelset_dict
         url_str = "http://%s/rest/v1/tunnelset/" % (sdnsh.controller)
         obj_data = {}
         obj_data['tunnelset_id']=tunnelset_id
-        obj_data['tunnel_params']=entries
+        if (len(entries) > 0):
+            obj_data['tunnel_params']=entries
+        if (len(tunnelset_remove_tunnels) > 0):
+            obj_data['remove_tunnel_params']=tunnelset_remove_tunnels
         result = "fail"
         try:
             result = sdnsh.store.rest_post_request(url_str,obj_data)
@@ -129,6 +135,7 @@
             print sdnsh.rest_error_dict_to_message(errors)
         # LOOK! successful stuff should be returned in json too.
         tunnelset_dict = []
+        tunnelset_remove_tunnels = []
         tunnelset_id = None
         curr_tunnel_id = None
         if result != "success":
@@ -141,7 +148,7 @@
     if sdnsh.description:   # description debugging
         print "tunnelset_remove:" , data
     tunnelset_id=data['tunnelset-id']
-    url_str = "http://%s/rest/v1/tunnel/" % (sdnsh.controller)
+    url_str = "http://%s/rest/v1/tunnelset/" % (sdnsh.controller)
     obj_data = {}
     obj_data['tunnelset_id']=data['tunnelset-id']
     result = "fail"
@@ -175,7 +182,7 @@
         print "tunnel_create:" , tunnel_id, tunnel_dict
 
 def tunnel_config_exit():
-    global tunnel_id,tunnel_dict
+    global tunnel_id,tunnel_dict,tunnelset_dict
     if sdnsh.description:   # description debugging
         print "tunnel_config_exit entered", tunnel_dict
         
@@ -206,20 +213,24 @@
     #Clear the transit information    
             
 def tunnel_remove(data=None):
+    global tunnelset_remove_tunnels
     if sdnsh.description:   # description debugging
         print "tunnel_remove:" , data
     tunnel_id=data['tunnel-id']
-    url_str = "http://%s/rest/v1/tunnel/" % (sdnsh.controller)
-    obj_data = {}
-    obj_data['tunnel_id']=data['tunnel-id']
-    result = "fail"
-    try:
-        result = sdnsh.store.rest_post_request(url_str,obj_data,'DELETE')
-    except Exception, e:
-        errors = sdnsh.rest_error_to_dict(e)
-        print sdnsh.rest_error_dict_to_message(errors)
-    if not result.startswith("SUCCESS"):
-        print result
+    if tunnelset_id:
+        tunnelset_remove_tunnels.append(tunnel_id)
+    else:
+        url_str = "http://%s/rest/v1/tunnel/" % (sdnsh.controller)
+        obj_data = {}
+        obj_data['tunnel_id']=data['tunnel-id']
+        result = "fail"
+        try:
+            result = sdnsh.store.rest_post_request(url_str,obj_data,'DELETE')
+        except Exception, e:
+            errors = sdnsh.rest_error_to_dict(e)
+            print sdnsh.rest_error_dict_to_message(errors)
+        if not result.startswith("SUCCESS"):
+            print result
 
 
 policy_obj_data = {}
@@ -821,6 +832,16 @@
     if (mode_name == 'config-tunnel'):
         if (current_mode == 'config-tunnelset'):
             mode_name = 'config-tunnelset-tunnel'
+    if (mode_name == 'config-policy'):
+        if (data.has_key('policy-type')):
+            if (data['policy-type'] == 'tunnel-flow'):
+                mode_name = 'config-policy-tunnel'
+            if (data['policy-type'] == 'loadbalance'):
+                mode_name = 'config-policy-loadbalance'
+            if (data['policy-type'] == 'avoid'):
+                mode_name = 'config-policy-avoid'
+            if sdnsh.description:   # description debugging
+                print "Changing config-policy sub mode to ", mode_name
 
     if sdnsh.description:   # description debugging
         print "push_mode: ", mode_name, obj_type, data, parent_field, parent_id
@@ -936,7 +957,7 @@
         exitCallback = tunnelset_config_exit
     if ((mode_name == 'config-tunnel') or (mode_name == 'config-tunnelset-tunnel')):
         exitCallback = tunnel_config_exit
-    if (mode_name == 'config-policy'):
+    if (mode_name.startswith('config-policy')):
         exitCallback = policy_config_exit
     sdnsh.push_mode(mode_name, obj_type, key, exitCallback)