From 5bf5d3669d22d48f4b2db01c76647c977fad7468 Mon Sep 17 00:00:00 2001 From: Devdeep Singh Date: Wed, 15 Jan 2014 02:51:15 +0530 Subject: [PATCH 01/10] CLOUDSTACK-5689: System vm creation on local storage fails for hyper-v. A null pointer exception was getting generated when a VolumeTO object was serialized to create an answer object. If a local storage is used the uri field will be null. Added null checks for the same. --- .../HypervResource/CloudStackTypes.cs | 33 ++++++++++++++----- .../HypervResourceController.cs | 11 ++----- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs index 89f0814214e..847380cb115 100644 --- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs +++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs @@ -61,7 +61,7 @@ namespace HypervResource get { string uncPath = null; - if (uri.Scheme.Equals("cifs") || uri.Scheme.Equals("networkfilesystem")) + if (uri != null && (uri.Scheme.Equals("cifs") || uri.Scheme.Equals("networkfilesystem"))) { uncPath = @"\\" + uri.Host + uri.LocalPath; } @@ -73,8 +73,13 @@ namespace HypervResource { get { - var queryDictionary = System.Web.HttpUtility.ParseQueryString(uri.Query); - return System.Web.HttpUtility.UrlDecode(queryDictionary["user"]); + string user = null; + if (uri != null) + { + var queryDictionary = System.Web.HttpUtility.ParseQueryString(uri.Query); + user = System.Web.HttpUtility.UrlDecode(queryDictionary["user"]); + } + return user; } } @@ -82,8 +87,13 @@ namespace HypervResource { get { - var queryDictionary = System.Web.HttpUtility.ParseQueryString(uri.Query); - return System.Web.HttpUtility.UrlDecode(queryDictionary["password"]); + string password = null; + if (uri != null) + { + var queryDictionary = System.Web.HttpUtility.ParseQueryString(uri.Query); + password = System.Web.HttpUtility.UrlDecode(queryDictionary["password"]); + } + return password; } } @@ -91,12 +101,17 @@ namespace HypervResource { get { - var queryDictionary = System.Web.HttpUtility.ParseQueryString(uri.Query); - if (queryDictionary["domain"] != null) + string domain = null; + if (uri != null) { - return System.Web.HttpUtility.UrlDecode(queryDictionary["domain"]); + var queryDictionary = System.Web.HttpUtility.ParseQueryString(uri.Query); + if (queryDictionary["domain"] != null) + { + domain = System.Web.HttpUtility.UrlDecode(queryDictionary["domain"]); + } + else domain = uri.Host; } - else return uri.Host; + return domain; } } diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs index 5ed3904398c..62eebdae982 100644 --- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs +++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs @@ -1474,15 +1474,8 @@ namespace HypervResource { // TODO: thin provision instead of copying the full file. File.Copy(srcFile, destFile); - VolumeObjectTO volume = new VolumeObjectTO(); - volume.path = destFile; - volume.dataStore = destVolumeObjectTO.dataStore; - volume.name = destVolumeObjectTO.name; - volume.size = ulong.Parse(destVolumeObjectTO.size.ToString()); - volume.format = destVolumeObjectTO.format; - volume.nfsDataStore = destVolumeObjectTO.nfsDataStore; - volume.primaryDataStore = destVolumeObjectTO.primaryDataStore; - JObject ansObj = Utils.CreateCloudStackObject(CloudStackTypes.VolumeObjectTO, volume); + destVolumeObjectTO.path = destFile; + JObject ansObj = Utils.CreateCloudStackObject(CloudStackTypes.VolumeObjectTO, destVolumeObjectTO); newData = ansObj; result = true; } From 69365836af993fad1f6d30da4bc300ee45f4c0f8 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Tue, 14 Jan 2014 10:54:49 -0800 Subject: [PATCH 02/10] CLOUDSTACK-5557: UI > Network > VPC > Router > Public IP Address > fix a bug that Configuration tab was wrongly hidden. --- ui/scripts/network.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/scripts/network.js b/ui/scripts/network.js index 610b1bdc2dc..c404b55b9b7 100755 --- a/ui/scripts/network.js +++ b/ui/scripts/network.js @@ -2222,7 +2222,11 @@ } } - if (ipAddress.vpcid || ipAddress.issourcenat) { + if (ipAddress.issourcenat) { + disableIpRules = true; + } + + if (('vpc' in args.context) == false && ipAddress.vpcid != null) { //from Guest Network section, don't show Configuration(ipRules) tab on VPC IP disableIpRules = true; } From 65f639219cdb0892ff661fb2dd44bb54370549aa Mon Sep 17 00:00:00 2001 From: sbalineni Date: Sun, 5 Jan 2014 16:57:53 +0000 Subject: [PATCH 03/10] Make sure that Cloudstack DB should be atleast once synced with contrail api server Signed-off-by: Sheng Yang --- .../contrail/management/ContrailManager.java | 2 +- .../management/ContrailManagerImpl.java | 3 ++- .../contrail/management/ServerDBSync.java | 2 +- .../contrail/management/ServerDBSyncImpl.java | 3 ++- .../management/NetworkProviderTest.java | 20 +++++++++++-------- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManager.java b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManager.java index 550abb7c0e4..6489da9d042 100644 --- a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManager.java +++ b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManager.java @@ -54,7 +54,7 @@ public interface ContrailManager { public NetworkOffering getRouterOffering(); public NetworkOffering getPublicRouterOffering(); - public void syncNetworkDB(short syncMode) throws IOException; + public void syncNetworkDB(short syncMode) throws Exception; public boolean isManagedPhysicalNetwork(Network network); diff --git a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java index eea5026a977..b7c0023cecf 100644 --- a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java +++ b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java @@ -416,7 +416,7 @@ public class ContrailManagerImpl extends ManagerBase implements ContrailManager } - public void syncNetworkDB(short syncMode) throws IOException { + public void syncNetworkDB(short syncMode) throws Exception { if (_dbSync.syncAll(syncMode) == ServerDBSync.SYNC_STATE_OUT_OF_SYNC) { if (syncMode == DBSyncGeneric.SYNC_MODE_CHECK) { s_logger.info("# Cloudstack DB & VNC are out of sync #"); @@ -440,6 +440,7 @@ public class ContrailManagerImpl extends ManagerBase implements ContrailManager } catch (Exception ex) { s_logger.debug(ex); s_logger.info("Unable to sync network db"); + //resync will be done after _dbSyncInterval seconds since _syncMode is still set to SYNC_MODE_UPDATE } } } diff --git a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ServerDBSync.java b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ServerDBSync.java index fea9a951e68..68319774c9f 100644 --- a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ServerDBSync.java +++ b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ServerDBSync.java @@ -32,7 +32,7 @@ public interface ServerDBSync { * API for syncing all classes of vnc objects with cloudstack * Sync cloudstack and vnc objects. */ - public short syncAll(short syncMode); + public short syncAll(short syncMode) throws Exception; public void syncClass(Class cls); public void createProject(ProjectVO project, StringBuffer syncLogMesg) throws IOException; public void createDomain(DomainVO domain, StringBuffer logMesg)throws IOException; diff --git a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ServerDBSyncImpl.java b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ServerDBSyncImpl.java index f8a8d978862..22c726abc85 100644 --- a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ServerDBSyncImpl.java +++ b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ServerDBSyncImpl.java @@ -117,7 +117,7 @@ public class ServerDBSyncImpl implements ServerDBSync { * Order has to be maintained */ @Override - public short syncAll(short syncMode) { + public short syncAll(short syncMode) throws Exception { short syncState = SYNC_STATE_IN_SYNC; /* vnc classes need to be synchronized with cloudstack */ @@ -158,6 +158,7 @@ public class ServerDBSyncImpl implements ServerDBSync { if (_lockSyncMode.isLocked()) { _lockSyncMode.unlock(); } + throw ex; } return syncState; diff --git a/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/NetworkProviderTest.java b/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/NetworkProviderTest.java index 930ac4d6c15..89294cca078 100644 --- a/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/NetworkProviderTest.java +++ b/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/NetworkProviderTest.java @@ -462,15 +462,19 @@ public class NetworkProviderTest extends TestCase { } catch (IOException ex) { fail(ex.getMessage()); } - + //now db sync - if (_dbSync.syncAll(DBSyncGeneric.SYNC_MODE_UPDATE) == ServerDBSync.SYNC_STATE_OUT_OF_SYNC) { - s_logger.info("# Cloudstack DB & VNC are out of sync - resync done"); - } - - if (_dbSync.syncAll(DBSyncGeneric.SYNC_MODE_CHECK) == ServerDBSync.SYNC_STATE_OUT_OF_SYNC) { - s_logger.info("# Cloudstack DB & VNC are still out of sync"); - fail("DB Sync failed"); + try { + if (_dbSync.syncAll(DBSyncGeneric.SYNC_MODE_UPDATE) == ServerDBSync.SYNC_STATE_OUT_OF_SYNC) { + s_logger.info("# Cloudstack DB & VNC are out of sync - resync done"); + } + + if (_dbSync.syncAll(DBSyncGeneric.SYNC_MODE_CHECK) == ServerDBSync.SYNC_STATE_OUT_OF_SYNC) { + s_logger.info("# Cloudstack DB & VNC are still out of sync"); + fail("DB Sync failed"); + } + } catch (Exception ex) { + fail(ex.getMessage()); } } From 8b9f7afc92679f9e316d417ba14c23c587b7d565 Mon Sep 17 00:00:00 2001 From: Sachchidanand Vaidya Date: Mon, 13 Jan 2014 17:30:24 -0800 Subject: [PATCH 04/10] Add L3VPN isolation method for contrail plugin Signed-off-by: Sheng Yang --- .../com/cloud/network/PhysicalNetwork.java | 3 ++- .../contrail/management/ContrailGuru.java | 27 +++++++++++++++---- .../management/ManagementServerMock.java | 2 +- ui/scripts/ui-custom/zoneWizard.js | 5 +++- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/api/src/com/cloud/network/PhysicalNetwork.java b/api/src/com/cloud/network/PhysicalNetwork.java index 55b18e67ba9..5d38b500305 100644 --- a/api/src/com/cloud/network/PhysicalNetwork.java +++ b/api/src/com/cloud/network/PhysicalNetwork.java @@ -40,7 +40,8 @@ public interface PhysicalNetwork extends Identity, InternalIdentity { VNS, MIDO, SSP, - VXLAN; + VXLAN, + L3VPN; } public enum BroadcastDomainRange { diff --git a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailGuru.java b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailGuru.java index 6587534994e..4e8083b6cd2 100644 --- a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailGuru.java +++ b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailGuru.java @@ -40,6 +40,9 @@ import com.cloud.deploy.DeploymentPlan; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.dc.dao.DataCenterDao; import com.cloud.network.Network; import com.cloud.network.Network.State; import com.cloud.network.NetworkProfile; @@ -50,6 +53,10 @@ import com.cloud.network.Networks.TrafficType; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkVO; import com.cloud.network.guru.NetworkGuru; +import com.cloud.network.PhysicalNetwork; +import com.cloud.network.PhysicalNetwork.IsolationMethod; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; import com.cloud.utils.component.AdapterBase; @@ -74,6 +81,8 @@ public class ContrailGuru extends AdapterBase implements NetworkGuru { @Inject NetworkDao _networkDao; @Inject ContrailManager _manager; @Inject NicDao _nicDao; + @Inject PhysicalNetworkDao _physicalNetworkDao; + @Inject DataCenterDao _dcDao; @Inject IPAddressDao _ipAddressDao; @Inject AccountManager _accountMgr; @Inject IpAddressManager _ipAddrMgr; @@ -81,12 +90,16 @@ public class ContrailGuru extends AdapterBase implements NetworkGuru { private static final Logger s_logger = Logger.getLogger(ContrailGuru.class); private static final TrafficType[] _trafficTypes = {TrafficType.Guest}; - private boolean canHandle(NetworkOffering offering) { - if (offering.getId() == _manager.getRouterOffering().getId()) + private boolean canHandle(NetworkOffering offering, NetworkType networkType, PhysicalNetwork physicalNetwork) { + if (networkType == NetworkType.Advanced + && isMyTrafficType(offering.getTrafficType()) + && offering.getGuestType() == Network.GuestType.Isolated + && physicalNetwork.getIsolationMethods().contains("L3VPN")) return true; - return false; - } + return false; + } + @Override public String getName() { return "ContrailGuru"; @@ -95,7 +108,11 @@ public class ContrailGuru extends AdapterBase implements NetworkGuru { @Override public Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, Account owner) { - if (!canHandle(offering)) { + // Check of the isolation type of the related physical network is L3VPN + PhysicalNetworkVO physnet = _physicalNetworkDao.findById(plan.getPhysicalNetworkId()); + DataCenter dc = _dcDao.findById(plan.getDataCenterId()); + if (!canHandle(offering, dc.getNetworkType(),physnet)) { + s_logger.debug("Refusing to design this network"); return null; } NetworkVO network = new NetworkVO(offering.getTrafficType(), Mode.Dhcp, BroadcastDomainType.Lswitch, diff --git a/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/ManagementServerMock.java b/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/ManagementServerMock.java index bbff4668119..36b5374187f 100644 --- a/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/ManagementServerMock.java +++ b/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/ManagementServerMock.java @@ -319,7 +319,7 @@ public class ManagementServerMock { } } catch (InvalidParameterValueException e) { List isolationMethods = new ArrayList(); - isolationMethods.add("GRE"); + isolationMethods.add("L3VPN"); _znet = _networkService.createPhysicalNetwork(_zone.getId(), null, null, isolationMethods, BroadcastDomainRange.ZONE.toString(), _zone.getDomainId(), null, "znet"); diff --git a/ui/scripts/ui-custom/zoneWizard.js b/ui/scripts/ui-custom/zoneWizard.js index 28df1933fb2..7b3a8e1234f 100644 --- a/ui/scripts/ui-custom/zoneWizard.js +++ b/ui/scripts/ui-custom/zoneWizard.js @@ -720,7 +720,10 @@ }).html('SSP'), $('