add support for sequence numner in the VPC topology updates and VPC
routing policy updates


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

Branch: refs/heads/4.4-forward
Commit: 192856fdcc78b1839bf97c785d357c7542b3e321
Parents: bc9737e
Author: Murali Reddy <[email protected]>
Authored: Tue Apr 15 15:52:12 2014 +0530
Committer: Murali Reddy <[email protected]>
Committed: Fri Apr 18 18:14:13 2014 +0530

----------------------------------------------------------------------
 plugins/hypervisors/kvm/agent-descriptor.xml    | 68 ++++++++++++++++++
 .../xen/resource/CitrixResourceBase.java        |  7 +-
 .../cloudstack/ovs/spring-ovs-context.xml       |  3 +-
 .../OvsVpcPhysicalTopologyConfigCommand.java    | 12 ++++
 .../api/OvsVpcRoutingPolicyConfigCommand.java   | 10 +++
 .../cloud/network/ovs/OvsTunnelManagerImpl.java | 41 ++++++++++-
 .../ovs/dao/VpcDistributedRouterSeqNoDao.java   | 23 +++++++
 .../dao/VpcDistributedRouterSeqNoDaoImpl.java   | 47 +++++++++++++
 .../ovs/dao/VpcDistributedRouterSeqNoVO.java    | 72 ++++++++++++++++++++
 .../xenserver/cloudstack_pluginlib.py           |  4 +-
 scripts/vm/hypervisor/xenserver/ovstunnel       |  6 +-
 setup/db/db/schema-430to440.sql                 |  8 ++-
 12 files changed, 291 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/plugins/hypervisors/kvm/agent-descriptor.xml
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/agent-descriptor.xml 
b/plugins/hypervisors/kvm/agent-descriptor.xml
new file mode 100644
index 0000000..51024a8
--- /dev/null
+++ b/plugins/hypervisors/kvm/agent-descriptor.xml
@@ -0,0 +1,68 @@
+<!--
+  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.
+-->
+<assembly 
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2";
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+    
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
 http://maven.apache.org/xsd/assembly-1.1.2.xsd";>
