You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2012/06/28 19:25:07 UTC

[12/12] git commit: VPC: implementation for Add/delete/list StaticRoute. Agent implementation is yet to be done

VPC: implementation for Add/delete/list StaticRoute. Agent implementation is yet to be done


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

Branch: refs/heads/vpc
Commit: 1a232171eb662f619e60f1eb1967b6fa62ba174e
Parents: ce876e2
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Tue Jun 26 11:10:55 2012 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Thu Jun 28 10:11:41 2012 -0700

----------------------------------------------------------------------
 .../agent/api/routing/SetStaticRouteAnswer.java    |   35 +++
 .../agent/api/routing/SetStaticRouteCommand.java   |   35 +++
 .../cloud/api/commands/CreateStaticRouteCmd.java   |    3 +-
 .../cloud/api/response/StaticRouteResponse.java    |   45 ++++-
 api/src/com/cloud/api/response/VolumeResponse.java |    2 +-
 api/src/com/cloud/network/element/VpcProvider.java |    5 +-
 .../com/cloud/network/vpc/StaticRouteProfile.java  |   97 ++++++++
 api/src/com/cloud/network/vpc/VpcService.java      |    6 +-
 .../xen/resource/CitrixResourceBase.java           |   11 +-
 server/src/com/cloud/api/ApiResponseHelper.java    |    2 +
 .../network/element/VpcVirtualRouterElement.java   |   32 ++-
 .../network/firewall/FirewallManagerImpl.java      |   24 ++-
 .../router/VpcVirtualNetworkApplianceManager.java  |    9 +
 .../VpcVirtualNetworkApplianceManagerImpl.java     |   40 +++-
 .../com/cloud/network/vpc/Dao/StaticRouteDao.java  |    8 +
 .../cloud/network/vpc/Dao/StaticRouteDaoImpl.java  |   51 ++++
 .../src/com/cloud/network/vpc/StaticRouteVO.java   |   17 ++-
 .../src/com/cloud/network/vpc/VpcManagerImpl.java  |  193 ++++++++++++++-
 server/src/com/cloud/vm/dao/DomainRouterDao.java   |    2 +-
 .../src/com/cloud/vm/dao/DomainRouterDaoImpl.java  |    2 +-
 20 files changed, 572 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/api/src/com/cloud/agent/api/routing/SetStaticRouteAnswer.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/routing/SetStaticRouteAnswer.java b/api/src/com/cloud/agent/api/routing/SetStaticRouteAnswer.java
