Merge remote-tracking branch 'apache/4.15' into main

This commit is contained in:
davidjumani 2021-08-09 15:10:51 +05:30
commit cb1078aa20
No known key found for this signature in database
GPG Key ID: 92D88ECF4D63C923
22 changed files with 129 additions and 106 deletions

View File

@ -18,17 +18,17 @@ package com.cloud.template;
import java.util.List; 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.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import com.cloud.agent.api.to.DatadiskTO;
import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVO;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.StorageUnavailableException; import com.cloud.exception.StorageUnavailableException;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePool;
import com.cloud.storage.VMTemplateStoragePoolVO; import com.cloud.storage.VMTemplateStoragePoolVO;
import com.cloud.storage.VMTemplateVO; 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", static final ConfigKey<Integer> TemplatePreloaderPoolSize = new ConfigKey<Integer>("Advanced", Integer.class, TemplatePreloaderPoolSizeCK, "8",
"Size of the TemplateManager threadpool", false, ConfigKey.Scope.Global); "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. * Prepares a template for vm creation for a certain storage pool.

View File

@ -27,11 +27,8 @@ import java.util.UUID;
import javax.inject.Inject; import javax.inject.Inject;
import javax.naming.ConfigurationException; import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import com.vmware.vim25.ManagedObjectReference;
import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiConstants;
import org.apache.log4j.Logger;
import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupRoutingCommand; 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.Storage.TemplateType;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.template.TemplateManager;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.utils.Pair; import com.cloud.utils.Pair;
import com.cloud.utils.UriUtils; import com.cloud.utils.UriUtils;
import com.vmware.vim25.ManagedObjectReference;
public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer, ResourceStateAdapter { public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer, ResourceStateAdapter {
private static final Logger s_logger = Logger.getLogger(VmwareServerDiscoverer.class); private static final Logger s_logger = Logger.getLogger(VmwareServerDiscoverer.class);
@ -563,7 +562,7 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer
} }
private void createVmwareToolsIso() { private void createVmwareToolsIso() {
String isoName = "vmware-tools.iso"; String isoName = TemplateManager.VMWARE_TOOLS_ISO;
VMTemplateVO tmplt = _tmpltDao.findByTemplateName(isoName); VMTemplateVO tmplt = _tmpltDao.findByTemplateName(isoName);
Long id; Long id;
if (tmplt == null) { if (tmplt == null) {

View File

@ -261,6 +261,7 @@ import com.cloud.storage.resource.VmwareStorageProcessor;
import com.cloud.storage.resource.VmwareStorageProcessor.VmwareStorageProcessorConfigurableFields; import com.cloud.storage.resource.VmwareStorageProcessor.VmwareStorageProcessorConfigurableFields;
import com.cloud.storage.resource.VmwareStorageSubsystemCommandHandler; import com.cloud.storage.resource.VmwareStorageSubsystemCommandHandler;
import com.cloud.storage.template.TemplateProp; import com.cloud.storage.template.TemplateProp;
import com.cloud.template.TemplateManager;
import com.cloud.utils.DateUtil; import com.cloud.utils.DateUtil;
import com.cloud.utils.ExecutionResult; import com.cloud.utils.ExecutionResult;
import com.cloud.utils.NumbersUtil; import com.cloud.utils.NumbersUtil;
@ -5181,7 +5182,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
String storeUrl = cmd.getStoreUrl(); String storeUrl = cmd.getStoreUrl();
if (storeUrl == null) { 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"; String msg = "ISO store root url is not found in AttachIsoCommand";
s_logger.error(msg); s_logger.error(msg);
throw new Exception(msg); throw new Exception(msg);

View File

@ -96,6 +96,7 @@ import com.cloud.storage.Storage.ProvisioningType;
import com.cloud.storage.StorageLayer; import com.cloud.storage.StorageLayer;
import com.cloud.storage.Volume; import com.cloud.storage.Volume;
import com.cloud.storage.template.OVAProcessor; import com.cloud.storage.template.OVAProcessor;
import com.cloud.template.TemplateManager;
import com.cloud.utils.Pair; import com.cloud.utils.Pair;
import com.cloud.utils.Ternary; import com.cloud.utils.Ternary;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
@ -2440,7 +2441,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
storeUrl = nfsImageStore.getUrl(); storeUrl = nfsImageStore.getUrl();
} }
if (storeUrl == null) { 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"; String msg = "ISO store root url is not found in AttachIsoCommand";
s_logger.error(msg); s_logger.error(msg);
throw new Exception(msg); throw new Exception(msg);

View File

@ -84,6 +84,7 @@ import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.template.TemplateManager;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.utils.NumbersUtil; import com.cloud.utils.NumbersUtil;
import com.cloud.utils.db.QueryBuilder; import com.cloud.utils.db.QueryBuilder;
@ -118,7 +119,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
@Inject @Inject
private HostPodDao _podDao; 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)"; private String xenServerIsoDisplayText = "XenServer Tools Installer ISO (xen-pv-drv-iso)";
protected XcpServerDiscoverer() { protected XcpServerDiscoverer() {

View File

@ -16,6 +16,8 @@
// under the License. // under the License.
package com.cloud.hypervisor.xenserver.resource; package com.cloud.hypervisor.xenserver.resource;
import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.BufferedWriter; import java.io.BufferedWriter;
import java.io.File; import java.io.File;
@ -124,6 +126,7 @@ import com.cloud.storage.Volume;
import com.cloud.storage.VolumeVO; import com.cloud.storage.VolumeVO;
import com.cloud.storage.resource.StorageSubsystemCommandHandler; import com.cloud.storage.resource.StorageSubsystemCommandHandler;
import com.cloud.storage.resource.StorageSubsystemCommandHandlerBase; import com.cloud.storage.resource.StorageSubsystemCommandHandlerBase;
import com.cloud.template.TemplateManager;
import com.cloud.template.VirtualMachineTemplate.BootloaderType; import com.cloud.template.VirtualMachineTemplate.BootloaderType;
import com.cloud.utils.ExecutionResult; import com.cloud.utils.ExecutionResult;
import com.cloud.utils.NumbersUtil; import com.cloud.utils.NumbersUtil;
@ -164,8 +167,6 @@ import com.xensource.xenapi.VLAN;
import com.xensource.xenapi.VM; import com.xensource.xenapi.VM;
import com.xensource.xenapi.XenAPIObject; import com.xensource.xenapi.XenAPIObject;
import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
/** /**
* CitrixResourceBase encapsulates the calls to the XenServer Xapi process to * CitrixResourceBase encapsulates the calls to the XenServer Xapi process to
* perform the required functionalities for CloudStack. * 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); private static final Logger s_logger = Logger.getLogger(CitrixResourceBase.class);
protected static final HashMap<VmPowerState, PowerState> s_powerStatesTable; protected static final HashMap<VmPowerState, PowerState> s_powerStatesTable;
private String xenServer70plusGuestToolsName = "guest-tools.iso"; public static final String XS_TOOLS_ISO_AFTER_70 = "guest-tools.iso";
private String xenServerBefore70GuestToolsName = "xs-tools.iso";
static { static {
s_powerStatesTable = new HashMap<VmPowerState, PowerState>(); 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. * Retrieve the actual ISO 'name-label' to be used.
* We based our decision on XenServer version. * We based our decision on XenServer version.
* <ul> * <ul>
* <li> for XenServer 7.0+, we use {@value #xenServer70plusGuestToolsName}; * <li> for XenServer 7.0+, we use {@value #XS_TOOLS_ISO_AFTER_70};
* <li> for versions before 7.0, we use {@value #xenServerBefore70GuestToolsName}. * <li> for versions before 7.0, we use {@value TemplateManager#XS_TOOLS_ISO}.
* </ul> * </ul>
* *
* For XCP we always use {@value #xenServerBefore70GuestToolsName}.
*/ */
protected String getActualIsoTemplate(Connection conn) throws XenAPIException, XmlRpcException { protected String getActualIsoTemplate(Connection conn) throws XenAPIException, XmlRpcException {
Host host = Host.getByUuid(conn, _host.getUuid()); Host host = Host.getByUuid(conn, _host.getUuid());
@ -2680,9 +2679,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
String[] items = xenVersion.split("\\."); String[] items = xenVersion.split("\\.");
if ((xenBrand.equals("XenServer") || xenBrand.equals("XCP-ng")) && Integer.parseInt(items[0]) >= 7) { 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() { public String getLabel() {

View File

@ -29,6 +29,7 @@ import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.template.TemplateManager;
@RunWith(MockitoJUnitRunner.class) @RunWith(MockitoJUnitRunner.class)
public class XcpServerDiscovererTest { public class XcpServerDiscovererTest {
@ -42,13 +43,13 @@ public class XcpServerDiscovererTest {
@Test @Test
public void createXenServerToolsIsoEntryInDatabaseTestNoEntryFound() { 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); Mockito.when(vmTemplateDao.getNextInSequence(Long.class, "id")).thenReturn(1L);
xcpServerDiscoverer.createXenServerToolsIsoEntryInDatabase(); xcpServerDiscoverer.createXenServerToolsIsoEntryInDatabase();
InOrder inOrder = Mockito.inOrder(vmTemplateDao); 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).getNextInSequence(Long.class, "id");
inOrder.verify(vmTemplateDao).persist(Mockito.any(VMTemplateVO.class)); inOrder.verify(vmTemplateDao).persist(Mockito.any(VMTemplateVO.class));
} }
@ -56,13 +57,13 @@ public class XcpServerDiscovererTest {
@Test @Test
public void createXenServerToolsIsoEntryInDatabaseTestEntryAlreadyExist() { public void createXenServerToolsIsoEntryInDatabaseTestEntryAlreadyExist() {
VMTemplateVO vmTemplateVOMock = Mockito.mock(VMTemplateVO.class); 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); Mockito.when(vmTemplateVOMock.getId()).thenReturn(1L);
xcpServerDiscoverer.createXenServerToolsIsoEntryInDatabase(); xcpServerDiscoverer.createXenServerToolsIsoEntryInDatabase();
InOrder inOrder = Mockito.inOrder(vmTemplateDao, vmTemplateVOMock); 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(vmTemplateDao, Mockito.times(0)).getNextInSequence(Long.class, "id");
inOrder.verify(vmTemplateVOMock).setTemplateType(TemplateType.PERHOST); inOrder.verify(vmTemplateVOMock).setTemplateType(TemplateType.PERHOST);
inOrder.verify(vmTemplateVOMock).setUrl(null); inOrder.verify(vmTemplateVOMock).setUrl(null);

View File

@ -42,6 +42,7 @@ import com.cloud.agent.api.StoragePoolInfo;
import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase.SRType; import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase.SRType;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Storage.StorageResourceType; import com.cloud.storage.Storage.StorageResourceType;
import com.cloud.template.TemplateManager;
import com.cloud.utils.script.Script; import com.cloud.utils.script.Script;
import com.xensource.xenapi.Connection; import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Host; import com.xensource.xenapi.Host;
@ -149,7 +150,7 @@ public class CitrixResourceBaseTest {
String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock); String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock);
Assert.assertEquals("xs-tools.iso", returnedIsoTemplateName); Assert.assertEquals(TemplateManager.XS_TOOLS_ISO, returnedIsoTemplateName);
} }
@Test @Test
@ -159,7 +160,7 @@ public class CitrixResourceBaseTest {
String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock); String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock);
Assert.assertEquals("xs-tools.iso", returnedIsoTemplateName); Assert.assertEquals(TemplateManager.XS_TOOLS_ISO, returnedIsoTemplateName);
} }
@Test @Test
@ -169,7 +170,7 @@ public class CitrixResourceBaseTest {
String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock); String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock);
Assert.assertEquals("guest-tools.iso", returnedIsoTemplateName); Assert.assertEquals(CitrixResourceBase.XS_TOOLS_ISO_AFTER_70, returnedIsoTemplateName);
} }
@Test @Test
@ -179,7 +180,7 @@ public class CitrixResourceBaseTest {
String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock); String returnedIsoTemplateName = citrixResourceBase.getActualIsoTemplate(connectionMock);
Assert.assertEquals("guest-tools.iso", returnedIsoTemplateName); Assert.assertEquals(CitrixResourceBase.XS_TOOLS_ISO_AFTER_70, returnedIsoTemplateName);
} }
@Test @Test

View File

@ -31,8 +31,6 @@ import java.util.stream.Stream;
import javax.inject.Inject; 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.acl.ControlledEntity.ACLType;
import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO; import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO;
import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.affinity.AffinityGroupResponse;
@ -220,6 +218,7 @@ import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume; import com.cloud.storage.Volume;
import com.cloud.storage.dao.StoragePoolTagsDao; import com.cloud.storage.dao.StoragePoolTagsDao;
import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.dao.VMTemplateDetailsDao;
import com.cloud.tags.ResourceTagVO; import com.cloud.tags.ResourceTagVO;
import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagDao;
import com.cloud.template.VirtualMachineTemplate.State; import com.cloud.template.VirtualMachineTemplate.State;
@ -246,6 +245,7 @@ import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.UserVmVO; import com.cloud.vm.UserVmVO;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineManager;
import com.cloud.vm.VmDetailConstants; import com.cloud.vm.VmDetailConstants;
import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.UserVmDao;
@ -3663,7 +3663,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q
SearchCriteria<TemplateJoinVO> zoneSc = _templateJoinDao.createSearchCriteria(); SearchCriteria<TemplateJoinVO> zoneSc = _templateJoinDao.createSearchCriteria();
zoneSc.addOr("dataCenterId", SearchCriteria.Op.EQ, zoneId); zoneSc.addOr("dataCenterId", SearchCriteria.Op.EQ, zoneId);
zoneSc.addOr("dataStoreScope", SearchCriteria.Op.EQ, ScopeType.REGION); 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 // have data_center information in template_view
SearchCriteria<TemplateJoinVO> isoPerhostSc = _templateJoinDao.createSearchCriteria(); SearchCriteria<TemplateJoinVO> isoPerhostSc = _templateJoinDao.createSearchCriteria();
isoPerhostSc.addAnd("format", SearchCriteria.Op.EQ, ImageFormat.ISO); isoPerhostSc.addAnd("format", SearchCriteria.Op.EQ, ImageFormat.ISO);

View File

@ -26,15 +26,7 @@ import java.util.Set;
import javax.inject.Inject; 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.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.ResponseObject.ResponseView;
import org.apache.cloudstack.api.response.ChildTemplateResponse; import org.apache.cloudstack.api.response.ChildTemplateResponse;
import org.apache.cloudstack.api.response.TemplateResponse; 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.engine.subsystem.api.storage.TemplateState;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; 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.TemplateDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; 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.ApiDBUtils;
import com.cloud.api.ApiResponseHelper; import com.cloud.api.ApiResponseHelper;
import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.api.query.vo.ResourceTagJoinVO;
import com.cloud.api.query.vo.TemplateJoinVO; 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.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.Storage; import com.cloud.storage.Storage;
import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.Storage.TemplateType;
@ -368,7 +367,7 @@ public class TemplateJoinDaoImpl extends GenericDaoBaseWithTagInformation<Templa
isoResponse.setCreated(iso.getCreatedOnStore()); isoResponse.setCreated(iso.getCreatedOnStore());
isoResponse.setDynamicallyScalable(iso.isDynamicallyScalable()); isoResponse.setDynamicallyScalable(iso.isDynamicallyScalable());
if (iso.getTemplateType() == TemplateType.PERHOST) { 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); isoResponse.setReady(true);
} else { } else {
isoResponse.setReady(iso.getState() == ObjectInDataStoreStateMachine.State.Ready); isoResponse.setReady(iso.getState() == ObjectInDataStoreStateMachine.State.Ready);

View File

@ -137,9 +137,9 @@ import com.cloud.exception.StorageUnavailableException;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.HypervisorGuru; import com.cloud.hypervisor.HypervisorGuru;
import com.cloud.hypervisor.HypervisorGuruManager; import com.cloud.hypervisor.HypervisorGuruManager;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.projects.Project; import com.cloud.projects.Project;
import com.cloud.projects.ProjectManager; import com.cloud.projects.ProjectManager;
import com.cloud.storage.DataStoreRole; import com.cloud.storage.DataStoreRole;
@ -299,7 +299,6 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
@Inject @Inject
private EndPointSelector selector; private EndPointSelector selector;
private TemplateAdapter getAdapter(HypervisorType type) { private TemplateAdapter getAdapter(HypervisorType type) {
TemplateAdapter adapter = null; TemplateAdapter adapter = null;
if (type == HypervisorType.BareMetal) { 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); throw new InvalidParameterValueException("Unable to find an ISO with id " + isoId);
} }
long dcId = vm.getDataCenterId(); if (!TemplateType.PERHOST.equals(iso.getTemplateType())) {
VMTemplateZoneVO exists = _tmpltZoneDao.findByZoneTemplate(dcId, isoId); VMTemplateZoneVO exists = _tmpltZoneDao.findByZoneTemplate(vm.getDataCenterId(), isoId);
if (null == exists) { if (null == exists) {
throw new InvalidParameterValueException("ISO is not available in the zone the VM is in."); throw new InvalidParameterValueException("ISO is not available in the zone the VM is in.");
}
} }
// check permissions // 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."); 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()); 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()); throw new InvalidParameterValueException("Cannot attach VMware tools drivers to incompatible hypervisor " + vm.getHypervisorType());
} }
boolean result = attachISOToVM(vmId, userId, isoId, true, forced); boolean result = attachISOToVM(vmId, userId, isoId, true, forced);

