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;
