You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by hu...@apache.org on 2012/10/12 14:15:51 UTC

[8/16] git commit: Add Nicira configuration to the UI

Add Nicira configuration to the UI

Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/c9b0b0b1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/c9b0b0b1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/c9b0b0b1

Branch: refs/heads/master
Commit: c9b0b0b1a9510f7740ca2c1de8961ad25b2d023f
Parents: c5634b9
Author: Hugo Trippaers <ht...@schubergphilis.com>
Authored: Sun Sep 30 23:33:37 2012 -0700
Committer: Hugo Trippaers <ht...@schubergphilis.com>
Committed: Sun Sep 30 23:33:37 2012 -0700

----------------------------------------------------------------------
 api/src/com/cloud/event/EventTypes.java            |    5 +
 .../cloud/api/commands/AddNiciraNvpDeviceCmd.java  |   12 +-
 .../api/commands/DeleteNiciraNvpDeviceCmd.java     |   16 +-
 .../api/commands/ListNiciraNvpDevicesCmd.java      |    2 +-
 .../api/response/NiciraNvpDeviceResponse.java      |   33 ++-
 .../cloud/network/element/NiciraNvpElement.java    |    8 +-
 .../cloud/network/resource/NiciraNvpResource.java  |    3 +-
 ui/scripts/system.js                               |  418 ++++++++++++++-
 8 files changed, 486 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c9b0b0b1/api/src/com/cloud/event/EventTypes.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java
