Fix return values of all modules and states

Change-Id: I64234eff97d23931b7e6237fcc64b1f18dac1623
diff --git a/_modules/contrail.py b/_modules/contrail.py
index cfdc793..ab3df9e 100644
--- a/_modules/contrail.py
+++ b/_modules/contrail.py
@@ -157,7 +157,10 @@
         - tor-service-node
         - embedded
     '''
-    ret = {}
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     vrouter_objs = virtual_router_list(**kwargs)
@@ -167,25 +170,27 @@
     if name in vrouter_objs:
         vrouter = virtual_router_get(name)
         vrouter_obj = vnc_client._object_read('virtual-router', id=vrouter[name]['uuid'])
-        changed = False
+        changes = {}
         if vrouter_obj.get_virtual_router_ip_address() != ip_address:
-            ret['ip_address'] = {'from': vrouter_obj.get_virtual_router_ip_address(), "to": ip_address}
+            changes['ip_address'] = {'from': vrouter_obj.get_virtual_router_ip_address(), "to": ip_address}
             vrouter_obj.set_virtual_router_ip_address(ip_address)
-            changed = True
         if vrouter_obj.get_virtual_router_type() != router_type:
-            ret['router_type'] = {"from": vrouter_obj.get_virtual_router_type(), "to": router_type}
+            changes['router_type'] = {"from": vrouter_obj.get_virtual_router_type(), "to": router_type}
             vrouter_obj.set_virtual_router_type(router_type)
-            changed = True
         if vrouter_obj.get_virtual_router_dpdk_enabled() != dpdk_enabled:
-            ret['dpdk_enabled'] = {"from": vrouter_obj.get_virtual_router_dpdk_enabled(), "to": dpdk_enabled}
+            changes['dpdk_enabled'] = {"from": vrouter_obj.get_virtual_router_dpdk_enabled(), "to": dpdk_enabled}
             vrouter_obj.set_virtual_router_dpdk_enabled(dpdk_enabled)
-            changed = True
-        if changed:
+        if len(changes) != 0:
             if __opts__['test']:
-                return "Virtual router " + name + " will be updated"
-            vnc_client.virtual_router_update(vrouter_obj)
+                ret['result'] = None
+                ret['comment'] = "Virtual router " + name + " will be updated"
+            else:
+                ret['comment'] = "VirtualRouter " + name + " has been updated"
+                ret['changes'] = changes
+                vnc_client.virtual_router_update(vrouter_obj)
             return ret
-        return {'OK': 'Virtual router %s already exists and is updated' % name}
+        ret['comment'] = 'Virtual router ' + name + ' already exists and is updated'
+        return ret
     else:
         vrouter_obj = VirtualRouter(
             name, gsc_obj,
@@ -193,10 +198,13 @@
             virtual_router_type=router_type)
         vrouter_obj.set_virtual_router_dpdk_enabled(dpdk_enabled)
         if __opts__['test']:
-            return "Virtual router " + name + " will be created"
-        vnc_client.virtual_router_create(vrouter_obj)
-    ret = virtual_router_list(**kwargs)
-    return "Create"
+            ret['result'] = None
+            ret['comment'] = "VirtualRouter " + name + " will be created"
+        else:
+            vnc_client.virtual_router_create(vrouter_obj)
+            ret['comment'] = "VirtualRouter " + name + " has been created"
+            ret['changes'] = {'VirtualRouter': {'old': '', 'new': name}}
+    return ret
 
 
 def virtual_router_delete(name, **kwargs):
@@ -209,14 +217,21 @@
 
         salt '*' contrail.virtual_router_delete cmp01
     '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     vrouter_obj = VirtualRouter(name, gsc_obj)
     if __opts__['test']:
-        return "Virtual router " + name + " will be deleted"
-    vnc_client.virtual_router_delete(
-        fq_name=vrouter_obj.get_fq_name())
-    return "Deleted"
+        ret['result'] = None
+        ret['comment'] = "VirtualRouter " + name + " will be deleted"
+    else:
+        vnc_client.virtual_router_delete(fq_name=vrouter_obj.get_fq_name())
+        ret['comment'] = "VirtualRouter " + name + " has been deleted"
+        ret['changes'] = {'VirtualRouter': {'old': name, 'new': ''}}
+    return ret
 
 
 def physical_router_list(**kwargs):
@@ -280,58 +295,75 @@
 
         salt '*' contrail.physical_router_create OVSDB_router management_ip=10.167.4.202 dataplane_ip=172.16.20.15 vendor_name=MyVendor product_name=MyProduct agents="['tor01','tns01']"
     '''
