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/16 00:38:02 UTC
[5/51] [abbrv] git commit: Isolated non-vpc networks: start router
with 3 nics from the very beginning
Isolated non-vpc networks: start router with 3 nics from the very beginning
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/9ae62d32
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/9ae62d32
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/9ae62d32
Branch: refs/heads/vpc
Commit: 9ae62d32cd760fff6fa1cbd2bb76839ed11ab0c9
Parents: b3985a3
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Wed Jun 13 14:56:04 2012 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri Jun 15 14:33:14 2012 -0700
----------------------------------------------------------------------
.../network/VpcVirtualNetworkApplianceService.java | 3 +-
.../router/VirtualNetworkApplianceManagerImpl.java | 233 ++++++++++++---
.../VpcVirtualNetworkApplianceManagerImpl.java | 45 ++-
wscript | 2 +-
4 files changed, 226 insertions(+), 57 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/9ae62d32/api/src/com/cloud/network/VpcVirtualNetworkApplianceService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/VpcVirtualNetworkApplianceService.java b/api/src/com/cloud/network/VpcVirtualNetworkApplianceService.java
index b8a3781..078d405 100644
--- a/api/src/com/cloud/network/VpcVirtualNetworkApplianceService.java
+++ b/api/src/com/cloud/network/VpcVirtualNetworkApplianceService.java
@@ -31,7 +31,8 @@ public interface VpcVirtualNetworkApplianceService {
* @throws ResourceUnavailableException
* @throws InsufficientCapacityException
*/
- boolean addVpcRouterToGuestNetwork(VirtualRouter router, Network network, boolean isRedundant) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
+ boolean addVpcRouterToGuestNetwork(VirtualRouter router, Network network, boolean isRedundant)
+ throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
/**
* @param router
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/9ae62d32/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 216622e..bc70945 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -121,6 +121,8 @@ import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.NetworkManager;
import com.cloud.network.NetworkVO;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.Networks.IsolationType;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.PhysicalNetworkServiceProvider;
import com.cloud.network.PublicIpAddress;
@@ -1210,8 +1212,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
s_logger.error("Didn't support redundant virtual router without public network!");
return null;
}
-
-
//1) Get deployment plan and find out the list of routers
boolean isPodBased = (dest.getDataCenter().getNetworkType() == NetworkType.Basic ||
@@ -1248,16 +1248,24 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
offeringId = _offering.getId();
}
- //3) Deploy Virtual Router(s)
PublicIp sourceNatIp = null;
if (publicNetwork) {
sourceNatIp = _networkMgr.assignSourceNatIpAddressToGuestNetwork(owner, guestNetwork);
}
+
+ //Check if control network has to be set on VR
+ boolean controlNetwork = true;
+ if ( dest.getDataCenter().getNetworkType() == NetworkType.Basic ) {
+ // in basic mode, use private network as control network
+ controlNetwork = false;
+ }
+
+ //3) deploy virtual router(s)
try {
int count = routerCount - routers.size();
for (int i = 0; i < count; i++) {
DomainRouterVO router = deployRouter(owner, dest, plan, params, isRedundant, vrProvider, offeringId,
- null, sourceNatIp);
+ null, sourceNatIp, publicNetwork, controlNetwork, guestNetwork, new Pair<Boolean, PublicIp>(publicNetwork, sourceNatIp));
//add router to router network map
if (!_routerDao.isRouterPartOfGuestNetwork(router.getId(), network.getId())) {
DomainRouterVO routerVO = _routerDao.findById(router.getId());
@@ -1275,7 +1283,8 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
protected DomainRouterVO deployRouter(Account owner, DeployDestination dest, DeploymentPlan plan, Map<Param, Object> params,
boolean isRedundant, VirtualRouterProvider vrProvider, long svcOffId,
- Long vpcId, PublicIp sourceNatIp) throws ConcurrentOperationException,
+ Long vpcId, PublicIp sourceNatIp, boolean setupPublicNetwork, boolean setupControlNetwork, Network guestNetwork,
+ Pair<Boolean, PublicIp> publicNetwork) throws ConcurrentOperationException,
InsufficientAddressCapacityException, InsufficientServerCapacityException, InsufficientCapacityException,
StorageUnavailableException, ResourceUnavailableException {
@@ -1284,8 +1293,9 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
s_logger.debug("Creating the router " + id + " in datacenter " + dest.getDataCenter());
}
- //1) Create router control network
- List<Pair<NetworkVO, NicProfile>> networks = createRouterControlNetwork(owner, isRedundant, plan);
+ //1) Create router networks
+ List<Pair<NetworkVO, NicProfile>> networks = createRouterNetworks(owner, isRedundant, plan, setupControlNetwork,
+ guestNetwork, publicNetwork);
ServiceOfferingVO routerOffering = _serviceOfferingDao.findById(svcOffId);
@@ -1376,17 +1386,85 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
return router;
}
- protected List<Pair<NetworkVO, NicProfile>> createRouterControlNetwork(Account owner, boolean isRedundant,
- DeploymentPlan plan) throws ConcurrentOperationException,
+ protected List<Pair<NetworkVO, NicProfile>> createRouterNetworks(Account owner, boolean isRedundant,
+ DeploymentPlan plan, boolean setupControlNetwork, Network guestNetwork, Pair<Boolean, PublicIp> publicNetwork) throws ConcurrentOperationException,
InsufficientAddressCapacityException {
- //Form control network
- List<Pair<NetworkVO, NicProfile>> networks = new ArrayList<Pair<NetworkVO, NicProfile>>(1);
- List<NetworkOfferingVO> offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemControlNetwork);
- NetworkOfferingVO controlOffering = offerings.get(0);
- NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false).get(0);
- s_logger.debug("Adding nic for Virtual Router in Control network ");
- networks.add(new Pair<NetworkVO, NicProfile>(controlConfig, null));
+
+ boolean setupPublicNetwork = false;
+ if (publicNetwork != null) {
+ setupPublicNetwork = publicNetwork.first();
+ }
+
+ //Form networks
+ List<Pair<NetworkVO, NicProfile>> networks = new ArrayList<Pair<NetworkVO, NicProfile>>(3);
+
+ //1) Guest network
+ boolean hasGuestNetwork = false;
+ if (guestNetwork != null) {
+ s_logger.debug("Adding nic for Virtual Router in Guest network " + guestNetwork);
+ String defaultNetworkStartIp = null;
+ if (guestNetwork.getCidr() != null && !setupPublicNetwork) {
+ String startIp = _networkMgr.getStartIpAddress(guestNetwork.getId());
+ if (startIp != null && _ipAddressDao.findByIpAndSourceNetworkId(guestNetwork.getId(), startIp).getAllocatedTime() == null) {
+ defaultNetworkStartIp = startIp;
+ } else if (s_logger.isDebugEnabled()){
+ s_logger.debug("First ip " + startIp + " in network id=" + guestNetwork.getId() +
+ " is already allocated, can't use it for domain router; will get random ip address from the range");
+ }
+ }
+
+ NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp);
+ if (setupPublicNetwork) {
+ if (isRedundant) {
+ gatewayNic.setIp4Address(_networkMgr.acquireGuestIpAddress(guestNetwork, null));
+ } else {
+ gatewayNic.setIp4Address(guestNetwork.getGateway());
+ }
+ gatewayNic.setBroadcastUri(guestNetwork.getBroadcastUri());
+ gatewayNic.setBroadcastType(guestNetwork.getBroadcastDomainType());
+ gatewayNic.setIsolationUri(guestNetwork.getBroadcastUri());
+ gatewayNic.setMode(guestNetwork.getMode());
+ String gatewayCidr = guestNetwork.getCidr();
+ gatewayNic.setNetmask(NetUtils.getCidrNetmask(gatewayCidr));
+ } else {
+ gatewayNic.setDefaultNic(true);
+ }
+ networks.add(new Pair<NetworkVO, NicProfile>((NetworkVO) guestNetwork, gatewayNic));
+ hasGuestNetwork = true;
+ }
+
+ //2) Control network
+ if (setupControlNetwork) {
+ s_logger.debug("Adding nic for Virtual Router in Control network ");
+ List<NetworkOfferingVO> offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemControlNetwork);
+ NetworkOfferingVO controlOffering = offerings.get(0);
+ NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false).get(0);
+ networks.add(new Pair<NetworkVO, NicProfile>(controlConfig, null));
+ }
+
+ //3) Public network
+ if (setupPublicNetwork) {
+ PublicIp sourceNatIp = publicNetwork.second();
+ s_logger.debug("Adding nic for Virtual Router in Public network ");
+ //if source nat service is supported by the network, get the source nat ip address
+ NicProfile defaultNic = new NicProfile();
+ defaultNic.setDefaultNic(true);
+ defaultNic.setIp4Address(sourceNatIp.getAddress().addr());
+ defaultNic.setGateway(sourceNatIp.getGateway());
+ defaultNic.setNetmask(sourceNatIp.getNetmask());
+ defaultNic.setMacAddress(sourceNatIp.getMacAddress());
+ defaultNic.setBroadcastType(BroadcastDomainType.Vlan);
+ defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag()));
+ defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag()));
+ if (hasGuestNetwork) {
+ defaultNic.setDeviceId(2);
+ }
+ NetworkOfferingVO publicOffering = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemPublicNetwork).get(0);
+ List<NetworkVO> publicNetworks = _networkMgr.setupNetwork(_systemAcct, publicOffering, plan, null, null, false);
+ networks.add(new Pair<NetworkVO, NicProfile>(publicNetworks.get(0), defaultNic));
+ }
+
return networks;
}
@@ -1526,6 +1604,9 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
public boolean finalizeVirtualMachineProfile(VirtualMachineProfile<DomainRouterVO> profile, DeployDestination dest,
ReservationContext context) {
+ boolean dnsProvided = true;
+ boolean dhcpProvided = true;
+ boolean publicNetwork = false;
DataCenterVO dc = _dcDao.findById(dest.getDataCenter().getId());
_dcDao.loadDetails(dc);
@@ -1544,14 +1625,10 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
buf.append(" vmpassword=").append(_configDao.getValue("system.vm.password"));
}
- NicProfile controlNic = null;
+ NicProfile controlNic = null;
String defaultDns1 = null;
String defaultDns2 = null;
-
-
- Iterator<NicProfile> it = profile.getNics().iterator();
- while (it.hasNext()) {
- NicProfile nic = it.next();
+ for (NicProfile nic : profile.getNics()) {
int deviceId = nic.getDeviceId();
buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address());
buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask());
@@ -1560,7 +1637,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
buf.append(" gateway=").append(nic.getGateway());
defaultDns1 = nic.getDns1();
defaultDns2 = nic.getDns2();
- }
+ }
if (nic.getTrafficType() == TrafficType.Management) {
buf.append(" localgw=").append(dest.getPod().getGateway());
@@ -1593,10 +1670,13 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
}
}
- } else {
- //Remove public and guest nics from the profile
- s_logger.debug("Removing nic of type " + nic.getTrafficType() + " from virtual machine profile " + profile.getVirtualMachine());
- it.remove();
+ } else if (nic.getTrafficType() == TrafficType.Guest) {
+ dnsProvided = _networkMgr.isProviderSupportServiceInNetwork(nic.getNetworkId(), Service.Dns, Provider.VirtualRouter);
+ dhcpProvided = _networkMgr.isProviderSupportServiceInNetwork(nic.getNetworkId(), Service.Dhcp, Provider.VirtualRouter);
+ //build bootloader parameter for the guest
+ buf.append(createGuestBootLoadArgs(nic, defaultDns1, defaultDns2, router));
+ } else if (nic.getTrafficType() == TrafficType.Public) {
+ publicNetwork = true;
}
}
@@ -1615,8 +1695,16 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
String type = null;
if (router.getVpcId() != null) {
type = "vpcrouter";
+ if (_disable_rp_filter) {
+ rpFilter=" disable_rp_filter=true";
+ }
+ } else if (!publicNetwork) {
+ type = "dhcpsrvr";
} else {
type = "router";
+ if (_disable_rp_filter) {
+ rpFilter=" disable_rp_filter=true";
+ }
}
if (_disable_rp_filter) {
@@ -1634,23 +1722,25 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
buf.append(" extra_pubnics=" + _routerExtraPublicNics);
}
- if (defaultDns1 != null) {
+ /* If virtual router didn't provide DNS service but provide DHCP service, we need to override the DHCP response
+ * to return DNS server rather than
+ * virtual router itself. */
+ if (dnsProvided || dhcpProvided) {
buf.append(" dns1=").append(defaultDns1);
- }
-
- if (defaultDns2 != null) {
- buf.append(" dns2=").append(defaultDns2);
- }
+ if (defaultDns2 != null) {
+ buf.append(" dns2=").append(defaultDns2);
+ }
- boolean useExtDns = false;
- /* For backward compatibility */
- String use_external_dns = _configDao.getValue(Config.UseExternalDnsServers.key());
- if (use_external_dns != null && use_external_dns.equals("true")) {
- useExtDns = true;
- }
+ boolean useExtDns = !dnsProvided;
+ /* For backward compatibility */
+ String use_external_dns = _configDao.getValue(Config.UseExternalDnsServers.key());
+ if (use_external_dns != null && use_external_dns.equals("true")) {
+ useExtDns = true;
+ }
- if (useExtDns) {
- buf.append(" useextdns=true");
+ if (useExtDns) {
+ buf.append(" useextdns=true");
+ }
}
if (s_logger.isDebugEnabled()) {
@@ -1659,6 +1749,65 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
return true;
}
+
+
+ protected StringBuilder createGuestBootLoadArgs(NicProfile guestNic, String defaultDns1,
+ String defaultDns2, DomainRouterVO router) {
+ long guestNetworkId = guestNic.getNetworkId();
+ NetworkVO guestNetwork = _networkDao.findById(guestNetworkId);
+ String dhcpRange = null;
+ DataCenterVO dc = _dcDao.findById(guestNetwork.getDataCenterId());
+
+ StringBuilder buf = new StringBuilder();
+
+ boolean isRedundant = router.getIsRedundantRouter();
+ if (isRedundant) {
+ buf.append(" redundant_router=1");
+ List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(guestNetwork.getId(), Role.VIRTUAL_ROUTER);
+ try {
+ int priority = getUpdatedPriority(guestNetwork, routers, router);
+ router.setPriority(priority);
+ } catch (InsufficientVirtualNetworkCapcityException e) {
+ s_logger.error("Failed to get update priority!", e);
+ throw new CloudRuntimeException("Failed to get update priority!");
+ }
+ Network net = _networkMgr.getNetwork(guestNic.getNetworkId());
+ buf.append(" guestgw=").append(net.getGateway());
+ String brd = NetUtils.long2Ip(NetUtils.ip2Long(guestNic.getIp4Address()) | ~NetUtils.ip2Long(guestNic.getNetmask()));
+ buf.append(" guestbrd=").append(brd);
+ buf.append(" guestcidrsize=").append(NetUtils.getCidrSize(guestNic.getNetmask()));
+ buf.append(" router_pr=").append(router.getPriority());
+ }
+
+ //setup network domain
+ String domain = guestNetwork.getNetworkDomain();
+ if (domain != null) {
+ buf.append(" domain=" + domain);
+ }
+
+ //setup dhcp range
+ if (dc.getNetworkType() == NetworkType.Basic) {
+ if (guestNic.isDefaultNic()) {
+ long cidrSize = NetUtils.getCidrSize(guestNic.getNetmask());
+ String cidr = NetUtils.getCidrSubNet(guestNic.getGateway(), cidrSize);
+ if (cidr != null) {
+ dhcpRange = NetUtils.getIpRangeStartIpFromCidr(cidr, cidrSize);
+ }
+ }
+ } else if (dc.getNetworkType() == NetworkType.Advanced) {
+ String cidr = guestNetwork.getCidr();
+ if (cidr != null) {
+ dhcpRange = NetUtils.getDhcpRange(cidr);
+ }
+ }
+
+ if (dhcpRange != null) {
+ buf.append(" dhcprange=" + dhcpRange);
+ }
+
+ return buf;
+ }
+
protected String getGuestDhcpRange(NicProfile guestNic, Network guestNetwork, DataCenter dc) {
String dhcpRange = null;
@@ -1935,7 +2084,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian
router.setScriptsVersion(versionAnswer.getScriptsVersion());
router = _routerDao.persist(router, guestNetworks);
}
- }
+ }
return result;
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/9ae62d32/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 c351485..bc7d3e0 100644
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -363,8 +363,12 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
public boolean finalizeStart(VirtualMachineProfile<DomainRouterVO> profile, long hostId, Commands cmds,
ReservationContext context) {
+
+
if (!super.finalizeStart(profile, hostId, cmds, context)) {
return false;
+ } else if (profile.getVirtualMachine().getVpcId() == null) {
+ return true;
}
DomainRouterVO router = profile.getVirtualMachine();
@@ -372,21 +376,19 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
//Get guest nic info
Map<Nic, Network> guestNics = new HashMap<Nic, Network>();
Map<Nic, Network> publicNics = new HashMap<Nic, Network>();
- List<Network> guestNetworks = new ArrayList<Network>();
List<? extends Nic> routerNics = _nicDao.listByVmId(profile.getId());
for (Nic routerNic : routerNics) {
Network network = _networkMgr.getNetwork(routerNic.getNetworkId());
if (network.getTrafficType() == TrafficType.Guest) {
guestNics.put(routerNic, network);
- guestNetworks.add(network);
} else if (network.getTrafficType() == TrafficType.Public) {
publicNics.put(routerNic, network);
}
}
try {
- //add router to public and guest networks
+ //add VPC router to public and guest networks
for (Nic publicNic : publicNics.keySet()) {
Network publicNtwk = publicNics.get(publicNic);
IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(publicNtwk.getId(),
@@ -423,19 +425,18 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
StorageUnavailableException, ResourceUnavailableException {
DomainRouterVO router =
- super.deployRouter(owner, dest, plan, params, isRedundant, vrProvider, svcOffId, vpcId, sourceNatIp);
+ super.deployRouter(owner, dest, plan, params, isRedundant, vrProvider, svcOffId, vpcId, sourceNatIp,
+ false, true, null, null);
//Plug public nic
- boolean addToPublicNtwk = true;
- if (sourceNatIp != null) {
+ if (router != null && sourceNatIp != null) {
Network publicNetwork = _networkDao.listByZoneAndTrafficType(dest.getDataCenter().getId(), TrafficType.Public).get(0);
- addToPublicNtwk = addPublicIpToVpc(router, publicNetwork, sourceNatIp);
- }
-
- if (!addToPublicNtwk) {
- s_logger.warn("Failed to add router " + router + " to public network in zone " + dest.getDataCenter() + " cleaninig up");
- destroyRouter(router.getId());
- return null;
+ if (!addPublicIpToVpc(router, publicNetwork, sourceNatIp)) {
+ s_logger.warn("Failed to add router " + router + " to public network in zone " + dest.getDataCenter() + " cleaninig up");
+ destroyRouter(router.getId());
+ return null;
+ }
+
}
return router;
@@ -683,4 +684,22 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
}
});
}
+
+
+// @Override
+// public boolean finalizeVirtualMachineProfile(VirtualMachineProfile<DomainRouterVO> profile, DeployDestination dest,
+// ReservationContext context) {
+// //remove public and guest nics as we will plug them later
+// Iterator<NicProfile> it = profile.getNics().iterator();
+// while (it.hasNext()) {
+// NicProfile nic = it.next();
+// if (nic.getTrafficType() == TrafficType.Public || nic.getTrafficType() == TrafficType.Guest) {
+// s_logger.debug("Removing nic of type " + nic.getTrafficType() + " from the nics passed on vm start. " +
+// "The nic will be plugged later");
+// it.remove();
+// }
+// }
+//
+// return super.finalizeVirtualMachineProfile(profile, dest, context);
+// }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/9ae62d32/wscript
----------------------------------------------------------------------
diff --git a/wscript b/wscript
index 48c01a8..22ef9dc 100644
--- a/wscript
+++ b/wscript
@@ -5,7 +5,7 @@
# if you change 'em here, you need to change it also in cloud.spec, add a %changelog entry there, and add an entry in debian/changelog
-VERSION = '3.0.3'
+VERSION = '3.0.3.2012-06-13T21:49:04Z'
APPNAME = 'cloud'
import shutil,os