index e84a403..9e6b36b 100755
--- a/api/src/com/cloud/event/EventTypes.java
+++ b/api/src/com/cloud/event/EventTypes.java
@@ -291,4 +291,9 @@ public class EventTypes {
     public static final String EVENT_TAGS_CREATE = "CREATE_TAGS";
     public static final String EVENT_TAGS_DELETE = "DELETE_TAGS";
 
+    // external network device events
+    public static final String EVENT_EXTERNAL_NVP_CONTROLLER_ADD = "PHYSICAL.NVPCONTROLLER.ADD";
+    public static final String EVENT_EXTERNAL_NVP_CONTROLLER_DELETE = "PHYSICAL.NVPCONTROLLER.DELETE";
+    public static final String EVENT_EXTERNAL_NVP_CONTROLLER_CONFIGURE = "PHYSICAL.NVPCONTROLLER.CONFIGURE";
+    
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c9b0b0b1/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/AddNiciraNvpDeviceCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/AddNiciraNvpDeviceCmd.java b/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/AddNiciraNvpDeviceCmd.java
index 1f497c6..7744b4f 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/AddNiciraNvpDeviceCmd.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/AddNiciraNvpDeviceCmd.java
@@ -42,7 +42,7 @@ import com.cloud.user.UserContext;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Implementation(responseObject=NiciraNvpDeviceResponse.class, description="Adds a Nicira NVP device")
-public class AddNiciraNvpDeviceCmd extends BaseCmd {
+public class AddNiciraNvpDeviceCmd extends BaseAsyncCmd {
     private static final Logger s_logger = Logger.getLogger(AddNiciraNvpDeviceCmd.class.getName());
     private static final String s_name = "addniciranvpdevice";
     @PlugService NiciraNvpElementService _niciraNvpElementService;
@@ -130,4 +130,14 @@ public class AddNiciraNvpDeviceCmd extends BaseCmd {
     public long getEntityOwnerId() {
         return UserContext.current().getCaller().getId();
     }
+
+	@Override
+	public String getEventType() {
+		return EventTypes.EVENT_EXTERNAL_NVP_CONTROLLER_ADD;
+	}
+
+	@Override
+	public String getEventDescription() {
+		return "Adding a Nicira Nvp Controller";
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c9b0b0b1/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java b/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java
index 01a3946..9cc8d62 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java
@@ -19,6 +19,7 @@ package com.cloud.api.commands;
 import org.apache.log4j.Logger;
 
 import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseAsyncCmd;
 import com.cloud.api.BaseCmd;
 import com.cloud.api.IdentityMapper;
 import com.cloud.api.Implementation;
@@ -26,6 +27,7 @@ import com.cloud.api.Parameter;
 import com.cloud.api.PlugService;
 import com.cloud.api.ServerApiException;
 import com.cloud.api.response.SuccessResponse;
+import com.cloud.event.EventTypes;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.InvalidParameterValueException;
@@ -36,9 +38,9 @@ import com.cloud.user.UserContext;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Implementation(responseObject=SuccessResponse.class, description=" delete a nicira nvp device")
-public class DeleteNiciraNvpDeviceCmd extends BaseCmd {
+public class DeleteNiciraNvpDeviceCmd extends BaseAsyncCmd {
     private static final Logger s_logger = Logger.getLogger(DeleteNiciraNvpDeviceCmd.class.getName());
-    private static final String s_name = "addniciranvpdevice";
+    private static final String s_name = "deleteniciranvpdeviceresponse";
     @PlugService NiciraNvpElementService _niciraNvpElementService;
 
     /////////////////////////////////////////////////////
@@ -89,4 +91,14 @@ public class DeleteNiciraNvpDeviceCmd extends BaseCmd {
         return UserContext.current().getCaller().getId();
     }
 
+	@Override
+	public String getEventType() {
+		return EventTypes.EVENT_EXTERNAL_LB_DEVICE_DELETE;
+	}
+
+	@Override
+	public String getEventDescription() {
+		return "Deleting Nicira Nvp Controller";
+	}
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c9b0b0b1/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/ListNiciraNvpDevicesCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/ListNiciraNvpDevicesCmd.java b/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/ListNiciraNvpDevicesCmd.java
index f9c157d..f38cb16 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/ListNiciraNvpDevicesCmd.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/ListNiciraNvpDevicesCmd.java
@@ -43,7 +43,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
 @Implementation(responseObject=NiciraNvpDeviceResponse.class, description="Lists Nicira NVP devices")
 public class ListNiciraNvpDevicesCmd extends BaseListCmd {
     private static final Logger s_logger = Logger.getLogger(ListNiciraNvpDevicesCmd.class.getName());
-    private static final String s_name = "listniciranvpdevices";
+    private static final String s_name = "listniciranvpdeviceresponse";
     @PlugService NiciraNvpElementService _niciraNvpElementService;
 
    /////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c9b0b0b1/plugins/network-elements/nicira-nvp/src/com/cloud/api/response/NiciraNvpDeviceResponse.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/api/response/NiciraNvpDeviceResponse.java b/plugins/network-elements/nicira-nvp/src/com/cloud/api/response/NiciraNvpDeviceResponse.java
index d5c82b3..e50be81 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/api/response/NiciraNvpDeviceResponse.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/api/response/NiciraNvpDeviceResponse.java
@@ -33,7 +33,16 @@ public class NiciraNvpDeviceResponse extends BaseResponse {
     
     @SerializedName(ApiConstants.NICIRA_NVP_DEVICE_NAME) @Param(description="device name")
     private String deviceName;
-
+    
+    @SerializedName(ApiConstants.HOST_NAME) @Param(description="the controller Ip address")
+    private String hostName;
+    
+    @SerializedName(ApiConstants.NICIRA_NVP_TRANSPORT_ZONE_UUID) @Param(description="the transport zone Uuid")
+    private String transportZoneUuid;
+    
+    @SerializedName(ApiConstants.NICIRA_NVP_GATEWAYSERVICE_UUID) @Param(description="this L3 gateway service Uuid")
+    private String l3GatewayServiceUuid;
+    
     public void setId(long nvpDeviceId) {
         this.id.setValue(nvpDeviceId);
     }
@@ -48,6 +57,26 @@ public class NiciraNvpDeviceResponse extends BaseResponse {
 
     public void setDeviceName(String deviceName) {
         this.deviceName = deviceName;
-    }     
+    }
+
+	public void setId(IdentityProxy id) {
+		this.id = id;
+	}
+
+	public void setPhysicalNetworkId(IdentityProxy physicalNetworkId) {
+		this.physicalNetworkId = physicalNetworkId;
+	}
+
+	public void setHostName(String hostName) {
+		this.hostName = hostName;
+	}
+
+	public void setTransportZoneUuid(String transportZoneUuid) {
+		this.transportZoneUuid = transportZoneUuid;
+	}
+
+	public void setL3GatewayServiceUuid(String l3GatewayServiceUuid) {
+		this.l3GatewayServiceUuid = l3GatewayServiceUuid;
+	}     
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c9b0b0b1/plugins/network-elements/nicira-nvp/src/com/cloud/network/element/NiciraNvpElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/element/NiciraNvpElement.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/element/NiciraNvpElement.java
index 716cd78..487a64d 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/element/NiciraNvpElement.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/element/NiciraNvpElement.java
@@ -657,11 +657,18 @@ public class NiciraNvpElement extends AdapterBase implements
 	@Override
 	public NiciraNvpDeviceResponse createNiciraNvpDeviceResponse(
 			NiciraNvpDeviceVO niciraNvpDeviceVO) {
+		HostVO niciraNvpHost = _hostDao.findById(niciraNvpDeviceVO.getHostId());
+		_hostDao.loadDetails(niciraNvpHost);
+		
 		NiciraNvpDeviceResponse response = new NiciraNvpDeviceResponse();
 		response.setDeviceName(niciraNvpDeviceVO.getDeviceName());
 		response.setPhysicalNetworkId(niciraNvpDeviceVO.getPhysicalNetworkId());
 		response.setId(niciraNvpDeviceVO.getId());
 		response.setProviderName(niciraNvpDeviceVO.getProviderName());
+		response.setHostName(niciraNvpHost.getDetail("ip"));
+		response.setTransportZoneUuid(niciraNvpHost.getDetail("transportzoneuuid"));
+		response.setL3GatewayServiceUuid(niciraNvpHost.getDetail("l3gatewayserviceuuid"));
+		response.setObjectName("niciranvpdevice");
 		return response;
 	}
 
@@ -705,7 +712,6 @@ public class NiciraNvpElement extends AdapterBase implements
 		_resourceMgr.deleteHost(hostId, false, false);
 
 		_niciraNvpDao.remove(niciraDeviceId);
-
 		return true;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c9b0b0b1/plugins/network-elements/nicira-nvp/src/com/cloud/network/resource/NiciraNvpResource.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/resource/NiciraNvpResource.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/resource/NiciraNvpResource.java
index 0908101..4d01bc6 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/resource/NiciraNvpResource.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/resource/NiciraNvpResource.java
@@ -229,7 +229,8 @@ public class NiciraNvpResource implements ServerResource {
         }
         else if (cmd instanceof ConfigurePortForwardingRulesOnLogicalRouterCommand) {
         	return executeRequest((ConfigurePortForwardingRulesOnLogicalRouterCommand) cmd, numRetries);
-        }        s_logger.debug("Received unsupported command " + cmd.toString());
+        }        
+        s_logger.debug("Received unsupported command " + cmd.toString());
         return Answer.createUnsupportedCommandAnswer(cmd);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c9b0b0b1/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index e5d53e2..826ba08 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -3761,7 +3761,213 @@
               name: { label: 'label.name' }//,
               //state: { label: 'label.status' } //comment it for now, since dataProvider below doesn't get called by widget code after action is done
             }
-          }
+          },
+          // Nicira Nvp provider detail view
+          niciraNvp: {
+            type: 'detailView',
+            id: 'niciraNvpProvider',
+            label: 'label.niciraNvp',
+            viewAll: { label: 'label.devices', path: '_zone.niciraNvpDevices' },
+            tabs: {
+              details: {
+                title: 'label.details',
+                fields: [
+                  {
+                    name: { label: 'label.name' }
+                  },
+                  {
+                    state: { label: 'label.state' }
+                  }
+                ],
+                dataProvider: function(args) {
+                                  refreshNspData("NiciraNvp");
+                                    var providerObj;
+                                    $(nspHardcodingArray).each(function(){
+                                        if(this.id == "niciraNvp") {
+                                            providerObj = this;
+                                            return false; //break each loop
+                                        }
+                                    });
+                  args.response.success({
+                    data: providerObj,
+                    actionFilter: networkProviderActionFilter('niciraNvp')
+                  });
+                }
+              }
+            },
+            actions: {
+              add: {
+                label: 'label.add.NiciraNvp.device',
+                createForm: {
+                  title: 'label.add.NiciraNvp.device',
+                  preFilter: function(args) {  },   // TODO What is this?  
+                  fields: {
+                    host: {
+                      label: 'label.ip.address'
+                    },
+                    username: {
+                      label: 'label.username'
+                    },
+                    password: {
+                      label: 'label.password',
+                      isPassword: true
+                    },
+                    numretries: {
+                      label: 'label.numretries',
+                      defaultValue: '2'
+                    },
+                    transportzoneuuid: {
+                      label: 'label.nicira.transportzoneuuid'
+                    },
+                    l3gatewayserviceuuid: {
+                      label: 'label.nicira.l3gatewayserviceuuid'
+                    }
+                  }
+                },
+                action: function(args) {
+                  if(nspMap["niciraNvp"] == null) {
+                    $.ajax({
+                      url: createURL("addNetworkServiceProvider&name=NiciraNvp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
+                      dataType: "json",
+                      async: true,
+                      success: function(json) {
+                        var jobId = json.addnetworkserviceproviderresponse.jobid;                        
+                        var addNiciraNvpProviderIntervalID = setInterval(function() {  
+                          $.ajax({
+                            url: createURL("queryAsyncJobResult&jobId="+jobId),
+                            dataType: "json",
+                            success: function(json) {
+                              var result = json.queryasyncjobresultresponse;
+                              if (result.jobstatus == 0) {
+                                return; //Job has not completed
+                              }
+                              else {
+                                clearInterval(addNiciraNvpProviderIntervalID); 
+                                if (result.jobstatus == 1) {
+                                  nspMap["niciraNvp"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
+                                  addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
+                                }
+                                else if (result.jobstatus == 2) {
+                                  alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + _s(result.jobresult.errortext));
+                                }
+                              }
+                            },
+                            error: function(XMLHttpResponse) {
+                              var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
+                              alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + errorMsg);
+                            }
+                          });
+                        }, 3000);       
+                      }
+                    });
+                  }
+                  else {
+                      addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
+                  }
+                },
+                messages: {
+                  notification: function(args) {
+                    return 'label.add.NiciraNvp.device';
+                  }
+                },
+                notification: {
+                  poll: pollAsyncJobResult
+                }
+              },
+              enable: {
+                label: 'label.enable.provider',
+                action: function(args) {
+                  $.ajax({
+                    url: createURL("updateNetworkServiceProvider&id=" + nspMap["niciraNvp"].id + "&state=Enabled"),
+                    dataType: "json",
+                    success: function(json) {
+                      var jid = json.updatenetworkserviceproviderresponse.jobid;
+                      args.response.success(
+                        {_custom:
+                          {
+                            jobId: jid,
+                                                        getUpdatedItem: function(json) {
+                                                            $(window).trigger('cloudStack.fullRefresh');
+                                                        }
+                          }
+                        }
+                      );
+                    }
+                  });
+                },
+                messages: {
+                                  confirm: function(args) {
+                                      return 'message.confirm.enable.provider';
+                                    },
+                  notification: function() {
+                                      return 'label.enable.provider';
+                                  }
+                },
+                notification: { poll: pollAsyncJobResult }
+              },
+              disable: {
+                label: 'label.disable.provider',
+                action: function(args) {
+                  $.ajax({
+                    url: createURL("updateNetworkServiceProvider&id=" + nspMap["niciraNvp"].id + "&state=Disabled"),
+                    dataType: "json",
+                    success: function(json) {
+                      var jid = json.updatenetworkserviceproviderresponse.jobid;
+                      args.response.success(
+                        {_custom:
+                          {
+                            jobId: jid,
+                                   getUpdatedItem: function(json) {
+                                     $(window).trigger('cloudStack.fullRefresh');
+                                   }
+                          }
+                        }
+                      );
+                    }
+                  });
+                },
+                messages: {
+                                  confirm: function(args) {
+                                      return 'message.confirm.disable.provider';
+                                    },
+                  notification: function() {
+                                      return 'label.disable.provider';
+                                    }
+                },
+                notification: { poll: pollAsyncJobResult }
+              },
+              destroy: {
+                label: 'label.shutdown.provider',
+                action: function(args) {
+                  $.ajax({
+                    url: createURL("deleteNetworkServiceProvider&id=" + nspMap["niciraNvp"].id),
+                    dataType: "json",
+                    success: function(json) {
+                      var jid = json.deletenetworkserviceproviderresponse.jobid;
+                      args.response.success(
+                        {_custom:
+                         {
+                           jobId: jid
+                         }
+                        }
+                      );
+
+                      $(window).trigger('cloudStack.fullRefresh');
+                    }
+                  });
+                },
+                messages: {
+                                  confirm: function(args) {
+                                      return 'message.confirm.shutdown.provider';
+                                    },
+                  notification: function(args) {
+                                      return 'label.shutdown.provider';
+                                    }
+                },
+                notification: { poll: pollAsyncJobResult }
+              }
+            }
+          }          
         }
       }
     },
@@ -6312,7 +6518,171 @@
           }
         }
       },
