Skip to content

Commit 57128dc

Browse files
authored
Merge branch '4.19' into Host-status-auto-refresh
2 parents 06ddb1a + c9c02d0 commit 57128dc

File tree

14 files changed

+186
-173
lines changed

14 files changed

+186
-173
lines changed

api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.apache.cloudstack.api.response.SecurityGroupResponse;
4242
import org.apache.cloudstack.api.response.ServiceOfferingResponse;
4343
import org.apache.cloudstack.api.response.TemplateResponse;
44+
import org.apache.cloudstack.api.response.UserDataResponse;
4445
import org.apache.cloudstack.api.response.UserResponse;
4546
import org.apache.cloudstack.api.response.UserVmResponse;
4647
import org.apache.cloudstack.api.response.VpcResponse;
@@ -151,6 +152,9 @@ public class ListVMsCmd extends BaseListRetrieveOnlyResourceCountCmd implements
151152
@Parameter(name = ApiConstants.USER_DATA, type = CommandType.BOOLEAN, description = "Whether to return the VMs' user data or not. By default, user data will not be returned.", since = "4.18.0.0")
152153
private Boolean showUserData;
153154

155+
@Parameter(name = ApiConstants.USER_DATA_ID, type = CommandType.UUID, entityType = UserDataResponse.class, required = false, description = "the instances by userdata", since = "4.20.1")
156+
private Long userdataId;
157+
154158
/////////////////////////////////////////////////////
155159
/////////////////// Accessors ///////////////////////
156160
/////////////////////////////////////////////////////
@@ -245,6 +249,10 @@ protected boolean isViewDetailsEmpty() {
245249
return CollectionUtils.isEmpty(viewDetails);
246250
}
247251

