diff --git a/.gitignore b/.gitignore index 1bde90a7aca..12f1943b466 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build/replace.properties +.classpath build/build.number bin/ *.000 diff --git a/api/src/com/cloud/storage/Volume.java b/api/src/com/cloud/storage/Volume.java index 25d64e8d891..f31454e66c2 100755 --- a/api/src/com/cloud/storage/Volume.java +++ b/api/src/com/cloud/storage/Volume.java @@ -33,7 +33,7 @@ public interface Volume extends ControlledEntity, BasedOn, StateObject avoids, long size, HypervisorType hyperType) throws NoTransitionException; + + String getSupportedImageFormatForCluster(Long clusterId); } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 7be946b2849..87012fbb8d5 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -3802,4 +3802,21 @@ public class StorageManagerImpl implements StorageManager, Manager, ClusterManag return _volumeDao.search(sc, searchFilter); } + @Override + public String getSupportedImageFormatForCluster(Long clusterId) { + ClusterVO cluster = ApiDBUtils.findClusterById(clusterId); + + if (cluster.getHypervisorType() == HypervisorType.XenServer) { + return "vhd"; + } else if (cluster.getHypervisorType() == HypervisorType.KVM) { + return "qcow2"; + } else if (cluster.getHypervisorType() == HypervisorType.VMware) { + return "ova"; + } else if (cluster.getHypervisorType() == HypervisorType.Ovm) { + return "raw"; + } else { + return null; + } + } + } diff --git a/server/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java b/server/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java index 9f3020aebae..477f24a6da4 100755 --- a/server/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java +++ b/server/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java @@ -108,7 +108,7 @@ public class PremiumDatabaseUpgradeChecker extends DatabaseUpgradeChecker { new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to303() }); _upgradeMap.put("2.2.10", new DbUpgrade[] { new Upgrade2210to2211(), new Upgrade2211to2212Premium(), - new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), + new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to303() }); _upgradeMap.put("2.2.11", new DbUpgrade[] { new Upgrade2211to2212Premium(), new Upgrade2212to2213(), diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 96e94f7125e..a6ff9941cac 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -590,6 +590,11 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager volume = _storageMgr.createVolume(volume, vm, rootDiskTmplt, dcVO, pod, rootDiskPool.getClusterId(), svo, diskVO, new ArrayList(), volume.getSize(), rootDiskHyperType); }else { try { + // Format of data disk should be the same as root disk + if(_storageMgr.getSupportedImageFormatForCluster(rootDiskPool.getClusterId()) != volHostVO.getFormat().getFileExtension()){ + throw new InvalidParameterValueException("Failed to attach volume to VM since volumes format " +volHostVO.getFormat().getFileExtension()+ + " is not compatible with the vm hypervisor type" ); + } volume = _storageMgr.copyVolumeFromSecToPrimary(volume, vm, rootDiskTmplt, dcVO, pod, rootDiskPool.getClusterId(), svo, diskVO, new ArrayList(), volume.getSize(), rootDiskHyperType); } catch (NoTransitionException e) { e.printStackTrace(); diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css index 6b96310d837..29baa5e0db4 100644 --- a/ui/css/cloudstack3.css +++ b/ui/css/cloudstack3.css @@ -1,5 +1,4 @@ /*[fmt]1C20-1C0D-E*/ -/*dmin*/ /*+clearfix {*/ div.toolbar:after, .multi-wizard .progress ul li:after, @@ -5453,6 +5452,10 @@ label.error { overflow: hidden; } +.multi-wizard.zone-wizard .setup-guest-traffic.basic .select-container { + background: #FFFFFF; +} + .multi-wizard.zone-wizard .main-desc { width: 516px; float: left; diff --git a/ui/scripts/accounts.js b/ui/scripts/accounts.js index 3d52633d600..58fdf9882f2 100644 --- a/ui/scripts/accounts.js +++ b/ui/scripts/accounts.js @@ -51,10 +51,7 @@ // For localization return str; }, - label: 'label.state', - converter: function(str) { - return 'state.' + str; - }, + label: 'label.state', indicator: { 'enabled': 'on', 'Destroyed': 'off', diff --git a/ui/scripts/instances.js b/ui/scripts/instances.js index 6d1b9ddb9eb..cd690e64e78 100644 --- a/ui/scripts/instances.js +++ b/ui/scripts/instances.js @@ -47,11 +47,7 @@ instancename: { label: 'label.internal.name' }, zonename: { label: 'label.zone.name' }, state: { - label: 'label.state', - converter: function(str) { - // For localization - return 'state.' + str; - }, + label: 'label.state', indicator: { 'Running': 'on', 'Stopped': 'off', diff --git a/ui/scripts/projects.js b/ui/scripts/projects.js index 233fecb1ec4..6132e793f84 100644 --- a/ui/scripts/projects.js +++ b/ui/scripts/projects.js @@ -576,16 +576,13 @@ displaytext: { label: 'label.display.name' }, domain: { label: 'label.domain' }, account: { label: 'label.owner.account' }, - state: { - converter: function(str) { - // For localization - return 'state.' + str; - }, - label: 'label.status', indicator: { - converter: function(str) { - return 'state.' + str; - }, - 'Active': 'on', 'Destroyed': 'off', 'Disabled': 'off', 'Left Project': 'off' + state: { + label: 'label.status', + indicator: { + 'Active': 'on', + 'Destroyed': 'off', + 'Disabled': 'off', + 'Left Project': 'off' } } }, @@ -870,11 +867,7 @@ project: { label: 'label.project' }, domain: { label: 'label.domain' }, state: { - label: 'label.status', - converter: function(str) { - // For localization - return 'state.' + str; - }, + label: 'label.status', indicator: { 'Accepted': 'on', 'Completed': 'on', 'Pending': 'off', 'Declined': 'off' diff --git a/ui/scripts/storage.js b/ui/scripts/storage.js index 512cf678993..52e6ebed595 100644 --- a/ui/scripts/storage.js +++ b/ui/scripts/storage.js @@ -35,14 +35,12 @@ type: { label: 'label.type' }, storagetype: { label: 'label.storage.type' }, vmdisplayname: { label: 'label.vm.display.name' }, - state: { - converter: function(str) { - // For localization - return 'state.' + str; - }, - label: 'State', - indicator: { 'Ready': 'on' } - } + state: { + label: 'State', + indicator: { + 'Ready': 'on' + } + } }, // List view actions @@ -1000,16 +998,11 @@ volumename: { label: 'label.volume' }, intervaltype: { label: 'label.interval.type' }, created: { label: 'label.created', converter: cloudStack.converters.toLocalDate }, - state: { - converter: function(str) { - // For localization - return 'state.'+str; - }, - label: 'label.state', indicator: { - converter: function(str) { - return 'state.' + str; - }, - 'BackedUp': 'on', 'Destroyed': 'off' + state: { + label: 'label.state', + indicator: { + 'BackedUp': 'on', + 'Destroyed': 'off' } } }, diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 7f638d880da..8217bd923b9 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -1258,7 +1258,7 @@ var selectedNetworkOfferingId = $(this).val(); $(networkOfferingObjs).each(function(){ if(this.id == selectedNetworkOfferingId) { - if(this.guestiptype == "Isolated") { + if(this.guestiptype == "Isolated") { //*** Isolated *** if(this.specifyipranges == false) { $form.find('.form-item[rel=guestStartIp]').hide(); $form.find('.form-item[rel=guestEndIp]').hide(); @@ -1266,26 +1266,40 @@ else { $form.find('.form-item[rel=guestStartIp]').css('display', 'inline-block'); $form.find('.form-item[rel=guestEndIp]').css('display', 'inline-block'); + } + + var includingSourceNat = false; + var serviceObjArray = this.service; + for(var k = 0; k < serviceObjArray.length; k++) { + if(serviceObjArray[k].name == "SourceNat") { + includingSourceNat = true; + break; + } + } + if(includingSourceNat == true) { //Isolated with SourceNat + cloudStack.dialog.createFormField.validation.required.remove($form.find('.form-item[rel=guestGateway]')); //make guestGateway optional + cloudStack.dialog.createFormField.validation.required.remove($form.find('.form-item[rel=guestNetmask]')); //make guestNetmask optional } - - //cloudStack.dialog.createFormField.validation.required.remove($form.find('.form-item[rel=guestGateway]')); //make guestGateway optional - //cloudStack.dialog.createFormField.validation.required.remove($form.find('.form-item[rel=guestNetmask]')); //make guestNetmask optional + else { //Isolated with no SourceNat + cloudStack.dialog.createFormField.validation.required.add($form.find('.form-item[rel=guestGateway]')); //make guestGateway required + cloudStack.dialog.createFormField.validation.required.add($form.find('.form-item[rel=guestNetmask]')); //make guestNetmask required + } } - else { //this.guestiptype == "Shared" + else { //*** Shared *** $form.find('.form-item[rel=guestStartIp]').css('display', 'inline-block'); $form.find('.form-item[rel=guestEndIp]').css('display', 'inline-block'); - //cloudStack.dialog.createFormField.validation.required.add($form.find('.form-item[rel=guestGateway]')); //make guestGateway required - //cloudStack.dialog.createFormField.validation.required.add($form.find('.form-item[rel=guestNetmask]')); //make guestNetmask required + cloudStack.dialog.createFormField.validation.required.add($form.find('.form-item[rel=guestGateway]')); //make guestGateway required + cloudStack.dialog.createFormField.validation.required.add($form.find('.form-item[rel=guestNetmask]')); //make guestNetmask required } if(this.specifyvlan == false) { $form.find('.form-item[rel=vlanId]').hide(); - //cloudStack.dialog.createFormField.validation.required.remove($form.find('.form-item[rel=vlanId]')); //make vlanId optional + cloudStack.dialog.createFormField.validation.required.remove($form.find('.form-item[rel=vlanId]')); //make vlanId optional } else { $form.find('.form-item[rel=vlanId]').css('display', 'inline-block'); - //cloudStack.dialog.createFormField.validation.required.add($form.find('.form-item[rel=vlanId]')); //make vlanId required + cloudStack.dialog.createFormField.validation.required.add($form.find('.form-item[rel=vlanId]')); //make vlanId required } return false; //break each loop } @@ -7815,10 +7829,7 @@ 'Enabled': 'on', 'Disabled': 'off', 'Destroyed': 'off' - }, - converter: function(str) { - return 'state.' + str; - } + } } }, diff --git a/ui/scripts/ui/dialog.js b/ui/scripts/ui/dialog.js index 709fabfefc7..9b659b26863 100644 --- a/ui/scripts/ui/dialog.js +++ b/ui/scripts/ui/dialog.js @@ -53,6 +53,7 @@ var fields = $.map(args.form.fields, function(value, key) { return key; }) + $(fields).each(function() { var key = this; var field = args.form.fields[key]; @@ -86,15 +87,21 @@ closeOnEscape: false }); */ // Label field + + //if( field.label == 'label.network.offering' || field.label == 'label.guest.gateway') + // debugger; + var $name = $('
').addClass('name') .appendTo($formItem) .append( $('