-
+      // FIXME convert to nicira detailview
+      // NiciraNvp devices listView
+      niciraNvpDevices: {
+        id: 'niciraNvpDevices',
+        title: 'label.devices',
+        listView: {
+          id: 'niciraNvpDevices',
+          fields: {
+            hostname: { label: 'label.nicira.controller.address' },
+            transportzoneuuid: { label: 'label.nicira.transportzoneuuid'},
+            l3gatewayserviceuuid: { label: 'label.nicira.l3gatewayserviceuuid' }
+          },
+          actions: {
+        	  add: {
+                label: 'label.add.NiciraNvp.device',
+                createForm: {
+                  title: 'label.add.NiciraNvp.device',
+                  preFilter: function(args) {  },   // TODO What is this?
+                  fields: {
+                    host: {
+                      label: 'label.ip.address'
+                    },
+                    username: {
+                      label: 'label.username'
+                    },
+                    password: {
+                      label: 'label.password',
+                      isPassword: true
+                    },
+                    numretries: {
+                      label: 'label.numretries',
+                      defaultValue: '2'
+                    },
+                    transportzoneuuid: {
+                      label: 'label.nicira.transportzoneuuid'
+                    },
+                    l3gatewayserviceuuid: {
+                      label: 'label.nicira.l3gatewayserviceuuid'
+                    }
+                  }
+                },
+                action: function(args) {
+                  if(nspMap["niciraNvp"] == null) {
+                    $.ajax({
+                      url: createURL("addNetworkServiceProvider&name=NiciraNvp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
+                      dataType: "json",
+                      async: true,
+                      success: function(json) {
+                        var jobId = json.addnetworkserviceproviderresponse.jobid;                        
+                        var addNiciraNvpProviderIntervalID = setInterval(function() {  
+                          $.ajax({
+                            url: createURL("queryAsyncJobResult&jobId="+jobId),
+                            dataType: "json",
+                            success: function(json) {
+                              var result = json.queryasyncjobresultresponse;
+                              if (result.jobstatus == 0) {
+                                return; // Job has not completed
+                              }
+                              else {
+                                clearInterval(addNiciraNvpProviderIntervalID); 
+                                if (result.jobstatus == 1) {
+                                  nspMap["niciraNvp"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
+                                  addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
+                                }
+                                else if (result.jobstatus == 2) {
+                                  alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + _s(result.jobresult.errortext));
+                                }
+                              }
+                            },
+                            error: function(XMLHttpResponse) {
+                              var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
+                              alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + errorMsg);
+                            }
+                          });
+                        }, 3000);       
+                      }
+                    });
+                  }
+                  else {
+                      addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
+                  }
+                },
+        	  
+              messages: {
+                notification: function(args) {
+                  return 'Added new Nicira Nvp Controller';
+                }
+              },
+              notification: {
+                poll: pollAsyncJobResult
+              }
+            }
+          },
+          dataProvider: function(args) {
+            $.ajax({
+              url: createURL("listNiciraNvpDevices&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
+              data: { page: args.page, pageSize: pageSize },
+              dataType: "json",
+              async: false,
+              success: function(json) {
+                var items = json.listniciranvpdeviceresponse.niciranvpdevice;
+                args.response.success({data: items});
+              }
+            });
+          },   
+          detailView: {
+            name: 'Nicira Nvp details',
+            actions: {
+              'remove': {
+                label: 'label.delete.NiciaNvp',
+                messages: {
+                  confirm: function(args) {
+                    return 'message.confirm.delete.NiciraNvp';
+                  },
+                  notification: function(args) {
+                    return 'label.delete.NiciraNvp';
+                  }
+                },
+                action: function(args) {
+                  $.ajax({
+                    url: createURL("deleteNiciraNvpDevice&nvpdeviceid=" + args.context.niciraNvpDevices[0].nvpdeviceid),
+                    dataType: "json",
+                    async: true,
+                    success: function(json) {
+                      var jid = json.deleteniciranvpdeviceresponse.jobid;
+                      args.response.success(
+                        {_custom:
+                         {jobId: jid}
+                        }
+                      );
+                    }
+                  });
+                },
+                notification: {
+                  poll: pollAsyncJobResult
+                }
+              }
+            },
+            tabs: {
+              details: {
+                title: 'label.details',
+                fields: [
+                  {
+                    nvpdeviceid: { label: 'label.id' },
+                    hostname: { label: 'label.ip.address' },
+                    transportzoneuuid: { label: 'label.nicira.transportzoneuuid' },
+                    l3gatewayserviceuuid: { label: 'label.nicira.l3gatewayserviceuuid' }
+                  }
+                ],
+                dataProvider: function(args) {                                
+                                    $.ajax({
+                                        url: createURL("listNiciraNvpDevices&nvpdeviceid=" + args.context.niciraNvpDevices[0].nvpdeviceid),                                       
+                                        dataType: "json",
+                                        async: true,
+                                        success: function(json) {                                         
+                                            var item = json.listniciranvpdeviceresponse.niciranvpdevice[0];
+                                            args.response.success({data: item});
+                                        }
+                                    });                                 
+                }
+              }
+            }
+          }
+        }
+      },
       pods: {
         title: 'label.pods',
         listView: {
@@ -9327,6 +9697,40 @@
     });
   }
 
