Skip to content

Commit f94975a

Browse files
Fixes to handle 404 exceptions when export policy and ontap volume are missing during storagepool delete workflow
1 parent 9369023 commit f94975a

2 files changed

Lines changed: 37 additions & 25 deletions

File tree

plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/service/StorageStrategy.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@
1919

2020
package org.apache.cloudstack.storage.service;
2121

22-
import com.cloud.utils.exception.CloudRuntimeException;
23-
import feign.FeignException;
22+
import java.util.ArrayList;
23+
import java.util.HashMap;
24+
import java.util.List;
25+
import java.util.Map;
26+
import java.util.Objects;
27+
2428
import org.apache.cloudstack.storage.feign.FeignClientFactory;
2529
import org.apache.cloudstack.storage.feign.client.AggregateFeignClient;
2630
import org.apache.cloudstack.storage.feign.client.JobFeignClient;
27-
import org.apache.cloudstack.storage.feign.client.NetworkFeignClient;
2831
import org.apache.cloudstack.storage.feign.client.NASFeignClient;
32+
import org.apache.cloudstack.storage.feign.client.NetworkFeignClient;
2933
import org.apache.cloudstack.storage.feign.client.SANFeignClient;
3034
import org.apache.cloudstack.storage.feign.client.SnapshotFeignClient;
3135
import org.apache.cloudstack.storage.feign.client.SvmFeignClient;
@@ -48,11 +52,9 @@
4852
import org.apache.logging.log4j.LogManager;
4953
import org.apache.logging.log4j.Logger;
5054

51-
import java.util.HashMap;
52-
import java.util.ArrayList;
53-
import java.util.List;
54-
import java.util.Map;
55-
import java.util.Objects;
55+
import com.cloud.utils.exception.CloudRuntimeException;
56+
57+
import feign.FeignException;
5658

5759
/**
5860
* Storage Strategy represents the communication path for all the ONTAP storage options
@@ -360,7 +362,11 @@ public void deleteStorageVolume(Volume volume) {
360362
throw new CloudRuntimeException("Volume deletion job failed for volume: " + volume.getName());
361363
}
362364
logger.info("Volume deleted successfully: " + volume.getName());
363-
} catch (FeignException.FeignClientException e) {
365+
} catch (FeignException e) {
366+
if (e.status() == 404) {
367+
logger.warn("deleteStorageVolume: Volume '{}' not found in ONTAP (may not have been created), treating as no-op", volume.getName());
368+
return;
369+
}
364370
logger.error("Exception while deleting volume: ", e);
365371
throw new CloudRuntimeException("Failed to delete volume: " + e.getMessage());
366372
}

plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/service/UnifiedNASStrategy.java

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@
1919

2020
package org.apache.cloudstack.storage.service;
2121

22-
import com.cloud.agent.api.Answer;
23-
import com.cloud.host.HostVO;
24-
import com.cloud.storage.Storage;
25-
import com.cloud.storage.VolumeVO;
26-
import com.cloud.storage.dao.VolumeDao;
27-
import com.cloud.utils.exception.CloudRuntimeException;
28-
import feign.FeignException;
22+
import java.util.ArrayList;
23+
import java.util.List;
24+
import java.util.Map;
25+
26+
import javax.inject.Inject;
27+
2928
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
3029
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
3130
import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
3231
import org.apache.cloudstack.storage.command.CreateObjectCommand;
3332
import org.apache.cloudstack.storage.command.DeleteCommand;
3433
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
34+
import org.apache.cloudstack.storage.feign.model.CliSnapshotRestoreRequest;
3535
import org.apache.cloudstack.storage.feign.model.ExportPolicy;
3636
import org.apache.cloudstack.storage.feign.model.ExportRule;
3737
import org.apache.cloudstack.storage.feign.model.FileInfo;
@@ -42,19 +42,22 @@
4242
import org.apache.cloudstack.storage.feign.model.Volume;
4343
import org.apache.cloudstack.storage.feign.model.response.JobResponse;
4444
import org.apache.cloudstack.storage.feign.model.response.OntapResponse;
45-
import org.apache.cloudstack.storage.feign.model.CliSnapshotRestoreRequest;
4645
import org.apache.cloudstack.storage.service.model.AccessGroup;
4746
import org.apache.cloudstack.storage.service.model.CloudStackVolume;
48-
import org.apache.cloudstack.storage.volume.VolumeObject;
4947
import org.apache.cloudstack.storage.utils.OntapStorageConstants;
5048
import org.apache.cloudstack.storage.utils.OntapStorageUtils;
49+
import org.apache.cloudstack.storage.volume.VolumeObject;
5150
import org.apache.logging.log4j.LogManager;
5251
import org.apache.logging.log4j.Logger;
5352

54-
import javax.inject.Inject;
55-
import java.util.ArrayList;
56-
import java.util.List;
57-
import java.util.Map;
53+
import com.cloud.agent.api.Answer;
54+
import com.cloud.host.HostVO;
55+
import com.cloud.storage.Storage;
56+
import com.cloud.storage.VolumeVO;
57+
import com.cloud.storage.dao.VolumeDao;
58+
import com.cloud.utils.exception.CloudRuntimeException;
59+
60+
import feign.FeignException;
5861

5962
public class UnifiedNASStrategy extends NASStrategy {
6063
private static final Logger logger = LogManager.getLogger(UnifiedNASStrategy.class);
@@ -176,12 +179,15 @@ public void deleteAccessGroup(AccessGroup accessGroup) {
176179
String exportPolicyId = details.get(OntapStorageConstants.EXPORT_POLICY_ID);
177180

178181
try {
179-
nasFeignClient.deleteExportPolicyById(authHeader,exportPolicyId);
182+
nasFeignClient.deleteExportPolicyById(authHeader, exportPolicyId);
180183
logger.info("deleteAccessGroup: Successfully deleted export policy '{}'", exportPolicyName);
181-
} catch (Exception e) {
184+
} catch (FeignException e) {
185+
if (e.status() == 404) {
186+
logger.warn("deleteAccessGroup: Export policy '{}' not found in ONTAP, treating as no-op", exportPolicyName);
187+
return;
188+
}
182189
logger.error("deleteAccessGroup: Failed to delete export policy. Exception: {}", e.getMessage(), e);
183190
throw new CloudRuntimeException("Failed to delete export policy: " + e.getMessage(), e);
184-
185191
}
186192
} catch (Exception e) {
187193
logger.error("deleteAccessGroup: Failed to delete export policy. Exception: {}", e.getMessage(), e);

0 commit comments

Comments
 (0)