View File

@ -16,9 +16,9 @@
// under the License. // under the License.
package com.cloud.api.query.dao; package com.cloud.api.query.dao;
import com.cloud.hypervisor.Hypervisor; import java.util.Date;
import com.cloud.storage.Storage; import java.util.Map;
import com.cloud.user.Account;
import org.apache.cloudstack.api.response.TemplateResponse; import org.apache.cloudstack.api.response.TemplateResponse;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
@ -27,13 +27,14 @@ import org.junit.runner.RunWith;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.test.util.ReflectionTestUtils;
import com.cloud.api.ApiDBUtils; import com.cloud.api.ApiDBUtils;
import com.cloud.api.query.vo.TemplateJoinVO; import com.cloud.api.query.vo.TemplateJoinVO;
import org.springframework.test.util.ReflectionTestUtils; import com.cloud.hypervisor.Hypervisor;
import com.cloud.storage.Storage;
import java.util.Date; import com.cloud.template.TemplateManager;
import java.util.Map; import com.cloud.user.Account;
@RunWith(PowerMockRunner.class) @RunWith(PowerMockRunner.class)
@PrepareForTest(ApiDBUtils.class) @PrepareForTest(ApiDBUtils.class)
@ -47,7 +48,7 @@ public class TemplateJoinDaoImplTest extends GenericDaoBaseWithTagInformationBas
//TemplateJoinVO fields //TemplateJoinVO fields
private String uuid = "1234567890abc"; 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 String displayText = "xen-pv-drv-iso";
private boolean publicTemplate = true; private boolean publicTemplate = true;
private Date created = new Date(); private Date created = new Date();