-    ret = {}
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
-    gsc_obj = _get_config(vnc_client)
+    # gsc_obj = _get_config(vnc_client)
     prouter_objs = physical_router_list(**kwargs)
     if name in prouter_objs:
         prouter = physical_router_get(name)
+        changes = {}
         prouter_obj = vnc_client._object_read('physical-router', id=prouter[name]['_uuid'])
         if prouter_obj.physical_router_management_ip != management_ip:
-            ret['management_ip'] = {'from': prouter_obj.physical_router_management_ip, "to": management_ip}
+            changes['management_ip'] = {'from': prouter_obj.physical_router_management_ip, "to": management_ip}
             prouter_obj.set_physical_router_management_ip(management_ip)
         if prouter_obj.physical_router_dataplane_ip != dataplane_ip:
-            ret['dataplane_ip'] = {'from': prouter_obj.physical_router_dataplane_ip, "to": dataplane_ip}
+            changes['dataplane_ip'] = {'from': prouter_obj.physical_router_dataplane_ip, "to": dataplane_ip}
             prouter_obj.set_physical_router_dataplane_ip(dataplane_ip)
         if prouter_obj.get_physical_router_vendor_name() != vendor_name:
-            ret['vendor_name'] = {'from': prouter_obj.get_physical_router_vendor_name(), "to": vendor_name}
+            changes['vendor_name'] = {'from': prouter_obj.get_physical_router_vendor_name(), "to": vendor_name}
             prouter_obj.set_physical_router_vendor_name(vendor_name)
         if prouter_obj.get_physical_router_product_name() != product_name:
-            ret['product_name'] = {'from': prouter_obj.get_physical_router_product_name(), "to": product_name}
+            changes['product_name'] = {'from': prouter_obj.get_physical_router_product_name(), "to": product_name}
             prouter_obj.set_physical_router_product_name(product_name)
         if prouter_obj.get_physical_router_vnc_managed() != vnc_managed:
-            ret['vnc_managed'] = {'from': prouter_obj.get_physical_router_vnc_managed(), "to": vnc_managed}
+            changes['vnc_managed'] = {'from': prouter_obj.get_physical_router_vnc_managed(), "to": vnc_managed}
             prouter_obj.set_physical_router_vnc_managed(vnc_managed)
         if prouter_obj.get_physical_router_junos_service_ports() != junos_service_ports:
-            ret['junos_service_ports'] = {'from': prouter_obj.get_physical_router_junos_service_ports(),
-                                          "to": junos_service_ports}
+            changes['junos_service_ports'] = {'from': prouter_obj.get_physical_router_junos_service_ports(),
+                                              'to': junos_service_ports}
             prouter_obj.set_physical_router_junos_service_ports(junos_service_ports)
 
-        if __opts__['test']:
-            if len(ret) != 0:
-                return "Physical router " + name + " will be updated"
-            return {"OK": "Physical router exists and is updated"}
+        if len(changes) != 0:
+            if __opts__['test']:
+                ret['result'] = None
+                ret['comment'] = "Physical router " + name + " will be updated"
+        else:
+            ret['comment'] = 'Physical router ' + name + ' already exists and is updated'
+        return ret
 
         vrouter_objs = vnc_client._objects_list('virtual-router', detail=True)  # all vrouter objects
         c_agents = []  # referenced vrouters
         for c_agent in prouter_obj.get_virtual_router_refs():
             c_agents.append(c_agent['uuid'])