252+
public Long getUserdataId() {
253+
return userdataId;
254+
}
255+
248256
public EnumSet<VMDetails> getDetails() throws InvalidParameterValueException {
249257
if (isViewDetailsEmpty()) {
250258
if (_queryService.ReturnVmStatsOnVmList.value()) {

api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,11 @@
2727
import org.apache.cloudstack.api.EntityReference;
2828

2929
import com.cloud.network.Network;
30-
import com.cloud.projects.ProjectAccount;
3130
import com.cloud.serializer.Param;
3231
import com.google.gson.annotations.SerializedName;
3332

3433
@SuppressWarnings("unused")
35-
@EntityReference(value = {Network.class, ProjectAccount.class})
34+
@EntityReference(value = {Network.class})
3635
public class NetworkResponse extends BaseResponseWithAssociatedNetwork implements ControlledEntityResponse, SetResourceIconResponse {
3736

3837
@SerializedName(ApiConstants.ID)

engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/BasePrimaryDataStoreLifeCycleImpl.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,13 @@
2222

2323
import javax.inject.Inject;
2424

25+
import com.cloud.storage.VMTemplateStoragePoolVO;
26+
import com.cloud.storage.VMTemplateStorageResourceAssoc;
27+
import com.cloud.template.TemplateManager;
2528
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
2629
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
30+
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
31+
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
2732
import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
2833
import org.apache.log4j.Logger;
2934

@@ -54,6 +59,10 @@ public class BasePrimaryDataStoreLifeCycleImpl {
5459
protected HostDao hostDao;
5560
@Inject
5661
protected StoragePoolHostDao storagePoolHostDao;
62+
@Inject
63+
private PrimaryDataStoreDao primaryDataStoreDao;
64+
@Inject
65+
private TemplateManager templateMgr;
5766

5867
private List<HostVO> getPoolHostsList(ClusterScope clusterScope, HypervisorType hypervisorType) {
5968
List<HostVO> hosts;
@@ -103,4 +112,42 @@ public void changeStoragePoolScopeToCluster(DataStore store, ClusterScope cluste
103112
}
104113
dataStoreHelper.switchToCluster(store, clusterScope);
105114
}
115+
116+
private void evictTemplates(StoragePoolVO storagePoolVO) {
117+
List<VMTemplateStoragePoolVO> unusedTemplatesInPool = templateMgr.getUnusedTemplatesInPool(storagePoolVO);
118+
for (VMTemplateStoragePoolVO templatePoolVO : unusedTemplatesInPool) {
119+
if (templatePoolVO.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
120+
templateMgr.evictTemplateFromStoragePool(templatePoolVO);
121+
}
122+
}
123+
}
124+
125+
private void deleteAgentStoragePools(StoragePool storagePool) {
126+
List<StoragePoolHostVO> poolHostVOs = storagePoolHostDao.listByPoolId(storagePool.getId());
127+
for (StoragePoolHostVO poolHostVO : poolHostVOs) {
128+
DeleteStoragePoolCommand deleteStoragePoolCommand = new DeleteStoragePoolCommand(storagePool);
129+
final Answer answer = agentMgr.easySend(poolHostVO.getHostId(), deleteStoragePoolCommand);
130+
if (answer != null && answer.getResult()) {
131+
s_logger.info("Successfully deleted storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId());
132+
} else {
133+
if (answer != null) {
134+
s_logger.error("Failed to delete storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId() + " , result: " + answer.getResult());
135+
} else {
136+
s_logger.error("Failed to delete storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId());
137+
}
138+
}
139+
}
140+
}
141+
142+
protected boolean cleanupDatastore(DataStore store) {
143+
StoragePool storagePool = (StoragePool)store;
144+
StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(storagePool.getId());
145+
if (storagePoolVO == null) {
146+
return false;
147+
}
148+
149+
evictTemplates(storagePoolVO);
150+
deleteAgentStoragePools(storagePool);
151+
return true;
152+
}
106153
}

plugins/backup/veeam/src/main/java/org/apache/cloudstack/backup/VeeamBackupProvider.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,9 @@ public boolean assignVMToBackupOffering(final VirtualMachine vm, final BackupOff
199199
public boolean removeVMFromBackupOffering(final VirtualMachine vm) {
200200
final VeeamClient client = getClient(vm.getDataCenterId());
201201
final VmwareDatacenter vmwareDC = findVmwareDatacenterForVM(vm);
202+
if (vm.getBackupExternalId() == null) {
203+
throw new CloudRuntimeException("The VM does not have a backup job assigned.");
204+
}
202205
try {
203206
if (!client.removeVMFromVeeamJob(vm.getBackupExternalId(), vm.getInstanceName(), vmwareDC.getVcenterHost())) {
204207
LOG.warn("Failed to remove VM from Veeam Job id: " + vm.getBackupExternalId());

plugins/storage/volume/linstor/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ All notable changes to Linstor CloudStack plugin will be documented in this file
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
9+
## [2025-03-13]
10+
11+
### Fixed
12+
13+
- Implemented missing delete datastore, to correctly cleanup on datastore removal
14+
15+
816
## [2025-02-21]
917

1018
### Fixed

plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/LinstorPrimaryDataStoreLifeCycleImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,10 @@ public boolean cancelMaintain(DataStore store) {
289289

290290
@Override
291291
public boolean deleteDataStore(DataStore store) {
292-
return dataStoreHelper.deletePrimaryDataStore(store);
292+
if (cleanupDatastore(store)) {
293+
return dataStoreHelper.deletePrimaryDataStore(store);
294+
}
295+
return false;
293296
}
294297

295298
/* (non-Javadoc)

plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@
5050
import org.apache.log4j.Logger;
5151

5252
import com.cloud.agent.AgentManager;
53-
import com.cloud.agent.api.Answer;
54-
import com.cloud.agent.api.DeleteStoragePoolCommand;
5553
import com.cloud.agent.api.StoragePoolInfo;
5654
import com.cloud.capacity.CapacityManager;
5755
import com.cloud.dc.ClusterVO;
@@ -65,9 +63,6 @@
6563
import com.cloud.storage.StorageManager;
6664
import com.cloud.storage.StoragePool;
6765
import com.cloud.storage.StoragePoolAutomation;
68-
import com.cloud.storage.StoragePoolHostVO;
69-
import com.cloud.storage.VMTemplateStoragePoolVO;
70-
import com.cloud.storage.VMTemplateStorageResourceAssoc;
7166
import com.cloud.storage.dao.StoragePoolHostDao;
7267
import com.cloud.template.TemplateManager;
7368
import com.cloud.utils.UriUtils;
@@ -345,37 +340,11 @@ public void disableStoragePool(DataStore dataStore) {
345340

346341
@Override
347342
public boolean deleteDataStore(DataStore dataStore) {
348-
StoragePool storagePool = (StoragePool)dataStore;
349-
StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(storagePool.getId());
350-
if (storagePoolVO == null) {
351-
return false;
352-
}
353-
354-
List<VMTemplateStoragePoolVO> unusedTemplatesInPool = templateMgr.getUnusedTemplatesInPool(storagePoolVO);
355-
for (VMTemplateStoragePoolVO templatePoolVO : unusedTemplatesInPool) {
356-
if (templatePoolVO.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
357-
templateMgr.evictTemplateFromStoragePool(templatePoolVO);
358-
}
343+
if (cleanupDatastore(dataStore)) {
344+
ScaleIOGatewayClientConnectionPool.getInstance().removeClient(dataStore.getId());
345+
return dataStoreHelper.deletePrimaryDataStore(dataStore);
359346
}
360-
361-
List<StoragePoolHostVO> poolHostVOs = storagePoolHostDao.listByPoolId(dataStore.getId());
362-
for (StoragePoolHostVO poolHostVO : poolHostVOs) {
363-
DeleteStoragePoolCommand deleteStoragePoolCommand = new DeleteStoragePoolCommand(storagePool);
364-
final Answer answer = agentMgr.easySend(poolHostVO.getHostId(), deleteStoragePoolCommand);
365-
if (answer != null && answer.getResult()) {
366-
LOGGER.info("Successfully deleted storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId());
367-
} else {
368-
if (answer != null) {
369-
LOGGER.error("Failed to delete storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId() + " , result: " + answer.getResult());
370-
} else {
371-
LOGGER.error("Failed to delete storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId());
372-
}
373-
}
374-
}
375-
376-
ScaleIOGatewayClientConnectionPool.getInstance().removeClient(dataStore.getId());
377-
378-
return dataStoreHelper.deletePrimaryDataStore(dataStore);
347+
return false;
379348
}
380349

381350
@Override

server/src/main/java/com/cloud/api/query/QueryManagerImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,6 +1267,7 @@ private Pair<List<Long>, Integer> searchForUserVMIdsAndCount(ListVMsCmd cmd) {
12671267
Long storageId = null;
12681268
StoragePoolVO pool = null;
12691269
Long userId = cmd.getUserId();
1270+
Long userdataId = cmd.getUserdataId();
12701271
Map<String, String> tags = cmd.getTags();
12711272

12721273
boolean isAdmin = false;
@@ -1339,6 +1340,10 @@ private Pair<List<Long>, Integer> searchForUserVMIdsAndCount(ListVMsCmd cmd) {
13391340
userVmSearchBuilder.and("templateId", userVmSearchBuilder.entity().getTemplateId(), Op.EQ);
13401341
}
13411342

1343+
if (userdataId != null) {
1344+
userVmSearchBuilder.and("userdataId", userVmSearchBuilder.entity().getUserDataId(), Op.EQ);
1345+
}
1346+
13421347
if (hypervisor != null) {
13431348
userVmSearchBuilder.and("hypervisorType", userVmSearchBuilder.entity().getHypervisorType(), Op.EQ);
13441349
}
@@ -1531,6 +1536,10 @@ private Pair<List<Long>, Integer> searchForUserVMIdsAndCount(ListVMsCmd cmd) {
15311536
userVmSearchCriteria.setParameters("templateId", templateId);
15321537
}
15331538

1539+
if (userdataId != null) {
1540+
userVmSearchCriteria.setParameters("userdataId", userdataId);
1541+
}
1542+
15341543
if (display != null) {
15351544
userVmSearchCriteria.setParameters("display", display);
15361545
}

server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,9 @@ public DomainRouterVO startVirtualRouter(final DomainRouterVO router, final User
445445
final int retryIndex = 5;
446446
final ExcludeList[] avoids = new ExcludeList[5];
447447
avoids[0] = new ExcludeList();
448-
avoids[0].addPod(routerToBeAvoid.getPodIdToDeployIn());
448+
if (routerToBeAvoid.getPodIdToDeployIn() != null) {
449+
avoids[0].addPod(routerToBeAvoid.getPodIdToDeployIn());
450+
}
449451
avoids[1] = new ExcludeList();
450452
avoids[1].addCluster(_hostDao.findById(routerToBeAvoid.getHostId()).getClusterId());
451453
avoids[2] = new ExcludeList();

0 commit comments

Comments
 (0)