+  function addNiciraNvpDevice(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
+    var array1 = [];
+    array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
+    array1.push("&username=" + todb(args.data.username));
+    array1.push("&password=" + todb(args.data.password));
+    array1.push("&hostname=" + todb(args.data.host));
+    array1.push("&transportzoneuuid=" + todb(args.data.transportzoneuuid));
+
+    var l3GatewayServiceUuid = args.data.l3gatewayserviceuuid;
+    if(l3GatewayServiceUuid != null && l3GatewayServiceUuid.length > 0) {
+        array1.push("&l3gatewayserviceuuid=" + todb(args.data.l3gatewayserviceuuid));
+    }
+    
+    $.ajax({
+      url: createURL(apiCmd + array1.join("")),
+      dataType: "json",
+      success: function(json) {
+        var jid = json[apiCmdRes].jobid;
+        args.response.success(
+          {_custom:
+           {jobId: jid,
+            getUpdatedItem: function(json) {
+              var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
+
+              return item;
+            }
+           }
+          }
+        );
+      }
+    });
+  }
+
+
 	var afterCreateZonePhysicalNetworkTrafficTypes = function(args, newZoneObj, newPhysicalnetwork) {
 		$.ajax({
 			url: createURL("updatePhysicalNetwork&state=Enabled&id=" + newPhysicalnetwork.id),
@@ -9924,6 +10328,9 @@
 							case "SecurityGroupProvider":
 								nspMap["securityGroups"] = items[i];
 								break;
+                            case "NiciraNvp":
+                                nspMap["niciraNvp"] = items[i];
+                                break;
 						}
 					}
 				}
@@ -9940,7 +10347,12 @@
 				id: 'virtualRouter',
 				name: 'Virtual Router',
 				state: nspMap.virtualRouter ? nspMap.virtualRouter.state : 'Disabled'
-			}
+			},
+            {
+                id: 'niciraNvp',
+                name: 'Nicira Nvp',
+                state: nspMap.niciraNvp ? nspMap.niciraNvp.state : 'Disabled'
+            }
 		];
 
 		if(selectedZoneObj.networktype == "Basic") {