+  <id>kvm-agent</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <includeBaseDirectory>yes</includeBaseDirectory>
+  <dependencySets>
+    <dependencySet>
+      <outputDirectory></outputDirectory>
+      <useProjectArtifact/>
+    </dependencySet>
+  </dependencySets>
+  <fileSets>
+    <fileSet>
+      <directory>../../../agent/scripts</directory>
+      <outputDirectory></outputDirectory>
+      <fileMode>774</fileMode>
+      <includes>
+       <include>run.sh</include>
+       <include>_run.sh</include>
+       <include>agent.sh</include>
+      </includes>
+    </fileSet>
+    <fileSet>
+      <directory>target</directory>
+      <outputDirectory></outputDirectory>
+      <fileMode>555</fileMode>
+      <includes>
+       <include>cloud-plugin-hypervisor-kvm-*.jar</include>
+      </includes>
+    </fileSet>
+    <fileSet>
+      <directory>../../../scripts</directory>
+      <outputDirectory>scripts</outputDirectory>
+      <fileMode>555</fileMode>
+    </fileSet>
+    <fileSet>
+      <directory>../../../agent/conf</directory>
+      <outputDirectory>conf</outputDirectory>
+      <directoryMode>555</directoryMode>
+      <fileMode>774</fileMode>
+      <includes>
+       <include>agent.properties</include>
+       <include>log4j-cloud.xml</include>
+      </includes>
+    </fileSet>
+  </fileSets>
+</assembly> 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 486e946..3fc7974 100644
--- 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -5305,8 +5305,10 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         try {
             Network nw = findOrCreateTunnelNetwork(conn, cmd.getBridgeName());
             String bridgeName = nw.getBridge(conn);
+            long sequenceNo = cmd.getSequenceNumber();
             String result = callHostPlugin(conn, "ovstunnel", 
"configure_ovs_bridge_for_network_topology", "bridge",
-                    bridgeName, "config", cmd.getVpcConfigInJson(), "host-id", 
((Long)cmd.getHostId()).toString());
+                    bridgeName, "config", cmd.getVpcConfigInJson(), "host-id", 
((Long)cmd.getHostId()).toString(),
+                    "seq-no", Long.toString(sequenceNo));
                 if (result.startsWith("SUCCESS")) {
                 return new Answer(cmd, true, result);
             } else {
@@ -5323,10 +5325,11 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         try {
             Network nw = findOrCreateTunnelNetwork(conn, cmd.getBridgeName());
             String bridgeName = nw.getBridge(conn);
+            long sequenceNo = cmd.getSequenceNumber();
 
             String result = callHostPlugin(conn, "ovstunnel", 
"configure_ovs_bridge_for_routing_policies", "bridge",
                     bridgeName, "host-id", ((Long)cmd.getHostId()).toString(), 
"config",
-                    cmd.getVpcConfigInJson());
+                    cmd.getVpcConfigInJson(), "seq-no", 
Long.toString(sequenceNo));
             if (result.startsWith("SUCCESS")) {
                 return new Answer(cmd, true, result);
             } else {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/plugins/network-elements/ovs/resources/META-INF/cloudstack/ovs/spring-ovs-context.xml
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/ovs/resources/META-INF/cloudstack/ovs/spring-ovs-context.xml
 
b/plugins/network-elements/ovs/resources/META-INF/cloudstack/ovs/spring-ovs-context.xml
index fa56d5d..086ffd6 100644
--- 
a/plugins/network-elements/ovs/resources/META-INF/cloudstack/ovs/spring-ovs-context.xml
+++ 
b/plugins/network-elements/ovs/resources/META-INF/cloudstack/ovs/spring-ovs-context.xml
@@ -39,4 +39,5 @@
     <bean id="ovsTunnelInterfaceDaoImpl" 
class="com.cloud.network.ovs.dao.OvsTunnelInterfaceDaoImpl" />
     <bean id="ovsTunnelNetworkDaoImpl" 
class="com.cloud.network.ovs.dao.OvsTunnelNetworkDaoImpl" />
     <bean id="ovsNetworkTopologyGuruImpl" 
class="com.cloud.network.ovs.OvsNetworkTopologyGuruImpl"/>
-</beans>
+    <bean id="VpcDistributedRouterSeqNoDaoImpl" 
class="com.cloud.network.ovs.dao.VpcDistributedRouterSeqNoDaoImpl"/>
+  </beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
 
b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
index 17299d3..403dff4 100644
--- 
a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
+++ 
b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
@@ -32,6 +32,9 @@ public class OvsVpcPhysicalTopologyConfigCommand extends 
Command {
     long hostId;
     String bridgeName;
 
+    long sequenceNumber;
+    String schemaVersion;
+
     public static class Host {
         long hostId;
         String ipAddress;
@@ -127,4 +130,13 @@ public class OvsVpcPhysicalTopologyConfigCommand extends 
Command {
     public void setBridgeName(String bridgeName) {
         this.bridgeName = bridgeName;
     }
+
+    public long getSequenceNumber() {
+        return sequenceNumber;
+    }
+
+    public void setSequenceNumber(long sequenceNumber) {
+        this.sequenceNumber = sequenceNumber;
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
 
b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
index 50f1fdd..d9514d5 100644
--- 
a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
+++ 
b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
@@ -27,6 +27,8 @@ public class OvsVpcRoutingPolicyConfigCommand extends Command 
{
     VpcConfig vpcConfig =null;
     long hostId;
     String bridgeName;
+    long sequenceNumber;
+    String schemaVersion;
 
     public static class AclItem {
         int number;
@@ -120,4 +122,12 @@ public class OvsVpcRoutingPolicyConfigCommand extends 
Command {
     public boolean executeInSequence() {
         return false;
     }
+
+    public long getSequenceNumber() {
+        return sequenceNumber;
+    }
+
+    public void setSequenceNumber(long sequenceNumber) {
+        this.sequenceNumber = sequenceNumber;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
 
b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
index a86106e..c755d72 100644
--- 
a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
+++ 
b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
@@ -78,9 +78,14 @@ import com.cloud.network.ovs.dao.OvsTunnelInterfaceVO;
 import com.cloud.network.ovs.dao.OvsTunnelNetworkDao;
 import com.cloud.network.ovs.dao.OvsTunnelNetworkVO;
 import com.cloud.network.ovs.dao.OvsTunnel;
+import com.cloud.network.ovs.dao.VpcDistributedRouterSeqNoDao;
+import com.cloud.network.ovs.dao.VpcDistributedRouterSeqNoVO;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
+import com.cloud.utils.db.TransactionStatus;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.fsm.StateListener;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.dao.DomainRouterDao;
@@ -128,6 +133,8 @@ public class OvsTunnelManagerImpl extends ManagerBase 
implements OvsTunnelManage
     NetworkACLDao _networkACLDao;
     @Inject
     NetworkACLItemDao _networkACLItemDao;
+    @Inject
+    VpcDistributedRouterSeqNoDao _vpcDrSeqNoDao;
 
     @Override
     public boolean configure(String name, Map<String, Object> params)
@@ -683,7 +690,7 @@ public class OvsTunnelManagerImpl extends ManagerBase 
implements OvsTunnelManage
         return true;
     }
 
-    public void handleVmStateChange(VMInstanceVO vm) {
+    private void handleVmStateChange(VMInstanceVO vm) {
 
         // get the VPC's impacted with the VM start
         List<Long> vpcIds = 
_ovsNetworkToplogyGuru.getVpcIdsVmIsPartOf(vm.getId());
@@ -693,6 +700,7 @@ public class OvsTunnelManagerImpl extends ManagerBase 
implements OvsTunnelManage
 
         for (Long vpcId: vpcIds) {
             VpcVO vpc = _vpcDao.findById(vpcId);
+            // nothing to do if the VPC is not setup for distributed routing
             if (vpc == null || !vpc.usesDistributedRouter()) {
                 return;
             }
@@ -702,6 +710,9 @@ public class OvsTunnelManagerImpl extends ManagerBase 
implements OvsTunnelManage
             String bridgeName=generateBridgeNameForVpc(vpcId);
 
             OvsVpcPhysicalTopologyConfigCommand topologyConfigCommand = 
prepareVpcTopologyUpdate(vpcId);
+            
topologyConfigCommand.setSequenceNumber(getNextSequenceNumber(vpcId));
+
+            // send topology change update to VPC spanned hosts
             for (Long id: vpcSpannedHostIds) {
                 if (!sendVpcTopologyChangeUpdate(topologyConfigCommand, id, 
bridgeName)) {
                     s_logger.debug("Failed to send VPC topology change update 
to host : " + id + ". Moving on " +
@@ -809,6 +820,10 @@ public class OvsTunnelManagerImpl extends ManagerBase 
implements OvsTunnelManage
                 if (network.getVpcId() != null && 
isVpcEnabledForDistributedRouter(network.getVpcId())) {
                     long vpcId = network.getVpcId();
                     OvsVpcRoutingPolicyConfigCommand cmd = 
prepareVpcRoutingPolicyUpdate(vpcId);
+                    cmd.setSequenceNumber(getNextSequenceNumber(vpcId));
+
+                    // get the list of hosts on which VPC spans (i.e hosts 
that need to be aware of VPC
+                    // network ACL update)
                     List<Long> vpcSpannedHostIds = 
_ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
                     for (Long id: vpcSpannedHostIds) {
                         if (!sendVpcRoutingPolicyChangeUpdate(cmd, id, 
bridgeName)) {
@@ -867,7 +882,7 @@ public class OvsTunnelManagerImpl extends ManagerBase 
implements OvsTunnelManage
         return cmd;
     }
 
-    public boolean 
sendVpcRoutingPolicyChangeUpdate(OvsVpcRoutingPolicyConfigCommand updateCmd, 
long hostId, String bridgeName) {
+    private boolean 
sendVpcRoutingPolicyChangeUpdate(OvsVpcRoutingPolicyConfigCommand updateCmd, 
long hostId, String bridgeName) {
         try {
             s_logger.debug("Sending VPC routing policies change update to the 
host " + hostId);
             updateCmd.setHostId(hostId);
@@ -885,4 +900,26 @@ public class OvsTunnelManagerImpl extends ManagerBase 
implements OvsTunnelManage
             return false;
         }
     }
+
+    private long getNextSequenceNumber(final long vpcId) {
+
+        try {
+            return  Transaction.execute(new TransactionCallback<Long>() {
+                @Override
+                public Long doInTransaction(TransactionStatus status) {
+                    VpcDistributedRouterSeqNoVO seqVo = 
_vpcDrSeqNoDao.findByVpcId(vpcId);
+                    if (seqVo == null) {
+                        seqVo = new VpcDistributedRouterSeqNoVO(vpcId);
+                        _vpcDrSeqNoDao.persist(seqVo);
+                    }
+                    _vpcDrSeqNoDao.lockRow(seqVo.getId(), true);
+                    seqVo.incrSequenceNo();
+                    _vpcDrSeqNoDao.update(seqVo.getId(), seqVo);
+                    return seqVo.getSequenceNo();
+                }
+            });
+        } finally {
+
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoDao.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoDao.java
 
b/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoDao.java
new file mode 100644
index 0000000..9965510
--- /dev/null
+++ 
b/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoDao.java
@@ -0,0 +1,23 @@
+// 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.ovs.dao;
+
+import com.cloud.utils.db.GenericDao;
+
+public interface VpcDistributedRouterSeqNoDao extends 
GenericDao<VpcDistributedRouterSeqNoVO, Long> {
+    VpcDistributedRouterSeqNoVO findByVpcId(long vpcId);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoDaoImpl.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoDaoImpl.java
 
b/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoDaoImpl.java
new file mode 100644
index 0000000..88fa9c1
--- /dev/null
+++ 
b/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoDaoImpl.java
@@ -0,0 +1,47 @@
+// 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.ovs.dao;
+
+import javax.ejb.Local;
+
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+
+@Component
+@Local(value = {VpcDistributedRouterSeqNoDao.class})
+public class VpcDistributedRouterSeqNoDaoImpl extends 
GenericDaoBase<VpcDistributedRouterSeqNoVO, Long> implements 
VpcDistributedRouterSeqNoDao {
+    protected static final Logger s_logger = 
Logger.getLogger(VpcDistributedRouterSeqNoDaoImpl.class);
+    private SearchBuilder<VpcDistributedRouterSeqNoVO> VpcIdSearch;
+
+    protected VpcDistributedRouterSeqNoDaoImpl() {
+        VpcIdSearch = createSearchBuilder();
+        VpcIdSearch.and("vmId", VpcIdSearch.entity().getVpcId(), 
SearchCriteria.Op.EQ);
+        VpcIdSearch.done();
+    }
+
+    @Override
+    public VpcDistributedRouterSeqNoVO findByVpcId(long vpcId) {
+        SearchCriteria<VpcDistributedRouterSeqNoVO> sc = VpcIdSearch.create();
+        sc.setParameters("vmId", vpcId);
+        return findOneIncludingRemovedBy(sc);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoVO.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoVO.java
 
b/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoVO.java
new file mode 100644
index 0000000..d87a2c4
--- /dev/null
+++ 
b/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/VpcDistributedRouterSeqNoVO.java
@@ -0,0 +1,72 @@
+// 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.ovs.dao;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import org.apache.cloudstack.api.InternalIdentity;
+
+@Entity
+@Table(name = "op_vpc_distributed_router_sequence_no")
+public class VpcDistributedRouterSeqNoVO implements InternalIdentity {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+
+    @Column(name = "vpc_id", updatable = false, nullable = false)
+    private Long vpcId;
+
+    @Column(name = "sequence_no")
+    long sequenceNo = 0;
+
+    protected VpcDistributedRouterSeqNoVO() {
+
+    }
+
+    public VpcDistributedRouterSeqNoVO(Long vpcId) {
+        super();
+        this.vpcId = vpcId;
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    public Long getVpcId() {
+        return vpcId;
+    }
+
+    public void setVpcId(Long vpcId) {
+        this.vpcId = vpcId;
+    }
+
+    public long getSequenceNo() {
+        return sequenceNo;
+    }
+
+    public void incrSequenceNo() {
+        sequenceNo++;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py 
b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
index 85daa86..cda3645 100644
--- a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
+++ b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
@@ -314,7 +314,7 @@ class jsonLoader(object):
         return '{%s}' % str(', '.join('%s : %s' % (k, repr(v)) for (k, v)
                                       in self.__dict__.iteritems()))
 
-def configure_bridge_for_network_topology(bridge, this_host_id, json_config):
+def configure_bridge_for_network_topology(bridge, this_host_id, json_config, 
sequence_no):
     vpconfig = jsonLoader(json.loads(json_config)).vpc
 
     if vpconfig is None:
@@ -389,7 +389,7 @@ def get_acl(vpcconfig, required_acl_id):
             return acl
     return None
 
-def configure_ovs_bridge_for_routing_policies(bridge, json_config):
+def configure_ovs_bridge_for_routing_policies(bridge, json_config, 
sequence_no):
     vpconfig = jsonLoader(json.loads(json_config)).vpc
 
     if vpconfig is None:

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/scripts/vm/hypervisor/xenserver/ovstunnel
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/ovstunnel 
b/scripts/vm/hypervisor/xenserver/ovstunnel
index f967302..a97df9b 100755
--- a/scripts/vm/hypervisor/xenserver/ovstunnel
+++ b/scripts/vm/hypervisor/xenserver/ovstunnel
@@ -400,15 +400,17 @@ def configure_ovs_bridge_for_network_topology(session, 
args):
     bridge = args.pop("bridge")
     json_config = args.pop("config")
     this_host_id = args.pop("host-id")
+    sequence_no = args.pop("seq-no")
 
-    return lib.configure_bridge_for_network_topology(bridge, this_host_id, 
json_config)
+    return lib.configure_bridge_for_network_topology(bridge, this_host_id, 
json_config, sequence_no)
 
 @echo
 def configure_ovs_bridge_for_routing_policies(session, args):
     bridge = args.pop("bridge")
     json_config = args.pop("config")
+    sequence_no = args.pop("seq-no")
 
-    return lib.configure_ovs_bridge_for_routing_policies(bridge, json_config)
+    return lib.configure_ovs_bridge_for_routing_policies(bridge, json_config, 
sequence_no)
 
 if __name__ == "__main__":
     XenAPIPlugin.dispatch({"create_tunnel": create_tunnel,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/192856fd/setup/db/db/schema-430to440.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-430to440.sql b/setup/db/db/schema-430to440.sql
index fff0ea3..5185670 100644
--- a/setup/db/db/schema-430to440.sql
+++ b/setup/db/db/schema-430to440.sql
@@ -770,5 +770,11 @@ ALTER TABLE `cloud`.`networks` ADD COLUMN streched_l2 
boolean default false;
 ALTER TABLE `cloud`.`vpc` ADD COLUMN region_level_vpc boolean default false;
 ALTER TABLE `cloud`.`load_balancer_vm_map` ADD COLUMN instance_ip VARCHAR(40);
 ALTER TABLE `cloud`.`load_balancer_vm_map` DROP KEY `load_balancer_id`, ADD 
UNIQUE KEY load_balancer_id (`load_balancer_id`, `instance_id`, `instance_ip`);
-
 INSERT INTO `cloud`.`configuration`(category, instance, component, name, 
value, description, default_value) VALUES ('Advanced', 'DEFAULT', 
'NetworkOrchestrationService', 'router.redundant.vrrp.interval', '1', 'seconds 
between VRRP broadcast. It would 3 times broadcast fail to trigger fail-over 
mechanism of redundant router', '1') ON DUPLICATE KEY UPDATE 
category='Advanced';
+CREATE TABLE `cloud`.`op_vpc_distributed_router_sequence_no` (
+  `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `vpc_id` bigint unsigned NOT NULL COMMENT 'vpc id.',
+  `sequence_no` bigint unsigned  COMMENT 'seq number to be sent to agent, 
uniquely identifies topology or routing policy updates',
+  PRIMARY KEY (`id`),
+  UNIQUE `u_op_vpc_distributed_router_sequence_no_vpc_id`(`vpc_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Reply via email to