View File

@ -279,8 +279,7 @@ class CsRedundant(object):
CsHelper.execute(cmd2) CsHelper.execute(cmd2)
dev = interface.get_device() dev = interface.get_device()
cmd = "%s -C %s" % (self.CONNTRACKD_BIN, self.CONNTRACKD_CONF) CsHelper.service("conntrackd", "restart")
CsHelper.execute("%s -d" % cmd)
CsHelper.service("ipsec", "stop") CsHelper.service("ipsec", "stop")
CsHelper.service("xl2tpd", "stop") CsHelper.service("xl2tpd", "stop")

View File

@ -134,8 +134,9 @@
</span> </span>
<span v-else>{{ text }}</span> <span v-else>{{ text }}</span>
</span> </span>
<template slot="state" slot-scope="text"> <template slot="state" slot-scope="text, record">
<status :text="text ? text : ''" displayText /> <status v-if="$route.path.startsWith('/host')" :text="getHostState(record)" displayText />
<status v-else :text="text ? text : ''" displayText />
</template> </template>
<template slot="allocationstate" slot-scope="text"> <template slot="allocationstate" slot-scope="text">
<status :text="text ? text : ''" displayText /> <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 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
} }
} }
} }

View File

@ -141,6 +141,7 @@ export default {
case 'created': case 'created':
case 'maintenance': case 'maintenance':
case 'pending': case 'pending':
case 'unsecure':
status = 'warning' status = 'warning'
break break
} }

