From 422f3ba7fefe42ce939b69555089c09c498f2532 Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Tue, 13 Aug 2024 12:08:05 -0700 Subject: [PATCH 01/18] Introduced configuration key "powerflex.connect.on.demand" to enable/disable PowerFlex on-demand connection from Host to Storage Pool feature. --- .../driver/ScaleIOPrimaryDataStoreDriver.java | 50 ++++++------ .../datastore/manager/ScaleIOSDCManager.java | 8 ++ .../manager/ScaleIOSDCManagerImpl.java | 12 +-- .../ScaleIOPrimaryDataStoreDriverTest.java | 80 ++++++++++++++++--- 4 files changed, 109 insertions(+), 41 deletions(-) diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java index 06091735d70..f7128876d7d 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java @@ -38,6 +38,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; +import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO; import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao; @@ -111,6 +112,13 @@ import com.google.common.base.Preconditions; public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { private static final Logger LOGGER = Logger.getLogger(ScaleIOPrimaryDataStoreDriver.class); + static ConfigKey ConnectOnDemand = new ConfigKey<>("Storage", + Boolean.class, + "powerflex.connect.on.demand", + Boolean.FALSE.toString(), + "Connect PowerFlex client on Host when first Volume created and disconnect when last Volume deleted (or always stay connected otherwise).", + Boolean.TRUE); + @Inject EndPointSelector selector; @Inject @@ -155,7 +163,9 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { private boolean setVolumeLimitsOnSDC(VolumeVO volume, Host host, DataStore dataStore, Long iopsLimit, Long bandwidthLimitInKbps) throws Exception { sdcManager = ComponentContext.inject(sdcManager); - final String sdcId = sdcManager.prepareSDC(host, dataStore); + // don't connect SDC if connect on demand disabled + final String sdcId = Boolean.TRUE.equals(ConnectOnDemand.value()) ? sdcManager.prepareSDC(host, dataStore) : + sdcManager.getConnectedSdc(host, dataStore); if (StringUtils.isBlank(sdcId)) { alertHostSdcDisconnection(host); throw new CloudRuntimeException("Unable to grant access to volume: " + volume.getId() + ", no Sdc connected with host ip: " + host.getPrivateIpAddress()); @@ -192,7 +202,9 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { public boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore) { try { sdcManager = ComponentContext.inject(sdcManager); - final String sdcId = sdcManager.prepareSDC(host, dataStore); + // don't connect SDC if connect on demand disabled + final String sdcId = Boolean.TRUE.equals(ConnectOnDemand.value()) ? sdcManager.prepareSDC(host, dataStore) : + sdcManager.getConnectedSdc(host, dataStore); if (StringUtils.isBlank(sdcId)) { alertHostSdcDisconnection(host); throw new CloudRuntimeException(String.format("Unable to grant access to %s: %s, no Sdc connected with host ip: %s", dataObject.getType(), dataObject.getId(), host.getPrivateIpAddress())); @@ -233,7 +245,8 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { } try { - final String sdcId = getConnectedSdc(dataStore.getId(), host.getId()); + sdcManager = ComponentContext.inject(sdcManager); + final String sdcId = sdcManager.getConnectedSdc(host, dataStore); if (StringUtils.isBlank(sdcId)) { LOGGER.warn(String.format("Unable to revoke access for %s: %s, no Sdc connected with host ip: %s", dataObject.getType(), dataObject.getId(), host.getPrivateIpAddress())); return; @@ -252,8 +265,9 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { LOGGER.debug("Revoking access for PowerFlex volume snapshot: " + snapshot.getPath()); client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(snapshot.getPath()), sdcId); } - if (client.listVolumesMappedToSdc(sdcId).isEmpty()) { - sdcManager = ComponentContext.inject(sdcManager); + + // don't stop SDC if connect on demand disabled + if (Boolean.TRUE.equals(ConnectOnDemand.value()) && client.listVolumesMappedToSdc(sdcId).isEmpty()) { sdcManager.stopSDC(host, dataStore); } } catch (Exception e) { @@ -269,8 +283,8 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { try { LOGGER.debug("Revoking access for PowerFlex volume: " + volumePath); - - final String sdcId = getConnectedSdc(dataStore.getId(), host.getId()); + sdcManager = ComponentContext.inject(sdcManager); + final String sdcId = sdcManager.getConnectedSdc(host, dataStore); if (StringUtils.isBlank(sdcId)) { LOGGER.warn(String.format("Unable to revoke access for volume: %s, no Sdc connected with host ip: %s", volumePath, host.getPrivateIpAddress())); return; @@ -278,8 +292,8 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { final ScaleIOGatewayClient client = getScaleIOClient(dataStore.getId()); client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(volumePath), sdcId); - if (client.listVolumesMappedToSdc(sdcId).isEmpty()) { - sdcManager = ComponentContext.inject(sdcManager); + // don't stop SDC if connect on demand disabled + if (Boolean.TRUE.equals(ConnectOnDemand.value()) && client.listVolumesMappedToSdc(sdcId).isEmpty()) { sdcManager.stopSDC(host, dataStore); } } catch (Exception e) { @@ -292,24 +306,6 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { revokeAccess(dataObject, host, dataStore); } - public String getConnectedSdc(long poolId, long hostId) { - try { - StoragePoolHostVO poolHostVO = storagePoolHostDao.findByPoolHost(poolId, hostId); - if (poolHostVO == null) { - return null; - } - - final ScaleIOGatewayClient client = getScaleIOClient(poolId); - if (client.isSdcConnected(poolHostVO.getLocalPath())) { - return poolHostVO.getLocalPath(); - } - } catch (Exception e) { - LOGGER.warn("Couldn't check SDC connection for the host: " + hostId + " and storage pool: " + poolId + " due to " + e.getMessage(), e); - } - - return null; - } - @Override public boolean requiresAccessForMigration(DataObject dataObject) { return true; diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManager.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManager.java index 696643cb17a..ede893786b5 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManager.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManager.java @@ -29,6 +29,14 @@ public interface ScaleIOSDCManager { */ boolean areSDCConnectionsWithinLimit(Long storagePoolId); + /** + * Returns connected SDC Id. + * @param host the host + * @param dataStore the datastore + * @return SDC Id of the host + */ + String getConnectedSdc(Host host, DataStore dataStore); + /** * Prepares/starts the SDC on the host. * @param host the host diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java index b121a1da66f..69ec098db02 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java @@ -115,7 +115,7 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager { long poolId = dataStore.getId(); long hostId = host.getId(); - String sdcId = getConnectedSdc(poolId, hostId); + String sdcId = getConnectedSdc(host, dataStore); if (StringUtils.isNotBlank(sdcId)) { LOGGER.debug(String.format("SDC %s already connected for the pool: %d on host: %d, no need to prepare/start it", sdcId, poolId, hostId)); return sdcId; @@ -245,9 +245,7 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager { throw new CloudRuntimeException("Unable to unprepare SDC, couldn't lock on " + hostIdStorageSystemIdLockString); } - long poolId = dataStore.getId(); - long hostId = host.getId(); - String sdcId = getConnectedSdc(poolId, hostId); + String sdcId = getConnectedSdc(host, dataStore); if (StringUtils.isBlank(sdcId)) { LOGGER.debug("SDC not connected, no need to unprepare it"); return true; @@ -296,7 +294,11 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager { } } - private String getConnectedSdc(long poolId, long hostId) { + @Override + public String getConnectedSdc(Host host, DataStore dataStore) { + long poolId = dataStore.getId(); + long hostId = host.getId(); + try { StoragePoolHostVO poolHostVO = storagePoolHostDao.findByPoolHost(poolId, hostId); if (poolHostVO == null) { diff --git a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java index f9cd2cda4f1..0a5743ac0fc 100644 --- a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java +++ b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java @@ -20,16 +20,23 @@ package org.apache.cloudstack.storage.datastore.driver; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isA; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Optional; +import com.cloud.utils.component.ComponentContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService; +import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.storage.RemoteHostEndPoint; import org.apache.cloudstack.storage.command.CreateObjectAnswer; @@ -38,6 +45,8 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO; import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.cloudstack.storage.datastore.manager.ScaleIOSDCManager; +import org.apache.cloudstack.storage.datastore.manager.ScaleIOSDCManagerImpl; import org.apache.cloudstack.storage.to.VolumeObjectTO; import org.junit.Assert; import org.junit.Before; @@ -74,12 +83,17 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.VMInstanceDao; @RunWith(PowerMockRunner.class) -@PrepareForTest(RemoteHostEndPoint.class) +@PrepareForTest({RemoteHostEndPoint.class, ComponentContext.class}) public class ScaleIOPrimaryDataStoreDriverTest { @Spy @InjectMocks ScaleIOPrimaryDataStoreDriver scaleIOPrimaryDataStoreDriver = new ScaleIOPrimaryDataStoreDriver(); + + @Spy + @InjectMocks + ScaleIOSDCManager sdcManager = new ScaleIOSDCManagerImpl(); + @Mock StoragePoolDetailsDao storagePoolDetailsDao; @Mock @@ -449,7 +463,7 @@ public class ScaleIOPrimaryDataStoreDriverTest { } @Test - public void deleteSourceVolumeFailureScenarioAfterSuccessfulBlockCopy() throws Exception { + public void deleteSourceVolumeFailureScenarioAfterSuccessfulBlockCopyOnDemandDisabled() throws Exception { // Either Volume deletion success or failure method should complete VolumeInfo srcData = Mockito.mock(VolumeInfo.class); @@ -463,18 +477,63 @@ public class ScaleIOPrimaryDataStoreDriverTest { when(srcData.getDataStore()).thenReturn(srcStore); when(srcData.getTO()).thenReturn(volumeTO); when(volumeTO.getPath()).thenReturn(srcVolumePath); + + PowerMockito.mockStatic(ComponentContext.class); + PowerMockito.when(ComponentContext.inject(eq(sdcManager))).thenReturn(sdcManager); + String sdcId = "7332760565f6340f"; - doReturn(sdcId).when(scaleIOPrimaryDataStoreDriver).getConnectedSdc(1L, 1L); + doReturn(sdcId).when(sdcManager).getConnectedSdc(host, srcStore); ScaleIOGatewayClient client = Mockito.mock(ScaleIOGatewayClient.class); - doReturn(client).when(scaleIOPrimaryDataStoreDriver) - .getScaleIOClient(any()); - doReturn(true).when(client).unmapVolumeFromSdc(any(), any()); - when(client.deleteVolume(any())).thenReturn(false); + + doReturn(client).when(scaleIOPrimaryDataStoreDriver).getScaleIOClient(any()); + + doReturn(true).when(client).unmapVolumeFromSdc(anyString(), anyString()); + doReturn(false).when(client).deleteVolume(anyString()); scaleIOPrimaryDataStoreDriver.deleteSourceVolumeAfterSuccessfulBlockCopy(srcData, host); } + @Test + public void deleteSourceVolumeFailureScenarioAfterSuccessfulBlockCopyOnDemandEnabled() throws Exception { + // Either Volume deletion success or failure method should complete + + VolumeInfo srcData = Mockito.mock(VolumeInfo.class); + Host host = Mockito.mock(Host.class); + when(host.getId()).thenReturn(1L); + String srcVolumePath = "bec0ba7700000007:vol-11-6aef-10ee"; + + DataStore srcStore = Mockito.mock(DataStore.class); + when(srcStore.getId()).thenReturn(1L); + DataTO volumeTO = Mockito.mock(DataTO.class); + when(srcData.getDataStore()).thenReturn(srcStore); + when(srcData.getTO()).thenReturn(volumeTO); + when(volumeTO.getPath()).thenReturn(srcVolumePath); + + PowerMockito.mockStatic(ComponentContext.class); + PowerMockito.when(ComponentContext.inject(eq(sdcManager))).thenReturn(sdcManager); + + String sdcId = "7332760565f6340f"; + doReturn(sdcId).when(sdcManager).getConnectedSdc(host, srcStore); + + ScaleIOGatewayClient client = Mockito.mock(ScaleIOGatewayClient.class); + doReturn(client).when(scaleIOPrimaryDataStoreDriver).getScaleIOClient(any()); + + doReturn(true).when(client).unmapVolumeFromSdc(any(), any()); + doReturn(false).when(client).deleteVolume(anyString()); + + ConfigKey connectOnDemand = Mockito.mock(ConfigKey.class); + doReturn(Boolean.TRUE).when(connectOnDemand).value(); + + doReturn(true).when(sdcManager).stopSDC(isA(Host.class), isA(DataStore.class)); + + scaleIOPrimaryDataStoreDriver.ConnectOnDemand = connectOnDemand; + + scaleIOPrimaryDataStoreDriver.deleteSourceVolumeAfterSuccessfulBlockCopy(srcData, host); + + verify(sdcManager, times(1)).stopSDC(isA(Host.class), isA(DataStore.class)); + } + @Test public void deleteSourceVolumeFailureScenarioWhenNoSDCisFound() { // Either Volume deletion success or failure method should complete @@ -490,8 +549,11 @@ public class ScaleIOPrimaryDataStoreDriverTest { when(srcData.getDataStore()).thenReturn(srcStore); when(srcData.getTO()).thenReturn(volumeTO); when(volumeTO.getPath()).thenReturn(srcVolumePath); - String sdcId = "7332760565f6340f"; - doReturn(null).when(scaleIOPrimaryDataStoreDriver).getConnectedSdc(1L, 1L); + + PowerMockito.mockStatic(ComponentContext.class); + PowerMockito.when(ComponentContext.inject(eq(sdcManager))).thenReturn(sdcManager); + + doReturn(null).when(sdcManager).getConnectedSdc(host, srcStore); scaleIOPrimaryDataStoreDriver.deleteSourceVolumeAfterSuccessfulBlockCopy(srcData, host); } From e0d606693573f8397c60ac2bf80700e3e07e6e93 Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Thu, 15 Aug 2024 17:55:00 -0700 Subject: [PATCH 02/18] Bumped pom version to 4.18.1.2 (to add migration SQL script) --- agent/pom.xml | 2 +- api/pom.xml | 2 +- client/pom.xml | 2 +- core/pom.xml | 2 +- developer/pom.xml | 2 +- engine/api/pom.xml | 2 +- engine/components-api/pom.xml | 2 +- engine/network/pom.xml | 2 +- engine/orchestration/pom.xml | 2 +- engine/pom.xml | 2 +- engine/schema/pom.xml | 2 +- engine/service/pom.xml | 2 +- engine/storage/cache/pom.xml | 2 +- engine/storage/configdrive/pom.xml | 2 +- engine/storage/datamotion/pom.xml | 2 +- engine/storage/image/pom.xml | 2 +- engine/storage/integration-test/pom.xml | 2 +- engine/storage/pom.xml | 2 +- engine/storage/snapshot/pom.xml | 2 +- engine/storage/volume/pom.xml | 2 +- engine/userdata/cloud-init/pom.xml | 2 +- engine/userdata/pom.xml | 2 +- framework/agent-lb/pom.xml | 2 +- framework/ca/pom.xml | 2 +- framework/cluster/pom.xml | 2 +- framework/config/pom.xml | 2 +- framework/db/pom.xml | 2 +- framework/direct-download/pom.xml | 4 ++-- framework/events/pom.xml | 2 +- framework/ipc/pom.xml | 2 +- framework/jobs/pom.xml | 2 +- framework/managed-context/pom.xml | 2 +- framework/pom.xml | 2 +- framework/quota/pom.xml | 2 +- framework/rest/pom.xml | 2 +- framework/security/pom.xml | 2 +- framework/spring/lifecycle/pom.xml | 2 +- framework/spring/module/pom.xml | 2 +- plugins/acl/dynamic-role-based/pom.xml | 2 +- plugins/acl/project-role-based/pom.xml | 2 +- plugins/acl/static-role-based/pom.xml | 2 +- plugins/affinity-group-processors/explicit-dedication/pom.xml | 2 +- plugins/affinity-group-processors/host-affinity/pom.xml | 2 +- plugins/affinity-group-processors/host-anti-affinity/pom.xml | 2 +- .../non-strict-host-affinity/pom.xml | 2 +- .../non-strict-host-anti-affinity/pom.xml | 4 ++-- plugins/alert-handlers/snmp-alerts/pom.xml | 2 +- plugins/alert-handlers/syslog-alerts/pom.xml | 2 +- plugins/api/discovery/pom.xml | 2 +- plugins/api/rate-limit/pom.xml | 2 +- plugins/api/solidfire-intg-test/pom.xml | 2 +- plugins/api/vmware-sioc/pom.xml | 2 +- plugins/backup/dummy/pom.xml | 2 +- plugins/backup/networker/pom.xml | 2 +- plugins/backup/veeam/pom.xml | 2 +- plugins/ca/root-ca/pom.xml | 2 +- plugins/database/mysql-ha/pom.xml | 2 +- plugins/database/quota/pom.xml | 2 +- plugins/dedicated-resources/pom.xml | 2 +- plugins/deployment-planners/implicit-dedication/pom.xml | 2 +- plugins/deployment-planners/user-concentrated-pod/pom.xml | 2 +- plugins/deployment-planners/user-dispersing/pom.xml | 2 +- plugins/event-bus/inmemory/pom.xml | 2 +- plugins/event-bus/kafka/pom.xml | 2 +- plugins/event-bus/rabbitmq/pom.xml | 2 +- plugins/ha-planners/skip-heurestics/pom.xml | 2 +- plugins/host-allocators/random/pom.xml | 2 +- plugins/hypervisors/baremetal/pom.xml | 2 +- plugins/hypervisors/hyperv/pom.xml | 2 +- plugins/hypervisors/kvm/pom.xml | 2 +- plugins/hypervisors/ovm/pom.xml | 2 +- plugins/hypervisors/ovm3/pom.xml | 2 +- plugins/hypervisors/simulator/pom.xml | 2 +- plugins/hypervisors/ucs/pom.xml | 2 +- plugins/hypervisors/vmware/pom.xml | 2 +- plugins/hypervisors/xenserver/pom.xml | 2 +- plugins/integrations/cloudian/pom.xml | 2 +- plugins/integrations/kubernetes-service/pom.xml | 2 +- plugins/integrations/prometheus/pom.xml | 2 +- plugins/metrics/pom.xml | 2 +- plugins/network-elements/bigswitch/pom.xml | 2 +- plugins/network-elements/brocade-vcs/pom.xml | 2 +- plugins/network-elements/cisco-vnmc/pom.xml | 2 +- plugins/network-elements/dns-notifier/pom.xml | 2 +- plugins/network-elements/elastic-loadbalancer/pom.xml | 2 +- plugins/network-elements/globodns/pom.xml | 2 +- plugins/network-elements/internal-loadbalancer/pom.xml | 2 +- plugins/network-elements/juniper-contrail/pom.xml | 2 +- plugins/network-elements/netscaler/pom.xml | 2 +- plugins/network-elements/nicira-nvp/pom.xml | 2 +- plugins/network-elements/opendaylight/pom.xml | 2 +- plugins/network-elements/ovs/pom.xml | 2 +- plugins/network-elements/palo-alto/pom.xml | 2 +- plugins/network-elements/stratosphere-ssp/pom.xml | 2 +- plugins/network-elements/tungsten/pom.xml | 2 +- plugins/network-elements/vxlan/pom.xml | 2 +- plugins/outofbandmanagement-drivers/ipmitool/pom.xml | 2 +- plugins/outofbandmanagement-drivers/nested-cloudstack/pom.xml | 2 +- plugins/outofbandmanagement-drivers/redfish/pom.xml | 2 +- plugins/pom.xml | 2 +- plugins/storage-allocators/random/pom.xml | 2 +- plugins/storage/image/default/pom.xml | 2 +- plugins/storage/image/s3/pom.xml | 2 +- plugins/storage/image/sample/pom.xml | 2 +- plugins/storage/image/swift/pom.xml | 2 +- plugins/storage/volume/cloudbyte/pom.xml | 2 +- plugins/storage/volume/datera/pom.xml | 2 +- plugins/storage/volume/default/pom.xml | 2 +- plugins/storage/volume/linstor/pom.xml | 2 +- plugins/storage/volume/nexenta/pom.xml | 2 +- plugins/storage/volume/sample/pom.xml | 2 +- plugins/storage/volume/scaleio/pom.xml | 2 +- plugins/storage/volume/solidfire/pom.xml | 2 +- plugins/storage/volume/storpool/pom.xml | 2 +- plugins/user-authenticators/ldap/pom.xml | 2 +- plugins/user-authenticators/md5/pom.xml | 2 +- plugins/user-authenticators/pbkdf2/pom.xml | 2 +- plugins/user-authenticators/plain-text/pom.xml | 2 +- plugins/user-authenticators/saml2/pom.xml | 2 +- plugins/user-authenticators/sha256salted/pom.xml | 2 +- plugins/user-two-factor-authenticators/static-pin/pom.xml | 2 +- plugins/user-two-factor-authenticators/totp/pom.xml | 2 +- pom.xml | 2 +- quickcloud/pom.xml | 2 +- server/pom.xml | 2 +- services/console-proxy/pom.xml | 2 +- services/console-proxy/rdpconsole/pom.xml | 2 +- services/console-proxy/server/pom.xml | 2 +- services/pom.xml | 2 +- services/secondary-storage/controller/pom.xml | 2 +- services/secondary-storage/pom.xml | 2 +- services/secondary-storage/server/pom.xml | 2 +- systemvm/pom.xml | 2 +- test/pom.xml | 2 +- tools/apidoc/pom.xml | 2 +- tools/checkstyle/pom.xml | 2 +- tools/devcloud-kvm/pom.xml | 2 +- tools/devcloud4/pom.xml | 2 +- tools/marvin/pom.xml | 2 +- tools/marvin/setup.py | 2 +- tools/pom.xml | 2 +- usage/pom.xml | 2 +- utils/pom.xml | 2 +- vmware-base/pom.xml | 2 +- 144 files changed, 146 insertions(+), 146 deletions(-) diff --git a/agent/pom.xml b/agent/pom.xml index d8ca0ccdd1f..92a23ba5e3e 100644 --- a/agent/pom.xml +++ b/agent/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 diff --git a/api/pom.xml b/api/pom.xml index 2f6c4c60fe1..ba32bd1671d 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 diff --git a/client/pom.xml b/client/pom.xml index a7cfdfb661f..57593381dee 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 diff --git a/core/pom.xml b/core/pom.xml index 53b9c316863..cf3fff2d30d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 diff --git a/developer/pom.xml b/developer/pom.xml index 86989eaa1ef..e60d95683ce 100644 --- a/developer/pom.xml +++ b/developer/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 diff --git a/engine/api/pom.xml b/engine/api/pom.xml index d43fccceb52..8cf38af978a 100644 --- a/engine/api/pom.xml +++ b/engine/api/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/engine/components-api/pom.xml b/engine/components-api/pom.xml index 836610debb9..84223ca93f8 100644 --- a/engine/components-api/pom.xml +++ b/engine/components-api/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/engine/network/pom.xml b/engine/network/pom.xml index 6d9bfb3ebc1..f6791c134bf 100644 --- a/engine/network/pom.xml +++ b/engine/network/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/engine/orchestration/pom.xml b/engine/orchestration/pom.xml index 19f42376c45..01b64391504 100755 --- a/engine/orchestration/pom.xml +++ b/engine/orchestration/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/engine/pom.xml b/engine/pom.xml index c7f7166c6e9..0b8651d46e8 100644 --- a/engine/pom.xml +++ b/engine/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/engine/schema/pom.xml b/engine/schema/pom.xml index 57b9b96b808..cda4934567b 100644 --- a/engine/schema/pom.xml +++ b/engine/schema/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/engine/service/pom.xml b/engine/service/pom.xml index f04d7e0772d..1539d13cd04 100644 --- a/engine/service/pom.xml +++ b/engine/service/pom.xml @@ -22,7 +22,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 cloud-engine-service war diff --git a/engine/storage/cache/pom.xml b/engine/storage/cache/pom.xml index bbbe2232d92..8f312a5e184 100644 --- a/engine/storage/cache/pom.xml +++ b/engine/storage/cache/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/engine/storage/configdrive/pom.xml b/engine/storage/configdrive/pom.xml index ad4ae103f60..3f0d661da5c 100644 --- a/engine/storage/configdrive/pom.xml +++ b/engine/storage/configdrive/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/engine/storage/datamotion/pom.xml b/engine/storage/datamotion/pom.xml index 55ea472c6da..90147d9ad05 100644 --- a/engine/storage/datamotion/pom.xml +++ b/engine/storage/datamotion/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/engine/storage/image/pom.xml b/engine/storage/image/pom.xml index 98ba4f19678..37b66129a4c 100644 --- a/engine/storage/image/pom.xml +++ b/engine/storage/image/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/engine/storage/integration-test/pom.xml b/engine/storage/integration-test/pom.xml index b38fb372802..80013a0ab3c 100644 --- a/engine/storage/integration-test/pom.xml +++ b/engine/storage/integration-test/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/engine/storage/pom.xml b/engine/storage/pom.xml index 9a8dbd46ab2..1fb4e9b2816 100644 --- a/engine/storage/pom.xml +++ b/engine/storage/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/engine/storage/snapshot/pom.xml b/engine/storage/snapshot/pom.xml index 78691543bf2..0d1cfb0c821 100644 --- a/engine/storage/snapshot/pom.xml +++ b/engine/storage/snapshot/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/engine/storage/volume/pom.xml b/engine/storage/volume/pom.xml index 351f43508c2..15626620ff2 100644 --- a/engine/storage/volume/pom.xml +++ b/engine/storage/volume/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/engine/userdata/cloud-init/pom.xml b/engine/userdata/cloud-init/pom.xml index 427c4bcc449..726047be75d 100644 --- a/engine/userdata/cloud-init/pom.xml +++ b/engine/userdata/cloud-init/pom.xml @@ -23,7 +23,7 @@ cloud-engine org.apache.cloudstack - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/engine/userdata/pom.xml b/engine/userdata/pom.xml index 48073b176c3..1b803ed8355 100644 --- a/engine/userdata/pom.xml +++ b/engine/userdata/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/framework/agent-lb/pom.xml b/framework/agent-lb/pom.xml index d6d1b078fda..d575134ab4a 100644 --- a/framework/agent-lb/pom.xml +++ b/framework/agent-lb/pom.xml @@ -24,7 +24,7 @@ cloudstack-framework org.apache.cloudstack - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/framework/ca/pom.xml b/framework/ca/pom.xml index 4f4d07acd85..0015306b08f 100644 --- a/framework/ca/pom.xml +++ b/framework/ca/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-framework - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/framework/cluster/pom.xml b/framework/cluster/pom.xml index 832023e60bd..dbe35ad2005 100644 --- a/framework/cluster/pom.xml +++ b/framework/cluster/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-framework - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/framework/config/pom.xml b/framework/config/pom.xml index d50c47f2b84..49c1c306651 100644 --- a/framework/config/pom.xml +++ b/framework/config/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-framework - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/framework/db/pom.xml b/framework/db/pom.xml index 922e915a622..2c28bb6b2cd 100644 --- a/framework/db/pom.xml +++ b/framework/db/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-framework - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/framework/direct-download/pom.xml b/framework/direct-download/pom.xml index 56d03c34ad1..d986eaf9c8d 100644 --- a/framework/direct-download/pom.xml +++ b/framework/direct-download/pom.xml @@ -25,14 +25,14 @@ org.apache.cloudstack cloud-utils - 4.18.1.1 + 4.18.1.2 compile cloudstack-framework org.apache.cloudstack - 4.18.1.1 + 4.18.1.2 ../pom.xml \ No newline at end of file diff --git a/framework/events/pom.xml b/framework/events/pom.xml index 333de2b2c8e..c1365c4a12a 100644 --- a/framework/events/pom.xml +++ b/framework/events/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-framework - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/framework/ipc/pom.xml b/framework/ipc/pom.xml index 1148b846bde..92bb0b75914 100644 --- a/framework/ipc/pom.xml +++ b/framework/ipc/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-framework - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/framework/jobs/pom.xml b/framework/jobs/pom.xml index 6f71728bc24..556c14ac682 100644 --- a/framework/jobs/pom.xml +++ b/framework/jobs/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-framework - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/framework/managed-context/pom.xml b/framework/managed-context/pom.xml index 1c72c59da78..97cc88a742e 100644 --- a/framework/managed-context/pom.xml +++ b/framework/managed-context/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/framework/pom.xml b/framework/pom.xml index d2641d2a49a..bb61e5712e1 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 diff --git a/framework/quota/pom.xml b/framework/quota/pom.xml index d35ce3c7f41..dc3952938b0 100644 --- a/framework/quota/pom.xml +++ b/framework/quota/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-framework - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/framework/rest/pom.xml b/framework/rest/pom.xml index da21a7fdc4b..5733894af13 100644 --- a/framework/rest/pom.xml +++ b/framework/rest/pom.xml @@ -22,7 +22,7 @@ org.apache.cloudstack cloudstack-framework - 4.18.1.1 + 4.18.1.2 ../pom.xml cloud-framework-rest diff --git a/framework/security/pom.xml b/framework/security/pom.xml index a46526f984e..c8713314203 100644 --- a/framework/security/pom.xml +++ b/framework/security/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-framework - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/framework/spring/lifecycle/pom.xml b/framework/spring/lifecycle/pom.xml index 6994b24497f..730bcd5ea98 100644 --- a/framework/spring/lifecycle/pom.xml +++ b/framework/spring/lifecycle/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/framework/spring/module/pom.xml b/framework/spring/module/pom.xml index 4913be7baf1..7631a866bb1 100644 --- a/framework/spring/module/pom.xml +++ b/framework/spring/module/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/acl/dynamic-role-based/pom.xml b/plugins/acl/dynamic-role-based/pom.xml index 4d1519b5d0d..aae1908dc81 100644 --- a/plugins/acl/dynamic-role-based/pom.xml +++ b/plugins/acl/dynamic-role-based/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/acl/project-role-based/pom.xml b/plugins/acl/project-role-based/pom.xml index 216ad4def33..c356f86c179 100644 --- a/plugins/acl/project-role-based/pom.xml +++ b/plugins/acl/project-role-based/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/acl/static-role-based/pom.xml b/plugins/acl/static-role-based/pom.xml index 851dd77f993..541975e891e 100644 --- a/plugins/acl/static-role-based/pom.xml +++ b/plugins/acl/static-role-based/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/affinity-group-processors/explicit-dedication/pom.xml b/plugins/affinity-group-processors/explicit-dedication/pom.xml index 524474a6fb6..d85230d9cfd 100644 --- a/plugins/affinity-group-processors/explicit-dedication/pom.xml +++ b/plugins/affinity-group-processors/explicit-dedication/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/affinity-group-processors/host-affinity/pom.xml b/plugins/affinity-group-processors/host-affinity/pom.xml index 21589613be7..340deda4cd0 100644 --- a/plugins/affinity-group-processors/host-affinity/pom.xml +++ b/plugins/affinity-group-processors/host-affinity/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/affinity-group-processors/host-anti-affinity/pom.xml b/plugins/affinity-group-processors/host-anti-affinity/pom.xml index 8a6dfe067ed..81947a62412 100644 --- a/plugins/affinity-group-processors/host-anti-affinity/pom.xml +++ b/plugins/affinity-group-processors/host-anti-affinity/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/affinity-group-processors/non-strict-host-affinity/pom.xml b/plugins/affinity-group-processors/non-strict-host-affinity/pom.xml index 945b5a87789..f6968c7c44f 100644 --- a/plugins/affinity-group-processors/non-strict-host-affinity/pom.xml +++ b/plugins/affinity-group-processors/non-strict-host-affinity/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/affinity-group-processors/non-strict-host-anti-affinity/pom.xml b/plugins/affinity-group-processors/non-strict-host-anti-affinity/pom.xml index aec218e073f..b90f70c0d8a 100644 --- a/plugins/affinity-group-processors/non-strict-host-anti-affinity/pom.xml +++ b/plugins/affinity-group-processors/non-strict-host-anti-affinity/pom.xml @@ -25,14 +25,14 @@ org.apache.cloudstack cloud-plugin-non-strict-host-affinity - 4.18.1.1 + 4.18.1.2 compile org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/alert-handlers/snmp-alerts/pom.xml b/plugins/alert-handlers/snmp-alerts/pom.xml index 53fa8fd9456..4c915bc72ad 100644 --- a/plugins/alert-handlers/snmp-alerts/pom.xml +++ b/plugins/alert-handlers/snmp-alerts/pom.xml @@ -24,7 +24,7 @@ cloudstack-plugins org.apache.cloudstack - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/alert-handlers/syslog-alerts/pom.xml b/plugins/alert-handlers/syslog-alerts/pom.xml index 11af0e1f226..cffc6c2734a 100644 --- a/plugins/alert-handlers/syslog-alerts/pom.xml +++ b/plugins/alert-handlers/syslog-alerts/pom.xml @@ -24,7 +24,7 @@ cloudstack-plugins org.apache.cloudstack - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/api/discovery/pom.xml b/plugins/api/discovery/pom.xml index fe5d0005d9c..c6afcbdeeef 100644 --- a/plugins/api/discovery/pom.xml +++ b/plugins/api/discovery/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/api/rate-limit/pom.xml b/plugins/api/rate-limit/pom.xml index 04af3723b64..92c6bb25fdd 100644 --- a/plugins/api/rate-limit/pom.xml +++ b/plugins/api/rate-limit/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/api/solidfire-intg-test/pom.xml b/plugins/api/solidfire-intg-test/pom.xml index cfdf8917af6..43ae554c2b9 100644 --- a/plugins/api/solidfire-intg-test/pom.xml +++ b/plugins/api/solidfire-intg-test/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/api/vmware-sioc/pom.xml b/plugins/api/vmware-sioc/pom.xml index 44d6598c122..e9b3504358e 100644 --- a/plugins/api/vmware-sioc/pom.xml +++ b/plugins/api/vmware-sioc/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/backup/dummy/pom.xml b/plugins/backup/dummy/pom.xml index e53fee435f5..0155f4a66c5 100644 --- a/plugins/backup/dummy/pom.xml +++ b/plugins/backup/dummy/pom.xml @@ -23,7 +23,7 @@ cloudstack-plugins org.apache.cloudstack - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/backup/networker/pom.xml b/plugins/backup/networker/pom.xml index 7754fea2ca3..bfcd7fb3873 100644 --- a/plugins/backup/networker/pom.xml +++ b/plugins/backup/networker/pom.xml @@ -25,7 +25,7 @@ cloudstack-plugins org.apache.cloudstack - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/backup/veeam/pom.xml b/plugins/backup/veeam/pom.xml index 643d73b64fe..793366e17e0 100644 --- a/plugins/backup/veeam/pom.xml +++ b/plugins/backup/veeam/pom.xml @@ -23,7 +23,7 @@ cloudstack-plugins org.apache.cloudstack - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/ca/root-ca/pom.xml b/plugins/ca/root-ca/pom.xml index 033889fe69a..feaed5c00b2 100644 --- a/plugins/ca/root-ca/pom.xml +++ b/plugins/ca/root-ca/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/database/mysql-ha/pom.xml b/plugins/database/mysql-ha/pom.xml index 854bb7c0a3e..563f8127636 100644 --- a/plugins/database/mysql-ha/pom.xml +++ b/plugins/database/mysql-ha/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/database/quota/pom.xml b/plugins/database/quota/pom.xml index a18039997cd..1ca1302a044 100644 --- a/plugins/database/quota/pom.xml +++ b/plugins/database/quota/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/dedicated-resources/pom.xml b/plugins/dedicated-resources/pom.xml index f0e062f3c8f..c59ca4ae6ae 100644 --- a/plugins/dedicated-resources/pom.xml +++ b/plugins/dedicated-resources/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/plugins/deployment-planners/implicit-dedication/pom.xml b/plugins/deployment-planners/implicit-dedication/pom.xml index 98a9d207e76..5765abfe6b5 100644 --- a/plugins/deployment-planners/implicit-dedication/pom.xml +++ b/plugins/deployment-planners/implicit-dedication/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/deployment-planners/user-concentrated-pod/pom.xml b/plugins/deployment-planners/user-concentrated-pod/pom.xml index e531512c258..71f8cc128f4 100644 --- a/plugins/deployment-planners/user-concentrated-pod/pom.xml +++ b/plugins/deployment-planners/user-concentrated-pod/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/deployment-planners/user-dispersing/pom.xml b/plugins/deployment-planners/user-dispersing/pom.xml index 99ca783bd1b..90b716146f1 100644 --- a/plugins/deployment-planners/user-dispersing/pom.xml +++ b/plugins/deployment-planners/user-dispersing/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/event-bus/inmemory/pom.xml b/plugins/event-bus/inmemory/pom.xml index aa068d26445..d957fbcd79b 100644 --- a/plugins/event-bus/inmemory/pom.xml +++ b/plugins/event-bus/inmemory/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/event-bus/kafka/pom.xml b/plugins/event-bus/kafka/pom.xml index 31f163448db..43c000c81b8 100644 --- a/plugins/event-bus/kafka/pom.xml +++ b/plugins/event-bus/kafka/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/event-bus/rabbitmq/pom.xml b/plugins/event-bus/rabbitmq/pom.xml index 10825ec394b..b0f49f95555 100644 --- a/plugins/event-bus/rabbitmq/pom.xml +++ b/plugins/event-bus/rabbitmq/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/ha-planners/skip-heurestics/pom.xml b/plugins/ha-planners/skip-heurestics/pom.xml index f9d1015476e..556e4afa05a 100644 --- a/plugins/ha-planners/skip-heurestics/pom.xml +++ b/plugins/ha-planners/skip-heurestics/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/host-allocators/random/pom.xml b/plugins/host-allocators/random/pom.xml index c68c5028aae..a29f1f6ae96 100644 --- a/plugins/host-allocators/random/pom.xml +++ b/plugins/host-allocators/random/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/hypervisors/baremetal/pom.xml b/plugins/hypervisors/baremetal/pom.xml index 65ab8328f17..12650a989c1 100755 --- a/plugins/hypervisors/baremetal/pom.xml +++ b/plugins/hypervisors/baremetal/pom.xml @@ -22,7 +22,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml cloud-plugin-hypervisor-baremetal diff --git a/plugins/hypervisors/hyperv/pom.xml b/plugins/hypervisors/hyperv/pom.xml index 188351e567f..17b62f40395 100644 --- a/plugins/hypervisors/hyperv/pom.xml +++ b/plugins/hypervisors/hyperv/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/hypervisors/kvm/pom.xml b/plugins/hypervisors/kvm/pom.xml index 7790fb2775e..084fe1e8746 100644 --- a/plugins/hypervisors/kvm/pom.xml +++ b/plugins/hypervisors/kvm/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/hypervisors/ovm/pom.xml b/plugins/hypervisors/ovm/pom.xml index 918e1389241..fd6fc7e2545 100644 --- a/plugins/hypervisors/ovm/pom.xml +++ b/plugins/hypervisors/ovm/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/hypervisors/ovm3/pom.xml b/plugins/hypervisors/ovm3/pom.xml index 5213058c8e6..b42c9247462 100644 --- a/plugins/hypervisors/ovm3/pom.xml +++ b/plugins/hypervisors/ovm3/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/hypervisors/simulator/pom.xml b/plugins/hypervisors/simulator/pom.xml index ae436073971..98cf4d2fa2f 100644 --- a/plugins/hypervisors/simulator/pom.xml +++ b/plugins/hypervisors/simulator/pom.xml @@ -22,7 +22,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml cloud-plugin-hypervisor-simulator diff --git a/plugins/hypervisors/ucs/pom.xml b/plugins/hypervisors/ucs/pom.xml index dfb9c7c4674..557f7a87cc7 100644 --- a/plugins/hypervisors/ucs/pom.xml +++ b/plugins/hypervisors/ucs/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml cloud-plugin-hypervisor-ucs diff --git a/plugins/hypervisors/vmware/pom.xml b/plugins/hypervisors/vmware/pom.xml index 6228b11d74a..24fc80fe706 100644 --- a/plugins/hypervisors/vmware/pom.xml +++ b/plugins/hypervisors/vmware/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/hypervisors/xenserver/pom.xml b/plugins/hypervisors/xenserver/pom.xml index ccd7f07136d..11d73dfafb6 100644 --- a/plugins/hypervisors/xenserver/pom.xml +++ b/plugins/hypervisors/xenserver/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/integrations/cloudian/pom.xml b/plugins/integrations/cloudian/pom.xml index 38db4549c29..3e3e8f4fdc2 100644 --- a/plugins/integrations/cloudian/pom.xml +++ b/plugins/integrations/cloudian/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/integrations/kubernetes-service/pom.xml b/plugins/integrations/kubernetes-service/pom.xml index 89dcbb12ea1..6f000c20b9e 100644 --- a/plugins/integrations/kubernetes-service/pom.xml +++ b/plugins/integrations/kubernetes-service/pom.xml @@ -26,7 +26,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/integrations/prometheus/pom.xml b/plugins/integrations/prometheus/pom.xml index f0d8f5ff860..9d968b13d66 100644 --- a/plugins/integrations/prometheus/pom.xml +++ b/plugins/integrations/prometheus/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/metrics/pom.xml b/plugins/metrics/pom.xml index 421063e5422..659adf8b4ea 100644 --- a/plugins/metrics/pom.xml +++ b/plugins/metrics/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/plugins/network-elements/bigswitch/pom.xml b/plugins/network-elements/bigswitch/pom.xml index 8d382127c10..8c763d584ca 100644 --- a/plugins/network-elements/bigswitch/pom.xml +++ b/plugins/network-elements/bigswitch/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/brocade-vcs/pom.xml b/plugins/network-elements/brocade-vcs/pom.xml index cbfd6b3ff9b..8dcf9b8f886 100644 --- a/plugins/network-elements/brocade-vcs/pom.xml +++ b/plugins/network-elements/brocade-vcs/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/cisco-vnmc/pom.xml b/plugins/network-elements/cisco-vnmc/pom.xml index 5598c69e166..3024266e3e1 100644 --- a/plugins/network-elements/cisco-vnmc/pom.xml +++ b/plugins/network-elements/cisco-vnmc/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/dns-notifier/pom.xml b/plugins/network-elements/dns-notifier/pom.xml index f1b1d19e602..cb2407058d2 100644 --- a/plugins/network-elements/dns-notifier/pom.xml +++ b/plugins/network-elements/dns-notifier/pom.xml @@ -22,7 +22,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml cloud-plugin-example-dns-notifier diff --git a/plugins/network-elements/elastic-loadbalancer/pom.xml b/plugins/network-elements/elastic-loadbalancer/pom.xml index a5aedfc8a43..39a9a900cd1 100644 --- a/plugins/network-elements/elastic-loadbalancer/pom.xml +++ b/plugins/network-elements/elastic-loadbalancer/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/globodns/pom.xml b/plugins/network-elements/globodns/pom.xml index 92c8d9d02f7..de24fed06cf 100644 --- a/plugins/network-elements/globodns/pom.xml +++ b/plugins/network-elements/globodns/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/internal-loadbalancer/pom.xml b/plugins/network-elements/internal-loadbalancer/pom.xml index 7b84efe3981..bc7691d3989 100644 --- a/plugins/network-elements/internal-loadbalancer/pom.xml +++ b/plugins/network-elements/internal-loadbalancer/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/juniper-contrail/pom.xml b/plugins/network-elements/juniper-contrail/pom.xml index 1b64d9150df..bd6f0d23795 100644 --- a/plugins/network-elements/juniper-contrail/pom.xml +++ b/plugins/network-elements/juniper-contrail/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/netscaler/pom.xml b/plugins/network-elements/netscaler/pom.xml index f5bba0179b4..6844062146d 100644 --- a/plugins/network-elements/netscaler/pom.xml +++ b/plugins/network-elements/netscaler/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/nicira-nvp/pom.xml b/plugins/network-elements/nicira-nvp/pom.xml index 2c6f6d50e56..fc0f18499cf 100644 --- a/plugins/network-elements/nicira-nvp/pom.xml +++ b/plugins/network-elements/nicira-nvp/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/opendaylight/pom.xml b/plugins/network-elements/opendaylight/pom.xml index 8bf864f8c3c..007baf2dce0 100644 --- a/plugins/network-elements/opendaylight/pom.xml +++ b/plugins/network-elements/opendaylight/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/ovs/pom.xml b/plugins/network-elements/ovs/pom.xml index b30e8cf72a1..c6e234e982c 100644 --- a/plugins/network-elements/ovs/pom.xml +++ b/plugins/network-elements/ovs/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/palo-alto/pom.xml b/plugins/network-elements/palo-alto/pom.xml index 41404b89d2a..d17667514a6 100644 --- a/plugins/network-elements/palo-alto/pom.xml +++ b/plugins/network-elements/palo-alto/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/stratosphere-ssp/pom.xml b/plugins/network-elements/stratosphere-ssp/pom.xml index 6c469dc2cc2..cb9320b9695 100644 --- a/plugins/network-elements/stratosphere-ssp/pom.xml +++ b/plugins/network-elements/stratosphere-ssp/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/tungsten/pom.xml b/plugins/network-elements/tungsten/pom.xml index f4d71a1d787..cac080a0d22 100644 --- a/plugins/network-elements/tungsten/pom.xml +++ b/plugins/network-elements/tungsten/pom.xml @@ -26,7 +26,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/network-elements/vxlan/pom.xml b/plugins/network-elements/vxlan/pom.xml index a8fb5e6b108..db4eb3d8caa 100644 --- a/plugins/network-elements/vxlan/pom.xml +++ b/plugins/network-elements/vxlan/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/outofbandmanagement-drivers/ipmitool/pom.xml b/plugins/outofbandmanagement-drivers/ipmitool/pom.xml index 3c35a42c996..ae135d9aedf 100644 --- a/plugins/outofbandmanagement-drivers/ipmitool/pom.xml +++ b/plugins/outofbandmanagement-drivers/ipmitool/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/outofbandmanagement-drivers/nested-cloudstack/pom.xml b/plugins/outofbandmanagement-drivers/nested-cloudstack/pom.xml index a68fd28adbc..fce742203da 100644 --- a/plugins/outofbandmanagement-drivers/nested-cloudstack/pom.xml +++ b/plugins/outofbandmanagement-drivers/nested-cloudstack/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/outofbandmanagement-drivers/redfish/pom.xml b/plugins/outofbandmanagement-drivers/redfish/pom.xml index 4b73e4bf346..1c64b26627f 100644 --- a/plugins/outofbandmanagement-drivers/redfish/pom.xml +++ b/plugins/outofbandmanagement-drivers/redfish/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/pom.xml b/plugins/pom.xml index b4d8969390f..4eef0adf578 100755 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 diff --git a/plugins/storage-allocators/random/pom.xml b/plugins/storage-allocators/random/pom.xml index 6db3a1fe919..fd3ddbda5f3 100644 --- a/plugins/storage-allocators/random/pom.xml +++ b/plugins/storage-allocators/random/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/storage/image/default/pom.xml b/plugins/storage/image/default/pom.xml index e2328f7607f..7d4d9f6fb02 100644 --- a/plugins/storage/image/default/pom.xml +++ b/plugins/storage/image/default/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/image/s3/pom.xml b/plugins/storage/image/s3/pom.xml index 9891a027a31..693a0d55023 100644 --- a/plugins/storage/image/s3/pom.xml +++ b/plugins/storage/image/s3/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/image/sample/pom.xml b/plugins/storage/image/sample/pom.xml index 3fbcae399c7..f9c45d5b4d8 100644 --- a/plugins/storage/image/sample/pom.xml +++ b/plugins/storage/image/sample/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/image/swift/pom.xml b/plugins/storage/image/swift/pom.xml index 9efe3b665e6..ef1bbef697a 100644 --- a/plugins/storage/image/swift/pom.xml +++ b/plugins/storage/image/swift/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/volume/cloudbyte/pom.xml b/plugins/storage/volume/cloudbyte/pom.xml index f083bdfcd99..99c73d76f73 100644 --- a/plugins/storage/volume/cloudbyte/pom.xml +++ b/plugins/storage/volume/cloudbyte/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/volume/datera/pom.xml b/plugins/storage/volume/datera/pom.xml index 305b8da3f79..aa49f779b9d 100644 --- a/plugins/storage/volume/datera/pom.xml +++ b/plugins/storage/volume/datera/pom.xml @@ -16,7 +16,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/volume/default/pom.xml b/plugins/storage/volume/default/pom.xml index f4146b8ed23..e0e78fd0786 100644 --- a/plugins/storage/volume/default/pom.xml +++ b/plugins/storage/volume/default/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/volume/linstor/pom.xml b/plugins/storage/volume/linstor/pom.xml index 4b16f181673..8b0781399fa 100644 --- a/plugins/storage/volume/linstor/pom.xml +++ b/plugins/storage/volume/linstor/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/volume/nexenta/pom.xml b/plugins/storage/volume/nexenta/pom.xml index 073359979fb..54d4b4b2929 100644 --- a/plugins/storage/volume/nexenta/pom.xml +++ b/plugins/storage/volume/nexenta/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/volume/sample/pom.xml b/plugins/storage/volume/sample/pom.xml index f53621c8e00..38e16255f69 100644 --- a/plugins/storage/volume/sample/pom.xml +++ b/plugins/storage/volume/sample/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/volume/scaleio/pom.xml b/plugins/storage/volume/scaleio/pom.xml index 6e0e86d94a2..da6d2db0de7 100644 --- a/plugins/storage/volume/scaleio/pom.xml +++ b/plugins/storage/volume/scaleio/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/volume/solidfire/pom.xml b/plugins/storage/volume/solidfire/pom.xml index 9e0b1cb71cf..8ff03e74306 100644 --- a/plugins/storage/volume/solidfire/pom.xml +++ b/plugins/storage/volume/solidfire/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/storage/volume/storpool/pom.xml b/plugins/storage/volume/storpool/pom.xml index 32f9835330e..e230d880bd6 100644 --- a/plugins/storage/volume/storpool/pom.xml +++ b/plugins/storage/volume/storpool/pom.xml @@ -17,7 +17,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../../pom.xml diff --git a/plugins/user-authenticators/ldap/pom.xml b/plugins/user-authenticators/ldap/pom.xml index 53b030d60b1..13296963ef9 100644 --- a/plugins/user-authenticators/ldap/pom.xml +++ b/plugins/user-authenticators/ldap/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/user-authenticators/md5/pom.xml b/plugins/user-authenticators/md5/pom.xml index 0010c08f21a..b82289e8c9e 100644 --- a/plugins/user-authenticators/md5/pom.xml +++ b/plugins/user-authenticators/md5/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/user-authenticators/pbkdf2/pom.xml b/plugins/user-authenticators/pbkdf2/pom.xml index b5394bf12df..87577365010 100644 --- a/plugins/user-authenticators/pbkdf2/pom.xml +++ b/plugins/user-authenticators/pbkdf2/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/user-authenticators/plain-text/pom.xml b/plugins/user-authenticators/plain-text/pom.xml index 18f2d7cefac..4f31f3f0b61 100644 --- a/plugins/user-authenticators/plain-text/pom.xml +++ b/plugins/user-authenticators/plain-text/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/user-authenticators/saml2/pom.xml b/plugins/user-authenticators/saml2/pom.xml index dca17c34399..d19026d5f94 100644 --- a/plugins/user-authenticators/saml2/pom.xml +++ b/plugins/user-authenticators/saml2/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/user-authenticators/sha256salted/pom.xml b/plugins/user-authenticators/sha256salted/pom.xml index adfd532c1b5..8d4004f0085 100644 --- a/plugins/user-authenticators/sha256salted/pom.xml +++ b/plugins/user-authenticators/sha256salted/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml diff --git a/plugins/user-two-factor-authenticators/static-pin/pom.xml b/plugins/user-two-factor-authenticators/static-pin/pom.xml index e399b8451b9..e0ed7853348 100644 --- a/plugins/user-two-factor-authenticators/static-pin/pom.xml +++ b/plugins/user-two-factor-authenticators/static-pin/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml \ No newline at end of file diff --git a/plugins/user-two-factor-authenticators/totp/pom.xml b/plugins/user-two-factor-authenticators/totp/pom.xml index 0e0100cb6c4..00e1098533f 100644 --- a/plugins/user-two-factor-authenticators/totp/pom.xml +++ b/plugins/user-two-factor-authenticators/totp/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.18.1.1 + 4.18.1.2 ../../pom.xml \ No newline at end of file diff --git a/pom.xml b/pom.xml index adfdd153d3e..816a365ac71 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 pom Apache CloudStack Apache CloudStack is an IaaS ("Infrastructure as a Service") cloud orchestration platform. diff --git a/quickcloud/pom.xml b/quickcloud/pom.xml index 8fcbb2b178a..85a6663cfdf 100644 --- a/quickcloud/pom.xml +++ b/quickcloud/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/server/pom.xml b/server/pom.xml index 24f50df6bca..250c2dcef21 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 diff --git a/services/console-proxy/pom.xml b/services/console-proxy/pom.xml index 8456aa9aa68..cf066476215 100644 --- a/services/console-proxy/pom.xml +++ b/services/console-proxy/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack-services - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/services/console-proxy/rdpconsole/pom.xml b/services/console-proxy/rdpconsole/pom.xml index 710c74af23b..45fec486033 100644 --- a/services/console-proxy/rdpconsole/pom.xml +++ b/services/console-proxy/rdpconsole/pom.xml @@ -26,7 +26,7 @@ org.apache.cloudstack cloudstack-service-console-proxy - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/services/console-proxy/server/pom.xml b/services/console-proxy/server/pom.xml index 984597c29db..1eb1fa8cfce 100644 --- a/services/console-proxy/server/pom.xml +++ b/services/console-proxy/server/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-service-console-proxy - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/services/pom.xml b/services/pom.xml index 4df43b9c733..0cd8a92f19a 100644 --- a/services/pom.xml +++ b/services/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/services/secondary-storage/controller/pom.xml b/services/secondary-storage/controller/pom.xml index 86c92a4b62f..dbf4fe12cf6 100644 --- a/services/secondary-storage/controller/pom.xml +++ b/services/secondary-storage/controller/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-service-secondary-storage - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/services/secondary-storage/pom.xml b/services/secondary-storage/pom.xml index 09bccd8306f..7640a68f614 100644 --- a/services/secondary-storage/pom.xml +++ b/services/secondary-storage/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack-services - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/services/secondary-storage/server/pom.xml b/services/secondary-storage/server/pom.xml index 12cd8485dbd..9517cece855 100644 --- a/services/secondary-storage/server/pom.xml +++ b/services/secondary-storage/server/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-service-secondary-storage - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/systemvm/pom.xml b/systemvm/pom.xml index 2a09cf3a6ea..f661d323351 100644 --- a/systemvm/pom.xml +++ b/systemvm/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/test/pom.xml b/test/pom.xml index 505d0daaae1..940d180d475 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 diff --git a/tools/apidoc/pom.xml b/tools/apidoc/pom.xml index 81597840df2..280cd6b2256 100644 --- a/tools/apidoc/pom.xml +++ b/tools/apidoc/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloud-tools - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/tools/checkstyle/pom.xml b/tools/checkstyle/pom.xml index d4f2cb5f899..ad5501dd78c 100644 --- a/tools/checkstyle/pom.xml +++ b/tools/checkstyle/pom.xml @@ -22,7 +22,7 @@ Apache CloudStack Developer Tools - Checkstyle Configuration org.apache.cloudstack checkstyle - 4.18.1.1 + 4.18.1.2 UTF-8 diff --git a/tools/devcloud-kvm/pom.xml b/tools/devcloud-kvm/pom.xml index 9f24d4ce2b7..99a5eb0a927 100644 --- a/tools/devcloud-kvm/pom.xml +++ b/tools/devcloud-kvm/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloud-tools - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/tools/devcloud4/pom.xml b/tools/devcloud4/pom.xml index f7efc1e570a..b2537c5f974 100644 --- a/tools/devcloud4/pom.xml +++ b/tools/devcloud4/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloud-tools - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/tools/marvin/pom.xml b/tools/marvin/pom.xml index ee0468a6741..af4ddcb69c0 100644 --- a/tools/marvin/pom.xml +++ b/tools/marvin/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloud-tools - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/tools/marvin/setup.py b/tools/marvin/setup.py index 760e008e767..48945f171b3 100644 --- a/tools/marvin/setup.py +++ b/tools/marvin/setup.py @@ -27,7 +27,7 @@ except ImportError: raise RuntimeError("python setuptools is required to build Marvin") -VERSION = "4.18.1.1" +VERSION = "4.18.1.2" setup(name="Marvin", version=VERSION, diff --git a/tools/pom.xml b/tools/pom.xml index ca87f180401..bd3c8155efe 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/usage/pom.xml b/usage/pom.xml index 1f658fa1a49..6a17a8a652a 100644 --- a/usage/pom.xml +++ b/usage/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 diff --git a/utils/pom.xml b/utils/pom.xml index 1d9336a9297..abb97af4a40 100755 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 ../pom.xml diff --git a/vmware-base/pom.xml b/vmware-base/pom.xml index e1e2f8cab63..090d1d7a83a 100644 --- a/vmware-base/pom.xml +++ b/vmware-base/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.18.1.1 + 4.18.1.2 From 8136db637aa8d2c71f0b39f7b5d11974189cf6b6 Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Thu, 15 Aug 2024 17:57:07 -0700 Subject: [PATCH 03/18] Added configuration key powerflex.connect.on.demand to DB and resource_reservation DDL --- .../cloud/upgrade/DatabaseUpgradeChecker.java | 2 + .../upgrade/dao/Upgrade41811to41812.java | 69 +++++++++++++++++++ .../db/schema-41811to41812-cleanup.sql | 20 ++++++ .../META-INF/db/schema-41811to41812.sql | 50 ++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41811to41812.java create mode 100644 engine/schema/src/main/resources/META-INF/db/schema-41811to41812-cleanup.sql create mode 100644 engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql diff --git a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java index e5b2df77ccf..d918373a759 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java @@ -81,6 +81,7 @@ import com.cloud.upgrade.dao.Upgrade41700to41710; import com.cloud.upgrade.dao.Upgrade41710to41720; import com.cloud.upgrade.dao.Upgrade41720to41800; import com.cloud.upgrade.dao.Upgrade41800to41810; +import com.cloud.upgrade.dao.Upgrade41811to41812; import com.cloud.upgrade.dao.Upgrade420to421; import com.cloud.upgrade.dao.Upgrade421to430; import com.cloud.upgrade.dao.Upgrade430to440; @@ -218,6 +219,7 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker { .next("4.17.1.0", new Upgrade41710to41720()) .next("4.17.2.0", new Upgrade41720to41800()) .next("4.18.0.0", new Upgrade41800to41810()) + .next("4.18.1.0", new Upgrade41811to41812()) .build(); } diff --git a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41811to41812.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41811to41812.java new file mode 100644 index 00000000000..23af4bbcf52 --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41811to41812.java @@ -0,0 +1,69 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.upgrade.dao; + +import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.log4j.Logger; + +import java.io.InputStream; +import java.sql.Connection; + +public class Upgrade41811to41812 implements DbUpgrade { + final static Logger LOG = Logger.getLogger(Upgrade41811to41812.class); + + @Override + public String[] getUpgradableVersionRange() { + return new String[]{"4.18.1.1", "4.18.1.2"}; + } + + @Override + public String getUpgradedVersion() { + return "4.18.1.2"; + } + + @Override + public boolean supportsRollingUpgrade() { + return true; + } + + @Override + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-41811to41812.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[]{script}; + } + + @Override + public void performDataMigration(Connection conn) { + } + + + @Override + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-41811to41812-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[]{script}; + } +} diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41811to41812-cleanup.sql b/engine/schema/src/main/resources/META-INF/db/schema-41811to41812-cleanup.sql new file mode 100644 index 00000000000..01d5cef1e5e --- /dev/null +++ b/engine/schema/src/main/resources/META-INF/db/schema-41811to41812-cleanup.sql @@ -0,0 +1,20 @@ +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + +--; +-- Schema upgrade cleanup from to 4.18.1.2 +--; \ No newline at end of file diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql b/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql new file mode 100644 index 00000000000..5a72bd42153 --- /dev/null +++ b/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql @@ -0,0 +1,50 @@ +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + +--; +-- Schema upgrade from 4.18.1.2 +--; + +-- Add property to enable/disable on-demand connection Host to PowerFlex storage pool +INSERT IGNORE INTO `cloud`.`configuration` ( + `category`, + `instance`, + `component`, + `scope`, + `name`, + `value`, + `default_value`, + `is_dynamic`, + `display_text`, + `description` +) VALUES ( + 'Storage', + 'DEFAULT', + 'StorageManager', + 'Global', + 'powerflex.connect.on.demand', + 'false', + 'false', + 1, + 'Connect PowerFlex client on Host on-demand', + 'Connect PowerFlex client on Host when first Volume created and disconnect when last Volume deleted (or always stay connected otherwise).' +); + +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'mgmt_server_id', 'bigint unsigned NULL COMMENT "management server id" '); +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'created', 'datetime DEFAULT NULL COMMENT "date when the reservation was created" '); + +UPDATE `cloud`.`resource_reservation` SET `created` = now() WHERE `created` IS NULL; From e1c749276867e8707cba3d7ab216e04ec527cda7 Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Thu, 22 Aug 2024 14:12:49 -0700 Subject: [PATCH 04/18] - added resource_reservation.mgmt_server_id - added resource_reservation.created to migration script --- .../META-INF/db/schema-41811to41812.sql | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql b/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql index 5a72bd42153..c5cdedf0168 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql @@ -44,7 +44,23 @@ INSERT IGNORE INTO `cloud`.`configuration` ( 'Connect PowerFlex client on Host when first Volume created and disconnect when last Volume deleted (or always stay connected otherwise).' ); -CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'mgmt_server_id', 'bigint unsigned NULL COMMENT "management server id" '); -CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'created', 'datetime DEFAULT NULL COMMENT "date when the reservation was created" '); - -UPDATE `cloud`.`resource_reservation` SET `created` = now() WHERE `created` IS NULL; +-- These fields have been added in 4.18.0, however due to issues with update process (sql updated after version update) +-- adding one more time here in case if migration from 4.18.0 didn't go through +CREATE PROCEDURE `cloud`.`ADD_RESOURCE_RESERVATION_MGMT_SERVER_ID_CREATED`() +BEGIN + DECLARE created_exists TINYINT DEFAULT FALSE +; IF NOT EXISTS (SELECT * FROM `information_schema`.`columns` WHERE `table_schema` = 'cloud' AND `table_name` = 'resource_reservation' AND `column_name` = 'mgmt_server_id') THEN + CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'mgmt_server_id', 'bigint unsigned NULL COMMENT "management server id" ') +; END IF +; IF NOT EXISTS (SELECT * FROM `information_schema`.`columns` WHERE `table_schema` = 'cloud' AND `table_name` = 'resource_reservation' AND `column_name` = 'created') THEN + SET created_exists = TRUE +; END IF +; IF created_exists THEN + CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'created', 'datetime DEFAULT NULL COMMENT "date when the reservation was created" ') +; END IF +; IF created_exists THEN + UPDATE `cloud`.`resource_reservation` SET `created` = now() WHERE `created` IS NULL +; END IF +; END; +CALL `cloud`.`ADD_RESOURCE_RESERVATION_MGMT_SERVER_ID_CREATED`(); +DROP PROCEDURE IF EXISTS `cloud`.`ADD_RESOURCE_RESERVATION_MGMT_SERVER_ID_CREATED`; From 0d553332d95abc86dbb34ac20f2ec44fbbfd39ce Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Wed, 28 Aug 2024 17:35:16 -0700 Subject: [PATCH 05/18] Implemented Configurable methods in ScaleIOPrimaryDataStoreDriver. --- .../driver/ScaleIOPrimaryDataStoreDriver.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java index f7128876d7d..60bad6683a4 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java @@ -39,6 +39,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO; import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao; @@ -109,7 +110,7 @@ import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.VMInstanceDao; import com.google.common.base.Preconditions; -public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { +public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Configurable { private static final Logger LOGGER = Logger.getLogger(ScaleIOPrimaryDataStoreDriver.class); static ConfigKey ConnectOnDemand = new ConfigKey<>("Storage", @@ -1519,4 +1520,14 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { public boolean zoneWideVolumesAvailableWithoutClusterMotion() { return true; } + + @Override + public String getConfigComponentName() { + return ScaleIOPrimaryDataStoreDriver.class.getSimpleName(); + } + + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[]{ConnectOnDemand}; + } } From 1ec11a148250e520db258115d2dfdfad34347e33 Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Fri, 30 Aug 2024 11:23:38 -0700 Subject: [PATCH 06/18] removed insert of powerflex.connect.on.demand as it taken care by commit 0d553332 already --- .../META-INF/db/schema-41811to41812.sql | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql b/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql index c5cdedf0168..4542f1b9084 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql @@ -19,31 +19,6 @@ -- Schema upgrade from 4.18.1.2 --; --- Add property to enable/disable on-demand connection Host to PowerFlex storage pool -INSERT IGNORE INTO `cloud`.`configuration` ( - `category`, - `instance`, - `component`, - `scope`, - `name`, - `value`, - `default_value`, - `is_dynamic`, - `display_text`, - `description` -) VALUES ( - 'Storage', - 'DEFAULT', - 'StorageManager', - 'Global', - 'powerflex.connect.on.demand', - 'false', - 'false', - 1, - 'Connect PowerFlex client on Host on-demand', - 'Connect PowerFlex client on Host when first Volume created and disconnect when last Volume deleted (or always stay connected otherwise).' -); - -- These fields have been added in 4.18.0, however due to issues with update process (sql updated after version update) -- adding one more time here in case if migration from 4.18.0 didn't go through CREATE PROCEDURE `cloud`.`ADD_RESOURCE_RESERVATION_MGMT_SERVER_ID_CREATED`() From 07218b8c3d1b02a84c89aa70b77b786ae1e34e8b Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Tue, 3 Sep 2024 14:19:42 -0700 Subject: [PATCH 07/18] Moved ConnectOnDemand logic to ScaleIO SDC Manager and made ConnectOnDemand of Zone-aware --- .../driver/ScaleIOPrimaryDataStoreDriver.java | 67 +++++++--------- .../manager/ScaleIOSDCManagerImpl.java | 31 +++++++- .../ScaleIOPrimaryDataStoreDriverTest.java | 78 ++----------------- 3 files changed, 68 insertions(+), 108 deletions(-) diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java index 60bad6683a4..3a0654eb8e7 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java @@ -38,8 +38,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; -import org.apache.cloudstack.framework.config.ConfigKey; -import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO; import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao; @@ -110,16 +108,9 @@ import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.VMInstanceDao; import com.google.common.base.Preconditions; -public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Configurable { +public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver { private static final Logger LOGGER = Logger.getLogger(ScaleIOPrimaryDataStoreDriver.class); - static ConfigKey ConnectOnDemand = new ConfigKey<>("Storage", - Boolean.class, - "powerflex.connect.on.demand", - Boolean.FALSE.toString(), - "Connect PowerFlex client on Host when first Volume created and disconnect when last Volume deleted (or always stay connected otherwise).", - Boolean.TRUE); - @Inject EndPointSelector selector; @Inject @@ -164,9 +155,7 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Co private boolean setVolumeLimitsOnSDC(VolumeVO volume, Host host, DataStore dataStore, Long iopsLimit, Long bandwidthLimitInKbps) throws Exception { sdcManager = ComponentContext.inject(sdcManager); - // don't connect SDC if connect on demand disabled - final String sdcId = Boolean.TRUE.equals(ConnectOnDemand.value()) ? sdcManager.prepareSDC(host, dataStore) : - sdcManager.getConnectedSdc(host, dataStore); + final String sdcId = sdcManager.prepareSDC(host, dataStore); if (StringUtils.isBlank(sdcId)) { alertHostSdcDisconnection(host); throw new CloudRuntimeException("Unable to grant access to volume: " + volume.getId() + ", no Sdc connected with host ip: " + host.getPrivateIpAddress()); @@ -203,9 +192,7 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Co public boolean grantAccess(DataObject dataObject, Host host, DataStore dataStore) { try { sdcManager = ComponentContext.inject(sdcManager); - // don't connect SDC if connect on demand disabled - final String sdcId = Boolean.TRUE.equals(ConnectOnDemand.value()) ? sdcManager.prepareSDC(host, dataStore) : - sdcManager.getConnectedSdc(host, dataStore); + final String sdcId = sdcManager.prepareSDC(host, dataStore); if (StringUtils.isBlank(sdcId)) { alertHostSdcDisconnection(host); throw new CloudRuntimeException(String.format("Unable to grant access to %s: %s, no Sdc connected with host ip: %s", dataObject.getType(), dataObject.getId(), host.getPrivateIpAddress())); @@ -246,8 +233,7 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Co } try { - sdcManager = ComponentContext.inject(sdcManager); - final String sdcId = sdcManager.getConnectedSdc(host, dataStore); + final String sdcId = getConnectedSdc(dataStore.getId(), host.getId()); if (StringUtils.isBlank(sdcId)) { LOGGER.warn(String.format("Unable to revoke access for %s: %s, no Sdc connected with host ip: %s", dataObject.getType(), dataObject.getId(), host.getPrivateIpAddress())); return; @@ -266,9 +252,8 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Co LOGGER.debug("Revoking access for PowerFlex volume snapshot: " + snapshot.getPath()); client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(snapshot.getPath()), sdcId); } - - // don't stop SDC if connect on demand disabled - if (Boolean.TRUE.equals(ConnectOnDemand.value()) && client.listVolumesMappedToSdc(sdcId).isEmpty()) { + if (client.listVolumesMappedToSdc(sdcId).isEmpty()) { + sdcManager = ComponentContext.inject(sdcManager); sdcManager.stopSDC(host, dataStore); } } catch (Exception e) { @@ -284,8 +269,8 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Co try { LOGGER.debug("Revoking access for PowerFlex volume: " + volumePath); - sdcManager = ComponentContext.inject(sdcManager); - final String sdcId = sdcManager.getConnectedSdc(host, dataStore); + + final String sdcId = getConnectedSdc(dataStore.getId(), host.getId()); if (StringUtils.isBlank(sdcId)) { LOGGER.warn(String.format("Unable to revoke access for volume: %s, no Sdc connected with host ip: %s", volumePath, host.getPrivateIpAddress())); return; @@ -293,8 +278,8 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Co final ScaleIOGatewayClient client = getScaleIOClient(dataStore.getId()); client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(volumePath), sdcId); - // don't stop SDC if connect on demand disabled - if (Boolean.TRUE.equals(ConnectOnDemand.value()) && client.listVolumesMappedToSdc(sdcId).isEmpty()) { + if (client.listVolumesMappedToSdc(sdcId).isEmpty()) { + sdcManager = ComponentContext.inject(sdcManager); sdcManager.stopSDC(host, dataStore); } } catch (Exception e) { @@ -307,6 +292,24 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Co revokeAccess(dataObject, host, dataStore); } + public String getConnectedSdc(long poolId, long hostId) { + try { + StoragePoolHostVO poolHostVO = storagePoolHostDao.findByPoolHost(poolId, hostId); + if (poolHostVO == null) { + return null; + } + + final ScaleIOGatewayClient client = getScaleIOClient(poolId); + if (client.isSdcConnected(poolHostVO.getLocalPath())) { + return poolHostVO.getLocalPath(); + } + } catch (Exception e) { + LOGGER.warn("Couldn't check SDC connection for the host: " + hostId + " and storage pool: " + poolId + " due to " + e.getMessage(), e); + } + + return null; + } + @Override public boolean requiresAccessForMigration(DataObject dataObject) { return true; @@ -553,7 +556,7 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Co } } } else { - LOGGER.debug(String.format("No encryption configured for data volume %s", volumeInfo)); + LOGGER.debug(String.format("No encryption configured for data volume %s", volumeInfo)); } return answer; @@ -776,7 +779,7 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Co long newSize = destData.getSize() + (1<<30); LOGGER.debug(String.format("Destination volume %s(%s) is configured for encryption. Resizing to fit headers, new size %s will be rounded up to nearest 8Gi", destInfo.getId(), destData.getSize(), newSize)); ResizeVolumePayload p = new ResizeVolumePayload(newSize, destInfo.getMinIops(), destInfo.getMaxIops(), - destInfo.getHypervisorSnapshotReserve(), false, destInfo.getAttachedVmName(), null, true); + destInfo.getHypervisorSnapshotReserve(), false, destInfo.getAttachedVmName(), null, true); destInfo.addPayload(p); resizeVolume(destInfo); } else { @@ -1520,14 +1523,4 @@ public class ScaleIOPrimaryDataStoreDriver implements PrimaryDataStoreDriver, Co public boolean zoneWideVolumesAvailableWithoutClusterMotion() { return true; } - - @Override - public String getConfigComponentName() { - return ScaleIOPrimaryDataStoreDriver.class.getSimpleName(); - } - - @Override - public ConfigKey[] getConfigKeys() { - return new ConfigKey[]{ConnectOnDemand}; - } } diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java index 69ec098db02..38f10ebdc85 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java @@ -24,10 +24,13 @@ import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient; import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClientConnectionPool; import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; +import org.apache.cloudstack.storage.datastore.driver.ScaleIOPrimaryDataStoreDriver; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -50,9 +53,17 @@ import com.cloud.utils.db.GlobalLock; import com.cloud.utils.exception.CloudRuntimeException; @Component -public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager { +public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { private static final Logger LOGGER = Logger.getLogger(ScaleIOSDCManagerImpl.class); + static ConfigKey ConnectOnDemand = new ConfigKey<>("Storage", + Boolean.class, + "powerflex.connect.on.demand", + Boolean.FALSE.toString(), + "Connect PowerFlex client on Host when first Volume created and disconnect when last Volume deleted (or always stay connected otherwise).", + Boolean.TRUE, + ConfigKey.Scope.Zone); + @Inject AgentManager agentManager; @Inject @@ -93,6 +104,10 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager { @Override public String prepareSDC(Host host, DataStore dataStore) { + if (Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { + return getConnectedSdc(host, dataStore); + } + String systemId = storagePoolDetailsDao.findDetail(dataStore.getId(), ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID).getValue(); if (systemId == null) { throw new CloudRuntimeException("Unable to prepare SDC, failed to get the system id for PowerFlex storage pool: " + dataStore.getName()); @@ -226,6 +241,9 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager { @Override public boolean stopSDC(Host host, DataStore dataStore) { + if(Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { + return true; + } String systemId = storagePoolDetailsDao.findDetail(dataStore.getId(), ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID).getValue(); if (systemId == null) { throw new CloudRuntimeException("Unable to unprepare SDC, failed to get the system id for PowerFlex storage pool: " + dataStore.getName()); @@ -345,4 +363,15 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager { private ScaleIOGatewayClient getScaleIOClient(final Long storagePoolId) throws Exception { return ScaleIOGatewayClientConnectionPool.getInstance().getClient(storagePoolId, storagePoolDetailsDao); } + + + @Override + public String getConfigComponentName() { + return ScaleIOPrimaryDataStoreDriver.class.getSimpleName(); + } + + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[]{ConnectOnDemand}; + } } diff --git a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java index 0a5743ac0fc..f9cd2cda4f1 100644 --- a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java +++ b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java @@ -20,23 +20,16 @@ package org.apache.cloudstack.storage.datastore.driver; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isA; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Optional; -import com.cloud.utils.component.ComponentContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService; -import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.storage.RemoteHostEndPoint; import org.apache.cloudstack.storage.command.CreateObjectAnswer; @@ -45,8 +38,6 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO; import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; -import org.apache.cloudstack.storage.datastore.manager.ScaleIOSDCManager; -import org.apache.cloudstack.storage.datastore.manager.ScaleIOSDCManagerImpl; import org.apache.cloudstack.storage.to.VolumeObjectTO; import org.junit.Assert; import org.junit.Before; @@ -83,17 +74,12 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.VMInstanceDao; @RunWith(PowerMockRunner.class) -@PrepareForTest({RemoteHostEndPoint.class, ComponentContext.class}) +@PrepareForTest(RemoteHostEndPoint.class) public class ScaleIOPrimaryDataStoreDriverTest { @Spy @InjectMocks ScaleIOPrimaryDataStoreDriver scaleIOPrimaryDataStoreDriver = new ScaleIOPrimaryDataStoreDriver(); - - @Spy - @InjectMocks - ScaleIOSDCManager sdcManager = new ScaleIOSDCManagerImpl(); - @Mock StoragePoolDetailsDao storagePoolDetailsDao; @Mock @@ -463,7 +449,7 @@ public class ScaleIOPrimaryDataStoreDriverTest { } @Test - public void deleteSourceVolumeFailureScenarioAfterSuccessfulBlockCopyOnDemandDisabled() throws Exception { + public void deleteSourceVolumeFailureScenarioAfterSuccessfulBlockCopy() throws Exception { // Either Volume deletion success or failure method should complete VolumeInfo srcData = Mockito.mock(VolumeInfo.class); @@ -477,61 +463,16 @@ public class ScaleIOPrimaryDataStoreDriverTest { when(srcData.getDataStore()).thenReturn(srcStore); when(srcData.getTO()).thenReturn(volumeTO); when(volumeTO.getPath()).thenReturn(srcVolumePath); - - PowerMockito.mockStatic(ComponentContext.class); - PowerMockito.when(ComponentContext.inject(eq(sdcManager))).thenReturn(sdcManager); - String sdcId = "7332760565f6340f"; - doReturn(sdcId).when(sdcManager).getConnectedSdc(host, srcStore); + doReturn(sdcId).when(scaleIOPrimaryDataStoreDriver).getConnectedSdc(1L, 1L); ScaleIOGatewayClient client = Mockito.mock(ScaleIOGatewayClient.class); - - doReturn(client).when(scaleIOPrimaryDataStoreDriver).getScaleIOClient(any()); - - doReturn(true).when(client).unmapVolumeFromSdc(anyString(), anyString()); - doReturn(false).when(client).deleteVolume(anyString()); - - scaleIOPrimaryDataStoreDriver.deleteSourceVolumeAfterSuccessfulBlockCopy(srcData, host); - } - - @Test - public void deleteSourceVolumeFailureScenarioAfterSuccessfulBlockCopyOnDemandEnabled() throws Exception { - // Either Volume deletion success or failure method should complete - - VolumeInfo srcData = Mockito.mock(VolumeInfo.class); - Host host = Mockito.mock(Host.class); - when(host.getId()).thenReturn(1L); - String srcVolumePath = "bec0ba7700000007:vol-11-6aef-10ee"; - - DataStore srcStore = Mockito.mock(DataStore.class); - when(srcStore.getId()).thenReturn(1L); - DataTO volumeTO = Mockito.mock(DataTO.class); - when(srcData.getDataStore()).thenReturn(srcStore); - when(srcData.getTO()).thenReturn(volumeTO); - when(volumeTO.getPath()).thenReturn(srcVolumePath); - - PowerMockito.mockStatic(ComponentContext.class); - PowerMockito.when(ComponentContext.inject(eq(sdcManager))).thenReturn(sdcManager); - - String sdcId = "7332760565f6340f"; - doReturn(sdcId).when(sdcManager).getConnectedSdc(host, srcStore); - - ScaleIOGatewayClient client = Mockito.mock(ScaleIOGatewayClient.class); - doReturn(client).when(scaleIOPrimaryDataStoreDriver).getScaleIOClient(any()); - + doReturn(client).when(scaleIOPrimaryDataStoreDriver) + .getScaleIOClient(any()); doReturn(true).when(client).unmapVolumeFromSdc(any(), any()); - doReturn(false).when(client).deleteVolume(anyString()); - - ConfigKey connectOnDemand = Mockito.mock(ConfigKey.class); - doReturn(Boolean.TRUE).when(connectOnDemand).value(); - - doReturn(true).when(sdcManager).stopSDC(isA(Host.class), isA(DataStore.class)); - - scaleIOPrimaryDataStoreDriver.ConnectOnDemand = connectOnDemand; + when(client.deleteVolume(any())).thenReturn(false); scaleIOPrimaryDataStoreDriver.deleteSourceVolumeAfterSuccessfulBlockCopy(srcData, host); - - verify(sdcManager, times(1)).stopSDC(isA(Host.class), isA(DataStore.class)); } @Test @@ -549,11 +490,8 @@ public class ScaleIOPrimaryDataStoreDriverTest { when(srcData.getDataStore()).thenReturn(srcStore); when(srcData.getTO()).thenReturn(volumeTO); when(volumeTO.getPath()).thenReturn(srcVolumePath); - - PowerMockito.mockStatic(ComponentContext.class); - PowerMockito.when(ComponentContext.inject(eq(sdcManager))).thenReturn(sdcManager); - - doReturn(null).when(sdcManager).getConnectedSdc(host, srcStore); + String sdcId = "7332760565f6340f"; + doReturn(null).when(scaleIOPrimaryDataStoreDriver).getConnectedSdc(1L, 1L); scaleIOPrimaryDataStoreDriver.deleteSourceVolumeAfterSuccessfulBlockCopy(srcData, host); } From 05db34bf445746e029a053f096a882e1b47f0680 Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Wed, 4 Sep 2024 20:24:52 -0700 Subject: [PATCH 08/18] Changed ConnectOnDemand order --- .../datastore/manager/ScaleIOSDCManagerImpl.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java index 38f10ebdc85..a368801a7ef 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java @@ -104,10 +104,6 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { @Override public String prepareSDC(Host host, DataStore dataStore) { - if (Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { - return getConnectedSdc(host, dataStore); - } - String systemId = storagePoolDetailsDao.findDetail(dataStore.getId(), ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID).getValue(); if (systemId == null) { throw new CloudRuntimeException("Unable to prepare SDC, failed to get the system id for PowerFlex storage pool: " + dataStore.getName()); @@ -135,6 +131,10 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { LOGGER.debug(String.format("SDC %s already connected for the pool: %d on host: %d, no need to prepare/start it", sdcId, poolId, hostId)); return sdcId; } + if (Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { + LOGGER.debug("On-demand connect/disconnect disabled, no need to prepare it"); + return getConnectedSdc(host, dataStore); + } String storageSystemIdLockString = String.format(POWERFLEX_SDC_SYSTEMID_LOCK_FORMAT, systemId); storageSystemIdLock = GlobalLock.getInternLock(storageSystemIdLockString); @@ -241,9 +241,6 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { @Override public boolean stopSDC(Host host, DataStore dataStore) { - if(Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { - return true; - } String systemId = storagePoolDetailsDao.findDetail(dataStore.getId(), ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID).getValue(); if (systemId == null) { throw new CloudRuntimeException("Unable to unprepare SDC, failed to get the system id for PowerFlex storage pool: " + dataStore.getName()); @@ -268,6 +265,10 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { LOGGER.debug("SDC not connected, no need to unprepare it"); return true; } + if (Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { + LOGGER.debug("On-demand connect/disconnect disabled, no need to unprepare it"); + return true; + } return unprepareSDCOnHost(host, dataStore); } finally { From b9946c28e7cff789134446abad022e797d96e8c8 Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Wed, 4 Sep 2024 21:21:43 -0700 Subject: [PATCH 09/18] CapacityManagementImpl.updateCapacityForHost(..) use VM update time in capacity calculation. VM update time is nullable in DB and can cause NullPointerException if record in vm_instance has defined last_host_id and undefined update_time. --- .../main/java/com/cloud/capacity/CapacityManagerImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java index 9c5f3e0fd3b..11db3792739 100644 --- a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java +++ b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java @@ -22,6 +22,7 @@ import java.net.URI; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import javax.inject.Inject; import javax.naming.ConfigurationException; @@ -711,7 +712,9 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, for (VMInstanceVO vm : vmsByLastHostId) { Float cpuOvercommitRatio = 1.0f; Float ramOvercommitRatio = 1.0f; - long secondsSinceLastUpdate = (DateUtil.currentGMTTime().getTime() - vm.getUpdateTime().getTime()) / 1000; + // use creation time if update time is null + long lastModificationTime = Optional.ofNullable(vm.getUpdateTime()).orElse(vm.getCreated()).getTime(); + long secondsSinceLastUpdate = (DateUtil.currentGMTTime().getTime() - lastModificationTime) / 1000; if (secondsSinceLastUpdate < _vmCapacityReleaseInterval) { UserVmDetailVO vmDetailCpu = _userVmDetailsDao.findDetail(vm.getId(), VmDetailConstants.CPU_OVER_COMMIT_RATIO); UserVmDetailVO vmDetailRam = _userVmDetailsDao.findDetail(vm.getId(), VmDetailConstants.MEMORY_OVER_COMMIT_RATIO); From 8cabccdbaeac54bac024e4040b07ca3a832cc643 Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Wed, 4 Sep 2024 22:44:04 -0700 Subject: [PATCH 10/18] Fixed listEvents intermittent exception: com.mysql.cj.jdbc.ClientPreparedStatement: SELECT event_view.id, event_view.uuid, event_view.type, event_view.state, event_view.description, event_view.created, event_view.user_id, event_view.user_name, event_view.level, event_view.start_id, event_view.start_uuid, event_view.parameters, event_view.account_id, event_view.account_uuid, event_view.account_name, event_view.account_type, event_view.domain_id, event_view.domain_uuid, event_view.domain_name, event_view.domain_path, event_view.resource_id, event_view.resource_type, event_view.project_id, event_view.project_uuid, event_view.project_name, event_view.archived, event_view.display FROM event_view WHERE event_view.id IN ) --- .../main/java/com/cloud/api/query/QueryManagerImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 72ae4935363..f45c1c114ee 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -739,7 +739,13 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Integer count = eventIdPage.second(); Long[] idArray = eventIdPage.first().toArray(new Long[0]); - if (count == 0) { + /** + * Need to check array empty, because {@link com.cloud.utils.db.GenericDaoBase#searchAndCount(SearchCriteria, Filter, boolean)} + * makes two calls: first to get objects and second to get count. + * List events has start date filter, there is highly possible cause where no objects loaded + * and next millisecond new event added and finally we ended up with count = 1 and no ids. + */ + if (count == 0 || idArray.length < 1) { return new Pair<>(new ArrayList<>(), count); } From 9f072f2f1c3150420e90518c03f7ba73b4817054 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Thu, 5 Sep 2024 12:42:05 +0530 Subject: [PATCH 11/18] Revert "Changed ConnectOnDemand order" This reverts commit 05db34bf445746e029a053f096a882e1b47f0680. --- .../datastore/manager/ScaleIOSDCManagerImpl.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java index a368801a7ef..38f10ebdc85 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java @@ -104,6 +104,10 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { @Override public String prepareSDC(Host host, DataStore dataStore) { + if (Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { + return getConnectedSdc(host, dataStore); + } + String systemId = storagePoolDetailsDao.findDetail(dataStore.getId(), ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID).getValue(); if (systemId == null) { throw new CloudRuntimeException("Unable to prepare SDC, failed to get the system id for PowerFlex storage pool: " + dataStore.getName()); @@ -131,10 +135,6 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { LOGGER.debug(String.format("SDC %s already connected for the pool: %d on host: %d, no need to prepare/start it", sdcId, poolId, hostId)); return sdcId; } - if (Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { - LOGGER.debug("On-demand connect/disconnect disabled, no need to prepare it"); - return getConnectedSdc(host, dataStore); - } String storageSystemIdLockString = String.format(POWERFLEX_SDC_SYSTEMID_LOCK_FORMAT, systemId); storageSystemIdLock = GlobalLock.getInternLock(storageSystemIdLockString); @@ -241,6 +241,9 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { @Override public boolean stopSDC(Host host, DataStore dataStore) { + if(Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { + return true; + } String systemId = storagePoolDetailsDao.findDetail(dataStore.getId(), ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID).getValue(); if (systemId == null) { throw new CloudRuntimeException("Unable to unprepare SDC, failed to get the system id for PowerFlex storage pool: " + dataStore.getName()); @@ -265,10 +268,6 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { LOGGER.debug("SDC not connected, no need to unprepare it"); return true; } - if (Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { - LOGGER.debug("On-demand connect/disconnect disabled, no need to unprepare it"); - return true; - } return unprepareSDCOnHost(host, dataStore); } finally { From a15fe4f1f4391ce293c9fbbdf32192551890486b Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Thu, 5 Sep 2024 12:49:47 +0530 Subject: [PATCH 12/18] Added logs for on-demand connect/disconnect config --- .../storage/datastore/manager/ScaleIOSDCManagerImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java index 38f10ebdc85..0ca8b138f45 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java @@ -105,6 +105,7 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { @Override public String prepareSDC(Host host, DataStore dataStore) { if (Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { + LOGGER.debug(String.format("On-demand connect/disconnect config %s disabled in the zone %d, no need to prepare SDC (check for connected SDC)", ConnectOnDemand.key(), host.getDataCenterId())); return getConnectedSdc(host, dataStore); } @@ -241,9 +242,11 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { @Override public boolean stopSDC(Host host, DataStore dataStore) { - if(Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { + if (Boolean.FALSE.equals(ConnectOnDemand.valueIn(host.getDataCenterId()))) { + LOGGER.debug(String.format("On-demand connect/disconnect config %s disabled in the zone %d, no need to unprepare SDC", ConnectOnDemand.key(), host.getDataCenterId())); return true; } + String systemId = storagePoolDetailsDao.findDetail(dataStore.getId(), ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID).getValue(); if (systemId == null) { throw new CloudRuntimeException("Unable to unprepare SDC, failed to get the system id for PowerFlex storage pool: " + dataStore.getName()); From cf8dd76d4c2dd36627d1415bb955e606c5433c00 Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Fri, 6 Sep 2024 01:25:04 -0700 Subject: [PATCH 13/18] renamed created_exists to created_column_not_exists in sql migration script --- .../main/resources/META-INF/db/schema-41811to41812.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql b/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql index 4542f1b9084..62aafa640b6 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41811to41812.sql @@ -23,17 +23,17 @@ -- adding one more time here in case if migration from 4.18.0 didn't go through CREATE PROCEDURE `cloud`.`ADD_RESOURCE_RESERVATION_MGMT_SERVER_ID_CREATED`() BEGIN - DECLARE created_exists TINYINT DEFAULT FALSE + DECLARE created_column_not_exists TINYINT DEFAULT FALSE ; IF NOT EXISTS (SELECT * FROM `information_schema`.`columns` WHERE `table_schema` = 'cloud' AND `table_name` = 'resource_reservation' AND `column_name` = 'mgmt_server_id') THEN CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'mgmt_server_id', 'bigint unsigned NULL COMMENT "management server id" ') ; END IF ; IF NOT EXISTS (SELECT * FROM `information_schema`.`columns` WHERE `table_schema` = 'cloud' AND `table_name` = 'resource_reservation' AND `column_name` = 'created') THEN - SET created_exists = TRUE + SET created_column_not_exists = TRUE ; END IF -; IF created_exists THEN +; IF created_column_not_exists THEN CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'created', 'datetime DEFAULT NULL COMMENT "date when the reservation was created" ') ; END IF -; IF created_exists THEN +; IF created_column_not_exists THEN UPDATE `cloud`.`resource_reservation` SET `created` = now() WHERE `created` IS NULL ; END IF ; END; From 97b07dbaae97afb6c2d52c1a55d06c288746354f Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Mon, 9 Sep 2024 15:54:44 -0700 Subject: [PATCH 14/18] Fixed code review comments --- .../src/main/java/com/cloud/api/query/QueryManagerImpl.java | 2 +- .../src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index f45c1c114ee..c0e5bd9621f 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -746,7 +746,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q * and next millisecond new event added and finally we ended up with count = 1 and no ids. */ if (count == 0 || idArray.length < 1) { - return new Pair<>(new ArrayList<>(), count); + count = 0; } List events = _eventJoinDao.searchByIds(idArray); diff --git a/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java b/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java index c73f57529b8..d83a52b380c 100644 --- a/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/event/dao/EventJoinDaoImpl.java @@ -130,6 +130,10 @@ public class EventJoinDaoImpl extends GenericDaoBase implemen @Override public List searchByIds(Long... ids) { + // return empty collection if there are no ids. + if (ids.length == 0) { + return List.of(); + } SearchCriteria sc = vrSearch.create(); sc.setParameters("idIN", ids); return searchIncludingRemoved(sc, null, null, false); From fc79a87050852da7202ad9e5f7825f953cab73bb Mon Sep 17 00:00:00 2001 From: mprokopchuk Date: Mon, 9 Sep 2024 15:56:15 -0700 Subject: [PATCH 15/18] Fixed code review comments --- server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java index 11db3792739..910d7a5f14e 100644 --- a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java +++ b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java @@ -712,7 +712,6 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, for (VMInstanceVO vm : vmsByLastHostId) { Float cpuOvercommitRatio = 1.0f; Float ramOvercommitRatio = 1.0f; - // use creation time if update time is null long lastModificationTime = Optional.ofNullable(vm.getUpdateTime()).orElse(vm.getCreated()).getTime(); long secondsSinceLastUpdate = (DateUtil.currentGMTTime().getTime() - lastModificationTime) / 1000; if (secondsSinceLastUpdate < _vmCapacityReleaseInterval) { From 51fea012ef4363100d868e11a7328b639f71660e Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Thu, 12 Sep 2024 16:45:19 +0530 Subject: [PATCH 16/18] NPE fix, for test_hostha_kvm_host_fencing (#479) --- .../src/main/java/com/cloud/capacity/CapacityManagerImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java index 910d7a5f14e..044e28a2fb3 100644 --- a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java +++ b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java @@ -720,6 +720,8 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, if (vmDetailCpu != null) { //if vmDetail_cpu is not null it means it is running in a overcommited cluster. cpuOvercommitRatio = Float.parseFloat(vmDetailCpu.getValue()); + } + if (vmDetailRam != null) { ramOvercommitRatio = Float.parseFloat(vmDetailRam.getValue()); } ServiceOffering so = offeringsMap.get(vm.getServiceOfferingId()); From 9f3380c4be21a115bea437c3762f770804274917 Mon Sep 17 00:00:00 2001 From: Cheng Cheng Date: Wed, 18 Sep 2024 04:16:06 -0700 Subject: [PATCH 17/18] Add Functionality Enum to HypervisorType (#481) * Commit for PR https://github.com/shapeblue/cloudstack-apple/pull/471 This PR adds a flag (customType) to HypervisorType to differentiate if a hypervisor plugin is built-in or customized. With the customType flag, we can isolate conditional checks for allow the customized hypervisor plugin to proceed. * Add customType field to HypervisorType to differentiate if the plugin is a customized type * Address @shwstppr's comments * Define a enum in HypervisorType to indicate specific functionalities of a hypervisor plugin type * Refactoring to define if the hypervisor supports the operation during initialization of the HypervisorType. * Remove ROOT_DISK_SIZE_OVERRIDE_SUPPORTING_HYPERVISORS --------- Co-authored-by: Annie Li --- .../java/com/cloud/hypervisor/Hypervisor.java | 39 ++++++++++++++++--- .../user/template/RegisterTemplateCmd.java | 4 +- .../java/com/cloud/vm/UserVmManagerImpl.java | 10 +---- .../com/cloud/vm/UserVmManagerImplTest.java | 2 +- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/api/src/main/java/com/cloud/hypervisor/Hypervisor.java b/api/src/main/java/com/cloud/hypervisor/Hypervisor.java index e1108b34a83..e12d469d2e0 100644 --- a/api/src/main/java/com/cloud/hypervisor/Hypervisor.java +++ b/api/src/main/java/com/cloud/hypervisor/Hypervisor.java @@ -23,34 +23,52 @@ import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.Set; +import java.util.EnumSet; public class Hypervisor { public static class HypervisorType { + public static enum Functionality { + DirectDownloadTemplate, + RootDiskSizeOverride; + } + private static final Map hypervisorTypeMap = new LinkedHashMap<>(); public static final HypervisorType None = new HypervisorType("None"); //for storage hosts - public static final HypervisorType XenServer = new HypervisorType("XenServer", ImageFormat.VHD); - public static final HypervisorType KVM = new HypervisorType("KVM", ImageFormat.QCOW2); - public static final HypervisorType VMware = new HypervisorType("VMware", ImageFormat.OVA); + public static final HypervisorType XenServer = new HypervisorType("XenServer", ImageFormat.VHD, + EnumSet.of(Functionality.RootDiskSizeOverride)); + public static final HypervisorType KVM = new HypervisorType("KVM", ImageFormat.QCOW2, + EnumSet.of(Functionality.DirectDownloadTemplate, Functionality.RootDiskSizeOverride)); + public static final HypervisorType VMware = new HypervisorType("VMware", ImageFormat.OVA, + EnumSet.of(Functionality.RootDiskSizeOverride)); public static final HypervisorType Hyperv = new HypervisorType("Hyperv"); public static final HypervisorType VirtualBox = new HypervisorType("VirtualBox"); public static final HypervisorType Parralels = new HypervisorType("Parralels"); public static final HypervisorType BareMetal = new HypervisorType("BareMetal"); - public static final HypervisorType Simulator = new HypervisorType("Simulator"); + public static final HypervisorType Simulator = new HypervisorType("Simulator", null, + EnumSet.of(Functionality.RootDiskSizeOverride)); public static final HypervisorType Ovm = new HypervisorType("Ovm", ImageFormat.RAW); public static final HypervisorType Ovm3 = new HypervisorType("Ovm3", ImageFormat.RAW); public static final HypervisorType LXC = new HypervisorType("LXC"); - public static final HypervisorType Custom = new HypervisorType("Custom"); + public static final HypervisorType Custom = new HypervisorType("Custom", null, + EnumSet.of(Functionality.RootDiskSizeOverride)); public static final HypervisorType Any = new HypervisorType("Any"); /*If you don't care about the hypervisor type*/ private final String name; private final ImageFormat imageFormat; + private final Set supportedFunctionalities; public HypervisorType(String name) { - this(name, null); + this(name, null, EnumSet.noneOf(Functionality.class)); } public HypervisorType(String name, ImageFormat imageFormat) { + this(name, imageFormat, EnumSet.noneOf(Functionality.class)); + } + + public HypervisorType(String name, ImageFormat imageFormat, Set supportedFunctionalities) { this.name = name; this.imageFormat = imageFormat; + this.supportedFunctionalities = supportedFunctionalities; if (name.equals("Parralels")){ // typo in the original code hypervisorTypeMap.put("parallels", this); } else { @@ -102,6 +120,15 @@ public class Hypervisor { return name; } + /** + * Make this method to be part of the properties of the hypervisor type itself. + * + * @return true if the hypervisor plugin support the specified functionality + */ + public boolean isFunctionalitySupported(Functionality functionality) { + return supportedFunctionalities.contains(functionality); + } + @Override public int hashCode() { return Objects.hash(name); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java index 5dfcd41c2e0..e1b77603250 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java @@ -344,7 +344,9 @@ public class RegisterTemplateCmd extends BaseCmd implements UserCmd { "Parameter zoneids cannot combine all zones (-1) option with other zones"); String customHypervisor = HypervisorGuru.HypervisorCustomDisplayName.value(); - if (isDirectDownload() && !(getHypervisor().equalsIgnoreCase(Hypervisor.HypervisorType.KVM.toString()) + if (isDirectDownload() && + !(Hypervisor.HypervisorType.getType(getHypervisor()) + .isFunctionalitySupported(Hypervisor.HypervisorType.Functionality.DirectDownloadTemplate) || getHypervisor().equalsIgnoreCase(customHypervisor))) { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, String.format("Parameter directdownload " + "is only allowed for KVM or %s templates", customHypervisor)); diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index f1712601497..2c822a8b519 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -659,14 +659,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir HypervisorType.Simulator )); - protected static final List ROOT_DISK_SIZE_OVERRIDE_SUPPORTING_HYPERVISORS = Arrays.asList( - HypervisorType.KVM, - HypervisorType.XenServer, - HypervisorType.VMware, - HypervisorType.Simulator, - HypervisorType.Custom - ); - private static final List HYPERVISORS_THAT_CAN_DO_STORAGE_MIGRATION_ON_NON_USER_VMS = Arrays.asList(HypervisorType.KVM, HypervisorType.VMware); @Override @@ -4396,7 +4388,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir * @throws InvalidParameterValueException if the hypervisor does not support rootdisksize override */ protected void verifyIfHypervisorSupportsRootdiskSizeOverride(HypervisorType hypervisorType) { - if (!ROOT_DISK_SIZE_OVERRIDE_SUPPORTING_HYPERVISORS.contains(hypervisorType)) { + if (!hypervisorType.isFunctionalitySupported(HypervisorType.Functionality.RootDiskSizeOverride)) { throw new InvalidParameterValueException("Hypervisor " + hypervisorType + " does not support rootdisksize override"); } } diff --git a/server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java b/server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java index d3c2ff585e5..11162522b49 100644 --- a/server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java +++ b/server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java @@ -654,7 +654,7 @@ public class UserVmManagerImplTest { int expectedExceptionCounter = hypervisorTypeArray.length - 5; for(int i = 0; i < hypervisorTypeArray.length; i++) { - if (UserVmManagerImpl.ROOT_DISK_SIZE_OVERRIDE_SUPPORTING_HYPERVISORS.contains(hypervisorTypeArray[i])) { + if (hypervisorTypeArray[i].isFunctionalitySupported(Hypervisor.HypervisorType.Functionality.RootDiskSizeOverride)) { userVmManagerImpl.verifyIfHypervisorSupportsRootdiskSizeOverride(hypervisorTypeArray[i]); } else { try { From a05a3f94b4af78bf23ebac85edde8ebe58cc0bb8 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Fri, 20 Sep 2024 10:08:18 +0530 Subject: [PATCH 18/18] Updated powerflex connect on demand config description (#486) --- .../storage/datastore/manager/ScaleIOSDCManagerImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java index 0ca8b138f45..9a524c51e5a 100644 --- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java +++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java @@ -60,7 +60,8 @@ public class ScaleIOSDCManagerImpl implements ScaleIOSDCManager, Configurable { Boolean.class, "powerflex.connect.on.demand", Boolean.FALSE.toString(), - "Connect PowerFlex client on Host when first Volume created and disconnect when last Volume deleted (or always stay connected otherwise).", + "Connect PowerFlex client on Host when first Volume is mapped to SDC and disconnect when last Volume is unmapped from SDC," + + " otherwise no action (that is connection remains in the same state whichever it is, connected or disconnected).", Boolean.TRUE, ConfigKey.Scope.Zone);