diff --git a/api/src/main/java/com/cloud/host/Status.java b/api/src/main/java/com/cloud/host/Status.java index e381115db41..5dc82bbfaef 100644 --- a/api/src/main/java/com/cloud/host/Status.java +++ b/api/src/main/java/com/cloud/host/Status.java @@ -131,6 +131,9 @@ public enum Status { s_fsm.addTransition(Status.Up, Event.PingTimeout, Status.Alert); s_fsm.addTransition(Status.Up, Event.AgentDisconnected, Status.Alert); s_fsm.addTransition(Status.Up, Event.ShutdownRequested, Status.Disconnected); + s_fsm.addTransition(Status.Disconnected, Event.ShutdownRequested, Status.Disconnected); + s_fsm.addTransition(Status.Down, Event.ShutdownRequested, Status.Disconnected); + s_fsm.addTransition(Status.Rebalancing, Event.ShutdownRequested, Status.Disconnected); s_fsm.addTransition(Status.Up, Event.HostDown, Status.Down); s_fsm.addTransition(Status.Up, Event.Ping, Status.Up); s_fsm.addTransition(Status.Up, Event.AgentConnected, Status.Connecting); diff --git a/api/src/main/java/com/cloud/vm/VirtualMachine.java b/api/src/main/java/com/cloud/vm/VirtualMachine.java index 4d6014f0a94..829e743df73 100644 --- a/api/src/main/java/com/cloud/vm/VirtualMachine.java +++ b/api/src/main/java/com/cloud/vm/VirtualMachine.java @@ -20,6 +20,8 @@ import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.HashSet; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.api.Displayable; @@ -186,6 +188,7 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Partition, } } + static final Set systemVMs = new HashSet<>(Arrays.asList(VirtualMachine.Type.ConsoleProxy, VirtualMachine.Type.SecondaryStorageVm)); static final String IsDynamicScalingEnabled = "enable.dynamic.scaling"; public enum Event { diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java index 2fafe933968..6dbaddb4d4f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java @@ -183,7 +183,7 @@ public class GetUploadParamsForTemplateCmd extends AbstractGetUploadParamsCmd { if (!hypervisor.equalsIgnoreCase(Hypervisor.HypervisorType.VMware.toString()) && osTypeId == null) { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Missing parameter ostypeid"); } - if (hypervisor.equalsIgnoreCase(Hypervisor.HypervisorType.VMware.toString()) && osTypeId != null) { + if (hypervisor.equalsIgnoreCase(Hypervisor.HypervisorType.VMware.toString()) && deployAsIs && osTypeId != null) { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid parameter ostypeid, not applicable for VMware"); } } diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java index 565d4de8788..b2b451c98fe 100755 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@ -43,6 +43,7 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.api.ApiDBUtils; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd; @@ -2087,6 +2088,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.warn("Unable to actually stop " + vm + " but continue with release because it's a force stop"); vmGuru.finalizeStop(profile, answer); } + } else { + if (VirtualMachine.systemVMs.contains(vm.getType())) { + HostVO systemVmHost = ApiDBUtils.findHostByTypeNameAndZoneId(vm.getDataCenterId(), vm.getHostName(), + VirtualMachine.Type.SecondaryStorageVm.equals(vm.getType()) ? Host.Type.SecondaryStorageVM : Host.Type.ConsoleProxy); + if (systemVmHost != null) { + _agentMgr.agentStatusTransitTo(systemVmHost, Status.Event.ShutdownRequested, _nodeId); + } + } } } diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 81425f0a360..3879e69018a 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -2086,9 +2086,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } VirtualMachineDiskInfo matchingExistingDisk = getMatchingExistingDisk(diskInfoBuilder, vol, hyperHost, context); - controllerKey = getDiskController(matchingExistingDisk, vol, vmSpec, ideControllerKey, scsiControllerKey); - String diskController = getDiskController(vmMo, matchingExistingDisk, vol, controllerInfo); - + String diskController = getDiskController(vmMo, matchingExistingDisk, vol, controllerInfo, deployAsIs); if (DiskControllerType.getType(diskController) == DiskControllerType.osdefault) { diskController = vmMo.getRecommendedDiskController(null); } @@ -3298,47 +3296,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa return null; } - private int getDiskController(VirtualMachineDiskInfo matchingExistingDisk, DiskTO vol, VirtualMachineTO vmSpec, int ideControllerKey, int scsiControllerKey) { - - int controllerKey; - if (matchingExistingDisk != null) { - s_logger.info("Chose disk controller based on existing information: " + matchingExistingDisk.getDiskDeviceBusName()); - if (matchingExistingDisk.getDiskDeviceBusName().startsWith("ide")) - return ideControllerKey; - else - return scsiControllerKey; - } - - if (vol.getType() == Volume.Type.ROOT) { - Map vmDetails = vmSpec.getDetails(); - if (vmDetails != null && vmDetails.get(VmDetailConstants.ROOT_DISK_CONTROLLER) != null) { - if (vmDetails.get(VmDetailConstants.ROOT_DISK_CONTROLLER).equalsIgnoreCase("scsi")) { - s_logger.info("Chose disk controller for vol " + vol.getType() + " -> scsi, based on root disk controller settings: " - + vmDetails.get(VmDetailConstants.ROOT_DISK_CONTROLLER)); - controllerKey = scsiControllerKey; - } else { - s_logger.info("Chose disk controller for vol " + vol.getType() + " -> ide, based on root disk controller settings: " - + vmDetails.get(VmDetailConstants.ROOT_DISK_CONTROLLER)); - controllerKey = ideControllerKey; - } - } else { - s_logger.info("Chose disk controller for vol " + vol.getType() + " -> scsi. due to null root disk controller setting"); - controllerKey = scsiControllerKey; - } - - } else { - // DATA volume always use SCSI device - s_logger.info("Chose disk controller for vol " + vol.getType() + " -> scsi"); - controllerKey = scsiControllerKey; - } - - return controllerKey; - } - - private String getDiskController(VirtualMachineMO vmMo, VirtualMachineDiskInfo matchingExistingDisk, DiskTO vol, Pair controllerInfo) throws Exception { - int controllerKey; + private String getDiskController(VirtualMachineMO vmMo, VirtualMachineDiskInfo matchingExistingDisk, DiskTO vol, Pair controllerInfo, boolean deployAsIs) throws Exception { DiskControllerType controllerType = DiskControllerType.none; - if (matchingExistingDisk != null) { + if (deployAsIs && matchingExistingDisk != null) { String currentBusName = matchingExistingDisk.getDiskDeviceBusName(); if (currentBusName != null) { s_logger.info("Chose disk controller based on existing information: " + currentBusName); diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java index 9510e28b7e2..5c5ba55f197 100644 --- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java +++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java @@ -1456,7 +1456,7 @@ public class ApiResponseHelper implements ResponseGenerator { } } - if (vm.getType() == Type.SecondaryStorageVm || vm.getType() == Type.ConsoleProxy) { + if (VirtualMachine.systemVMs.contains(vm.getType())) { Host systemVmHost = ApiDBUtils.findHostByTypeNameAndZoneId(vm.getDataCenterId(), vm.getHostName(), Type.SecondaryStorageVm.equals(vm.getType()) ? Host.Type.SecondaryStorageVM : Host.Type.ConsoleProxy); if (systemVmHost != null) { diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index af081e539e1..0fecd604995 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -2554,6 +2554,13 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir String extraConfig = cmd.getExtraConfig(); UserVmVO vmInstance = _vmDao.findById(cmd.getId()); + if (MapUtils.isNotEmpty(details) || cmd.isCleanupDetails()) { + VMTemplateVO template = _templateDao.findById(vmInstance.getTemplateId()); + if (template != null && template.isDeployAsIs()) { + throw new CloudRuntimeException("Detail settings are read from OVA, it cannot be changed by API call."); + } + } + long accountId = vmInstance.getAccountId(); if (isDisplayVm != null && isDisplayVm != vmInstance.isDisplay()) { diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index 8e430dd7d87..190398287e6 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -2968,6 +2968,8 @@ "message.move.acl.order.failed": "Failed to move ACL rule", "message.move.acl.order.processing": "Moving ACL rule...", "message.ncc.delete.confirm": "Please confirm you want to delete this NCC", +"message.network.acl.default.allow": "Warning: With this policy all traffic will be allowed through the firewall to this VPC tier. You should consider securing your network.", +"message.network.acl.default.deny": "Warning: With this policy all traffic will be denied through the firewall to this VPC tier. In order to allow traffic through you will need to change policies.", "message.network.addvm.desc": "Please specify the network that you would like to add this VM to. A new NIC will be added for this network.", "message.network.addvmnic": "Please confirm that you would like to add a new VM NIC for this network.", "message.network.description": "Setup network and traffic", diff --git a/ui/src/components/view/DetailSettings.vue b/ui/src/components/view/DetailSettings.vue index 77aac15e927..1af56bf321a 100644 --- a/ui/src/components/view/DetailSettings.vue +++ b/ui/src/components/view/DetailSettings.vue @@ -80,11 +80,12 @@ slot="actions" v-if="!disableSettings && 'updateTemplate' in $store.getters.apis && 'updateVirtualMachine' in $store.getters.apis && isAdminOrOwner() && allowEditOfDetail(item.name)"> - - + + @@ -99,7 +100,7 @@ :cancelText="$t('label.no')" placement="left" > - + @@ -130,6 +131,7 @@ export default { newValue: '', loading: false, resourceType: 'UserVm', + deployasistemplate: false, error: false } }, @@ -163,6 +165,9 @@ export default { this.detailOptions = json.listdetailoptionsresponse.detailoptions.details }) this.disableSettings = (this.$route.meta.name === 'vm' && this.resource.state !== 'Stopped') + api('listTemplates', { templatefilter: 'all', id: this.resource.templateid }).then(json => { + this.deployasistemplate = json.listtemplatesresponse.template[0].deployasis + }) }, filterOrReadOnlyDetails () { for (var i = 0; i < this.details.length; i++) { diff --git a/ui/src/views/network/VpcTab.vue b/ui/src/views/network/VpcTab.vue index a4ecb49e36b..ae349590b93 100644 --- a/ui/src/views/network/VpcTab.vue +++ b/ui/src/views/network/VpcTab.vue @@ -176,7 +176,7 @@ - {{ item.name }} + {{ item.name }} ({{ item.description }}) diff --git a/ui/src/views/network/VpcTiersTab.vue b/ui/src/views/network/VpcTiersTab.vue index 9c512b74650..de2153bfdc1 100644 --- a/ui/src/views/network/VpcTiersTab.vue +++ b/ui/src/views/network/VpcTiersTab.vue @@ -204,12 +204,20 @@ v-decorator="['externalId']"> - + - {{ item.name }} + {{ item.name }} ({{ item.description }}) + + + + + + @@ -293,6 +301,7 @@ export default { showAddInternalLB: false, networkOfferings: [], networkAclList: [], + selectedNetworkAcl: {}, modalLoading: false, internalLB: {}, LBPublicIPs: {}, @@ -430,11 +439,7 @@ export default { this.modalLoading = true api('listNetworkACLLists', { vpcid: this.resource.id }).then(json => { this.networkAclList = json.listnetworkacllistsresponse.networkacllist || [] - this.$nextTick(function () { - this.form.setFieldsValue({ - acl: this.networkAclList[0].id - }) - }) + this.handleNetworkAclChange(null) }).catch(error => { this.$notifyError(error) }).finally(() => { @@ -541,6 +546,13 @@ export default { handleNetworkOfferingChange (networkOfferingId) { this.selectedNetworkOffering = this.networkOfferings.filter(offering => offering.id === networkOfferingId)[0] }, + handleNetworkAclChange (aclId) { + if (aclId) { + this.selectedNetworkAcl = this.networkAclList.filter(acl => acl.id === aclId)[0] + } else { + this.selectedNetworkAcl = {} + } + }, closeModal () { this.$emit('close-action') },