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 2014/02/18 09:53:07 UTC

[4/4] git commit: updated refs/heads/master to 510972a

Nvp and rest refactoring and more tests

Signed-off-by: Hugo Trippaers <ht...@schubergphilis.com>


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

Branch: refs/heads/master
Commit: 510972abde3b5435ed2a4d02fc4f59a1f6dabefe
Parents: dda47db
Author: Antonio Fornie <af...@schubergphilis.com>
Authored: Wed Feb 5 10:01:06 2014 +0100
Committer: Hugo Trippaers <ht...@schubergphilis.com>
Committed: Tue Feb 18 09:51:54 2014 +0100

----------------------------------------------------------------------
 .../network/nicira/AccessConfiguration.java     |  90 +--
 .../src/com/cloud/network/nicira/Acl.java       |   1 -
 .../cloud/network/nicira/BaseNiciraEntity.java  |  85 +++
 .../network/nicira/BaseNiciraNamedEntity.java   |  44 ++
 .../com/cloud/network/nicira/LogicalRouter.java |  71 ++
 .../network/nicira/LogicalRouterConfig.java     |  65 --
 .../cloud/network/nicira/LogicalRouterPort.java |  41 +-
 .../com/cloud/network/nicira/LogicalSwitch.java |  68 +-
 .../cloud/network/nicira/LogicalSwitchPort.java |  50 +-
 .../com/cloud/network/nicira/NiciraNvpApi.java  | 745 +++++++------------
 ...SingleDefaultRouteImplicitRoutingConfig.java |  40 +
 .../SingleDefaultRouteImplictRoutingConfig.java |  40 -
 .../com/cloud/network/nicira/VifAttachment.java |  35 +-
 .../network/resource/NiciraNvpResource.java     |  20 +-
 .../network/element/NiciraNvpElementTest.java   |  42 +-
 .../guru/NiciraNvpGuestNetworkGuruTest.java     | 154 ++--
 .../com/cloud/network/nicira/NatRuleTest.java   |  12 +-
 .../cloud/network/nicira/NiciraNvpApiIT.java    | 200 ++++-
 .../cloud/network/nicira/NiciraNvpApiTest.java  | 650 ++++++----------
 .../com/cloud/network/nicira/NiciraTagTest.java |   8 +-
 .../network/resource/NiciraNvpResourceTest.java | 258 ++++---
 pom.xml                                         |   6 +
 utils/pom.xml                                   |  27 +
 .../BasicEncodedRESTValidationStrategy.java     |  47 ++
 .../utils/rest/CloudstackRESTException.java     |  36 +
 .../cloud/utils/rest/RESTServiceConnector.java  | 377 ++++++++++
 .../utils/rest/RESTValidationStrategy.java      | 146 ++++
 .../utils/rest/RESTServiceConnectorTest.java    | 373 ++++++++++
 28 files changed, 2277 insertions(+), 1454 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/AccessConfiguration.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/AccessConfiguration.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/AccessConfiguration.java
index 487f14b..b5291dc 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/AccessConfiguration.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/AccessConfiguration.java
@@ -19,32 +19,12 @@
 
 package com.cloud.network.nicira;
 
