mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Merge remote-tracking branch 'apache/4.15' into main
This commit is contained in:
commit
cb1078aa20
@ -18,17 +18,17 @@ package com.cloud.template;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.cloud.agent.api.to.DatadiskTO;
|
||||
import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.storage.DataStoreRole;
|
||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
|
||||
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
|
||||
import org.apache.cloudstack.framework.config.ConfigKey;
|
||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
|
||||
|
||||
import com.cloud.agent.api.to.DatadiskTO;
|
||||
import com.cloud.dc.DataCenterVO;
|
||||
import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import com.cloud.exception.StorageUnavailableException;
|
||||
import com.cloud.storage.DataStoreRole;
|
||||
import com.cloud.storage.StoragePool;
|
||||
import com.cloud.storage.VMTemplateStoragePoolVO;
|
||||
import com.cloud.storage.VMTemplateVO;
|
||||
@ -48,7 +48,8 @@ public interface TemplateManager {
|
||||
static final ConfigKey<Integer> TemplatePreloaderPoolSize = new ConfigKey<Integer>("Advanced", Integer.class, TemplatePreloaderPoolSizeCK, "8",
|
||||
"Size of the TemplateManager threadpool", false, ConfigKey.Scope.Global);
|
||||
|
||||
|
||||
static final String VMWARE_TOOLS_ISO = "vmware-tools.iso";
|
||||
static final String XS_TOOLS_ISO = "xs-tools.iso";
|
||||
|
||||
/**
|
||||
* Prepares a template for vm creation for a certain storage pool.
|
||||
|
||||
@ -27,11 +27,8 @@ import java.util.UUID;
|
||||
import javax.inject.Inject;
|
||||
import javax.naming.ConfigurationException;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.vmware.vim25.ManagedObjectReference;
|
||||
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.agent.api.StartupRoutingCommand;
|
||||
@ -75,9 +72,11 @@ import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.cloud.storage.Storage.TemplateType;
|
||||
import com.cloud.storage.VMTemplateVO;
|
||||
import com.cloud.storage.dao.VMTemplateDao;
|
||||
import com.cloud.template.TemplateManager;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.utils.Pair;
|
||||
import com.cloud.utils.UriUtils;
|
||||
import com.vmware.vim25.ManagedObjectReference;
|
||||
|
||||
public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer, ResourceStateAdapter {
|
||||
private static final Logger s_logger = Logger.getLogger(VmwareServerDiscoverer.class);
|
||||
@ -563,7 +562,7 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer
|
||||
}
|
||||
|
||||
private void createVmwareToolsIso() {
|
||||
String isoName = "vmware-tools.iso";
|
||||
String isoName = TemplateManager.VMWARE_TOOLS_ISO;
|
||||
VMTemplateVO tmplt = _tmpltDao.findByTemplateName(isoName);
|
||||
Long id;
|
||||
if (tmplt == null) {
|
||||
|
||||
@ -261,6 +261,7 @@ import com.cloud.storage.resource.VmwareStorageProcessor;
|
||||
import com.cloud.storage.resource.VmwareStorageProcessor.VmwareStorageProcessorConfigurableFields;
|
||||
import com.cloud.storage.resource.VmwareStorageSubsystemCommandHandler;
|
||||
import com.cloud.storage.template.TemplateProp;
|
||||
import com.cloud.template.TemplateManager;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import com.cloud.utils.ExecutionResult;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
@ -5181,7 +5182,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
||||
|
||||
String storeUrl = cmd.getStoreUrl();
|
||||
if (storeUrl == null) {
|
||||
if (!cmd.getIsoPath().equalsIgnoreCase("vmware-tools.iso")) {
|
||||
if (!cmd.getIsoPath().equalsIgnoreCase(TemplateManager.VMWARE_TOOLS_ISO)) {
|
||||
String msg = "ISO store root url is not found in AttachIsoCommand";
|
||||
s_logger.error(msg);
|
||||
throw new Exception(msg);
|
||||
|
||||
@ -96,6 +96,7 @@ import com.cloud.storage.Storage.ProvisioningType;
|
||||
import com.cloud.storage.StorageLayer;
|
||||
import com.cloud.storage.Volume;
|
||||
import com.cloud.storage.template.OVAProcessor;
|
||||
import com.cloud.template.TemplateManager;
|
||||
import com.cloud.utils.Pair;
|
||||
import com.cloud.utils.Ternary;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
@ -2440,7 +2441,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
|
||||
storeUrl = nfsImageStore.getUrl();
|
||||
}
|
||||
if (storeUrl == null) {
|
||||
if (!iso.getName().equalsIgnoreCase("vmware-tools.iso")) {
|
||||
if (!iso.getName().equalsIgnoreCase(TemplateManager.VMWARE_TOOLS_ISO)) {
|
||||
String msg = "ISO store root url is not found in AttachIsoCommand";
|
||||
s_logger.error(msg);
|
||||
throw new Exception(msg);
|
||||
|
||||
@ -84,6 +84,7 @@ import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.cloud.storage.Storage.TemplateType;
|
||||
import com.cloud.storage.VMTemplateVO;
|
||||
import com.cloud.storage.dao.VMTemplateDao;
|
||||
import com.cloud.template.TemplateManager;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
import com.cloud.utils.db.QueryBuilder;
|
||||
@ -118,7 +119,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
||||
@Inject
|
||||
private HostPodDao _podDao;
|
||||
|
||||
private String xenServerIsoName = "xs-tools.iso";
|
||||
private String xenServerIsoName = TemplateManager.XS_TOOLS_ISO;
|
||||
private String xenServerIsoDisplayText = "XenServer Tools Installer ISO (xen-pv-drv-iso)";
|
||||
|
||||
protected XcpServerDiscoverer() {
|
||||
|
||||
@ -16,6 +16,8 @@
|
||||
// under the License.
|
||||
package com.cloud.hypervisor.xenserver.resource;
|
||||
|
||||
import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
@ -124,6 +126,7 @@ import com.cloud.storage.Volume;
|
||||
import com.cloud.storage.VolumeVO;
|
||||
import com.cloud.storage.resource.StorageSubsystemCommandHandler;
|
||||
import com.cloud.storage.resource.StorageSubsystemCommandHandlerBase;
|
||||
import com.cloud.template.TemplateManager;
|
||||
import com.cloud.template.VirtualMachineTemplate.BootloaderType;
|
||||
import com.cloud.utils.ExecutionResult;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
@ -164,8 +167,6 @@ import com.xensource.xenapi.VLAN;
|
||||
import com.xensource.xenapi.VM;
|
||||
import com.xensource.xenapi.XenAPIObject;
|
||||
|
||||
import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
|
||||
|
||||
/**
|
||||
* CitrixResourceBase encapsulates the calls to the XenServer Xapi process to
|
||||
* perform the required functionalities for CloudStack.
|
||||
@ -222,8 +223,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
||||
private static final Logger s_logger = Logger.getLogger(CitrixResourceBase.class);
|
||||
protected static final HashMap<VmPowerState, PowerState> s_powerStatesTable;
|
||||
|
||||
private String xenServer70plusGuestToolsName = "guest-tools.iso";
|
||||
private String xenServerBefore70GuestToolsName = "xs-tools.iso";
|
||||
public static final String XS_TOOLS_ISO_AFTER_70 = "guest-tools.iso";
|
||||
|
||||
static {
|
||||
s_powerStatesTable = new HashMap<VmPowerState, PowerState>();
|
||||
@ -2666,11 +2666,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
||||
* Retrieve the actual ISO 'name-label' to be used.
|
||||
* We based our decision on XenServer version.
|
||||
* <ul>
|
||||
* <li> for XenServer 7.0+, we use {@value #xenServer70plusGuestToolsName};
|
||||
* <li> for versions before 7.0, we use {@value #xenServerBefore70GuestToolsName}.
|
||||
* <li> for XenServer 7.0+, we use {@value #XS_TOOLS_ISO_AFTER_70};
|
||||
* <li> for versions before 7.0, we use {@value TemplateManager#XS_TOOLS_ISO}.
|
||||
* </ul>
|
||||
*
|
||||
* For XCP we always use {@value #xenServerBefore70GuestToolsName}.
|
||||
*/
|
||||
protected String getActualIsoTemplate(Connection conn) throws XenAPIException, XmlRpcException {
|
||||
Host host = Host.getByUuid(conn, _host.getUuid());
|
||||
@ -2680,9 +2679,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
||||
String[] items = xenVersion.split("\\.");
|
||||
|
||||
if ((xenBrand.equals("XenServer") || xenBrand.equals("XCP-ng")) && Integer.parseInt(items[0]) >= 7) {
|
||||
return xenServer70plusGuestToolsName;
|
||||
return XS_TOOLS_ISO_AFTER_70;
|
||||
}
|
||||
return xenServerBefore70GuestToolsName;
|
||||
return TemplateManager.XS_TOOLS_ISO;
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
|
||||
@ -29,6 +29,7 @@ import org.mockito.runners.MockitoJUnitRunner;
|
||||
import com.cloud.storage.Storage.TemplateType;
|
||||
import com.cloud.storage.VMTemplateVO;
|
||||
import com.cloud.storage.dao.VMTemplateDao;
|
||||
import com.cloud.template.TemplateManager;
|
||||
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class XcpServerDiscovererTest {
|
||||
@ -42,13 +43,13 @@ public class XcpServerDiscovererTest {
|
||||
|
||||
@Test
|
||||
public void createXenServerToolsIsoEntryInDatabaseTestNoEntryFound() {
|
||||
Mockito.when(vmTemplateDao.findByTemplateName("xs-tools.iso")).thenReturn(null);
|
||||
Mockito.when(vmTemplateDao.findByTemplateName(TemplateManager.XS_TOOLS_ISO)).thenReturn(null);
|
||||
Mockito.when(vmTemplateDao.getNextInSequence(Long.class, "id")).thenReturn(1L);
|
||||
|
||||
xcpServerDiscoverer.createXenServerToolsIsoEntryInDatabase();
|
||||
|
||||
InOrder inOrder = Mockito.inOrder(vmTemplateDao);
|
||||
inOrder.verify(vmTemplateDao).findByTemplateName("xs-tools.iso");
|
||||
inOrder.verify(vmTemplateDao).findByTemplateName(TemplateManager.XS_TOOLS_ISO);
|
||||
inOrder.verify(vmTemplateDao).getNextInSequence(Long.class, "id");
|
||||
inOrder.verify(vmTemplateDao).persist(Mockito.any(VMTemplateVO.class));
|
||||
}
|
||||
@ -56,13 +57,13 @@ public class XcpServerDiscovererTest {
|
||||
@Test
|
||||
public void createXenServerToolsIsoEntryInDatabaseTestEntryAlreadyExist() {
|
||||
VMTemplateVO vmTemplateVOMock = Mockito.mock(VMTemplateVO.class);
|
||||
Mockito.when(vmTemplateDao.findByTemplateName("xs-tools.iso")).thenReturn(vmTemplateVOMock);
|
||||
Mockito.when(vmTemplateDao.findByTemplateName(TemplateManager.XS_TOOLS_ISO)).thenReturn(vmTemplateVOMock);
|
||||
Mockito.when(vmTemplateVOMock.getId()).thenReturn(1L);
|
||||
|
||||
xcpServerDiscoverer.createXenServerToolsIsoEntryInDatabase();
|
||||
|
||||
InOrder inOrder = Mockito.inOrder(vmTemplateDao, vmTemplateVOMock);
|
||||
inOrder.verify(vmTemplateDao).findByTemplateName("xs-tools.iso");
|
||||
inOrder.verify(vmTemplateDao).findByTemplateName(TemplateManager.XS_TOOLS_ISO);
|
||||
inOrder.verify(vmTemplateDao, Mockito.times(0)).getNextInSequence(Long.class, "id");
|
||||
inOrder.verify(vmTemplateVOMock).setTemplateType(TemplateType.PERHOST);
|
||||
inOrder.verify(vmTemplateVOMock).setUrl(null);
|
||||
|
||||
@ -42,6 +42,7 @@ import com.cloud.agent.api.StoragePoolInfo;
|
||||
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase.SRType;
|
||||
import com.cloud.storage.Storage.StoragePoolType;
|
||||
import com.cloud.storage.Storage.StorageResourceType;
|
||||
import com.cloud.template.TemplateManager;
|
||||
import com.cloud.utils.script.Script;
|
||||
import com.xensource.xenapi.Connection;
|
||||
import com.xensource.xenapi.Host;
|
||||
@ -149,7 +150,7 @@ public class CitrixResourceBaseTest {
|
||||
|
||||
String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock);
|
||||
|
||||
Assert.assertEquals("xs-tools.iso", returnedIsoTemplateName);
|
||||
Assert.assertEquals(TemplateManager.XS_TOOLS_ISO, returnedIsoTemplateName);
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -159,7 +160,7 @@ public class CitrixResourceBaseTest {
|
||||
|
||||
String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock);
|
||||
|
||||
Assert.assertEquals("xs-tools.iso", returnedIsoTemplateName);
|
||||
Assert.assertEquals(TemplateManager.XS_TOOLS_ISO, returnedIsoTemplateName);
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -169,7 +170,7 @@ public class CitrixResourceBaseTest {
|
||||
|
||||
String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock);
|
||||
|
||||
Assert.assertEquals("guest-tools.iso", returnedIsoTemplateName);
|
||||
Assert.assertEquals(CitrixResourceBase.XS_TOOLS_ISO_AFTER_70, returnedIsoTemplateName);
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -179,7 +180,7 @@ public class CitrixResourceBaseTest {
|
||||
|
||||
String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock);
|
||||
|
||||
Assert.assertEquals("guest-tools.iso", returnedIsoTemplateName);
|
||||
Assert.assertEquals(CitrixResourceBase.XS_TOOLS_ISO_AFTER_70, returnedIsoTemplateName);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@ -31,8 +31,6 @@ import java.util.stream.Stream;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.storage.dao.VMTemplateDetailsDao;
|
||||
import com.cloud.vm.VirtualMachineManager;
|
||||
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
|
||||
import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO;
|
||||
import org.apache.cloudstack.affinity.AffinityGroupResponse;
|
||||
@ -220,6 +218,7 @@ import com.cloud.storage.VMTemplateVO;
|
||||
import com.cloud.storage.Volume;
|
||||
import com.cloud.storage.dao.StoragePoolTagsDao;
|
||||
import com.cloud.storage.dao.VMTemplateDao;
|
||||
import com.cloud.storage.dao.VMTemplateDetailsDao;
|
||||
import com.cloud.tags.ResourceTagVO;
|
||||
import com.cloud.tags.dao.ResourceTagDao;
|
||||
import com.cloud.template.VirtualMachineTemplate.State;
|
||||
@ -246,6 +245,7 @@ import com.cloud.vm.DomainRouterVO;
|
||||
import com.cloud.vm.UserVmVO;
|
||||
import com.cloud.vm.VMInstanceVO;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.VirtualMachineManager;
|
||||
import com.cloud.vm.VmDetailConstants;
|
||||
import com.cloud.vm.dao.DomainRouterDao;
|
||||
import com.cloud.vm.dao.UserVmDao;
|
||||
@ -3663,7 +3663,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q
|
||||
SearchCriteria<TemplateJoinVO> zoneSc = _templateJoinDao.createSearchCriteria();
|
||||
zoneSc.addOr("dataCenterId", SearchCriteria.Op.EQ, zoneId);
|
||||
zoneSc.addOr("dataStoreScope", SearchCriteria.Op.EQ, ScopeType.REGION);
|
||||
// handle the case where xs-tools.iso and vmware-tools.iso do not
|
||||
// handle the case where TemplateManager.VMWARE_TOOLS_ISO and TemplateManager.VMWARE_TOOLS_ISO do not
|
||||
// have data_center information in template_view
|
||||
SearchCriteria<TemplateJoinVO> isoPerhostSc = _templateJoinDao.createSearchCriteria();
|
||||
isoPerhostSc.addAnd("format", SearchCriteria.Op.EQ, ImageFormat.ISO);
|
||||
|
||||
@ -26,15 +26,7 @@ import java.util.Set;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.deployasis.DeployAsIsConstants;
|
||||
import com.cloud.deployasis.TemplateDeployAsIsDetailVO;
|
||||
import com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDao;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
|
||||
import org.apache.cloudstack.utils.security.DigestHelper;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import org.apache.cloudstack.api.ResponseObject.ResponseView;
|
||||
import org.apache.cloudstack.api.response.ChildTemplateResponse;
|
||||
import org.apache.cloudstack.api.response.TemplateResponse;
|
||||
@ -43,13 +35,20 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreState
|
||||
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState;
|
||||
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
|
||||
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
|
||||
import org.apache.cloudstack.utils.security.DigestHelper;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.cloud.api.ApiDBUtils;
|
||||
import com.cloud.api.ApiResponseHelper;
|
||||
import com.cloud.api.query.vo.ResourceTagJoinVO;
|
||||
import com.cloud.api.query.vo.TemplateJoinVO;
|
||||
import com.cloud.deployasis.DeployAsIsConstants;
|
||||
import com.cloud.deployasis.TemplateDeployAsIsDetailVO;
|
||||
import com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.storage.Storage;
|
||||
import com.cloud.storage.Storage.TemplateType;
|
||||
@ -368,7 +367,7 @@ public class TemplateJoinDaoImpl extends GenericDaoBaseWithTagInformation<Templa
|
||||
isoResponse.setCreated(iso.getCreatedOnStore());
|
||||
isoResponse.setDynamicallyScalable(iso.isDynamicallyScalable());
|
||||
if (iso.getTemplateType() == TemplateType.PERHOST) {
|
||||
// for xs-tools.iso and vmware-tools.iso, we didn't download, but is ready to use.
|
||||
// for TemplateManager.XS_TOOLS_ISO and TemplateManager.VMWARE_TOOLS_ISO, we didn't download, but is ready to use.
|
||||
isoResponse.setReady(true);
|
||||
} else {
|
||||
isoResponse.setReady(iso.getState() == ObjectInDataStoreStateMachine.State.Ready);
|
||||
|
||||
@ -137,9 +137,9 @@ import com.cloud.exception.StorageUnavailableException;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.hypervisor.HypervisorGuru;
|
||||
import com.cloud.hypervisor.HypervisorGuruManager;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.projects.Project;
|
||||
import com.cloud.projects.ProjectManager;
|
||||
import com.cloud.storage.DataStoreRole;
|
||||
@ -299,7 +299,6 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
|
||||
@Inject
|
||||
private EndPointSelector selector;
|
||||
|
||||
|
||||
private TemplateAdapter getAdapter(HypervisorType type) {
|
||||
TemplateAdapter adapter = null;
|
||||
if (type == HypervisorType.BareMetal) {
|
||||
@ -1165,10 +1164,11 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
|
||||
throw new InvalidParameterValueException("Unable to find an ISO with id " + isoId);
|
||||
}
|
||||
|
||||
long dcId = vm.getDataCenterId();
|
||||
VMTemplateZoneVO exists = _tmpltZoneDao.findByZoneTemplate(dcId, isoId);
|
||||
if (null == exists) {
|
||||
throw new InvalidParameterValueException("ISO is not available in the zone the VM is in.");
|
||||
if (!TemplateType.PERHOST.equals(iso.getTemplateType())) {
|
||||
VMTemplateZoneVO exists = _tmpltZoneDao.findByZoneTemplate(vm.getDataCenterId(), isoId);
|
||||
if (null == exists) {
|
||||
throw new InvalidParameterValueException("ISO is not available in the zone the VM is in.");
|
||||
}
|
||||
}
|
||||
|
||||
// check permissions
|
||||
@ -1185,11 +1185,11 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
|
||||
throw new InvalidParameterValueException("Please specify a VM that is either Stopped or Running.");
|
||||
}
|
||||
|
||||
if ("xen-pv-drv-iso".equals(iso.getDisplayText()) && vm.getHypervisorType() != Hypervisor.HypervisorType.XenServer) {
|
||||
if (XS_TOOLS_ISO.equals(iso.getUniqueName()) && vm.getHypervisorType() != Hypervisor.HypervisorType.XenServer) {
|
||||
throw new InvalidParameterValueException("Cannot attach Xenserver PV drivers to incompatible hypervisor " + vm.getHypervisorType());
|
||||
}
|
||||
|
||||
if ("vmware-tools.iso".equals(iso.getName()) && vm.getHypervisorType() != Hypervisor.HypervisorType.VMware) {
|
||||
if (VMWARE_TOOLS_ISO.equals(iso.getUniqueName()) && vm.getHypervisorType() != Hypervisor.HypervisorType.VMware) {
|
||||
throw new InvalidParameterValueException("Cannot attach VMware tools drivers to incompatible hypervisor " + vm.getHypervisorType());
|
||||
}
|
||||
boolean result = attachISOToVM(vmId, userId, isoId, true, forced);
|
||||
|
||||
@ -16,9 +16,9 @@
|
||||
// under the License.
|
||||
package com.cloud.api.query.dao;
|
||||
|
||||
import com.cloud.hypervisor.Hypervisor;
|
||||
import com.cloud.storage.Storage;
|
||||
import com.cloud.user.Account;
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.cloudstack.api.response.TemplateResponse;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
@ -27,13 +27,14 @@ import org.junit.runner.RunWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
|
||||
import com.cloud.api.ApiDBUtils;
|
||||
import com.cloud.api.query.vo.TemplateJoinVO;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
import com.cloud.hypervisor.Hypervisor;
|
||||
import com.cloud.storage.Storage;
|
||||
import com.cloud.template.TemplateManager;
|
||||
import com.cloud.user.Account;
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest(ApiDBUtils.class)
|
||||
@ -47,7 +48,7 @@ public class TemplateJoinDaoImplTest extends GenericDaoBaseWithTagInformationBas
|
||||
|
||||
//TemplateJoinVO fields
|
||||
private String uuid = "1234567890abc";
|
||||
private String name = "xs-tools.iso";
|
||||
private String name = TemplateManager.XS_TOOLS_ISO;
|
||||
private String displayText = "xen-pv-drv-iso";
|
||||
private boolean publicTemplate = true;
|
||||
private Date created = new Date();
|
||||
|
||||
@ -279,8 +279,7 @@ class CsRedundant(object):
|
||||
CsHelper.execute(cmd2)
|
||||
dev = interface.get_device()
|
||||
|
||||
cmd = "%s -C %s" % (self.CONNTRACKD_BIN, self.CONNTRACKD_CONF)
|
||||
CsHelper.execute("%s -d" % cmd)
|
||||
CsHelper.service("conntrackd", "restart")
|
||||
CsHelper.service("ipsec", "stop")
|
||||
CsHelper.service("xl2tpd", "stop")
|
||||
|
||||
|
||||
@ -134,8 +134,9 @@
|
||||
</span>
|
||||
<span v-else>{{ text }}</span>
|
||||
</span>
|
||||
<template slot="state" slot-scope="text">
|
||||
<status :text="text ? text : ''" displayText />
|
||||
<template slot="state" slot-scope="text, record">
|
||||
<status v-if="$route.path.startsWith('/host')" :text="getHostState(record)" displayText />
|
||||
<status v-else :text="text ? text : ''" displayText />
|
||||
</template>
|
||||
<template slot="allocationstate" slot-scope="text">
|
||||
<status :text="text ? text : ''" displayText />
|
||||
@ -584,6 +585,12 @@ export default {
|
||||
}
|
||||
|
||||
return record.nic.filter(e => { return e.ip6address }).map(e => { return e.ip6address }).join(', ') || text
|
||||
},
|
||||
getHostState (host) {
|
||||
if (host && host.hypervisor === 'KVM' && host.state === 'Up' && host.details && host.details.secured !== 'true') {
|
||||
return 'Unsecure'
|
||||
}
|
||||
return host.state
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -141,6 +141,7 @@ export default {
|
||||
case 'created':
|
||||
case 'maintenance':
|
||||
case 'pending':
|
||||
case 'unsecure':
|
||||
status = 'warning'
|
||||
break
|
||||
}
|
||||
|
||||
@ -37,8 +37,8 @@
|
||||
:layout="isMobile() ? 'horizontal': 'inline'"
|
||||
:form="form"
|
||||
@submit="handleAddRange">
|
||||
<a-row :gutter="12">
|
||||
<a-col :md="4" :lg="4">
|
||||
<div class="form-row">
|
||||
<div class="form-col">
|
||||
<a-form-item>
|
||||
<a-input
|
||||
v-decorator="[ 'gateway', {
|
||||
@ -48,8 +48,8 @@
|
||||
autoFocus
|
||||
/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :md="4" :lg="4">
|
||||
</div>
|
||||
<div class="form-col">
|
||||
<a-form-item>
|
||||
<a-input
|
||||
v-decorator="[ 'netmask', {
|
||||
@ -58,16 +58,16 @@
|
||||
:placeholder="$t('label.netmask')"
|
||||
/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :md="4" :lg="4">
|
||||
</div>
|
||||
<div class="form-col">
|
||||
<a-form-item>
|
||||
<a-input
|
||||
v-decorator="[ 'vlan', { rules: [{ required: false }] }]"
|
||||
:placeholder="$t('label.vlan')"
|
||||
/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :md="4" :lg="4">
|
||||
</div>
|
||||
<div class="form-col">
|
||||
<a-form-item>
|
||||
<a-input
|
||||
v-decorator="[ 'startIp', {
|
||||
@ -86,8 +86,8 @@
|
||||
:placeholder="$t('label.start.ip')"
|
||||
/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :md="4" :lg="4">
|
||||
</div>
|
||||
<div class="form-col">
|
||||
<a-form-item>
|
||||
<a-input
|
||||
v-decorator="[ 'endIp', {
|
||||
@ -105,13 +105,13 @@
|
||||
:placeholder="$t('label.end.ip')"
|
||||
/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :md="4" :lg="4">
|
||||
<a-form-item :style="{ display: 'inline-block', float: 'right' }">
|
||||
</div>
|
||||
<div class="form-col">
|
||||
<a-form-item :style="{ display: 'inline-block', float: 'right', marginRight: 0 }">
|
||||
<a-button type="primary" html-type="submit">{{ $t('label.add') }}</a-button>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</div>
|
||||
</div>
|
||||
</a-form>
|
||||
</template>
|
||||
</a-table>
|
||||
@ -183,12 +183,12 @@ export default {
|
||||
{
|
||||
title: this.$t('label.gateway'),
|
||||
dataIndex: 'gateway',
|
||||
width: 150
|
||||
width: 140
|
||||
},
|
||||
{
|
||||
title: this.$t('label.netmask'),
|
||||
dataIndex: 'netmask',
|
||||
width: 150
|
||||
width: 140
|
||||
},
|
||||
{
|
||||
title: this.$t('label.vlan'),
|
||||
@ -198,12 +198,12 @@ export default {
|
||||
{
|
||||
title: this.$t('label.start.ip'),
|
||||
dataIndex: 'startIp',
|
||||
width: 130
|
||||
width: 140
|
||||
},
|
||||
{
|
||||
title: this.$t('label.end.ip'),
|
||||
dataIndex: 'endIp',
|
||||
width: 130
|
||||
width: 140
|
||||
},
|
||||
{
|
||||
title: '',
|
||||
@ -286,3 +286,16 @@ export default {
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="less">
|
||||
.form-row {
|
||||
display: grid;
|
||||
grid-template-columns: 145px 145px 130px 145px 145px 70px;
|
||||
justify-content: center;
|
||||
|
||||
@media (max-width: 768px) {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -264,7 +264,6 @@ export default {
|
||||
},
|
||||
filters: {
|
||||
capitalise: val => {
|
||||
if (val === 'all') return this.$t('label.all')
|
||||
return val.toUpperCase()
|
||||
}
|
||||
},
|
||||
|
||||
@ -77,7 +77,7 @@
|
||||
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
|
||||
:rowKey="record => record.id">
|
||||
<template slot="protocol" slot-scope="record">
|
||||
{{ record.protocol | capitalise }}
|
||||
{{ getCapitalise(record.protocol) }}
|
||||
</template>
|
||||
<template slot="startport" slot-scope="record">
|
||||
{{ record.icmptype || record.startport >= 0 ? record.icmptype || record.startport : 'All' }}
|
||||
@ -208,7 +208,6 @@ export default {
|
||||
},
|
||||
filters: {
|
||||
capitalise: val => {
|
||||
if (val === 'all') return this.$t('label.all')
|
||||
return val.toUpperCase()
|
||||
}
|
||||
},
|
||||
@ -284,6 +283,10 @@ export default {
|
||||
this.deleteRule(rule)
|
||||
}
|
||||
},
|
||||
getCapitalise (val) {
|
||||
if (val === 'all') return this.$t('label.all')
|
||||
return val.toUpperCase()
|
||||
},
|
||||
deleteRule (rule) {
|
||||
this.loading = true
|
||||
api('deleteEgressFirewallRule', { id: rule.id }).then(response => {
|
||||
|
||||
@ -72,7 +72,7 @@
|
||||
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
|
||||
:rowKey="record => record.id">
|
||||
<template slot="protocol" slot-scope="record">
|
||||
{{ record.protocol | capitalise }}
|
||||
{{ getCapitalise(record.protocol) }}
|
||||
</template>
|
||||
<template slot="startport" slot-scope="record">
|
||||
{{ record.icmptype || record.startport >= 0 ? record.icmptype || record.startport : $t('label.all') }}
|
||||
@ -261,12 +261,6 @@ export default {
|
||||
created () {
|
||||
this.fetchData()
|
||||
},
|
||||
filters: {
|
||||
capitalise: val => {
|
||||
if (val === 'all') return 'All'
|
||||
return val.toUpperCase()
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
resource: function (newItem, oldItem) {
|
||||
if (!newItem || !newItem.id) {
|
||||
@ -340,6 +334,10 @@ export default {
|
||||
this.deleteRule(rule)
|
||||
}
|
||||
},
|
||||
getCapitalise (val) {
|
||||
if (val === 'all') return this.$t('label.all')
|
||||
return val.toUpperCase()
|
||||
},
|
||||
deleteRule (rule) {
|
||||
this.loading = true
|
||||
api('deleteFirewallRule', { id: rule.id }).then(response => {
|
||||
|
||||
@ -90,7 +90,7 @@
|
||||
:pagination="{ pageSizeOptions: ['10', '20', '40', '80', '100', '200'], showSizeChanger: true}"
|
||||
:rowKey="record => record.ruleid">
|
||||
<template slot="protocol" slot-scope="record">
|
||||
{{ record.protocol | capitalise }}
|
||||
{{ getCapitalise(record.protocol) }}
|
||||
</template>
|
||||
<template slot="account" slot-scope="record">
|
||||
<div v-if="record.account && record.securitygroupname">
|
||||
@ -265,7 +265,6 @@ export default {
|
||||
},
|
||||
filters: {
|
||||
capitalise: val => {
|
||||
if (val === 'all') return this.$t('label.all')
|
||||
return val.toUpperCase()
|
||||
}
|
||||
},
|
||||
@ -277,6 +276,10 @@ export default {
|
||||
this.tabType = this.$parent.tab === this.$t('label.ingress.rule') ? 'ingress' : 'egress'
|
||||
this.rules = this.tabType === 'ingress' ? this.resource.ingressrule : this.resource.egressrule
|
||||
},
|
||||
getCapitalise (val) {
|
||||
if (val === 'all') return this.$t('label.all')
|
||||
return val.toUpperCase()
|
||||
},
|
||||
handleAddRule () {
|
||||
if (this.isSubmitted) return
|
||||
this.isSubmitted = true
|
||||
|
||||
@ -83,7 +83,7 @@
|
||||
{{ returnAlgorithmName(record.algorithm) }}
|
||||
</template>
|
||||
<template slot="protocol" slot-scope="record">
|
||||
{{ record.protocol | capitalise }}
|
||||
{{ getCapitalise(record.protocol) }}
|
||||
</template>
|
||||
<template slot="stickiness" slot-scope="record">
|
||||
<a-button @click="() => openStickinessModal(record.id)">
|
||||
@ -597,12 +597,6 @@ export default {
|
||||
this.fetchData()
|
||||
}
|
||||
},
|
||||
filters: {
|
||||
capitalise: val => {
|
||||
if (val === 'all') return this.$t('label.all')
|
||||
return val.toUpperCase()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
fetchData () {
|
||||
this.fetchListTiers()
|
||||
@ -701,6 +695,10 @@ export default {
|
||||
}
|
||||
return 'Configure'
|
||||
},
|
||||
getCapitalise (val) {
|
||||
if (val === 'all') return this.$t('label.all')
|
||||
return val.toUpperCase()
|
||||
},
|
||||
openTagsModal (id) {
|
||||
this.tagsModalLoading = true
|
||||
this.tagsModalVisible = true
|
||||
|
||||
@ -95,7 +95,7 @@
|
||||
{{ record.publicport }} - {{ record.publicendport }}
|
||||
</template>
|
||||
<template slot="protocol" slot-scope="record">
|
||||
{{ record.protocol | capitalise }}
|
||||
{{ getCapitalise(record.protocol) }}
|
||||
</template>
|
||||
<template slot="vm" slot-scope="record">
|
||||
<div><a-icon type="desktop"/>
|
||||
@ -434,12 +434,6 @@ export default {
|
||||
this.fetchData()
|
||||
}
|
||||
},
|
||||
filters: {
|
||||
capitalise: val => {
|
||||
if (val === 'all') return this.$t('label.all')
|
||||
return val.toUpperCase()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
fetchData () {
|
||||
this.fetchListTiers()
|
||||
@ -529,6 +523,10 @@ export default {
|
||||
this.deleteRule(rule)
|
||||
}
|
||||
},
|
||||
getCapitalise (val) {
|
||||
if (val === 'all') return this.$t('label.all')
|
||||
return val.toUpperCase()
|
||||
},
|
||||
deleteRule (rule) {
|
||||
this.loading = true
|
||||
api('deletePortForwardingRule', { id: rule.id }).then(response => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user