new file mode 100644
index 0000000..93e79aa
--- /dev/null
+++ b/api/src/com/cloud/agent/api/routing/SetStaticRouteAnswer.java
@@ -0,0 +1,35 @@
+// Copyright 2012 Citrix Systems, Inc. Licensed under the
+// Apache License, Version 2.0 (the "License"); you may not use this
+// file except in compliance with the License.  Citrix Systems, Inc.
+// reserves all rights not expressly granted by 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.
+// 
+// Automatically generated by addcopyright.py at 04/03/2012
+package com.cloud.agent.api.routing;
+
+import com.cloud.agent.api.Answer;
+
+/**
+ * @author Alena Prokharchyk
+ */
+public class SetStaticRouteAnswer extends Answer{
+    String[] results;
+    
+    protected SetStaticRouteAnswer() {
+    }
+    
+    public SetStaticRouteAnswer(SetStaticRouteCommand cmd, boolean success, String[] results) {
+        super(cmd, success, null);
+        assert (cmd.getStaticRoutes().length == results.length) : "Static routes and their results should be the same length";
+        this.results = results;
+    }
+    
+    public String[] getResults() {
+        return results;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/api/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java b/api/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java
new file mode 100644
index 0000000..1ab59d7
--- /dev/null
+++ b/api/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java
@@ -0,0 +1,35 @@
+// Copyright 2012 Citrix Systems, Inc. Licensed under the
+// Apache License, Version 2.0 (the "License"); you may not use this
+// file except in compliance with the License.  Citrix Systems, Inc.
+// reserves all rights not expressly granted by 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.
+// 
+// Automatically generated by addcopyright.py at 04/03/2012
+package com.cloud.agent.api.routing;
+
+import java.util.List;
+
+import com.cloud.network.vpc.StaticRouteProfile;
+
+/**
+ * @author Alena Prokharchyk
+ */
+public class SetStaticRouteCommand extends NetworkElementCommand{
+    StaticRouteProfile[] staticRoutes;
+    
+    protected SetStaticRouteCommand() {
+    }
+    
+    public SetStaticRouteCommand(List<StaticRouteProfile> staticRoutes) {
+        this.staticRoutes = staticRoutes.toArray(new StaticRouteProfile[staticRoutes.size()]); 
+    }
+
+    public StaticRouteProfile[] getStaticRoutes() {
+        return staticRoutes;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/api/src/com/cloud/api/commands/CreateStaticRouteCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/CreateStaticRouteCmd.java b/api/src/com/cloud/api/commands/CreateStaticRouteCmd.java
index 805013e..af6fc00 100644
--- a/api/src/com/cloud/api/commands/CreateStaticRouteCmd.java
+++ b/api/src/com/cloud/api/commands/CreateStaticRouteCmd.java
@@ -28,6 +28,7 @@ import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.vpc.PrivateGateway;
 import com.cloud.network.vpc.StaticRoute;
 import com.cloud.user.UserContext;
@@ -91,7 +92,7 @@ public class CreateStaticRouteCmd extends BaseAsyncCreateCmd{
     }
 
     @Override
-    public void execute() {
+    public void execute() throws ResourceUnavailableException {
         boolean success = false;
         StaticRoute route = _entityMgr.findById(StaticRoute.class, getEntityId());
         try {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/api/src/com/cloud/api/response/StaticRouteResponse.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/response/StaticRouteResponse.java b/api/src/com/cloud/api/response/StaticRouteResponse.java
index a77c71b..025be6e 100644
--- a/api/src/com/cloud/api/response/StaticRouteResponse.java
+++ b/api/src/com/cloud/api/response/StaticRouteResponse.java
@@ -21,7 +21,7 @@ import com.google.gson.annotations.SerializedName;
  * @author Alena Prokharchyk
  */
 @SuppressWarnings("unused")
-public class StaticRouteResponse extends BaseResponse{
+public class StaticRouteResponse extends BaseResponse implements ControlledEntityResponse{
     @SerializedName(ApiConstants.ID) @Param(description="the ID of static route")
     private IdentityProxy id = new IdentityProxy("static_routes");
     
@@ -36,6 +36,24 @@ public class StaticRouteResponse extends BaseResponse{
     
     @SerializedName(ApiConstants.CIDR) @Param(description="static route CIDR")
     private String cidr;
+    
+    @SerializedName(ApiConstants.ACCOUNT)
+    @Param(description = "the account associated with the static route")
+    private String accountName;
+    
+    @SerializedName(ApiConstants.PROJECT_ID) @Param(description="the project id of the static route")
+    private IdentityProxy projectId = new IdentityProxy("projects");
+    
+    @SerializedName(ApiConstants.PROJECT) @Param(description="the project name of the static route")
+    private String projectName;
+
+    @SerializedName(ApiConstants.DOMAIN_ID)
+    @Param(description = "the ID of the domain associated with the static route")
+    private IdentityProxy domainId = new IdentityProxy("domain");
+
+    @SerializedName(ApiConstants.DOMAIN)
+    @Param(description = "the domain associated with the static route")
+    private String domainName;
 
     public void setId(Long id) {
         this.id.setValue(id);
@@ -56,4 +74,29 @@ public class StaticRouteResponse extends BaseResponse{
     public void setCidr(String cidr) {
         this.cidr = cidr;
     }
+    
+    @Override
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    @Override
+    public void setDomainId(Long domainId) {
+        this.domainId.setValue(domainId);
+    }
+    
+    @Override
+    public void setDomainName(String domainName) {
+        this.domainName = domainName;
+    }
+    
+    @Override
+    public void setProjectId(Long projectId) {
+        this.projectId.setValue(projectId);
+    }
+
+    @Override
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/api/src/com/cloud/api/response/VolumeResponse.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/response/VolumeResponse.java b/api/src/com/cloud/api/response/VolumeResponse.java
index 8659525..926e368 100755
--- a/api/src/com/cloud/api/response/VolumeResponse.java
+++ b/api/src/com/cloud/api/response/VolumeResponse.java
@@ -292,5 +292,5 @@ public class VolumeResponse extends BaseResponse implements ControlledEntityResp
     @Override
     public void setProjectName(String projectName) {
         this.projectName = projectName;
-    }   
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/api/src/com/cloud/network/element/VpcProvider.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/element/VpcProvider.java b/api/src/com/cloud/network/element/VpcProvider.java
index 34bdb51..3e369b3 100644
--- a/api/src/com/cloud/network/element/VpcProvider.java
+++ b/api/src/com/cloud/network/element/VpcProvider.java
@@ -12,6 +12,7 @@
 // Automatically generated by addcopyright.py at 04/03/2012
 package com.cloud.network.element;
 
+
 import java.util.List;
 
 import com.cloud.deploy.DeployDestination;
@@ -20,7 +21,7 @@ import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.InsufficientNetworkCapacityException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.vpc.PrivateGateway;
-import com.cloud.network.vpc.StaticRoute;
+import com.cloud.network.vpc.StaticRouteProfile;
 import com.cloud.network.vpc.Vpc;
 import com.cloud.vm.ReservationContext;
 
@@ -48,5 +49,5 @@ public interface VpcProvider extends NetworkElement{
     
     boolean deletePrivateGateway(PrivateGateway privateGateway) throws ConcurrentOperationException, ResourceUnavailableException;
     
-    boolean applyStaticRoutes(Vpc vpc, List<? extends StaticRoute> routes) throws ResourceUnavailableException;
+    boolean applyStaticRoutes(Vpc vpc, List<StaticRouteProfile> routes) throws ResourceUnavailableException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/api/src/com/cloud/network/vpc/StaticRouteProfile.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/vpc/StaticRouteProfile.java b/api/src/com/cloud/network/vpc/StaticRouteProfile.java
new file mode 100644
index 0000000..073621d
--- /dev/null
+++ b/api/src/com/cloud/network/vpc/StaticRouteProfile.java
@@ -0,0 +1,97 @@
+// Copyright 2012 Citrix Systems, Inc. Licensed under the
+// Apache License, Version 2.0 (the "License"); you may not use this
+// file except in compliance with the License.  Citrix Systems, Inc.
+// reserves all rights not expressly granted by 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.
+// 
+// Automatically generated by addcopyright.py at 04/03/2012
+package com.cloud.network.vpc;
+
+/**
+ * @author Alena Prokharchyk
+ */
+public class StaticRouteProfile implements StaticRoute{
+    private long id;
+    private String cidr;
+    private long accountId;
+    private long domainId;
+    private long gatewayId;
+    private StaticRoute.State state;
+    private long vpcId;
+    String vlanTag;
+    String gateway;
+    String netmask;
+    String ipAddress;
+    
+
+    public StaticRouteProfile(StaticRoute staticRoute, PrivateGateway gateway) {
+        this.id = staticRoute.getId();
+        this.cidr = staticRoute.getCidr();
+        this.accountId = staticRoute.getAccountId();
+        this.domainId = staticRoute.getDomainId();
+        this.gatewayId = staticRoute.getVpcGatewayId();
+        this.state = staticRoute.getState();
+        this.vpcId = staticRoute.getVpcId();
+        this.vlanTag = gateway.getVlanTag();
+        this.gateway = gateway.getGateway();
+        this.netmask = gateway.getNetmask();
+        this.ipAddress = gateway.getIp4Address();
+    }
+
+    @Override
+    public long getAccountId() {
+        return accountId;
+    }
+
+    @Override
+    public long getDomainId() {
+        return domainId;
+    }
+
+    @Override
+    public long getVpcGatewayId() {
+        return gatewayId;
+    }
+
+    @Override
+    public String getCidr() {
+        return cidr;
+    }
+
+    @Override
+    public State getState() {
+        return state;
+    }
+
+    @Override
+    public Long getVpcId() {
+       return vpcId;
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    public String getVlanTag() {
+        return vlanTag;
+    }
+    
+    public String getIp4Address() {
+        return ipAddress;
+    }
+
+    public String getGateway() {
+        return gateway;
+    }
+
+    public String getNetmask() {
+        return netmask;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/api/src/com/cloud/network/vpc/VpcService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/vpc/VpcService.java b/api/src/com/cloud/network/vpc/VpcService.java
index d1faf23..a4e1a1a 100644
--- a/api/src/com/cloud/network/vpc/VpcService.java
+++ b/api/src/com/cloud/network/vpc/VpcService.java
@@ -189,14 +189,16 @@ public interface VpcService {
     /**
      * @param vpcId
      * @return
+     * @throws ResourceUnavailableException 
      */
-    public boolean applyStaticRoutes(long vpcId);
+    public boolean applyStaticRoutes(long vpcId) throws ResourceUnavailableException;
 
     /**
      * @param routeId
      * @return TODO
+     * @throws ResourceUnavailableException 
      */
-    public boolean revokeStaticRoute(long routeId);
+    public boolean revokeStaticRoute(long routeId) throws ResourceUnavailableException;
 
     /**
      * @param gatewayId

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 7153dc4..dac8f23 100644
--- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -156,6 +156,8 @@ import com.cloud.agent.api.routing.SetPortForwardingRulesVpcCommand;
 import com.cloud.agent.api.routing.SetSourceNatCommand;
 import com.cloud.agent.api.routing.SetStaticNatRulesAnswer;
 import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
+import com.cloud.agent.api.routing.SetStaticRouteAnswer;
+import com.cloud.agent.api.routing.SetStaticRouteCommand;
 import com.cloud.agent.api.routing.VmDataCommand;
 import com.cloud.agent.api.routing.VpnUsersCfgCommand;
 import com.cloud.agent.api.storage.CopyVolumeAnswer;
@@ -542,12 +544,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             return execute((SetNetworkACLCommand) cmd);
         } else if (clazz == SetPortForwardingRulesVpcCommand.class) {
             return execute((SetPortForwardingRulesVpcCommand) cmd);
+        } else if (clazz == SetStaticRouteCommand.class) {
+            return execute((SetStaticRouteCommand) cmd);
         } else {
             return Answer.createUnsupportedCommandAnswer(cmd);
         }
     }
 
-
     protected XsLocalNetwork getNativeNetworkForTraffic(Connection conn, TrafficType type, String name) throws XenAPIException, XmlRpcException {
         if (name != null) {
             if (s_logger.isDebugEnabled()) {
@@ -7125,4 +7128,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
        //TODO - add implementation
         return null;
     }
+    
+    
+    private SetStaticRouteAnswer execute(SetStaticRouteCommand cmd) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index d01213e..094af0a 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -3563,6 +3563,8 @@ public class ApiResponseHelper implements ResponseGenerator {
             stateToSet = "Deleting";
         }
         response.setState(stateToSet);
+        populateAccount(response, result.getAccountId());
+        populateDomain(response, result.getDomainId());
         response.setObjectName("staticroute");
         
         return response;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
index e9a2cf5..c5e2efd 100644
--- a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
@@ -32,19 +32,19 @@ import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
-import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType;
 import com.cloud.network.NetworkService;
 import com.cloud.network.PublicIpAddress;
+import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType;
 import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.router.VirtualRouter.Role;
 import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.NetworkACL;
-import com.cloud.network.vpc.StaticRoute;
+import com.cloud.network.vpc.PrivateGateway;
+import com.cloud.network.vpc.StaticRouteProfile;
 import com.cloud.network.vpc.Vpc;
 import com.cloud.network.vpc.VpcGateway;
 import com.cloud.network.vpc.VpcManager;
-import com.cloud.network.vpc.PrivateGateway;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.utils.component.Inject;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -119,7 +119,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
     
     @Override
     public boolean shutdownVpc(Vpc vpc) throws ConcurrentOperationException, ResourceUnavailableException {
-        List<DomainRouterVO> routers = _routerDao.listRoutersByVpcId(vpc.getId());
+        List<DomainRouterVO> routers = _routerDao.listByVpcId(vpc.getId());
         if (routers == null || routers.isEmpty()) {
             return true;
         }
@@ -228,7 +228,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
             return success;
         }
         
-        List<? extends VirtualRouter> routers = _routerDao.listRoutersByVpcId(vpcId);
+        List<? extends VirtualRouter> routers = _routerDao.listByVpcId(vpcId);
         for (VirtualRouter router : routers) {
             //1) Check if router is already a part of the network
             if (!_ntwkService.isVmPartOfNetwork(router.getId(), network.getId())) {
@@ -256,7 +256,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
             return success;
         }
         
-        List<? extends VirtualRouter> routers = _routerDao.listRoutersByVpcId(vpcId);
+        List<? extends VirtualRouter> routers = _routerDao.listByVpcId(vpcId);
         for (VirtualRouter router : routers) {
             //1) Check if router is already a part of the network
             if (!_ntwkService.isVmPartOfNetwork(router.getId(), config.getId())) {
@@ -403,12 +403,20 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
         return VirtualRouterProviderType.VPCVirtualRouter;
     }
 
-    /* (non-Javadoc)
-     * @see com.cloud.network.element.VpcProvider#applyStaticRoutes(com.cloud.network.vpc.Vpc, java.util.List)
-     */
     @Override
-    public boolean applyStaticRoutes(Vpc vpc, List<? extends StaticRoute> routes) throws ResourceUnavailableException {
-        // TODO Auto-generated method stub
-        return false;
+    public boolean applyStaticRoutes(Vpc vpc, List<StaticRouteProfile> routes) throws ResourceUnavailableException {
+        List<DomainRouterVO> routers = _routerDao.listByVpcId(vpc.getId());
+        if (routers == null || routers.isEmpty()) {
+            s_logger.debug("Virtual router elemnt doesn't need to static routes on the backend; virtual " +
+                    "router doesn't exist in the vpc " + vpc);
+            return true;
+        }
+
+        if (!_vpcRouterMgr.applyStaticRoutes(routes, routers)) {
+            throw new CloudRuntimeException("Failed to apply static routes in vpc " + vpc);
+        } else {
+            s_logger.debug("Applied static routes on vpc " + vpc);
+            return true;
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
index 7d0a785..a364dbc 100644
--- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
+++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
@@ -277,16 +277,16 @@ public class FirewallManagerImpl implements FirewallService, FirewallManager, Ma
             if (!oneOfRulesIsFirewall) {
                 if (rule.getPurpose() == Purpose.StaticNat && newRule.getPurpose() != Purpose.StaticNat) {
                     throw new NetworkRuleConflictException("There is 1 to 1 Nat rule specified for the ip address id=" 
-                + newRule.getSourceIpAddressId());
+                            + newRule.getSourceIpAddressId());
                 } else if (rule.getPurpose() != Purpose.StaticNat && newRule.getPurpose() == Purpose.StaticNat) {
                     throw new NetworkRuleConflictException("There is already firewall rule specified for the ip address id="
-                + newRule.getSourceIpAddressId());
+                            + newRule.getSourceIpAddressId());
                 }
             }
 
             if (rule.getNetworkId() != newRule.getNetworkId() && rule.getState() != State.Revoke) {
                 throw new NetworkRuleConflictException("New rule is for a different network than what's specified in rule "
-            + rule.getXid());
+                        + rule.getXid());
             }
 
             if (newRule.getProtocol().equalsIgnoreCase(NetUtils.ICMP_PROTO) && newRule.getProtocol().equalsIgnoreCase(rule.getProtocol())) {
@@ -302,14 +302,20 @@ public class FirewallManagerImpl implements FirewallService, FirewallManager, Ma
             if (!notNullPorts) {
                 continue;
             } else if (!oneOfRulesIsFirewall && !(bothRulesFirewall && !duplicatedCidrs)
-                    && ((rule.getSourcePortStart().intValue() <= newRule.getSourcePortStart().intValue() && rule.getSourcePortEnd().intValue() >= newRule.getSourcePortStart().intValue())
-                            || (rule.getSourcePortStart().intValue() <= newRule.getSourcePortEnd().intValue() && rule.getSourcePortEnd().intValue() >= newRule.getSourcePortEnd().intValue())
-                            || (newRule.getSourcePortStart().intValue() <= rule.getSourcePortStart().intValue() && newRule.getSourcePortEnd().intValue() >= rule.getSourcePortStart().intValue())
-                            || (newRule.getSourcePortStart().intValue() <= rule.getSourcePortEnd().intValue() && newRule.getSourcePortEnd().intValue() >= rule.getSourcePortEnd().intValue()))) {
+                    && ((rule.getSourcePortStart().intValue() <= newRule.getSourcePortStart().intValue() 
+                    && rule.getSourcePortEnd().intValue() >= newRule.getSourcePortStart().intValue())
+                            || (rule.getSourcePortStart().intValue() <= newRule.getSourcePortEnd().intValue() 
+                            && rule.getSourcePortEnd().intValue() >= newRule.getSourcePortEnd().intValue())
+                            || (newRule.getSourcePortStart().intValue() <= rule.getSourcePortStart().intValue() 
+                            && newRule.getSourcePortEnd().intValue() >= rule.getSourcePortStart().intValue())
+                            || (newRule.getSourcePortStart().intValue() <= rule.getSourcePortEnd().intValue() 
+                            && newRule.getSourcePortEnd().intValue() >= rule.getSourcePortEnd().intValue()))) {
 
                 // we allow port forwarding rules with the same parameters but different protocols
-                boolean allowPf = (rule.getPurpose() == Purpose.PortForwarding && newRule.getPurpose() == Purpose.PortForwarding && !newRule.getProtocol().equalsIgnoreCase(rule.getProtocol()));
-                boolean allowStaticNat = (rule.getPurpose() == Purpose.StaticNat && newRule.getPurpose() == Purpose.StaticNat && !newRule.getProtocol().equalsIgnoreCase(rule.getProtocol()));
+                boolean allowPf = (rule.getPurpose() == Purpose.PortForwarding && newRule.getPurpose() == Purpose.PortForwarding
+                        && !newRule.getProtocol().equalsIgnoreCase(rule.getProtocol()));
+                boolean allowStaticNat = (rule.getPurpose() == Purpose.StaticNat && newRule.getPurpose() == Purpose.StaticNat
+                        && !newRule.getProtocol().equalsIgnoreCase(rule.getProtocol()));
 
                 if (!(allowPf || allowStaticNat || oneOfRulesIsFirewall)) {
                     throw new NetworkRuleConflictException("The range specified, " + newRule.getSourcePortStart() + "-" + newRule.getSourcePortEnd() + ", conflicts with rule " + rule.getId()

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java
index 0d738ee..a17c7cf 100644
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java
@@ -22,6 +22,7 @@ import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.Network;
 import com.cloud.network.VpcVirtualNetworkApplianceService;
 import com.cloud.network.rules.NetworkACL;
+import com.cloud.network.vpc.StaticRouteProfile;
 import com.cloud.network.vpc.Vpc;
 import com.cloud.network.vpc.PrivateGateway;
 import com.cloud.user.Account;
@@ -75,4 +76,12 @@ public interface VpcVirtualNetworkApplianceManager extends VirtualNetworkApplian
      */
     boolean destroyPrivateGateway(PrivateGateway gateway, VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException;
 
+    /**
+     * @param routes
+     * @param routers
+     * @return
+     * @throws ResourceUnavailableException 
+     */
+    boolean applyStaticRoutes(List<StaticRouteProfile> routes, List<DomainRouterVO> routers) throws ResourceUnavailableException;
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
index 405cf3c..f838885 100644
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -35,6 +35,7 @@ import com.cloud.agent.api.routing.IpAssocVpcCommand;
 import com.cloud.agent.api.routing.NetworkElementCommand;
 import com.cloud.agent.api.routing.SetNetworkACLCommand;
 import com.cloud.agent.api.routing.SetSourceNatCommand;
+import com.cloud.agent.api.routing.SetStaticRouteCommand;
 import com.cloud.agent.api.to.IpAddressTO;
 import com.cloud.agent.api.to.NetworkACLTO;
 import com.cloud.agent.api.to.NicTO;
@@ -72,6 +73,7 @@ import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.firewall.NetworkACLService;
 import com.cloud.network.rules.NetworkACL;
 import com.cloud.network.vpc.PrivateGateway;
+import com.cloud.network.vpc.StaticRouteProfile;
 import com.cloud.network.vpc.Vpc;
 import com.cloud.network.vpc.Dao.VpcDao;
 import com.cloud.network.vpc.Dao.VpcOfferingDao;
@@ -183,7 +185,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
         long dcId = dest.getDataCenter().getId();
         
         DeploymentPlan plan = new DataCenterDeployment(dcId);
-        List<DomainRouterVO> routers = _routerDao.listRoutersByVpcId(vpcId);
+        List<DomainRouterVO> routers = _routerDao.listByVpcId(vpcId);
         
         return new Pair<DeploymentPlan, List<DomainRouterVO>>(plan, routers);
     }
@@ -668,7 +670,8 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
     }
 
     
-    protected boolean sendNetworkACLs(VirtualRouter router, List<NetworkACL> rules, long guestNetworkId) throws ResourceUnavailableException {
+    protected boolean sendNetworkACLs(VirtualRouter router, List<NetworkACL> rules, long guestNetworkId) 
+            throws ResourceUnavailableException {
         Commands cmds = new Commands(OnError.Continue);
         createNetworkACLsCommands(rules, router, cmds, guestNetworkId);
         return sendCommandsToRouter(router, cmds);
@@ -936,4 +939,37 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
             }
         }
     }
+
+    @Override
+    public boolean applyStaticRoutes(List<StaticRouteProfile> staticRoutes, List<DomainRouterVO> routers) throws ResourceUnavailableException {
+        if (staticRoutes == null || staticRoutes.isEmpty()) {
+            s_logger.debug("No static routes to apply");
+            return true;
+        }
+        
+        //send commands to only one router as there is only one in the VPC
+        return sendStaticRoutes(staticRoutes, routers.get(0));     
+         
+    }
+    
+    protected boolean sendStaticRoutes(List<StaticRouteProfile> staticRoutes, DomainRouterVO router) 
+            throws ResourceUnavailableException {
+        Commands cmds = new Commands(OnError.Continue);
+        createStaticRouteCommands(staticRoutes, router, cmds);
+        return sendCommandsToRouter(router, cmds);
+    }
+
+    /**
+     * @param staticRoutes
+     * @param router
+     * @param cmds
+     */
+    private void createStaticRouteCommands(List<StaticRouteProfile> staticRoutes, DomainRouterVO router, Commands cmds) {
+        SetStaticRouteCommand cmd = new SetStaticRouteCommand(staticRoutes);
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+        DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn());
+        cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+        cmds.addCommand(cmd);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/server/src/com/cloud/network/vpc/Dao/StaticRouteDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/Dao/StaticRouteDao.java b/server/src/com/cloud/network/vpc/Dao/StaticRouteDao.java
index f4bc80a..9f5a339 100644
--- a/server/src/com/cloud/network/vpc/Dao/StaticRouteDao.java
+++ b/server/src/com/cloud/network/vpc/Dao/StaticRouteDao.java
@@ -12,6 +12,9 @@
 // Automatically generated by addcopyright.py at 04/03/2012
 package com.cloud.network.vpc.Dao;
 
+import java.util.List;
+
+import com.cloud.network.vpc.StaticRoute;
 import com.cloud.network.vpc.StaticRouteVO;
 import com.cloud.utils.db.GenericDao;
 
@@ -19,5 +22,10 @@ import com.cloud.utils.db.GenericDao;
  * @author Alena Prokharchyk
  */
 public interface StaticRouteDao extends GenericDao<StaticRouteVO, Long>{
+    
+    boolean setStateToAdd(StaticRouteVO rule);
 
+    List<? extends StaticRoute> listByGatewayIdAndNotRevoked(long gatewayId);
+    
+    List<? extends StaticRoute> listByVpcId(long vpcId);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/server/src/com/cloud/network/vpc/Dao/StaticRouteDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/Dao/StaticRouteDaoImpl.java b/server/src/com/cloud/network/vpc/Dao/StaticRouteDaoImpl.java
index b25b931..0f03a85 100644
--- a/server/src/com/cloud/network/vpc/Dao/StaticRouteDaoImpl.java
+++ b/server/src/com/cloud/network/vpc/Dao/StaticRouteDaoImpl.java
@@ -12,11 +12,17 @@
 // Automatically generated by addcopyright.py at 04/03/2012
 package com.cloud.network.vpc.Dao;
 
+import java.util.List;
+
 import javax.ejb.Local;
 
+import com.cloud.network.vpc.StaticRoute;
 import com.cloud.network.vpc.StaticRouteVO;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Op;
 
 /**
  * @author Alena Prokharchyk
@@ -25,5 +31,50 @@ import com.cloud.utils.db.GenericDaoBase;
 @Local(value = StaticRouteDao.class)
 @DB(txn = false)
 public class StaticRouteDaoImpl extends GenericDaoBase<StaticRouteVO, Long> implements StaticRouteDao{
+    protected final SearchBuilder<StaticRouteVO> AllFieldsSearch;
+    protected final SearchBuilder<StaticRouteVO> NotRevokedSearch;
+    
+    protected StaticRouteDaoImpl() {
+        super();
+
+        AllFieldsSearch = createSearchBuilder();
+        AllFieldsSearch.and("gatewayId", AllFieldsSearch.entity().getVpcGatewayId(), Op.EQ);
+        AllFieldsSearch.and("vpcId", AllFieldsSearch.entity().getVpcId(), Op.EQ);
+        AllFieldsSearch.and("state", AllFieldsSearch.entity().getState(), Op.EQ);
+        AllFieldsSearch.and("id", AllFieldsSearch.entity().getId(), Op.EQ);
+        AllFieldsSearch.done();
+        
+        NotRevokedSearch = createSearchBuilder();
+        NotRevokedSearch.and("gatewayId", NotRevokedSearch.entity().getVpcGatewayId(), Op.EQ);
+        NotRevokedSearch.and("state", NotRevokedSearch.entity().getState(), Op.NEQ);
+        NotRevokedSearch.done();
+    }
+
+    
+    @Override
+    public boolean setStateToAdd(StaticRouteVO rule) {
+        SearchCriteria<StaticRouteVO> sc = AllFieldsSearch.create();
+        sc.setParameters("id", rule.getId());
+        sc.setParameters("state", StaticRoute.State.Staged);
+
+        rule.setState(StaticRoute.State.Add);
+
+        return update(rule, sc) > 0;
+    }
+
+
+    @Override
+    public List<? extends StaticRoute> listByGatewayIdAndNotRevoked(long gatewayId) {
+        SearchCriteria<StaticRouteVO> sc = NotRevokedSearch.create();
+        sc.setParameters("gatewayId", gatewayId);
+        sc.setParameters("state", StaticRoute.State.Revoke);
+        return listBy(sc);
+    }
 
+    @Override
+    public List<? extends StaticRoute> listByVpcId(long vpcId) {
+        SearchCriteria<StaticRouteVO> sc = AllFieldsSearch.create();
+        sc.setParameters("vpcId", vpcId);
+        return listBy(sc);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/server/src/com/cloud/network/vpc/StaticRouteVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/StaticRouteVO.java b/server/src/com/cloud/network/vpc/StaticRouteVO.java
index f8b59a0..8859aa8 100644
--- a/server/src/com/cloud/network/vpc/StaticRouteVO.java
+++ b/server/src/com/cloud/network/vpc/StaticRouteVO.java
@@ -72,13 +72,17 @@ public class StaticRouteVO implements Identity, StaticRoute{
      * @param vpcGatewayId
      * @param cidr
      * @param vpcId
+     * @param accountId TODO
+     * @param domainId TODO
      */
-    public StaticRouteVO(long vpcGatewayId, String cidr, Long vpcId) {
+    public StaticRouteVO(long vpcGatewayId, String cidr, Long vpcId, long accountId, long domainId) {
         super();
         this.vpcGatewayId = vpcGatewayId;
         this.cidr = cidr;
         this.state = State.Staged;
         this.vpcId = vpcId;
+        this.accountId = accountId;
+        this.domainId = domainId;
         this.uuid = UUID.randomUUID().toString();
     }
     
@@ -121,4 +125,15 @@ public class StaticRouteVO implements Identity, StaticRoute{
     public long getDomainId() {
         return domainId;
     }
+
+    public void setState(State state) {
+        this.state = state;
+    }
+    
+    @Override
+    public String toString() {
+        StringBuilder buf = new StringBuilder("StaticRoute[");
+        buf.append(uuid).append("|").append(cidr).append("|").append(vpcGatewayId).append("]");
+        return buf.toString();
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index f21ca70..0eeb47a 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -77,6 +77,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.ReservationContext;
@@ -611,7 +612,6 @@ public class VpcManagerImpl implements VpcManager, Manager{
         sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ);
         sb.and("restartRequired", sb.entity().isRestartRequired(), SearchCriteria.Op.EQ);
 
-
         // now set the SC criteria...
         SearchCriteria<VpcVO> sc = sb.create();
         _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);  
@@ -796,7 +796,7 @@ public class VpcManagerImpl implements VpcManager, Manager{
         }
         
         try {
-          //1) CIDR is required
+            //1) CIDR is required
             if (cidr == null) {
                 throw new InvalidParameterValueException("Gateway/netmask are required when create network for VPC");
             }
@@ -930,7 +930,7 @@ public class VpcManagerImpl implements VpcManager, Manager{
     
     @Override
     public List<DomainRouterVO> getVpcRouters(long vpcId) {
-        return _routerDao.listRoutersByVpcId(vpcId);
+        return _routerDao.listByVpcId(vpcId);
     }
 
     @Override
@@ -1110,26 +1110,193 @@ public class VpcManagerImpl implements VpcManager, Manager{
     }
 
     @Override
-    public boolean applyStaticRoutes(long vpcId) {
-        // TODO Auto-generated method stub
-        return false;
+    public boolean applyStaticRoutes(long vpcId) throws ResourceUnavailableException {
+        Account caller = UserContext.current().getCaller();
+        List<? extends StaticRoute> routes = _staticRouteDao.listByVpcId(vpcId);
+        return applyStaticRoutes(routes, caller);
+    }
+
+    protected boolean applyStaticRoutes(List<? extends StaticRoute> routes, Account caller) throws ResourceUnavailableException {
+        boolean success = true;
+        List<StaticRouteProfile> staticRouteProfiles = new ArrayList<StaticRouteProfile>(routes.size());
+        Map<Long, PrivateGateway> gatewayMap = new HashMap<Long, PrivateGateway>();
+        for (StaticRoute route : routes) {
+            PrivateGateway gateway = gatewayMap.get(route.getVpcGatewayId());
+            if (gateway == null) {
+                gateway = getVpcPrivateGateway(route.getVpcGatewayId());
+                gatewayMap.put(gateway.getId(), gateway);
+            }
+            staticRouteProfiles.add(new StaticRouteProfile(route, gateway));
+        }
+        if (!applyStaticRoutes(staticRouteProfiles)) {
+            s_logger.warn("Routes are not completely applied");
+            return false;
+        } else {
+            for (StaticRoute route : routes) {
+                if (route.getState() == StaticRoute.State.Revoke) {
+                    _staticRouteDao.remove(route.getId());
+                } else if (route.getState() == StaticRoute.State.Add) {
+                    StaticRouteVO ruleVO = _staticRouteDao.findById(route.getId());
+                    ruleVO.setState(StaticRoute.State.Active);
+                    _staticRouteDao.update(ruleVO.getId(), ruleVO);
+                }
+            } 
+        }
+
+        return success;
+    }   
+    
+    protected boolean applyStaticRoutes(List<StaticRouteProfile> routes) throws ResourceUnavailableException{
+        if (routes.isEmpty()) {
+            s_logger.debug("No static routes to apply");
+            return true;
+        }
+        Vpc vpc = getVpc(routes.get(0).getVpcId());
+        
+        s_logger.debug("Applying static routes for vpc " + vpc);
+        if (getVpcElement().applyStaticRoutes(vpc, routes)) {
+            s_logger.debug("Applied static routes for vpc " + vpc);
+        } else {
+            s_logger.warn("Failed to apply static routes for vpc " + vpc);
+            return false;
+        }
+        
+        return true;
     }
 
     @Override
-    public boolean revokeStaticRoute(long routeId) {
-        // TODO Auto-generated method stub
-        return false;
+    public boolean revokeStaticRoute(long routeId) throws ResourceUnavailableException {
+        Account caller = UserContext.current().getCaller();
+        
+        StaticRouteVO route = _staticRouteDao.findById(routeId);
+        if (route == null) {
+            throw new InvalidParameterValueException("Unable to find static route by id");
+        }
+
+        _accountMgr.checkAccess(caller, null, false, route);
+
+        revokeStaticRoute(route, caller);
+
+        return applyStaticRoutes(route.getVpcId());
+        
     }
 
     @Override
+    @DB
     public StaticRoute createStaticRoute(long gatewayId, String cidr) throws NetworkRuleConflictException {
-        // TODO Auto-generated method stub
-        return null;
+        Account caller = UserContext.current().getCaller();
+        
+        //parameters validation
+        PrivateGateway gateway = getVpcPrivateGateway(gatewayId);
+        if (gateway == null) {
+            throw new InvalidParameterValueException("Invalid gateway id is given");
+        }
+        
+        Vpc vpc = getVpc(gateway.getVpcId());  
+        _accountMgr.checkAccess(caller, null, false, vpc);
+        
+        if (!NetUtils.isValidCIDR(cidr)){
+            throw new InvalidParameterValueException("Invalid format for cidr " + cidr);
+        }
+        
+        //TODO - check cidr for the conflicts
+        Transaction txn = Transaction.currentTxn();
+        txn.start();
+        
+        StaticRouteVO newRoute = new StaticRouteVO(gateway.getId(), cidr, vpc.getId(), vpc.getAccountId(), vpc.getDomainId());
+        s_logger.debug("Adding static route " + newRoute);
+        newRoute = _staticRouteDao.persist(newRoute);
+        
+        detectRoutesConflict(newRoute);
+
+        if (!_staticRouteDao.setStateToAdd(newRoute)) {
+            throw new CloudRuntimeException("Unable to update the state to add for " + newRoute);
+        }
+        UserContext.current().setEventDetails("Static route Id: " + newRoute.getId());
+        
+        txn.commit();
+
+        return newRoute;
     }
 
     @Override
     public List<? extends StaticRoute> listStaticRoutes(ListStaticRoutesCmd cmd) {
-        // TODO Auto-generated method stub
-        return null;
+        Long id = cmd.getId();
+        Long gatewayId = cmd.getGatewayId();
+        Long vpcId = cmd.getVpcId();
+        Long domainId = cmd.getDomainId();
+        Boolean isRecursive = cmd.isRecursive();
+        Boolean listAll = cmd.listAll();
+        String accountName = cmd.getAccountName();
+
+        Account caller = UserContext.current().getCaller();
+        List<Long> permittedAccounts = new ArrayList<Long>();
+        
+        Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<Long, Boolean, 
+                ListProjectResourcesCriteria>(domainId, isRecursive, null);
+        _accountMgr.buildACLSearchParameters(caller, id, accountName, null, permittedAccounts, domainIdRecursiveListProject,
+                listAll, false);
+        domainId = domainIdRecursiveListProject.first();
+        isRecursive = domainIdRecursiveListProject.second();
+        ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third();
+        Filter searchFilter = new Filter(StaticRouteVO.class, "created", false, cmd.getStartIndex(), cmd.getPageSizeVal());
+
+        SearchBuilder<StaticRouteVO> sb = _staticRouteDao.createSearchBuilder();
+        _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
+
+        sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
+        sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ);
+        sb.and("vpcGatewayId", sb.entity().getVpcGatewayId(), SearchCriteria.Op.EQ);
+        
+        SearchCriteria<StaticRouteVO> sc = sb.create();
+        _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);  
+        
+        if (id != null) {
+            sc.addAnd("id", Op.EQ, id);
+        }
+        
+        if (vpcId != null) {
+            sc.addAnd("vpcId", Op.EQ, vpcId);
+        }
+        
+        if (gatewayId != null) {
+            sc.addAnd("vpcGatewayId", Op.EQ, vpcId);
+        }
+        
+        return _staticRouteDao.search(sc, searchFilter);
+    }
+    
+    protected void detectRoutesConflict(StaticRoute newRoute) throws NetworkRuleConflictException {
+        List<? extends StaticRoute> routes = _staticRouteDao.listByGatewayIdAndNotRevoked(newRoute.getVpcGatewayId());
+        assert (routes.size() >= 1) : "For static routes, we now always first persist the route and then check for " +
+                "network conflicts so we should at least have one rule at this point.";
+        
+        for (StaticRoute route : routes) {
+            if (route.getId() == newRoute.getId()) {
+                continue; // Skips my own route.
+            }
+            
+            if (NetUtils.isNetworksOverlap(route.getCidr(), newRoute.getCidr())) {
+                throw new NetworkRuleConflictException("New static route cidr conflicts with existing route " + route);
+            }
+        }
+    }
+    
+    protected void revokeStaticRoute(StaticRouteVO route, Account caller) {
+        s_logger.debug("Revoking static route " + route);
+        if (caller != null) {
+            _accountMgr.checkAccess(caller, null, false, route);
+        }
+
+        if (route.getState() == StaticRoute.State.Staged) {
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("Found a static route that is still in stage state so just removing it: " + route);
+            }
+            _staticRouteDao.remove(route.getId());
+        } else if (route.getState() == StaticRoute.State.Add || route.getState() == StaticRoute.State.Active) {
+            route.setState(StaticRoute.State.Revoke);
+            _staticRouteDao.update(route.getId(), route);
+        }
+
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/server/src/com/cloud/vm/dao/DomainRouterDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/DomainRouterDao.java b/server/src/com/cloud/vm/dao/DomainRouterDao.java
index 11f93bb..ed86184 100755
--- a/server/src/com/cloud/vm/dao/DomainRouterDao.java
+++ b/server/src/com/cloud/vm/dao/DomainRouterDao.java
@@ -110,7 +110,7 @@ public interface DomainRouterDao extends GenericDao<DomainRouterVO, Long> {
      * @param vpcId
      * @return
      */
-    List<DomainRouterVO> listRoutersByVpcId(long vpcId);
+    List<DomainRouterVO> listByVpcId(long vpcId);
 
     /**
      * @param routerId

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1a232171/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
index f0257ac..c58cc4a 100755
--- a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
+++ b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
@@ -303,7 +303,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase<DomainRouterVO, Long> im
     }
     
     @Override
-    public List<DomainRouterVO> listRoutersByVpcId(long vpcId) {
+    public List<DomainRouterVO> listByVpcId(long vpcId) {
         SearchCriteria<DomainRouterVO> sc = VpcSearch.create();
         sc.setParameters("vpcId", vpcId);
         sc.setParameters("role", Role.VIRTUAL_ROUTER);