-import java.io.Serializable;
 import java.util.List;
 
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.commons.lang.builder.ReflectionToStringBuilder;
-import org.apache.commons.lang.builder.ToStringStyle;
+public abstract class AccessConfiguration<T extends AccessRule> extends BaseNiciraNamedEntity {
 
-@SuppressWarnings("serial")
-public abstract class AccessConfiguration<T extends AccessRule> implements Serializable {
-
-    protected String displayName;
     protected List<T> logicalPortEgressRules;
     protected List<T> logicalPortIngressRules;
-    protected List<NiciraNvpTag> tags;
-    protected String uuid;
-    protected String href;
-    protected String schema;
-
-    public String getDisplayName() {
-        return displayName;
-    }
-
-    public void setDisplayName(final String displayName) {
-        this.displayName = displayName;
-    }
 
     public List<T> getLogicalPortEgressRules() {
         return logicalPortEgressRules;
@@ -61,72 +41,4 @@ public abstract class AccessConfiguration<T extends AccessRule> implements Seria
     public void setLogicalPortIngressRules(final List<T> logicalPortIngressRules) {
         this.logicalPortIngressRules = logicalPortIngressRules;
     }
-
-    public String getUuid() {
-        return uuid;
-    }
-
-    public void setUuid(final String uuid) {
-        this.uuid = uuid;
-    }
-
-    public String getHref() {
-        return href;
-    }
-
-    public void setHref(final String href) {
-        this.href = href;
-    }
-
-    public String getSchema() {
-        return schema;
-    }
-
-    public void setSchema(final String schema) {
-        this.schema = schema;
-    }
-
-    public List<NiciraNvpTag> getTags() {
-        return tags;
-    }
-
-    public void setTags(final List<NiciraNvpTag> tags) {
-        this.tags = tags;
-    }
-
-    @Override
-    public String toString() {
-        return ReflectionToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE, false);
-    }
-
-    @Override
-    public int hashCode() {
-        return new HashCodeBuilder(17, 31)
-            .append(displayName).append(logicalPortEgressRules)
-            .append(logicalPortIngressRules).append(tags)
-            .append(uuid).append(href).append(schema)
-            .toHashCode();
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public boolean equals(final Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        if (obj == this) {
-            return true;
-        }
-        if (!(this.getClass().isInstance(obj))) {
-            return false;
-        }
-        final AccessConfiguration<? extends AccessRule> another =
-                (AccessConfiguration<? extends AccessRule>) obj;
-        return new EqualsBuilder()
-                .append(displayName, another.displayName)
-                .append(uuid, another.uuid)
-                .append(href, another.href)
-                .append(schema, another.schema)
-                .isEquals();
-    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/Acl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/Acl.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/Acl.java
index 976177f..870124e 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/Acl.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/Acl.java
@@ -19,6 +19,5 @@
 
 package com.cloud.network.nicira;
 
-@SuppressWarnings("serial")
 public class Acl extends AccessConfiguration<AclRule> {
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/BaseNiciraEntity.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/BaseNiciraEntity.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/BaseNiciraEntity.java
new file mode 100644
index 0000000..afcd233
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/BaseNiciraEntity.java
@@ -0,0 +1,85 @@
+//
+// 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.
+//
+
+package com.cloud.network.nicira;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+
+public abstract class BaseNiciraEntity implements Serializable {
+    protected String href;
+    protected String schema;
+    protected String uuid;
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(final String uuid) {
+        this.uuid = uuid;
+    }
+
+    public String getHref() {
+        return href;
+    }
+
+    public void setHref(final String href) {
+        this.href = href;
+    }
+
+    public String getSchema() {
+        return schema;
+    }
+
+    public void setSchema(final String schema) {
+        this.schema = schema;
+    }
+
+    @Override
+    public String toString() {
+        return ReflectionToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE, false);
+    }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder(17, 31)
+                .append(this.getClass())
+                .append(uuid)
+                .toHashCode();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (obj == this) {
+            return true;
+        }
+        if (!(this.getClass().isInstance(obj))) {
+            return false;
+        }
+        final BaseNiciraEntity another = (BaseNiciraEntity) obj;
+        return new EqualsBuilder().append(uuid, another.uuid).isEquals();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/BaseNiciraNamedEntity.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/BaseNiciraNamedEntity.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/BaseNiciraNamedEntity.java
new file mode 100644
index 0000000..0e21ddb
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/BaseNiciraNamedEntity.java
@@ -0,0 +1,44 @@
+//
+// 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.
+//
+
+package com.cloud.network.nicira;
+
+import java.util.List;
+
+public abstract class BaseNiciraNamedEntity extends BaseNiciraEntity {
+
+    protected String displayName;
+    protected List<NiciraNvpTag> tags;
+
+    public String getDisplayName() {
+        return displayName;
+    }
+
+    public void setDisplayName(final String displayName) {
+        this.displayName = displayName;
+    }
+
+    public List<NiciraNvpTag> getTags() {
+        return tags;
+    }
+
+    public void setTags(final List<NiciraNvpTag> tags) {
+        this.tags = tags;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouter.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouter.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouter.java
new file mode 100644
index 0000000..edc9351
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouter.java
@@ -0,0 +1,71 @@
+//
+// 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.
+//
+
+package com.cloud.network.nicira;
+
+
+/**
+ *
+ */
+public class LogicalRouter extends BaseNiciraNamedEntity {
+    public static final String REPLICATION_MODE_SERVICE = "service";
+    public static final String REPLICATION_MODE_SOURCE = "source";
+
+    private final String type = "LogicalRouterConfig";
+    private RoutingConfig routingConfig;
+    private boolean distributed;
+    private boolean natSynchronizationEnabled;
+    private String replicationMode;
+
+    public String getType() {
+        return type;
+    }
+
+    public RoutingConfig getRoutingConfig() {
+        return routingConfig;
+    }
+
+    public void setRoutingConfig(final RoutingConfig routingConfig) {
+        this.routingConfig = routingConfig;
+    }
+
+    public boolean isDistributed() {
+        return distributed;
+    }
+
+    public void setDistributed(final boolean distributed) {
+        this.distributed = distributed;
+    }
+
+    public boolean isNatSynchronizationEnabled() {
+        return natSynchronizationEnabled;
+    }
+
+    public void setNatSynchronizationEnabled(final boolean natSynchronizationEnabled) {
+        this.natSynchronizationEnabled = natSynchronizationEnabled;
+    }
+
+    public String getReplicationMode() {
+        return replicationMode;
+    }
+
+    public void setReplicationMode(final String replicationMode) {
+        this.replicationMode = replicationMode;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouterConfig.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouterConfig.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouterConfig.java
deleted file mode 100644
index b6eaa8f..0000000
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouterConfig.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-// 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.
-//
-
-package com.cloud.network.nicira;
-
-import java.util.List;
-
-/**
- *
- */
-public class LogicalRouterConfig {
-    private String displayName;
-    private RoutingConfig routingConfig;
-    private final String type = "LogicalRouterConfig";
-    private String uuid;
-    private List<NiciraNvpTag> tags;
-
-    public RoutingConfig getRoutingConfig() {
-        return routingConfig;
-    }
-
-    public void setRoutingConfig(RoutingConfig routingConfig) {
-        this.routingConfig = routingConfig;
-    }
-
-    public String getDisplayName() {
-        return displayName;
-    }
-
-    public void setDisplayName(String displayName) {
-        this.displayName = displayName;
-    }
-
-    public String getUuid() {
-        return uuid;
-    }
-
-    public void setUuid(String uuid) {
-        this.uuid = uuid;
-    }
-
-    public List<NiciraNvpTag> getTags() {
-        return tags;
-    }
-
-    public void setTags(List<NiciraNvpTag> tags) {
-        this.tags = tags;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouterPort.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouterPort.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouterPort.java
index 8ffe054..d9ee09a 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouterPort.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalRouterPort.java
@@ -21,24 +21,18 @@ package com.cloud.network.nicira;
 
 import java.util.List;
 
-/**
- *
- */
-public class LogicalRouterPort {
-    private String displayName;
-    private List<NiciraNvpTag> tags;
+public class LogicalRouterPort extends BaseNiciraNamedEntity {
     private Integer portno;
     private boolean adminStatusEnabled;
     private List<String> ipAddresses;
     private String macAddress;
     private final String type = "LogicalRouterPortConfig";
-    private String uuid;
 
     public int getPortno() {
         return portno;
     }
 
-    public void setPortno(int portno) {
+    public void setPortno(final int portno) {
         this.portno = portno;
     }
 
@@ -46,7 +40,7 @@ public class LogicalRouterPort {
         return adminStatusEnabled;
     }
 
-    public void setAdminStatusEnabled(boolean adminStatusEnabled) {
+    public void setAdminStatusEnabled(final boolean adminStatusEnabled) {
         this.adminStatusEnabled = adminStatusEnabled;
     }
 
@@ -54,7 +48,7 @@ public class LogicalRouterPort {
         return ipAddresses;
     }
 
-    public void setIpAddresses(List<String> ipAddresses) {
+    public void setIpAddresses(final List<String> ipAddresses) {
         this.ipAddresses = ipAddresses;
     }
 
@@ -62,32 +56,7 @@ public class LogicalRouterPort {
         return macAddress;
     }
 
-    public void setMacAddress(String macAddress) {
+    public void setMacAddress(final String macAddress) {
         this.macAddress = macAddress;
     }
-
-    public String getDisplayName() {
-        return displayName;
-    }
-
-    public void setDisplayName(String displayName) {
-        this.displayName = displayName;
-    }
-
-    public List<NiciraNvpTag> getTags() {
-        return tags;
-    }
-
-    public void setTags(List<NiciraNvpTag> tags) {
-        this.tags = tags;
-    }
-
-    public String getUuid() {
-        return uuid;
-    }
-
-    public void setUuid(String uuid) {
-        this.uuid = uuid;
-    }
-
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalSwitch.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalSwitch.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalSwitch.java
index 2379354..b527d94 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalSwitch.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalSwitch.java
@@ -21,29 +21,20 @@ package com.cloud.network.nicira;
 
 import java.util.List;
 
-public class LogicalSwitch {
-    private String displayName;
+public class LogicalSwitch extends BaseNiciraNamedEntity {
+    public static final String REPLICATION_MODE_SERVICE = "service";
+    public static final String REPLICATION_MODE_SOURCE = "source";
+
+    private final String type = "LogicalSwitchConfig";
     private boolean portIsolationEnabled;
-    private List<NiciraNvpTag> tags;
     private List<TransportZoneBinding> transportZones;
-    private String type;
-    private String uuid;
-    private String href;
-    private String schema;
-
-    public String getDisplayName() {
-        return displayName;
-    }
-
-    public void setDisplayName(String displayName) {
-        this.displayName = displayName;
-    }
+    private String replicationMode;
 
     public boolean isPortIsolationEnabled() {
         return portIsolationEnabled;
     }
 
-    public void setPortIsolationEnabled(boolean portIsolationEnabled) {
+    public void setPortIsolationEnabled(final boolean portIsolationEnabled) {
         this.portIsolationEnabled = portIsolationEnabled;
     }
 
@@ -51,48 +42,19 @@ public class LogicalSwitch {
         return type;
     }
 
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getUuid() {
-        return uuid;
-    }
-
-    public void setUuid(String uuid) {
-        this.uuid = uuid;
-    }
-
-    public String getHref() {
-        return href;
-    }
-
-    public void setHref(String href) {
-        this.href = href;
-    }
-
-    public String getSchema() {
-        return schema;
-    }
-
-    public void setSchema(String schema) {
-        this.schema = schema;
-    }
-
-    public List<NiciraNvpTag> getTags() {
-        return tags;
-    }
-
-    public void setTags(List<NiciraNvpTag> tags) {
-        this.tags = tags;
-    }
-
     public List<TransportZoneBinding> getTransportZones() {
         return transportZones;
     }
 
-    public void setTransportZones(List<TransportZoneBinding> transportZones) {
+    public void setTransportZones(final List<TransportZoneBinding> transportZones) {
         this.transportZones = transportZones;
     }
 
+    public String getReplicationMode() {
+        return replicationMode;
+    }
+
+    public void setReplicationMode(final String replicationMode) {
+        this.replicationMode = replicationMode;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalSwitchPort.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalSwitchPort.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalSwitchPort.java
index 3565fbe..5e07423 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalSwitchPort.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/LogicalSwitchPort.java
@@ -21,16 +21,13 @@ package com.cloud.network.nicira;
 
 import java.util.List;
 
-public class LogicalSwitchPort {
-    private String displayName;
-    private List<NiciraNvpTag> tags;
+public class LogicalSwitchPort extends BaseNiciraNamedEntity {
     private Integer portno;
     private boolean adminStatusEnabled;
     private String queueUuid;
     private List<String> securityProfiles;
     private List<String> mirrorTargets;
-    private String type;
-    private String uuid;
+    private final String type = "LogicalSwitchPortConfig";
 
     public LogicalSwitchPort() {
         super();
@@ -43,27 +40,11 @@ public class LogicalSwitchPort {
         this.adminStatusEnabled = adminStatusEnabled;
     }
 
-    public String getDisplayName() {
-        return displayName;
-    }
-
-    public void setDisplayName(String displayName) {
-        this.displayName = displayName;
-    }
-
-    public List<NiciraNvpTag> getTags() {
-        return tags;
-    }
-
-    public void setTags(List<NiciraNvpTag> tags) {
-        this.tags = tags;
-    }
-
     public Integer getPortno() {
         return portno;
     }
 
-    public void setPortno(Integer portno) {
+    public void setPortno(final Integer portno) {
         this.portno = portno;
     }
 
@@ -71,7 +52,7 @@ public class LogicalSwitchPort {
         return adminStatusEnabled;
     }
 
-    public void setAdminStatusEnabled(boolean adminStatusEnabled) {
+    public void setAdminStatusEnabled(final boolean adminStatusEnabled) {
         this.adminStatusEnabled = adminStatusEnabled;
     }
 
@@ -79,7 +60,7 @@ public class LogicalSwitchPort {
         return queueUuid;
     }
 
-    public void setQueueUuid(String queueUuid) {
+    public void setQueueUuid(final String queueUuid) {
         this.queueUuid = queueUuid;
     }
 
@@ -87,7 +68,7 @@ public class LogicalSwitchPort {
         return securityProfiles;
     }
 
-    public void setSecurityProfiles(List<String> securityProfiles) {
+    public void setSecurityProfiles(final List<String> securityProfiles) {
         this.securityProfiles = securityProfiles;
     }
 
@@ -95,24 +76,7 @@ public class LogicalSwitchPort {
         return mirrorTargets;
     }
 
-    public void setMirrorTargets(List<String> mirrorTargets) {
+    public void setMirrorTargets(final List<String> mirrorTargets) {
         this.mirrorTargets = mirrorTargets;
     }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getUuid() {
-        return uuid;
-    }
-
-    public void setUuid(String uuid) {
-        this.uuid = uuid;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpApi.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpApi.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpApi.java
index 83d0075..3861d63 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpApi.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpApi.java
@@ -18,55 +18,14 @@
 //
 
 package com.cloud.network.nicira;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.lang.reflect.Type;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.MalformedURLException;
-import java.net.Socket;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.security.KeyManagementException;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.X509Certificate;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.UUID;
 
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSocketFactory;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-
-import org.apache.commons.httpclient.ConnectTimeoutException;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpMethodBase;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
-import org.apache.commons.httpclient.NameValuePair;
-import org.apache.commons.httpclient.cookie.CookiePolicy;
-import org.apache.commons.httpclient.methods.DeleteMethod;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.PutMethod;
-import org.apache.commons.httpclient.methods.StringRequestEntity;
-import org.apache.commons.httpclient.params.HttpConnectionParams;
-import org.apache.commons.httpclient.protocol.Protocol;
-import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
-import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
-import org.apache.log4j.Logger;
-
-import com.google.gson.FieldNamingPolicy;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
 import com.google.gson.JsonDeserializationContext;
 import com.google.gson.JsonDeserializer;
 import com.google.gson.JsonElement;
@@ -74,33 +33,24 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonParseException;
 import com.google.gson.reflect.TypeToken;
 
+import com.cloud.utils.rest.CloudstackRESTException;
+import com.cloud.utils.rest.RESTServiceConnector;
+import com.cloud.utils.rest.RESTValidationStrategy;
+
 @SuppressWarnings("rawtypes")
 public class NiciraNvpApi {
     protected static final String GET_METHOD_TYPE = "get";
     protected static final String DELETE_METHOD_TYPE = "delete";
     protected static final String PUT_METHOD_TYPE = "put";
     protected static final String POST_METHOD_TYPE = "post";
-    private static final String TEXT_HTML_CONTENT_TYPE = "text/html";
-    private static final String JSON_CONTENT_TYPE = "application/json";
-    private static final String CONTENT_TYPE = "Content-Type";
-    private static final int BODY_RESP_MAX_LEN = 1024;
+
     protected static final String SEC_PROFILE_URI_PREFIX = "/ws.v1/security-profile";
     protected static final String ACL_URI_PREFIX = "/ws.v1/acl";
     private static final String SWITCH_URI_PREFIX = "/ws.v1/lswitch";
     private static final String ROUTER_URI_PREFIX = "/ws.v1/lrouter";
-    private static final int HTTPS_PORT = 443;
-    private static final Logger s_logger = Logger.getLogger(NiciraNvpApi.class);
-    private final static String protocol = "https";
-    private final static MultiThreadedHttpConnectionManager s_httpClientManager = new MultiThreadedHttpConnectionManager();
-
-    private String host;
-    private String adminuser;
-    private String adminpass;
-
-    private final HttpClient client;
-    private String nvpVersion;
+    private static final String LOGIN_URL = "/ws.v1/login";
 
-    private final Gson gson;
+    protected RESTServiceConnector restConnector;
 
     protected final static Map<Class, String> prefixMap;
 
@@ -112,115 +62,174 @@ public class NiciraNvpApi {
         prefixMap = new HashMap<Class, String>();
         prefixMap.put(SecurityProfile.class, SEC_PROFILE_URI_PREFIX);
         prefixMap.put(Acl.class, ACL_URI_PREFIX);
+        prefixMap.put(LogicalSwitch.class, SWITCH_URI_PREFIX);
+        prefixMap.put(LogicalRouter.class, ROUTER_URI_PREFIX);
 
         listTypeMap = new HashMap<Class, Type>();
         listTypeMap.put(SecurityProfile.class, new TypeToken<NiciraNvpList<SecurityProfile>>() {
         }.getType());
         listTypeMap.put(Acl.class, new TypeToken<NiciraNvpList<Acl>>() {
         }.getType());
+        listTypeMap.put(LogicalSwitch.class, new TypeToken<NiciraNvpList<LogicalSwitch>>() {
+        }.getType());
+        listTypeMap.put(LogicalRouter.class, new TypeToken<NiciraNvpList<LogicalRouter>>() {
+        }.getType());
 
         defaultListParams = new HashMap<String, String>();
         defaultListParams.put("fields", "*");
     }
 
-    /* This factory method is protected so we can extend this
-     * in the unittests.
-     */
-    protected HttpClient createHttpClient() {
-        return new HttpClient(s_httpClientManager);
+    public NiciraNvpApi() {
+        final List<Class<?>> classList = new ArrayList<Class<?>>();
+        classList.add(NatRule.class);
+        classList.add(RoutingConfig.class);
+        final List<JsonDeserializer<?>> deserializerList = new ArrayList<JsonDeserializer<?>>();
+        deserializerList.add(new NatRuleAdapter());
+        deserializerList.add(new RoutingConfigAdapter());
+
+        restConnector = new RESTServiceConnector(new RESTValidationStrategy(LOGIN_URL), classList, deserializerList);
     }
 
-    protected HttpMethod createMethod(final String type, final String uri) throws NiciraNvpApiException {
-        String url;
-        try {
-            url = new URL(protocol, host, uri).toString();
-        } catch (final MalformedURLException e) {
-            s_logger.error("Unable to build Nicira API URL", e);
-            throw new NiciraNvpApiException("Unable to build Nicira API URL", e);
-        }
+    public NiciraNvpApi(final String address, final String username, final String password) {
+        this();
+        restConnector.setControllerAddress(address);
+        restConnector.setAdminCredentials(username, password);
+    }
 
-        if (POST_METHOD_TYPE.equalsIgnoreCase(type)) {
-            return new PostMethod(url);
-        } else if (GET_METHOD_TYPE.equalsIgnoreCase(type)) {
-            return new GetMethod(url);
-        } else if (DELETE_METHOD_TYPE.equalsIgnoreCase(type)) {
-            return new DeleteMethod(url);
-        } else if (PUT_METHOD_TYPE.equalsIgnoreCase(type)) {
-            return new PutMethod(url);
-        } else {
-            throw new NiciraNvpApiException("Requesting unknown method type");
-        }
+    public void setControllerAddress(final String address) {
+        restConnector.setControllerAddress(address);
     }
 
-    public NiciraNvpApi() {
-        client = createHttpClient();
-        client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
+    public void setAdminCredentials(final String username, final String password) {
+        restConnector.setAdminCredentials(username, password);
+    }
+
+    /**
+     * POST
+     *
+     * @param entity
+     * @return
+     * @throws NiciraNvpApiException
+     */
+    protected <T> T create(final T entity) throws NiciraNvpApiException {
+        final String uri = prefixMap.get(entity.getClass());
+        return createWithUri(entity, uri);
+    }
 
+    /**
+     * POST
+     *
+     * @param entity
+     * @return
+     * @throws NiciraNvpApiException
+     */
+    protected <T> T createWithUri(final T entity, final String uri) throws NiciraNvpApiException {
+        T createdEntity;
         try {
-            // Cast to ProtocolSocketFactory to avoid the deprecated constructor with the SecureProtocolSocketFactory parameter
-            Protocol.registerProtocol("https", new Protocol("https", (ProtocolSocketFactory)new TrustingProtocolSocketFactory(), HTTPS_PORT));
-        } catch (final IOException e) {
-            s_logger.warn("Failed to register the TrustingProtocolSocketFactory, falling back to default SSLSocketFactory", e);
+            createdEntity = restConnector.executeCreateObject(entity, new TypeToken<T>() {
+            }.getType(), uri, Collections.<String, String> emptyMap());
+        } catch (final CloudstackRESTException e) {
+            throw new NiciraNvpApiException(e);
         }
 
-        gson = new GsonBuilder().registerTypeAdapter(NatRule.class, new NatRuleAdapter()).setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
-    }
-
-    public void setControllerAddress(final String address) {
-        host = address;
+        return createdEntity;
     }
 
-    public void setAdminCredentials(final String username, final String password) {
-        adminuser = username;
-        adminpass = password;
+    /**
+     * GET list of items
+     *
+     * @return
+     * @throws NiciraNvpApiException
+     */
+    protected <T> NiciraNvpList<T> find(final Class<T> clazz) throws NiciraNvpApiException {
+        return find(null, clazz);
     }
 
     /**
-     * Logs into the Nicira API. The cookie is stored in the <code>_authcookie<code> variable.
-     * <p>
-     * The method returns false if the login failed or the connection could not be made.
+     * GET list of items
      *
+     * @param uuid
+     * @return
+     * @throws NiciraNvpApiException
      */
-    protected void login() throws NiciraNvpApiException {
-        String url;
-
-        if (host == null || host.isEmpty() || adminuser == null || adminuser.isEmpty() || adminpass == null || adminpass.isEmpty()) {
-            throw new NiciraNvpApiException("Hostname/credentials are null or empty");
+    public <T> NiciraNvpList<T> find(final String uuid, final Class<T> clazz) throws NiciraNvpApiException {
+        final String uri = prefixMap.get(clazz);
+        Map<String, String> params = defaultListParams;
+        if (uuid != null) {
+            params = new HashMap<String, String>(defaultListParams);
+            params.put("uuid", uuid);
         }
 
+        NiciraNvpList<T> entities;
         try {
-            url = new URL(protocol, host, "/ws.v1/login").toString();
-        } catch (final MalformedURLException e) {
-            s_logger.error("Unable to build Nicira API URL", e);
-            throw new NiciraNvpApiException("Unable to build Nicira API URL", e);
+            entities = restConnector.executeRetrieveObject(listTypeMap.get(clazz), uri, params);
+        } catch (final CloudstackRESTException e) {
+            throw new NiciraNvpApiException(e);
         }
 
-        final PostMethod pm = new PostMethod(url);
-        pm.addParameter("username", adminuser);
-        pm.addParameter("password", adminpass);
+        if (entities == null) {
+            throw new NiciraNvpApiException("Unexpected response from API");
+        }
 
+        return entities;
+    }
+
+    /**
+     * PUT item given a UUID as key and an item object
+     * with the new data
+     *
+     * @param item
+     * @param uuid
+     * @throws NiciraNvpApiException
+     */
+    public <T> void update(final T item, final String uuid)
+                    throws NiciraNvpApiException {
+        final String uri = prefixMap.get(item.getClass()) + "/" + uuid;
+        updateWithUri(item, uri);
+    }
+
+    /**
+     * PUT item given a UUID as key and an item object
+     * with the new data
+     *
+     * @param item
+     * @param uuid
+     * @throws NiciraNvpApiException
+     */
+    public <T> void updateWithUri(final T item, final String uri)
+                    throws NiciraNvpApiException {
         try {
-            client.executeMethod(pm);
-        } catch (final HttpException e) {
-            throw new NiciraNvpApiException("Nicira NVP API login failed ", e);
-        } catch (final IOException e) {
-            throw new NiciraNvpApiException("Nicira NVP API login failed ", e);
-        } finally {
-            pm.releaseConnection();
+            restConnector.executeUpdateObject(item, uri, Collections.<String, String> emptyMap());
+        } catch (final CloudstackRESTException e) {
+            throw new NiciraNvpApiException(e);
         }
+    }
 
-        if (pm.getStatusCode() != HttpStatus.SC_OK) {
-            s_logger.error("Nicira NVP API login failed : " + pm.getStatusText());
-            throw new NiciraNvpApiException("Nicira NVP API login failed " + pm.getStatusText());
-        }
+    /**
+     * DELETE Security Profile given a UUID as key
+     *
+     * @param securityProfileUuid
+     * @throws NiciraNvpApiException
+     */
+    public <T> void delete(final String uuid, final Class<T> clazz)
+            throws NiciraNvpApiException {
+        final String uri = prefixMap.get(clazz) + "/" + uuid;
+        deleteWithUri(uri);
+    }
 
-        // Extract the version for later use
-        if (pm.getResponseHeader("Server") != null) {
-            nvpVersion = pm.getResponseHeader("Server").getValue();
-            s_logger.debug("NVP Controller reports version " + nvpVersion);
+    /**
+     * DELETE Security Profile given a UUID as key
+     *
+     * @param securityProfileUuid
+     * @throws NiciraNvpApiException
+     */
+    public <T> void deleteWithUri(final String uri)
+            throws NiciraNvpApiException {
+        try {
+            restConnector.executeDeleteObject(uri);
+        } catch (final CloudstackRESTException e) {
+            throw new NiciraNvpApiException(e);
         }
-
-        // Success; the cookie required for login is kept in _client
     }
 
     /**
@@ -341,111 +350,68 @@ public class NiciraNvpApi {
         delete(aclUuid, Acl.class);
     }
 
-    /**
-     * POST
-     *
-     * @param entity
-     * @return
-     * @throws NiciraNvpApiException
-     */
-    protected <T> T create(final T entity) throws NiciraNvpApiException {
-        final String uri = prefixMap.get(entity.getClass());
-        final T createdEntity = executeCreateObject(entity, new TypeToken<T>() {
-        }.getType(), uri, Collections.<String, String> emptyMap());
-
-        return createdEntity;
+    public LogicalSwitch createLogicalSwitch(final LogicalSwitch logicalSwitch) throws NiciraNvpApiException {
+        return create(logicalSwitch);
     }
 
     /**
-     * GET list of items
+     * GET list of {@link LogicalSwitch}
      *
      * @return
      * @throws NiciraNvpApiException
      */
-    protected <T> NiciraNvpList<T> find(final Class<T> clazz) throws NiciraNvpApiException {
-        return find(null, clazz);
+    public NiciraNvpList<LogicalSwitch> findLogicalSwitch() throws NiciraNvpApiException {
+        return findLogicalSwitch(null);
     }
 
     /**
-     * GET list of items
+     * GET list of {@link LogicalSwitch} filtered by UUID
      *
      * @param uuid
      * @return
      * @throws NiciraNvpApiException
      */
-    public <T> NiciraNvpList<T> find(final String uuid, final Class<T> clazz) throws NiciraNvpApiException {
-        final String uri = prefixMap.get(clazz);
-        Map<String, String> params = defaultListParams;
-        if (uuid != null) {
-            params = new HashMap<String, String>(defaultListParams);
-            params.put("uuid", uuid);
-        }
-
-        final NiciraNvpList<T> entities = executeRetrieveObject(listTypeMap.get(clazz), uri, params);
-
-        if (entities == null) {
-            throw new NiciraNvpApiException("Unexpected response from API");
-        }
-
-        return entities;
+    public NiciraNvpList<LogicalSwitch> findLogicalSwitch(final String uuid) throws NiciraNvpApiException {
+        return find(uuid, LogicalSwitch.class);
     }
 
     /**
-     * PUT item given a UUID as key and an item object
+     * PUT {@link LogicalSwitch} given a UUID as key and a {@link LogicalSwitch}
      * with the new data
      *
-     * @param item
-     * @param uuid
+     * @param logicalSwitch
+     * @param logicalSwitchUuid
      * @throws NiciraNvpApiException
      */
-    public <T> void update(final T item,
-            final String uuid)
+    public void updateLogicalSwitch(final LogicalSwitch logicalSwitch,
+            final String logicalSwitchUuid)
                     throws NiciraNvpApiException {
-        final String uri = prefixMap.get(item.getClass()) + "/" + uuid;
-        executeUpdateObject(item, uri, Collections.<String, String> emptyMap());
-    }
-
-    /**
-     * DELETE Security Profile given a UUID as key
-     *
-     * @param securityProfileUuid
-     * @throws NiciraNvpApiException
-     */
-    public <T> void delete(final String uuid, final Class<T> clazz)
-            throws NiciraNvpApiException {
-        final String uri = prefixMap.get(clazz) + "/" + uuid;
-        executeDeleteObject(uri);
-    }
-
-    public LogicalSwitch createLogicalSwitch(final LogicalSwitch logicalSwitch) throws NiciraNvpApiException {
-        final String uri = SWITCH_URI_PREFIX;
-        final LogicalSwitch createdLogicalSwitch = executeCreateObject(logicalSwitch, new TypeToken<LogicalSwitch>() {
-        }.getType(), uri, Collections.<String, String> emptyMap());
-
-        return createdLogicalSwitch;
+        update(logicalSwitch, logicalSwitchUuid);
     }
 
     public void deleteLogicalSwitch(final String uuid) throws NiciraNvpApiException {
-        final String uri = SWITCH_URI_PREFIX + "/" + uuid;
-        executeDeleteObject(uri);
+        delete(uuid, LogicalSwitch.class);
     }
 
     public LogicalSwitchPort createLogicalSwitchPort(final String logicalSwitchUuid, final LogicalSwitchPort logicalSwitchPort) throws NiciraNvpApiException {
         final String uri = SWITCH_URI_PREFIX + "/" + logicalSwitchUuid + "/lport";
-        final LogicalSwitchPort createdLogicalSwitchPort = executeCreateObject(logicalSwitchPort, new TypeToken<LogicalSwitchPort>() {
-        }.getType(), uri, Collections.<String, String> emptyMap());
+        return createWithUri(logicalSwitchPort, uri);
+    }
 
-        return createdLogicalSwitchPort;
+    public void updateLogicalSwitchPort(final String logicalSwitchUuid, final LogicalSwitchPort logicalSwitchPort) throws NiciraNvpApiException {
+        final String uri = SWITCH_URI_PREFIX + "/" + logicalSwitchUuid + "/lport/" + logicalSwitchPort.getUuid();
+        updateWithUri(logicalSwitchPort, uri);
     }
 
-    public void modifyLogicalSwitchPortAttachment(final String logicalSwitchUuid, final String logicalSwitchPortUuid, final Attachment attachment) throws NiciraNvpApiException {
+    public void updateLogicalSwitchPortAttachment(final String logicalSwitchUuid, final String logicalSwitchPortUuid,
+            final Attachment attachment) throws NiciraNvpApiException {
         final String uri = SWITCH_URI_PREFIX + "/" + logicalSwitchUuid + "/lport/" + logicalSwitchPortUuid + "/attachment";
-        executeUpdateObject(attachment, uri, Collections.<String, String> emptyMap());
+        updateWithUri(attachment, uri);
     }
 
     public void deleteLogicalSwitchPort(final String logicalSwitchUuid, final String logicalSwitchPortUuid) throws NiciraNvpApiException {
         final String uri = SWITCH_URI_PREFIX + "/" + logicalSwitchUuid + "/lport/" + logicalSwitchPortUuid;
-        executeDeleteObject(uri);
+        deleteWithUri(uri);
     }
 
     public String findLogicalSwitchPortUuidByVifAttachmentUuid(final String logicalSwitchUuid, final String vifAttachmentUuid) throws NiciraNvpApiException {
@@ -454,8 +420,13 @@ public class NiciraNvpApi {
         params.put("attachment_vif_uuid", vifAttachmentUuid);
         params.put("fields", "uuid");
 
-        final NiciraNvpList<LogicalSwitchPort> lspl = executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalSwitchPort>>() {
-        }.getType(), uri, params);
+        NiciraNvpList<LogicalSwitchPort> lspl;
+        try {
+            lspl = restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalSwitchPort>>() {
+            }.getType(), uri, params);
+        } catch (final CloudstackRESTException e) {
+            throw new NiciraNvpApiException(e);
+        }
 
         if (lspl == null || lspl.getResultCount() != 1) {
             throw new NiciraNvpApiException("Unexpected response from API");
@@ -467,8 +438,13 @@ public class NiciraNvpApi {
 
     public ControlClusterStatus getControlClusterStatus() throws NiciraNvpApiException {
         final String uri = "/ws.v1/control-cluster/status";
-        final ControlClusterStatus ccs = executeRetrieveObject(new TypeToken<ControlClusterStatus>() {
-        }.getType(), uri, null);
+        ControlClusterStatus ccs;
+        try {
+            ccs = restConnector.executeRetrieveObject(new TypeToken<ControlClusterStatus>() {
+            }.getType(), uri, null);
+        } catch (final CloudstackRESTException e) {
+            throw new NiciraNvpApiException(e);
+        }
 
         return ccs;
     }
@@ -479,8 +455,13 @@ public class NiciraNvpApi {
         params.put("uuid", logicalSwitchPortUuid);
         params.put("fields", "uuid");
 
-        final NiciraNvpList<LogicalSwitchPort> lspl = executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalSwitchPort>>() {
-        }.getType(), uri, params);
+        NiciraNvpList<LogicalSwitchPort> lspl;
+        try {
+            lspl = restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalSwitchPort>>() {
+            }.getType(), uri, params);
+        } catch (final CloudstackRESTException e) {
+            throw new NiciraNvpApiException(e);
+        }
 
         if (lspl == null) {
             throw new NiciraNvpApiException("Unexpected response from API");
@@ -489,64 +470,101 @@ public class NiciraNvpApi {
         return lspl;
     }
 
-    public LogicalRouterConfig createLogicalRouter(final LogicalRouterConfig logicalRouterConfig) throws NiciraNvpApiException {
-        final String uri = ROUTER_URI_PREFIX;
+    public NiciraNvpList<LogicalRouterPort> findLogicalRouterPortsByUuid(final String logicalRouterUuid, final String logicalRouterPortUuid) throws NiciraNvpApiException {
+        final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport";
+        final Map<String, String> params = new HashMap<String, String>();
+        params.put("uuid", logicalRouterPortUuid);
+        params.put("fields", "uuid");
+
+        NiciraNvpList<LogicalRouterPort> lrpl;
+        try {
+            lrpl = restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalRouterPort>>() {
+            }.getType(), uri, params);
+        } catch (final CloudstackRESTException e) {
+            throw new NiciraNvpApiException(e);
+        }
+
+        if (lrpl == null) {
+            throw new NiciraNvpApiException("Unexpected response from API");
+        }
+
+        return lrpl;
+    }
+
+    public LogicalRouter createLogicalRouter(final LogicalRouter logicalRouter) throws NiciraNvpApiException {
+        return create(logicalRouter);
+    }
+
+    /**
+     * GET list of {@link LogicalRouter}
+     *
+     * @return
+     * @throws NiciraNvpApiException
+     */
+    public NiciraNvpList<LogicalRouter> findLogicalRouter() throws NiciraNvpApiException {
+        return findLogicalRouter(null);
+    }
+
+    /**
+     * GET list of {@link LogicalRouter} filtered by UUID
+     *
+     * @param uuid
+     * @return
+     * @throws NiciraNvpApiException
+     */
+    public NiciraNvpList<LogicalRouter> findLogicalRouter(final String uuid) throws NiciraNvpApiException {
+        return find(uuid, LogicalRouter.class);
+    }
 
-        final LogicalRouterConfig lrc = executeCreateObject(logicalRouterConfig, new TypeToken<LogicalRouterConfig>() {
-        }.getType(), uri, Collections.<String, String> emptyMap());
+    public LogicalRouter findOneLogicalRouterByUuid(final String logicalRouterUuid) throws NiciraNvpApiException {
+        return findLogicalRouter(logicalRouterUuid).getResults().get(0);
+    }
 
-        return lrc;
+    public void updateLogicalRouter(final LogicalRouter logicalRouter,
+            final String logicalRouterUuid)
+                    throws NiciraNvpApiException {
+        update(logicalRouter, logicalRouterUuid);
     }
 
     public void deleteLogicalRouter(final String logicalRouterUuid) throws NiciraNvpApiException {
         final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid;
-
-        executeDeleteObject(uri);
+        deleteWithUri(uri);
     }
 
     public LogicalRouterPort createLogicalRouterPort(final String logicalRouterUuid, final LogicalRouterPort logicalRouterPort) throws NiciraNvpApiException {
         final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport";
-
-        final LogicalRouterPort lrp = executeCreateObject(logicalRouterPort, new TypeToken<LogicalRouterPort>() {
-        }.getType(), uri, Collections.<String, String> emptyMap());
-        return lrp;
+        return createWithUri(logicalRouterPort, uri);
     }
 
     public void deleteLogicalRouterPort(final String logicalRouterUuid, final String logicalRouterPortUuid) throws NiciraNvpApiException {
         final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport/" + logicalRouterPortUuid;
-
-        executeDeleteObject(uri);
+        deleteWithUri(uri);
     }
 
-    public void modifyLogicalRouterPort(final String logicalRouterUuid, final LogicalRouterPort logicalRouterPort) throws NiciraNvpApiException {
+    public void updateLogicalRouterPort(final String logicalRouterUuid, final LogicalRouterPort logicalRouterPort) throws NiciraNvpApiException {
         final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport/" + logicalRouterPort.getUuid();
-
-        executeUpdateObject(logicalRouterPort, uri, Collections.<String, String> emptyMap());
+        updateWithUri(logicalRouterPort, uri);
     }
 
-    public void modifyLogicalRouterPortAttachment(final String logicalRouterUuid, final String logicalRouterPortUuid, final Attachment attachment)
+    public void updateLogicalRouterPortAttachment(final String logicalRouterUuid, final String logicalRouterPortUuid, final Attachment attachment)
             throws NiciraNvpApiException {
         final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport/" + logicalRouterPortUuid + "/attachment";
-        executeUpdateObject(attachment, uri, Collections.<String, String> emptyMap());
+        updateWithUri(attachment, uri);
     }
 
     public NatRule createLogicalRouterNatRule(final String logicalRouterUuid, final NatRule natRule) throws NiciraNvpApiException {
         final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/nat";
-
-        return executeCreateObject(natRule, new TypeToken<NatRule>() {
-        }.getType(), uri, Collections.<String, String> emptyMap());
+        return createWithUri(natRule, uri);
     }
 
-    public void modifyLogicalRouterNatRule(final String logicalRouterUuid, final NatRule natRule) throws NiciraNvpApiException {
+    public void updateLogicalRouterNatRule(final String logicalRouterUuid, final NatRule natRule) throws NiciraNvpApiException {
         final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/nat/" + natRule.getUuid();
-
-        executeUpdateObject(natRule, uri, Collections.<String, String> emptyMap());
+        updateWithUri(natRule, uri);
     }
 
     public void deleteLogicalRouterNatRule(final String logicalRouterUuid, final UUID natRuleUuid) throws NiciraNvpApiException {
         final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/nat/" + natRuleUuid.toString();
-
-        executeDeleteObject(uri);
+        deleteWithUri(uri);
     }
 
     public NiciraNvpList<LogicalRouterPort> findLogicalRouterPortByGatewayServiceAndVlanId(final String logicalRouterUuid, final String gatewayServiceUuid,
@@ -557,21 +575,12 @@ public class NiciraNvpApi {
         params.put("attachment_vlan", "0");
         params.put("fields", "*");
 
-        return executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalRouterPort>>() {
-        }.getType(), uri, params);
-    }
-
-    public LogicalRouterConfig findOneLogicalRouterByUuid(final String logicalRouterUuid) throws NiciraNvpApiException {
-        final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid;
-
-        return executeRetrieveObject(new TypeToken<LogicalRouterConfig>() {
-        }.getType(), uri, Collections.<String, String> emptyMap());
-    }
-
-    public void updateLogicalRouterPortConfig(final String logicalRouterUuid, final LogicalRouterPort logicalRouterPort) throws NiciraNvpApiException {
-        final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport" + logicalRouterPort.getUuid();
-
-        executeUpdateObject(logicalRouterPort, uri, Collections.<String, String> emptyMap());
+        try {
+            return restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalRouterPort>>() {
+            }.getType(), uri, params);
+        } catch (final CloudstackRESTException e) {
+            throw new NiciraNvpApiException(e);
+        }
     }
 
     public NiciraNvpList<NatRule> findNatRulesByLogicalRouterUuid(final String logicalRouterUuid) throws NiciraNvpApiException {
@@ -579,8 +588,12 @@ public class NiciraNvpApi {
         final Map<String, String> params = new HashMap<String, String>();
         params.put("fields", "*");
 
-        return executeRetrieveObject(new TypeToken<NiciraNvpList<NatRule>>() {
-        }.getType(), uri, params);
+        try {
+            return restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<NatRule>>() {
+            }.getType(), uri, params);
+        } catch (final CloudstackRESTException e) {
+            throw new NiciraNvpApiException(e);
+        }
     }
 
     public NiciraNvpList<LogicalRouterPort> findLogicalRouterPortByGatewayServiceUuid(final String logicalRouterUuid, final String l3GatewayServiceUuid)
@@ -590,231 +603,11 @@ public class NiciraNvpApi {
         params.put("fields", "*");
         params.put("attachment_gwsvc_uuid", l3GatewayServiceUuid);
 
-        return executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalRouterPort>>() {
-        }.getType(), uri, params);
-    }
-
-    protected <T> void executeUpdateObject(final T newObject, final String uri, final Map<String, String> parameters) throws NiciraNvpApiException {
-        if (host == null || host.isEmpty() || adminuser == null || adminuser.isEmpty() || adminpass == null || adminpass.isEmpty()) {
-            throw new NiciraNvpApiException("Hostname/credentials are null or empty");
-        }
-
-        final PutMethod pm = (PutMethod)createMethod(PUT_METHOD_TYPE, uri);
-        pm.setRequestHeader(CONTENT_TYPE, JSON_CONTENT_TYPE);
         try {
-            pm.setRequestEntity(new StringRequestEntity(gson.toJson(newObject), JSON_CONTENT_TYPE, null));
-        } catch (final UnsupportedEncodingException e) {
-            throw new NiciraNvpApiException("Failed to encode json request body", e);
-        }
-
-        executeMethod(pm);
-
-        if (pm.getStatusCode() != HttpStatus.SC_OK) {
-            final String errorMessage = responseToErrorMessage(pm);
-            pm.releaseConnection();
-            s_logger.error("Failed to update object : " + errorMessage);
-            throw new NiciraNvpApiException("Failed to update object : " + errorMessage);
-        }
-        pm.releaseConnection();
-    }
-
-    @SuppressWarnings("unchecked")
-    protected <T> T executeCreateObject(final T newObject, final Type returnObjectType, final String uri, final Map<String, String> parameters)
-            throws NiciraNvpApiException {
-        if (host == null || host.isEmpty() || adminuser == null || adminuser.isEmpty() || adminpass == null || adminpass.isEmpty()) {
-            throw new NiciraNvpApiException("Hostname/credentials are null or empty");
-        }
-
-        final PostMethod pm = (PostMethod)createMethod(POST_METHOD_TYPE, uri);
-        pm.setRequestHeader(CONTENT_TYPE, JSON_CONTENT_TYPE);
-        try {
-            pm.setRequestEntity(new StringRequestEntity(gson.toJson(newObject), JSON_CONTENT_TYPE, null));
-        } catch (final UnsupportedEncodingException e) {
-            throw new NiciraNvpApiException("Failed to encode json request body", e);
-        }
-
-        executeMethod(pm);
-
-        if (pm.getStatusCode() != HttpStatus.SC_CREATED) {
-            final String errorMessage = responseToErrorMessage(pm);
-            pm.releaseConnection();
-            s_logger.error("Failed to create object : " + errorMessage);
-            throw new NiciraNvpApiException("Failed to create object : " + errorMessage);
-        }
-
-        T result;
-        try {
-            result = (T)gson.fromJson(pm.getResponseBodyAsString(), TypeToken.get(newObject.getClass()).getType());
-        } catch (final IOException e) {
-            throw new NiciraNvpApiException("Failed to decode json response body", e);
-        } finally {
-            pm.releaseConnection();
-        }
-
-        return result;
-    }
-
-    protected void executeDeleteObject(final String uri) throws NiciraNvpApiException {
-        if (host == null || host.isEmpty() || adminuser == null || adminuser.isEmpty() || adminpass == null || adminpass.isEmpty()) {
-            throw new NiciraNvpApiException("Hostname/credentials are null or empty");
-        }
-
-        final DeleteMethod dm = (DeleteMethod)createMethod(DELETE_METHOD_TYPE, uri);
-        dm.setRequestHeader(CONTENT_TYPE, JSON_CONTENT_TYPE);
-
-        executeMethod(dm);
-
-        if (dm.getStatusCode() != HttpStatus.SC_NO_CONTENT) {
-            final String errorMessage = responseToErrorMessage(dm);
-            dm.releaseConnection();
-            s_logger.error("Failed to delete object : " + errorMessage);
-            throw new NiciraNvpApiException("Failed to delete object : " + errorMessage);
-        }
-        dm.releaseConnection();
-    }
-
-    @SuppressWarnings("unchecked")
-    protected <T> T executeRetrieveObject(final Type returnObjectType, final String uri, final Map<String, String> parameters) throws NiciraNvpApiException {
-        if (host == null || host.isEmpty() || adminuser == null || adminuser.isEmpty() || adminpass == null || adminpass.isEmpty()) {
-            throw new NiciraNvpApiException("Hostname/credentials are null or empty");
-        }
-
-        final GetMethod gm = (GetMethod)createMethod(GET_METHOD_TYPE, uri);
-        gm.setRequestHeader(CONTENT_TYPE, JSON_CONTENT_TYPE);
-        if (parameters != null && !parameters.isEmpty()) {
-            final List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(parameters.size());
-            for (final Entry<String, String> e : parameters.entrySet()) {
-                nameValuePairs.add(new NameValuePair(e.getKey(), e.getValue()));
-            }
-            gm.setQueryString(nameValuePairs.toArray(new NameValuePair[0]));
-        }
-
-        executeMethod(gm);
-
-        if (gm.getStatusCode() != HttpStatus.SC_OK) {
-            final String errorMessage = responseToErrorMessage(gm);
-            gm.releaseConnection();
-            s_logger.error("Failed to retrieve object : " + errorMessage);
-            throw new NiciraNvpApiException("Failed to retrieve object : " + errorMessage);
-        }
-
-        T returnValue;
-        try {
-            returnValue = (T)gson.fromJson(gm.getResponseBodyAsString(), returnObjectType);
-        } catch (final IOException e) {
-            s_logger.error("IOException while retrieving response body", e);
+            return restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalRouterPort>>() {
+            }.getType(), uri, params);
+        } catch (final CloudstackRESTException e) {
             throw new NiciraNvpApiException(e);
-        } finally {
-            gm.releaseConnection();
-        }
-        return returnValue;
-    }
-
-    protected void executeMethod(final HttpMethodBase method) throws NiciraNvpApiException {
-        try {
-            client.executeMethod(method);
-            if (method.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
-                method.releaseConnection();
-                // login and try again
-                login();
-                client.executeMethod(method);
-            }
-        } catch (final HttpException e) {
-            s_logger.error("HttpException caught while trying to connect to the Nicira NVP Controller", e);
-            method.releaseConnection();
-            throw new NiciraNvpApiException("API call to Nicira NVP Controller Failed", e);
-        } catch (final IOException e) {
-            s_logger.error("IOException caught while trying to connect to the Nicira NVP Controller", e);
-            method.releaseConnection();
-            throw new NiciraNvpApiException("API call to Nicira NVP Controller Failed", e);
-        }
-    }
-
-    private String responseToErrorMessage(final HttpMethodBase method) {
-        assert method.isRequestSent() : "no use getting an error message unless the request is sent";
-
-        if (TEXT_HTML_CONTENT_TYPE.equals(method.getResponseHeader(CONTENT_TYPE).getValue())) {
-            // The error message is the response content
-            // Safety margin of 1024 characters, anything longer is probably useless
-            // and will clutter the logs
-            try {
-                return method.getResponseBodyAsString(BODY_RESP_MAX_LEN);
-            } catch (final IOException e) {
-                s_logger.debug("Error while loading response body", e);
-            }
-        }
-
-        // The default
-        return method.getStatusText();
-    }
-
-    /* The Nicira controller uses a self-signed certificate. The
-     * TrustingProtocolSocketFactory will accept any provided
-     * certificate when making an SSL connection to the SDN
-     * Manager
-     */
-    private class TrustingProtocolSocketFactory implements SecureProtocolSocketFactory {
-
-        private SSLSocketFactory ssf;
-
-        public TrustingProtocolSocketFactory() throws IOException {
-            // Create a trust manager that does not validate certificate chains
-            final TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
-                @Override
-                public X509Certificate[] getAcceptedIssuers() {
-                    return null;
-                }
-
-                @Override
-                public void checkClientTrusted(final X509Certificate[] certs, final String authType) {
-                    // Trust always
-                }
-
-                @Override
-                public void checkServerTrusted(final X509Certificate[] certs, final String authType) {
-                    // Trust always
-                }
-            }};
-
-            try {
-                // Install the all-trusting trust manager
-                final SSLContext sc = SSLContext.getInstance("SSL");
-                sc.init(null, trustAllCerts, new java.security.SecureRandom());
-                ssf = sc.getSocketFactory();
-            } catch (final KeyManagementException e) {
-                throw new IOException(e);
-            } catch (final NoSuchAlgorithmException e) {
-                throw new IOException(e);
-            }
-        }
-
-        @Override
-        public Socket createSocket(final String host, final int port) throws IOException {
-            return ssf.createSocket(host, port);
-        }
-
-        @Override
-        public Socket createSocket(final String address, final int port, final InetAddress localAddress, final int localPort) throws IOException, UnknownHostException {
-            return ssf.createSocket(address, port, localAddress, localPort);
-        }
-
-        @Override
-        public Socket createSocket(final Socket socket, final String host, final int port, final boolean autoClose) throws IOException, UnknownHostException {
-            return ssf.createSocket(socket, host, port, autoClose);
-        }
-
-        @Override
-        public Socket createSocket(final String host, final int port, final InetAddress localAddress, final int localPort, final HttpConnectionParams params)
-                throws IOException, UnknownHostException, ConnectTimeoutException {
-            final int timeout = params.getConnectionTimeout();
-            if (timeout == 0) {
-                return createSocket(host, port, localAddress, localPort);
-            } else {
-                final Socket s = ssf.createSocket();
-                s.bind(new InetSocketAddress(localAddress, localPort));
-                s.connect(new InetSocketAddress(host, port), timeout);
-                return s;
-            }
         }
     }
 
@@ -837,6 +630,24 @@ public class NiciraNvpApi {
 
             throw new JsonParseException("Failed to deserialize type \"" + natRuleType + "\"");
         }
+    }
+
+    public static class RoutingConfigAdapter implements JsonDeserializer<RoutingConfig> {
 
+        @Override
+        public RoutingConfig deserialize(final JsonElement jsonElement, final Type type, final JsonDeserializationContext context) throws JsonParseException {
+            final JsonObject jsonObject = jsonElement.getAsJsonObject();
+
+            if (!jsonObject.has("type")) {
+                throw new JsonParseException("Deserializing as a RoutingConfig, but no type present in the json object");
+            }
+
+            final String routingConfigType = jsonObject.get("type").getAsString();
+            if ("SingleDefaultRouteImplicitRoutingConfig".equals(routingConfigType)) {
+                return context.deserialize(jsonElement, SingleDefaultRouteImplicitRoutingConfig.class);
+            }
+
+            throw new JsonParseException("Failed to deserialize type \"" + routingConfigType + "\"");
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SingleDefaultRouteImplicitRoutingConfig.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SingleDefaultRouteImplicitRoutingConfig.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SingleDefaultRouteImplicitRoutingConfig.java
new file mode 100644
index 0000000..ea5df2c
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SingleDefaultRouteImplicitRoutingConfig.java
@@ -0,0 +1,40 @@
+//
+// 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.
+//
+
+package com.cloud.network.nicira;
+
+/**
+ *
+ */
+public class SingleDefaultRouteImplicitRoutingConfig extends RoutingConfig {
+    public RouterNextHop defaultRouteNextHop;
+    public final String type = "SingleDefaultRouteImplicitRoutingConfig";
+
+    public SingleDefaultRouteImplicitRoutingConfig(final RouterNextHop routerNextHop) {
+        defaultRouteNextHop = routerNextHop;
+    }
+
+    public RouterNextHop getDefaultRouteNextHop() {
+        return defaultRouteNextHop;
+    }
+
+    public void setDefaultRouteNextHop(final RouterNextHop defaultRouteNextHop) {
+        this.defaultRouteNextHop = defaultRouteNextHop;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SingleDefaultRouteImplictRoutingConfig.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SingleDefaultRouteImplictRoutingConfig.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SingleDefaultRouteImplictRoutingConfig.java
deleted file mode 100644
index 0533579..0000000
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SingleDefaultRouteImplictRoutingConfig.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// 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.
-//
-
-package com.cloud.network.nicira;
-
-/**
- *
- */
-public class SingleDefaultRouteImplictRoutingConfig extends RoutingConfig {
-    public RouterNextHop defaultRouteNextHop;
-    public final String type = "SingleDefaultRouteImplicitRoutingConfig";
-
-    public SingleDefaultRouteImplictRoutingConfig(RouterNextHop routerNextHop) {
-        defaultRouteNextHop = routerNextHop;
-    }
-
-    public RouterNextHop getDefaultRouteNextHop() {
-        return defaultRouteNextHop;
-    }
-
-    public void setDefaultRouteNextHop(RouterNextHop defaultRouteNextHop) {
-        this.defaultRouteNextHop = defaultRouteNextHop;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/VifAttachment.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/VifAttachment.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/VifAttachment.java
index 87765be..fe7d93a 100644
--- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/VifAttachment.java
+++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/VifAttachment.java
@@ -19,6 +19,11 @@
 
 package com.cloud.network.nicira;
 
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+
 public class VifAttachment extends Attachment {
     private final String type = "VifAttachment";
     private String vifUuid;
@@ -34,7 +39,7 @@ public class VifAttachment extends Attachment {
         return vifUuid;
     }
 
-    public void setVifUuid(String vifUuid) {
+    public void setVifUuid(final String vifUuid) {
         this.vifUuid = vifUuid;
     }
 
@@ -42,4 +47,32 @@ public class VifAttachment extends Attachment {
         return type;
     }
 
+
+    @Override
+    public String toString() {
+        return ReflectionToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE, false);
+    }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder(17, 31)
+                .append(this.getClass())
+                .append(vifUuid)
+                .toHashCode();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (obj == this) {
+            return true;
+        }
+        if (!(this.getClass().isInstance(obj))) {
+            return false;
+        }
+        final VifAttachment another = (VifAttachment) obj;
+        return new EqualsBuilder().append(vifUuid, another.vifUuid).isEquals();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/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 c228b08..ec95ea5 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
@@ -66,7 +66,7 @@ import com.cloud.host.Host.Type;
 import com.cloud.network.nicira.ControlClusterStatus;
 import com.cloud.network.nicira.DestinationNatRule;
 import com.cloud.network.nicira.L3GatewayAttachment;
-import com.cloud.network.nicira.LogicalRouterConfig;
+import com.cloud.network.nicira.LogicalRouter;
 import com.cloud.network.nicira.LogicalRouterPort;
 import com.cloud.network.nicira.LogicalSwitch;
 import com.cloud.network.nicira.LogicalSwitchPort;
@@ -78,7 +78,7 @@ import com.cloud.network.nicira.NiciraNvpList;
 import com.cloud.network.nicira.NiciraNvpTag;
 import com.cloud.network.nicira.PatchAttachment;
 import com.cloud.network.nicira.RouterNextHop;
-import com.cloud.network.nicira.SingleDefaultRouteImplictRoutingConfig;
+import com.cloud.network.nicira.SingleDefaultRouteImplicitRoutingConfig;
 import com.cloud.network.nicira.SourceNatRule;
 import com.cloud.network.nicira.TransportZoneBinding;
 import com.cloud.network.nicira.VifAttachment;
@@ -294,7 +294,7 @@ public class NiciraNvpResource implements ServerResource {
             LogicalSwitchPort logicalSwitchPort = new LogicalSwitchPort(attachmentUuid, tags, true);
             LogicalSwitchPort newPort = niciraNvpApi.createLogicalSwitchPort(logicalSwitchUuid, logicalSwitchPort);
             try {
-                niciraNvpApi.modifyLogicalSwitchPortAttachment(cmd.getLogicalSwitchUuid(), newPort.getUuid(), new VifAttachment(attachmentUuid));
+                niciraNvpApi.updateLogicalSwitchPortAttachment(cmd.getLogicalSwitchUuid(), newPort.getUuid(), new VifAttachment(attachmentUuid));
             } catch (NiciraNvpApiException ex) {
                 s_logger.warn("modifyLogicalSwitchPort failed after switchport was created, removing switchport");
                 niciraNvpApi.deleteLogicalSwitchPort(cmd.getLogicalSwitchUuid(), newPort.getUuid());
@@ -334,7 +334,7 @@ public class NiciraNvpResource implements ServerResource {
             List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>();
             tags.add(new NiciraNvpTag("cs_account", cmd.getOwnerName()));
 
-            niciraNvpApi.modifyLogicalSwitchPortAttachment(logicalSwitchUuid, logicalSwitchPortUuid, new VifAttachment(attachmentUuid));
+            niciraNvpApi.updateLogicalSwitchPortAttachment(logicalSwitchUuid, logicalSwitchPortUuid, new VifAttachment(attachmentUuid));
             return new UpdateLogicalSwitchPortAnswer(cmd, true, "Attachment for  " + logicalSwitchPortUuid + " updated", logicalSwitchPortUuid);
         } catch (NiciraNvpApiException e) {
             if (numRetries > 0) {
@@ -383,10 +383,10 @@ public class NiciraNvpResource implements ServerResource {
 
         try {
             // Create the Router
-            LogicalRouterConfig lrc = new LogicalRouterConfig();
+            LogicalRouter lrc = new LogicalRouter();
             lrc.setDisplayName(truncate(routerName, NAME_MAX_LEN));
             lrc.setTags(tags);
-            lrc.setRoutingConfig(new SingleDefaultRouteImplictRoutingConfig(new RouterNextHop(publicNetworkNextHopIp)));
+            lrc.setRoutingConfig(new SingleDefaultRouteImplicitRoutingConfig(new RouterNextHop(publicNetworkNextHopIp)));
             lrc = niciraNvpApi.createLogicalRouter(lrc);
 
             // store the switchport for rollback
@@ -408,7 +408,7 @@ public class NiciraNvpResource implements ServerResource {
                 if (cmd.getVlanId() != 0) {
                     attachment.setVlanId(cmd.getVlanId());
                 }
-                niciraNvpApi.modifyLogicalRouterPortAttachment(lrc.getUuid(), lrpo.getUuid(), attachment);
+                niciraNvpApi.updateLogicalRouterPortAttachment(lrc.getUuid(), lrpo.getUuid(), attachment);
 
                 // Create the inside port for the router
                 LogicalRouterPort lrpi = new LogicalRouterPort();
@@ -425,10 +425,10 @@ public class NiciraNvpResource implements ServerResource {
                 lsp = niciraNvpApi.createLogicalSwitchPort(logicalSwitchUuid, lsp);
 
                 // Attach the inside router port to the lswitch port with a PatchAttachment
-                niciraNvpApi.modifyLogicalRouterPortAttachment(lrc.getUuid(), lrpi.getUuid(), new PatchAttachment(lsp.getUuid()));
+                niciraNvpApi.updateLogicalRouterPortAttachment(lrc.getUuid(), lrpi.getUuid(), new PatchAttachment(lsp.getUuid()));
 
                 // Attach the inside lswitch port to the router with a PatchAttachment
-                niciraNvpApi.modifyLogicalSwitchPortAttachment(logicalSwitchUuid, lsp.getUuid(), new PatchAttachment(lrpi.getUuid()));
+                niciraNvpApi.updateLogicalSwitchPortAttachment(logicalSwitchUuid, lsp.getUuid(), new PatchAttachment(lrpi.getUuid()));
 
                 // Setup the source nat rule
                 SourceNatRule snr = new SourceNatRule();
@@ -484,7 +484,7 @@ public class NiciraNvpResource implements ServerResource {
             }
             LogicalRouterPort lrp = ports.getResults().get(0);
             lrp.setIpAddresses(cmd.getPublicCidrs());
-            niciraNvpApi.modifyLogicalRouterPort(cmd.getLogicalRouterUuid(), lrp);
+            niciraNvpApi.updateLogicalRouterPort(cmd.getLogicalRouterUuid(), lrp);
 
             return new ConfigurePublicIpsOnLogicalRouterAnswer(cmd, true, "Configured " + cmd.getPublicCidrs().size() + " ip addresses on logical router uuid " +
                 cmd.getLogicalRouterUuid());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/plugins/network-elements/nicira-nvp/test/com/cloud/network/element/NiciraNvpElementTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/test/com/cloud/network/element/NiciraNvpElementTest.java b/plugins/network-elements/nicira-nvp/test/com/cloud/network/element/NiciraNvpElementTest.java
index 822c8c7..bf8ce18 100644
--- a/plugins/network-elements/nicira-nvp/test/com/cloud/network/element/NiciraNvpElementTest.java
+++ b/plugins/network-elements/nicira-nvp/test/com/cloud/network/element/NiciraNvpElementTest.java
@@ -104,7 +104,7 @@ public class NiciraNvpElementTest {
 
     @Test
     public void canHandleTest() {
-        Network net = mock(Network.class);
+        final Network net = mock(Network.class);
         when(net.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Lswitch);
         when(net.getId()).thenReturn(NETWORK_ID);
 
@@ -134,43 +134,43 @@ public class NiciraNvpElementTest {
 
     @Test
     public void implementTest() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
-        Network network = mock(Network.class);
+        final Network network = mock(Network.class);
         when(network.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Lswitch);
         when(network.getId()).thenReturn(NETWORK_ID);
 
-        NetworkOffering offering = mock(NetworkOffering.class);
+        final NetworkOffering offering = mock(NetworkOffering.class);
         when(offering.getId()).thenReturn(NETWORK_ID);
         when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
         when(offering.getGuestType()).thenReturn(GuestType.Isolated);
 
         mock(DeployDestination.class);
 
-        Domain dom = mock(Domain.class);
+        final Domain dom = mock(Domain.class);
         when(dom.getName()).thenReturn("domain");
-        Account acc = mock(Account.class);
+        final Account acc = mock(Account.class);
         when(acc.getAccountName()).thenReturn("accountname");
-        ReservationContext context = mock(ReservationContext.class);
+        final ReservationContext context = mock(ReservationContext.class);
         when(context.getDomain()).thenReturn(dom);
         when(context.getAccount()).thenReturn(acc);
     }
 
     @Test
     public void applyIpTest() throws ResourceUnavailableException {
-        Network network = mock(Network.class);
+        final Network network = mock(Network.class);
         when(network.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Lswitch);
         when(network.getId()).thenReturn(NETWORK_ID);
         when(network.getPhysicalNetworkId()).thenReturn(NETWORK_ID);
 
-        NetworkOffering offering = mock(NetworkOffering.class);
+        final NetworkOffering offering = mock(NetworkOffering.class);
         when(offering.getId()).thenReturn(NETWORK_ID);
         when(offering.getTrafficType()).thenReturn(TrafficType.Guest);
         when(offering.getGuestType()).thenReturn(GuestType.Isolated);
 
-        List<PublicIpAddress> ipAddresses = new ArrayList<PublicIpAddress>();
-        PublicIpAddress pipReleased = mock(PublicIpAddress.class);
-        PublicIpAddress pipAllocated = mock(PublicIpAddress.class);
-        Ip ipReleased = new Ip("42.10.10.10");
-        Ip ipAllocated = new Ip("10.10.10.10");
+        final List<PublicIpAddress> ipAddresses = new ArrayList<PublicIpAddress>();
+        final PublicIpAddress pipReleased = mock(PublicIpAddress.class);
+        final PublicIpAddress pipAllocated = mock(PublicIpAddress.class);
+        final Ip ipReleased = new Ip("42.10.10.10");
+        final Ip ipAllocated = new Ip("10.10.10.10");
         when(pipAllocated.getState()).thenReturn(IpAddress.State.Allocated);
         when(pipAllocated.getAddress()).thenReturn(ipAllocated);
         when(pipAllocated.getNetmask()).thenReturn("255.255.255.0");
@@ -180,25 +180,25 @@ public class NiciraNvpElementTest {
         ipAddresses.add(pipAllocated);
         ipAddresses.add(pipReleased);
 
-        Set<Service> services = new HashSet<Service>();
+        final Set<Service> services = new HashSet<Service>();
         services.add(Service.SourceNat);
         services.add(Service.StaticNat);
         services.add(Service.PortForwarding);
 
-        List<NiciraNvpDeviceVO> deviceList = new ArrayList<NiciraNvpDeviceVO>();
-        NiciraNvpDeviceVO nndVO = mock(NiciraNvpDeviceVO.class);
-        NiciraNvpRouterMappingVO nnrmVO = mock(NiciraNvpRouterMappingVO.class);
+        final List<NiciraNvpDeviceVO> deviceList = new ArrayList<NiciraNvpDeviceVO>();
+        final NiciraNvpDeviceVO nndVO = mock(NiciraNvpDeviceVO.class);
+        final NiciraNvpRouterMappingVO nnrmVO = mock(NiciraNvpRouterMappingVO.class);
         when(niciraNvpRouterMappingDao.findByNetworkId(NETWORK_ID)).thenReturn(nnrmVO);
         when(nnrmVO.getLogicalRouterUuid()).thenReturn("abcde");
         when(nndVO.getHostId()).thenReturn(NETWORK_ID);
-        HostVO hvo = mock(HostVO.class);
+        final HostVO hvo = mock(HostVO.class);
         when(hvo.getId()).thenReturn(NETWORK_ID);
         when(hvo.getDetail("l3gatewayserviceuuid")).thenReturn("abcde");
         when(hostDao.findById(NETWORK_ID)).thenReturn(hvo);
         deviceList.add(nndVO);
         when(niciraNvpDao.listByPhysicalNetwork(NETWORK_ID)).thenReturn(deviceList);
 
-        ConfigurePublicIpsOnLogicalRouterAnswer answer = mock(ConfigurePublicIpsOnLogicalRouterAnswer.class);
+        final ConfigurePublicIpsOnLogicalRouterAnswer answer = mock(ConfigurePublicIpsOnLogicalRouterAnswer.class);
         when(answer.getResult()).thenReturn(true);
         when(agentManager.easySend(eq(NETWORK_ID), any(ConfigurePublicIpsOnLogicalRouterCommand.class))).thenReturn(answer);
 
@@ -206,8 +206,8 @@ public class NiciraNvpElementTest {
 
         verify(agentManager, atLeast(1)).easySend(eq(NETWORK_ID), argThat(new ArgumentMatcher<ConfigurePublicIpsOnLogicalRouterCommand>() {
             @Override
-            public boolean matches(Object argument) {
-                ConfigurePublicIpsOnLogicalRouterCommand command = (ConfigurePublicIpsOnLogicalRouterCommand)argument;
+            public boolean matches(final Object argument) {
+                final ConfigurePublicIpsOnLogicalRouterCommand command = (ConfigurePublicIpsOnLogicalRouterCommand)argument;
                 if (command.getPublicCidrs().size() == 1)
                     return true;
                 return false;