-        agent_objs = []  # required state of references
+        # agent_objs = []  # required state of references
         for vrouter_obj in vrouter_objs:
             if vrouter_obj._display_name in agents and vrouter_obj._uuid not in c_agents:
                 prouter_obj.add_virtual_router(vrouter_obj)
-                ret['vrouter ' + vrouter_obj._display_name] = "Reference added"
+                changes['vrouter ' + vrouter_obj._display_name] = "Reference added"
             if vrouter_obj._display_name not in agents and vrouter_obj._uuid in c_agents:
                 prouter_obj.del_virtual_router(vrouter_obj)
-                ret['vrouter ' + vrouter_obj._display_name] = "Reference removed"
+                changes['vrouter ' + vrouter_obj._display_name] = "Reference removed"
         vnc_client.physical_router_update(prouter_obj)
 
-        if len(ret) == 0:
-            return {"OK": "Physical router exists and is updated"}
+        if __opts__['test']:
+            ret['result'] = None
+            ret['comment'] = "VirtualRouter " + name + " will be created"
+        else:
+            vnc_client.virtual_router_create(vrouter_obj)
+            ret['comment'] = "VirtualRouter " + name + " has been created"
+            ret['changes'] = {'VirtualRouter': {'old': '', 'new': name}}
+
+        if len(changes) == 0:
+            ret['comment'] = "Physical router exists and is updated"
         return ret
     else:
         if __opts__['test']:
-            return "Physical router " + name + " will be created"
+            ret['result'] = None
+            ret['comment'] = "Physical router " + name + " will be created"
+            return ret
         prouter_obj = PhysicalRouter(
             name=name,
             parent_obj=None,
@@ -347,7 +379,9 @@
             vrouter_obj = vnc_client._object_read('virtual-router', id=vrouter[agent]['uuid'])
             prouter_obj.add_virtual_router(vrouter_obj)
         vnc_client.physical_router_create(prouter_obj)
-    return "Created"
+        ret['comment'] = "Physical router " + name + " has been created"
+        ret['changes'] = {'PhysicalRouter': {'old': '', 'new': name}}
+    return ret
 
 
 def physical_router_delete(name, **kwargs):
@@ -360,14 +394,21 @@
 
         salt '*' contrail.physical_router_delete router_name
     '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     prouter_obj = PhysicalRouter(name, gsc_obj)
     if __opts__['test']:
-        return "Physical router " + name + " will be deleted"
-    vnc_client.physical_router_delete(
-        fq_name=prouter_obj.get_fq_name())
-    return "Deleted"
+        ret['result'] = None
+        ret['comment'] = "Physical router " + name + " will be deleted"
+    else:
+        vnc_client.physical_router_delete(fq_name=prouter_obj.get_fq_name())
+        ret['comment'] = "Physical router " + name + " has been deleted"
+        ret['changes'] = {'Physical router': {'old': name, 'new': ''}}
+    return ret
 
 
 def physical_interface_list(**kwargs):
@@ -424,20 +465,29 @@
 
         salt '*' contrail.physical_interface_create ge-0/0/10 physical_router_name
     '''
-    ret = {}
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
-    gsc_obj = _get_config(vnc_client)
+    # gsc_obj = _get_config(vnc_client)
     pinterf_obj = physical_interface_get(name, physical_router, **kwargs)
     if 'Error' not in pinterf_obj:
-        return {'OK': 'Physical interface ' + name + ' on ' + physical_router + ' already exists'}
-    else:
-        if __opts__['test']:
-            return "Physical interface " + name + " will be created"
-        prouter = physical_router_get(physical_router)
-        prouter_obj = vnc_client._object_read('physical-router', id=prouter[physical_router]['_uuid'])
-        pinterf_obj = PhysicalInterface(name, prouter_obj)
-        vnc_client.physical_interface_create(pinterf_obj)
-    return "Created"
+        ret['comment'] = 'Physical interface ' + name + ' on ' + physical_router + ' already exists'
+        return ret
+
+    if __opts__['test']:
+        ret['result'] = None
+        ret['comment'] = "Physical interface " + name + " will be created"
+        return ret
+
+    prouter = physical_router_get(physical_router)
+    prouter_obj = vnc_client._object_read('physical-router', id=prouter[physical_router]['_uuid'])
+    pinterf_obj = PhysicalInterface(name, prouter_obj)
+    vnc_client.physical_interface_create(pinterf_obj)
+    ret['comment'] = "Physical interface " + name + " has been created"
+    ret['changes'] = {'Physical interface': {'old': '', 'new': name}}
+    return ret
 
 
 def physical_interface_delete(name, physical_router, **kwargs):
@@ -449,13 +499,21 @@
 
         salt '*' contrail.physical_interface_delete ge-0/0/0 phr01
     '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
-    gsc_obj = _get_config(vnc_client)
+    # gsc_obj = _get_config(vnc_client)
     piface = physical_interface_get(name, physical_router)
     if __opts__['test']:
-        return "Physical interface " + name + " will be deleted"
-    vnc_client.physical_interface_delete(id=piface[name]['_uuid'])
-    return "Deleted"
+        ret['result'] = None
+        ret['comment'] = "Physical interface " + name + " will be deleted"
+    else:
+        vnc_client.physical_interface_delete(id=piface[name]['_uuid'])
+        ret['comment'] = "Physical router " + name + " has been deleted"
+        ret['changes'] = {'Physical router': {'old': name, 'new': ''}}
+    return ret
 
 
 def logical_interface_list(**kwargs):
@@ -526,16 +584,21 @@
 
         salt '*' contrail.logical_interface_create ge-0/0/10.11 parent_names="['ge-0/0/0','phr1']" parent_type=physical-interface vlan_tag=1025 interface_type=L2
     '''
-    ret = {}
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
-    gsc_obj = _get_config(vnc_client)
+    # gsc_obj = _get_config(vnc_client)
 
     liface_obj = logical_interface_get(name, parent_names, parent_type, **kwargs)
     if 'Error' not in liface_obj:
-        return {'OK': 'Logical interface ' + name + ' already exists'}
+        ret['comment'] = 'Logical interface ' + name + ' already exists'
     else:
         if __opts__['test']:
-            return "Logical interface " + name + " will be created"
+            ret['result'] = None
+            ret['comment'] = "Logical interface " + name + " will be created"
+            return ret
         parent_obj = None
         for router in parent_names:
             parent_router = physical_router_get(router)
@@ -543,7 +606,9 @@
                 parent_obj = vnc_client._object_read('physical-router', id=parent_router[router]['_uuid'])
                 break
         if not parent_obj:
-            return {'Error': 'Physical router have to be defined'}
+            ret['result'] = False
+            ret['comment'] = 'Physical router have to be defined'
+            return ret
         if parent_type == 'physical-interface':
             for interface in parent_names:
                 parent_interface = physical_interface_get(interface, parent_obj.name)
@@ -551,18 +616,23 @@
                     parent_obj = vnc_client._object_read('physical-interface', id=parent_interface[interface]['_uuid'])
                     break
         if interface_type.lower() == "l3":
-            return {'Error': "Virtual Network have to be defined for L3 interface type"}
+            ret['result'] = False
+            ret['comment'] = "Virtual Network have to be defined for L3 interface type"
+            return ret
 
         liface_obj = LogicalInterface(name, parent_obj, vlan_tag, interface_type.lower())
 
-        for vmi_name, vmi in vmis.iteritems():
-            vmi = vnc_client.virtual_machine_interface_read(
-                fq_name=_get_fq_name(vnc_client, resource_name=vmi_name,
-                                     project_name=kwargs.get('tenant', 'admin')))
-            liface_obj.add_virtual_machine_interface(vmi)
+        if vmis:
+            for vmi_name, vmi in vmis.iteritems():
+                vmi = vnc_client.virtual_machine_interface_read(
+                    fq_name=_get_fq_name(vnc_client, resource_name=vmi_name,
+                                         project_name=kwargs.get('tenant', 'admin')))
+                liface_obj.add_virtual_machine_interface(vmi)
         vnc_client.logical_interface_create(liface_obj)
 
-    return "Created"
+    ret['comment'] = "Logical interface " + name + " has been created"
+    ret['changes'] = {'Logical interface': {'old': '', 'new': name}}
+    return ret
 
 
 def logical_interface_delete(name, parent_names, parent_type=None, **kwargs):
@@ -578,16 +648,22 @@
         salt '*' contrail.logical_interface_delete ge-0/0/0.12 ['phr01'] parent_type=physical-router
 
     '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
-    gsc_obj = _get_config(vnc_client)
+    # gsc_obj = _get_config(vnc_client)
     liface = logical_interface_get(name, parent_names, parent_type)
-    if 'Error' not in liface:
-        if __opts__['test']:
-            return "Logical interface " + name + " will be deleted"
-        vnc_client.logical_interface_delete(id=liface[name]['_uuid'])
-        return "Deleted"
-    else:
-        return liface
+
+    if __opts__['test']:
+        ret['result'] = None
+        ret['comment'] = "Logical interface " + name + " will be deleted"
+        return ret
+    vnc_client.logical_interface_delete(id=liface[name]['_uuid'])
+    ret['comment'] = "Logical interface  " + name + " has been deleted"
+    ret['changes'] = {'LogicalInterface ': {'old': name, 'new': ''}}
+    return ret
 
 
 def global_vrouter_config_list(**kwargs):
@@ -637,12 +713,16 @@
 
         salt '*' contrail.global_vrouter_config_create name=global-vrouter-config parent_type=global-system-config encap_priority="MPLSoUDP,MPLSoGRE" vxlan_vn_id_mode="automatic" fq_names="['default-global-system-config', 'default-global-vrouter-config']"
     '''
-    ret = {}
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
-    gsc_obj = _get_config(vnc_client)
+    # gsc_obj = _get_config(vnc_client)
     vrouter_conf_objs = global_vrouter_config_list(**kwargs)
     if name in vrouter_conf_objs:
-        return {'OK': 'Global vrouter config %s already exists' % name}
+        ret['comment'] = 'Global vrouter config ' + name + ' already exists'
+        return ret
     else:
         vrouter_conf_obj = GlobalVrouterConfig(
             name=name,
@@ -653,9 +733,13 @@
             parent_type=parent_type,
         )
         if __opts__['test']:
-            return "Global vRouter config " + name + " will be created"
+            ret['result'] = None
+            ret['comment'] = "Global vRouter config " + name + " will be created"
+            return ret
         vnc_client.global_vrouter_config_create(vrouter_conf_obj)
-    return "Created"
+    ret['comment'] = "Global vRouter config " + name + " has been created"
+    ret['changes'] = {'Global vRouter config': {'old': '', 'new': name}}
+    return ret
 
 
 def global_vrouter_config_delete(name, **kwargs):
@@ -668,14 +752,22 @@
 
         salt '*' contrail.global_vrouter_config_delete global-vrouter-config
     '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     vrouter_conf_obj = GlobalVrouterConfig(name, gsc_obj)
     if __opts__['test']:
-        return "Global vRouter config " + name + " will be deleted"
+        ret['result'] = None
+        ret['comment'] = "Global vRouter config " + name + " will be deleted"
+        return ret
     vnc_client.global_vrouter_config_delete(
         fq_name=vrouter_conf_obj.get_fq_name())
-    return "Deleted"
+    ret['comment'] = "Global vRouter config " + name + " has been deleted"
+    ret['changes'] = {'Global vRouter config': {'old': name, 'new': ''}}
+    return ret
 
 
 def analytics_node_list(**kwargs):
@@ -725,20 +817,29 @@
 
         salt '*' contrail.analytics_node_create ntw03 10.10.10.103
     '''
-    ret = {}
+
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     analytics_node_objs = analytics_node_list(**kwargs)
     if name in analytics_node_objs:
-        return {'OK': 'Analytics node %s already exists' % name}
+        ret['comment'] = 'Analytics node %s already exists'
+        return ret
     else:
         analytics_node_obj = AnalyticsNode(
             name, gsc_obj,
             analytics_node_ip_address=ip_address)
         if __opts__['test']:
-            return "AnalyticsNode " + name + " will be created"
+            ret['result'] = None
+            ret['comment'] = "AnalyticsNode " + name + " will be created"
+            return ret
         vnc_client.analytics_node_create(analytics_node_obj)
-    return "Created"
+        ret['comment'] = "AnalyticsNode " + name + " has been created"
+        ret['changes'] = {'Analytics Node': {'old': '', 'new': name}}
+    return ret
 
 
 def analytics_node_delete(name, **kwargs):
@@ -751,14 +852,22 @@
 
         salt '*' contrail.analytics_node_delete cmp01
     '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     analytics_node_obj = AnalyticsNode(name, gsc_obj)
     if __opts__['test']:
-        return "AnalyticsNode " + name + " will be deleted"
+        ret['result'] = None
+        ret['comment'] = "AnalyticsNode " + name + " will be deleted"
+        return ret
     vnc_client.analytics_node_delete(
         fq_name=analytics_node_obj.get_fq_name())
-    return "Deleted"
+    ret['comment'] = "AnalyticsNode " + name + " has been deleted"
+    ret['changes'] = {'Analytics Node': {'old': name, 'new': ''}}
+    return ret
 
 
 def config_node_list(**kwargs):
@@ -808,20 +917,28 @@
 
         salt '*' contrail.config_node_create ntw03 10.10.10.103
     '''
-    ret = {}
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     config_node_objs = config_node_list(**kwargs)
     if name in config_node_objs:
-        return {'OK': 'Config node %s already exists' % name}
+        ret['comment'] = 'Config node ' + name + ' already exists'
+        return ret
     else:
         config_node_obj = ConfigNode(
             name, gsc_obj,
             config_node_ip_address=ip_address)
         if __opts__['test']:
-            return "ConfigNode " + name + " will be created"
+            ret['comment'] = "ConfigNode " + name + " will be created"
+            ret['result'] = None
+            return ret
         vnc_client.config_node_create(config_node_obj)
-    return "Created"
+        ret['comment'] = "ConfigNode " + name + " has been created"
+        ret['changes'] = {'ConfigNode': {'old': '', 'new': name}}
+    return ret
 
 
 def config_node_delete(name, **kwargs):
@@ -834,14 +951,22 @@
 
         salt '*' contrail.config_node_delete cmp01
     '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     config_node_obj = ConfigNode(name, gsc_obj)
     if __opts__['test']:
-        return "ConfigNode " + name + " will be deleted"
+        ret['comment'] = "ConfigNode " + name + " will be deleted"
+        ret['result'] = None
+        return ret
     vnc_client.config_node_delete(
         fq_name=config_node_obj.get_fq_name())
-    return "Deleted"
+    ret['comment'] = "ConfigNode " + name + " has been deleted"
+    ret['changes'] = {'ConfigNode': {'old': name, 'new': ''}}
+    return ret
 
 
 def bgp_router_list(**kwargs):
@@ -892,7 +1017,10 @@
         salt '*' contrail.bgp_router_create ntw03 control-node 10.10.10.103
         salt '*' contrail.bgp_router_create mx01 router 10.10.10.105
     '''
-    ret = {}
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
 
     address_families = ['route-target', 'inet-vpn', 'e-vpn', 'erm-vpn',
@@ -902,7 +1030,7 @@
 
     bgp_addr_fams = AddressFamilies(address_families)
     bgp_sess_attrs = [
-        BgpSessionAttributes(address_families=bgp_addr_fams)]
+       BgpSessionAttributes(address_families=bgp_addr_fams)]
     bgp_sessions = [BgpSession(attributes=bgp_sess_attrs)]
     bgp_peering_attrs = BgpPeeringAttributes(session=bgp_sessions)
     rt_inst_obj = _get_rt_inst_obj(vnc_client)
@@ -925,15 +1053,23 @@
         bgp_router_obj = vnc_client._object_read('bgp-router', id=bgp_router_objs[name]['_uuid'])
         bgp_router_obj.set_bgp_router_parameters(router_params)
         if __opts__['test']:
-            return "BGP router " + name + " will be updated"
+            ret['result'] = None
+            ret['comment'] = "BGP router " + name + " will be updated"
+            return ret
         vnc_client.bgp_router_update(bgp_router_obj)
+        ret['comment'] = "BGP router " + name + " has been updated"
+        ret['changes'] = {'new': name}
+        return ret
     else:
         bgp_router_obj = BgpRouter(name, rt_inst_obj, bgp_router_parameters=router_params)
         if __opts__['test']:
-            return "BGP router " + name + " will be created"
+            ret['result'] = None
+            ret['comment'] = "BGP router " + name + " will be created"
+            return ret
         vnc_client.bgp_router_create(bgp_router_obj)
-        return "Created"
-    return {'OK': 'Config node %s already exists' % name}
+        ret['comment'] = "BGP router " + name + " has been created"
+        ret['changes'] = {'BGP router': {'old': name, 'new': ''}}
+    return ret
 
 
 def bgp_router_delete(name, **kwargs):
@@ -946,16 +1082,22 @@
 
         salt '*' contrail.bgp_router_delete mx01
     '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     bgp_router_obj = BgpRouter(name, gsc_obj)
 
     if __opts__['test']:
-        return "BGP router " + name + " will be deleted"
-    vnc_client.bgp_router_delete(
-        fq_name=bgp_router_obj.get_fq_name())
-
-    return "Deleted"
+        ret['result'] = None
+        ret['comment'] = "BGP router " + name + " will be deleted"
+        return ret
+    vnc_client.bgp_router_delete(bgp_router_obj.get_uuid())
+    ret['comment'] = "BGP router " + name + " has been deleted"
+    ret['changes'] = {'BGP router': {'old': '', 'new': name}}
+    return ret
 
 
 def database_node_list(**kwargs):
@@ -1005,20 +1147,28 @@
 
         salt '*' contrail.database_node_create ntw03 10.10.10.103
     '''
-    ret = {}
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     database_node_objs = database_node_list(**kwargs)
     if name in database_node_objs:
-        return {'OK': 'Database node %s already exists' % name}
+        ret['comment'] = 'Database node ' + name + ' already exists'
+        return ret
     else:
         database_node_obj = DatabaseNode(
             name, gsc_obj,
             database_node_ip_address=ip_address)
         if __opts__['test']:
-            return "DatabaseNode " + name + " will be created"
+            ret['result'] = None
+            ret['comment'] = "DatabaseNode " + name + " will be created"
+            return ret
         vnc_client.database_node_create(database_node_obj)
-    return "Created"
+        ret['comment'] = "DatabaseNode " + name + " has been created"
+        ret['changes'] = {'DatabaseNode': {'old': '', 'new': name}}
+    return ret
 
 
 def database_node_delete(name, **kwargs):
@@ -1031,13 +1181,22 @@
 
         salt '*' contrail.database_node_delete cmp01
     '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     database_node_obj = DatabaseNode(name, gsc_obj)
     if __opts__['test']:
-        return "DatabaseNode " + name + " will be deleted"
+        ret['result'] = None
+        ret['comment'] = "DatabaseNode " + name + " will be deleted"
+        return ret
     vnc_client.database_node_delete(
         fq_name=database_node_obj.get_fq_name())
+    ret['comment'] = "DatabaseNode " + name + " has been deleted"
+    ret['changes'] = {'DatabaseNode': {'old': '', 'new': name}}
+    return ret
 
 
 def _get_vrouter_config(vnc_client):
@@ -1112,11 +1271,12 @@
         salt '*' contrail.linklocal_service_create \
             llservice 10.10.10.103 22 link-local.service.dns-name 22
     '''
-    ret = {}
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
     vnc_client = _auth(**kwargs)
-
     current_config = _get_vrouter_config(vnc_client)
-
     service_entry = LinklocalServiceEntryType(
         linklocal_service_name=name,
         linklocal_service_ip=lls_ip,
@@ -1132,9 +1292,11 @@
         new_services = LinklocalServicesTypes([service_entry])
         new_config = GlobalVrouterConfig(linklocal_services=new_services)
         if __opts__['test']:
-            ret['GlobalVrouterConfig'] = "Global vRouter Config will be created"
+            ret['result'] = None
+            ret['comment'] = "Link local service " + name + " will be created"
         else:
-            ret = "Created"
+            ret['comment'] = "Link local service " + name + " has been created"
+            ret['changes'] = {'LinkLocalSevice': {'old': '', 'new': name}}
             vnc_client.global_vrouter_config_create(new_config)
     else:
         _current_service_list = current_config.get_linklocal_services()
@@ -1150,17 +1312,21 @@
                 entry = _entry.__dict__
                 if 'linklocal_service_name' in entry:
                     if entry['linklocal_service_name'] == name:
-                        return {'OK': 'Link local service "{0}" already exists'.format(name)}
+                        ret['comment'] = 'Link local service ' + name + ' already exists'
+                        return ret
                     new_services.append(_entry)
             if __opts__['test']:
-                ret['Test'] = "LinkLocalSevices will be created"
+                ret['result'] = None
+                ret['comment'] = "LinkLocalSevices " + name + " will be created"
             service_list[key] = new_services
         new_config = GlobalVrouterConfig(linklocal_services=service_list)
         if __opts__['test']:
-            ret['GlobalVrouterConfig'] = "Global vRouter Config will be updated"
+            ret['result'] = None
+            ret['comment'] = "LinkLocalSevices " + name + " will be updated"
         else:
             vnc_client.global_vrouter_config_update(new_config)
-            ret = "Created"
+            ret['comment'] = "LinkLocalSevices " + name + " has been created"
+            ret['changes'] = {'LinkLocalSevices': {'old': '', 'new': name}}
     return ret
 
 
@@ -1174,11 +1340,23 @@
 
         salt '*' contrail.linklocal_service_delete llservice
     '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': ''}
+    lls = linklocal_service_get(name)
+    print (lls)
+    if name in lls:
+        if __opts__['test']:
+            print " ------------ Test only  ------------"
+            ret['result'] = None
+            ret['comment'] = "Link local service " + name + " will be deleted"
+            return ret
+    else:
+        return ret
+
     vnc_client = _auth(**kwargs)
-
     current_config = _get_vrouter_config(vnc_client)
-
-    found = False
     if current_config is not None:
         _current_service_list = current_config.get_linklocal_services()
         if _current_service_list is None:
@@ -1192,18 +1370,14 @@
             for _entry in value:
                 entry = _entry.__dict__
                 if 'linklocal_service_name' in entry:
-                    if entry['linklocal_service_name'] == name:
-                        found = True
-                    else:
+                    if entry['linklocal_service_name'] != name:
                         new_services.append(_entry)
             service_list[key] = new_services
         new_config = GlobalVrouterConfig(linklocal_services=service_list)
-        if __opts__['test']:
-            return "Link local service " + name + " will be deleted"
         vnc_client.global_vrouter_config_update(new_config)
-        return "Deleted"
-    if not found:
-        return {'Error': 'Link local service "{0}" not found'.format(name)}
+        ret['comment'] = "Link local service " + name + " will be deleted"
+        ret['changes'] = {'LinkLocalService': {'old': '', 'new': name}}
+    return ret
 
 
 def virtual_machine_interface_list(**kwargs):
@@ -1261,7 +1435,7 @@
 
     if security_group:
         sgo = vnc_client.security_group_read(fq_name=_get_fq_name(
-            vnc_client, security_group, kwargs.get('tenant', 'admin')))
+          vnc_client, security_group, kwargs.get('tenant', 'admin')))
         vm_int.set_security_group(sgo)
 
     vnet_uuid = virtual_network_get(virtual_network, **kwargs)[virtual_network]['_uuid']