View File

@ -37,8 +37,8 @@
:layout="isMobile() ? 'horizontal': 'inline'" :layout="isMobile() ? 'horizontal': 'inline'"
:form="form" :form="form"
@submit="handleAddRange"> @submit="handleAddRange">
<a-row :gutter="12"> <div class="form-row">
<a-col :md="4" :lg="4"> <div class="form-col">
<a-form-item> <a-form-item>
<a-input <a-input
v-decorator="[ 'gateway', { v-decorator="[ 'gateway', {
@ -48,8 +48,8 @@
autoFocus autoFocus
/> />
</a-form-item> </a-form-item>
</a-col> </div>
<a-col :md="4" :lg="4"> <div class="form-col">
<a-form-item> <a-form-item>
<a-input <a-input
v-decorator="[ 'netmask', { v-decorator="[ 'netmask', {
@ -58,16 +58,16 @@
:placeholder="$t('label.netmask')" :placeholder="$t('label.netmask')"
/> />
</a-form-item> </a-form-item>
</a-col> </div>
<a-col :md="4" :lg="4"> <div class="form-col">
<a-form-item> <a-form-item>
<a-input <a-input
v-decorator="[ 'vlan', { rules: [{ required: false }] }]" v-decorator="[ 'vlan', { rules: [{ required: false }] }]"
:placeholder="$t('label.vlan')" :placeholder="$t('label.vlan')"
/> />
</a-form-item> </a-form-item>
</a-col> </div>
<a-col :md="4" :lg="4"> <div class="form-col">
<a-form-item> <a-form-item>
<a-input <a-input
v-decorator="[ 'startIp', { v-decorator="[ 'startIp', {
@ -86,8 +86,8 @@
:placeholder="$t('label.start.ip')" :placeholder="$t('label.start.ip')"
/> />
</a-form-item> </a-form-item>
</a-col> </div>
<a-col :md="4" :lg="4"> <div class="form-col">
<a-form-item> <a-form-item>
<a-input <a-input
v-decorator="[ 'endIp', { v-decorator="[ 'endIp', {
@ -105,13 +105,13 @@
:placeholder="$t('label.end.ip')" :placeholder="$t('label.end.ip')"
/> />
</a-form-item> </a-form-item>
</a-col> </div>
<a-col :md="4" :lg="4"> <div class="form-col">
<a-form-item :style="{ display: 'inline-block', float: 'right' }"> <a-form-item :style="{ display: 'inline-block', float: 'right', marginRight: 0 }">
<a-button type="primary" html-type="submit">{{ $t('label.add') }}</a-button> <a-button type="primary" html-type="submit">{{ $t('label.add') }}</a-button>
</a-form-item> </a-form-item>
</a-col> </div>
</a-row> </div>
</a-form> </a-form>
</template> </template>
</a-table> </a-table>
@ -183,12 +183,12 @@ export default {
{ {
title: this.$t('label.gateway'), title: this.$t('label.gateway'),
dataIndex: 'gateway', dataIndex: 'gateway',
width: 150 width: 140
}, },
{ {
title: this.$t('label.netmask'), title: this.$t('label.netmask'),
dataIndex: 'netmask', dataIndex: 'netmask',
width: 150 width: 140
}, },
{ {
title: this.$t('label.vlan'), title: this.$t('label.vlan'),
@ -198,12 +198,12 @@ export default {
{ {
title: this.$t('label.start.ip'), title: this.$t('label.start.ip'),
dataIndex: 'startIp', dataIndex: 'startIp',
width: 130 width: 140
}, },
{ {
title: this.$t('label.end.ip'), title: this.$t('label.end.ip'),
dataIndex: 'endIp', dataIndex: 'endIp',
width: 130 width: 140
}, },
{ {
title: '', title: '',
@ -286,3 +286,16 @@ export default {
} }
} }
</script> </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>

View File

@ -264,7 +264,6 @@ export default {
}, },
filters: { filters: {
capitalise: val => { capitalise: val => {
if (val === 'all') return this.$t('label.all')
return val.toUpperCase() return val.toUpperCase()
} }
}, },

View File

@ -77,7 +77,7 @@
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
:rowKey="record => record.id"> :rowKey="record => record.id">
<template slot="protocol" slot-scope="record"> <template slot="protocol" slot-scope="record">
{{ record.protocol | capitalise }} {{ getCapitalise(record.protocol) }}
</template> </template>
<template slot="startport" slot-scope="record"> <template slot="startport" slot-scope="record">
{{ record.icmptype || record.startport >= 0 ? record.icmptype || record.startport : 'All' }} {{ record.icmptype || record.startport >= 0 ? record.icmptype || record.startport : 'All' }}
@ -208,7 +208,6 @@ export default {
}, },
filters: { filters: {
capitalise: val => { capitalise: val => {
if (val === 'all') return this.$t('label.all')
return val.toUpperCase() return val.toUpperCase()
} }
}, },
@ -284,6 +283,10 @@ export default {
this.deleteRule(rule) this.deleteRule(rule)
} }
}, },
getCapitalise (val) {
if (val === 'all') return this.$t('label.all')
return val.toUpperCase()
},
deleteRule (rule) { deleteRule (rule) {
this.loading = true this.loading = true
api('deleteEgressFirewallRule', { id: rule.id }).then(response => { api('deleteEgressFirewallRule', { id: rule.id }).then(response => {

View File

@ -72,7 +72,7 @@
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
:rowKey="record => record.id"> :rowKey="record => record.id">
<template slot="protocol" slot-scope="record"> <template slot="protocol" slot-scope="record">
{{ record.protocol | capitalise }} {{ getCapitalise(record.protocol) }}
</template> </template>
<template slot="startport" slot-scope="record"> <template slot="startport" slot-scope="record">
{{ record.icmptype || record.startport >= 0 ? record.icmptype || record.startport : $t('label.all') }} {{ record.icmptype || record.startport >= 0 ? record.icmptype || record.startport : $t('label.all') }}
@ -261,12 +261,6 @@ export default {
created () { created () {
this.fetchData() this.fetchData()
}, },
filters: {
capitalise: val => {
if (val === 'all') return 'All'
return val.toUpperCase()
}
},
watch: { watch: {
resource: function (newItem, oldItem) { resource: function (newItem, oldItem) {
if (!newItem || !newItem.id) { if (!newItem || !newItem.id) {
@ -340,6 +334,10 @@ export default {
this.deleteRule(rule) this.deleteRule(rule)
} }
}, },
getCapitalise (val) {
if (val === 'all') return this.$t('label.all')
return val.toUpperCase()
},
deleteRule (rule) { deleteRule (rule) {
this.loading = true this.loading = true
api('deleteFirewallRule', { id: rule.id }).then(response => { api('deleteFirewallRule', { id: rule.id }).then(response => {

View File

@ -90,7 +90,7 @@
:pagination="{ pageSizeOptions: ['10', '20', '40', '80', '100', '200'], showSizeChanger: true}" :pagination="{ pageSizeOptions: ['10', '20', '40', '80', '100', '200'], showSizeChanger: true}"
:rowKey="record => record.ruleid"> :rowKey="record => record.ruleid">
<template slot="protocol" slot-scope="record"> <template slot="protocol" slot-scope="record">
{{ record.protocol | capitalise }} {{ getCapitalise(record.protocol) }}
</template> </template>
<template slot="account" slot-scope="record"> <template slot="account" slot-scope="record">
<div v-if="record.account && record.securitygroupname"> <div v-if="record.account && record.securitygroupname">
@ -265,7 +265,6 @@ export default {
}, },
filters: { filters: {
capitalise: val => { capitalise: val => {
if (val === 'all') return this.$t('label.all')
return val.toUpperCase() return val.toUpperCase()
} }
}, },
@ -277,6 +276,10 @@ export default {
this.tabType = this.$parent.tab === this.$t('label.ingress.rule') ? 'ingress' : 'egress' this.tabType = this.$parent.tab === this.$t('label.ingress.rule') ? 'ingress' : 'egress'
this.rules = this.tabType === 'ingress' ? this.resource.ingressrule : this.resource.egressrule 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 () { handleAddRule () {
if (this.isSubmitted) return if (this.isSubmitted) return
this.isSubmitted = true this.isSubmitted = true

View File

@ -83,7 +83,7 @@
{{ returnAlgorithmName(record.algorithm) }} {{ returnAlgorithmName(record.algorithm) }}
</template> </template>
<template slot="protocol" slot-scope="record"> <template slot="protocol" slot-scope="record">
{{ record.protocol | capitalise }} {{ getCapitalise(record.protocol) }}
</template> </template>
<template slot="stickiness" slot-scope="record"> <template slot="stickiness" slot-scope="record">
<a-button @click="() => openStickinessModal(record.id)"> <a-button @click="() => openStickinessModal(record.id)">
@ -597,12 +597,6 @@ export default {
this.fetchData() this.fetchData()
} }
}, },
filters: {
capitalise: val => {
if (val === 'all') return this.$t('label.all')
return val.toUpperCase()
}
},
methods: { methods: {
fetchData () { fetchData () {
this.fetchListTiers() this.fetchListTiers()
@ -701,6 +695,10 @@ export default {
} }
return 'Configure' return 'Configure'
}, },
getCapitalise (val) {
if (val === 'all') return this.$t('label.all')
return val.toUpperCase()
},
openTagsModal (id) { openTagsModal (id) {
this.tagsModalLoading = true this.tagsModalLoading = true
this.tagsModalVisible = true this.tagsModalVisible = true

View File

@ -95,7 +95,7 @@
{{ record.publicport }} - {{ record.publicendport }} {{ record.publicport }} - {{ record.publicendport }}
</template> </template>
<template slot="protocol" slot-scope="record"> <template slot="protocol" slot-scope="record">
{{ record.protocol | capitalise }} {{ getCapitalise(record.protocol) }}
</template> </template>
<template slot="vm" slot-scope="record"> <template slot="vm" slot-scope="record">
<div><a-icon type="desktop"/> <div><a-icon type="desktop"/>
@ -434,12 +434,6 @@ export default {
this.fetchData() this.fetchData()
} }
}, },
filters: {
capitalise: val => {
if (val === 'all') return this.$t('label.all')
return val.toUpperCase()
}
},
methods: { methods: {
fetchData () { fetchData () {
this.fetchListTiers() this.fetchListTiers()
@ -529,6 +523,10 @@ export default {
this.deleteRule(rule) this.deleteRule(rule)
} }
}, },
getCapitalise (val) {
if (val === 'all') return this.$t('label.all')
return val.toUpperCase()
},
deleteRule (rule) { deleteRule (rule) {
this.loading = true this.loading = true
api('deletePortForwardingRule', { id: rule.id }).then(response => { api('deletePortForwardingRule', { id: rule.id }).then(response => {