Skip to content

Commit d2633cc

Browse files
Handled the 403 forbidden error in GetAggregateByUUID and getNetworkInterfaces apis
1 parent 14b217d commit d2633cc

2 files changed

Lines changed: 63 additions & 4 deletions

File tree

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,9 @@ public boolean connect(boolean validateAggregatesForVolumeCreation) {
309309
String msg = "Authentication failed: Invalid credentials. Please verify the username and password.";
310310
logger.error(msg, e);
311311
throw new CloudRuntimeException(msg, e);
312+
} catch (FeignException.Forbidden e) {
313+
logger.error(e.getMessage());
314+
throw new CloudRuntimeException(e.getMessage());
312315
} catch (Exception e) {
313316
logger.error("Failed to connect to ONTAP cluster: " + e.getMessage(), e);
314317
throw new CloudRuntimeException("Failed to connect to ONTAP cluster: " + e.getMessage(), e);
@@ -382,10 +385,16 @@ public Aggregate chooseAggregate(Long size) {
382385
Aggregate aggrChosen = null;
383386
for (Aggregate aggr : aggregates) {
384387
logger.debug("Found aggregate: " + aggr.getName() + " with UUID: " + aggr.getUuid());
385-
Aggregate aggrResp = aggregateFeignClient.getAggregateByUUID(authHeader, aggr.getUuid(),
386-
Map.of(OntapStorageConstants.FIELDS, OntapStorageConstants.AGGREGATE_NODE
387-
+ OntapStorageConstants.COMMA + OntapStorageConstants.AGGREGATE_SPACE
388-
+ OntapStorageConstants.COMMA + OntapStorageConstants.STATE));
388+
Aggregate aggrResp;
389+
try {
390+
aggrResp = aggregateFeignClient.getAggregateByUUID(authHeader, aggr.getUuid(),
391+
Map.of(OntapStorageConstants.FIELDS, OntapStorageConstants.AGGREGATE_NODE
392+
+ OntapStorageConstants.COMMA + OntapStorageConstants.AGGREGATE_SPACE
393+
+ OntapStorageConstants.COMMA + OntapStorageConstants.STATE));
394+
} catch (FeignException.Forbidden e) {
395+
logger.error(e.getMessage());
396+
throw new CloudRuntimeException(e.getMessage());
397+
}
389398

390399
if (aggrResp == null) {
391400
logger.warn("Aggregate details response is null for aggregate " + aggr.getName() + ". Skipping.");
@@ -766,6 +775,9 @@ public Map<String, String> getNetworkInterface(Aggregate aggregate) {
766775
return networkInterfaceResult(ip, warning);
767776
} catch (CloudRuntimeException e) {
768777
throw e;
778+
} catch (FeignException.Forbidden e) {
779+
logger.error(e.getMessage());
780+
throw new CloudRuntimeException(e.getMessage());
769781
} catch (Exception e) {
770782
logger.error("Exception while retrieving network interfaces: ", e);
771783
throw new CloudRuntimeException("Failed to retrieve network interfaces: " + e.getMessage());

‎plugins/storage/volume/ontap/src/test/java/org/apache/cloudstack/storage/service/StorageStrategyTest.java‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,20 @@ public void testConnect_invalidCredentials() {
556556
"Expected the message to prompt verifying username/password but got: " + ex.getMessage());
557557
}
558558

559+
@Test
560+
public void testConnect_forbidden() {
561+
setupSuccessfulConnect();
562+
Map<String, Collection<String>> emptyHeaders = Collections.emptyMap();
563+
Request dummyReq = Request.create(Request.HttpMethod.GET, "http://test", emptyHeaders, (byte[]) null, (Charset) null);
564+
FeignException.Forbidden forbidden = new FeignException.Forbidden("Forbidden", dummyReq, null);
565+
when(aggregateFeignClient.getAggregateByUUID(anyString(), eq("aggr-uuid-1"), anyMap()))
566+
.thenThrow(forbidden);
567+
568+
CloudRuntimeException ex = assertThrows(CloudRuntimeException.class, () -> storageStrategy.connect());
569+
assertEquals("Forbidden", ex.getMessage());
570+
assertNull(ex.getCause());
571+
}
572+
559573
// ========== chooseAggregate() Tests ==========
560574

561575
@Test
@@ -649,6 +663,23 @@ public void testChooseAggregate_missingNode() {
649663
assertTrue(ex.getMessage().contains("does not have a node name"));
650664
}
651665

666+
@Test
667+
public void testChooseAggregate_forbidden() {
668+
setupSuccessfulConnect();
669+
storageStrategy.connect();
670+
671+
Map<String, Collection<String>> emptyHeaders = Collections.emptyMap();
672+
Request dummyReq = Request.create(Request.HttpMethod.GET, "http://test", emptyHeaders, (byte[]) null, (Charset) null);
673+
FeignException.Forbidden forbidden = new FeignException.Forbidden("Forbidden", dummyReq, null);
674+
when(aggregateFeignClient.getAggregateByUUID(anyString(), eq("aggr-uuid-1"), anyMap()))
675+
.thenThrow(forbidden);
676+
677+
CloudRuntimeException ex = assertThrows(CloudRuntimeException.class,
678+
() -> storageStrategy.chooseAggregate(5000000000L));
679+
assertEquals("Forbidden", ex.getMessage());
680+
assertNull(ex.getCause());
681+
}
682+
652683
// ========== createStorageVolume() Tests ==========
653684

654685
@Test
@@ -1129,6 +1160,22 @@ public void testGetNetworkInterface_feignException() {
11291160
assertTrue(ex.getMessage().contains("Failed to retrieve network interfaces"));
11301161
}
11311162

1163+
@Test
1164+
public void testGetNetworkInterface_forbidden() {
1165+
Aggregate aggregate = buildAggregate("aggr1", "aggr-uuid-1", 10000000000.0, "node-a");
1166+
1167+
Map<String, Collection<String>> emptyHeaders = Collections.emptyMap();
1168+
Request dummyReq = Request.create(Request.HttpMethod.GET, "http://test", emptyHeaders, (byte[]) null, (Charset) null);
1169+
FeignException.Forbidden forbidden = new FeignException.Forbidden("Forbidden", dummyReq, null);
1170+
when(networkFeignClient.getNetworkIpInterfaces(anyString(), anyMap()))
1171+
.thenThrow(forbidden);
1172+
1173+
CloudRuntimeException ex = assertThrows(CloudRuntimeException.class,
1174+
() -> storageStrategy.getNetworkInterface(aggregate));
1175+
assertEquals("Forbidden", ex.getMessage());
1176+
assertNull(ex.getCause());
1177+
}
1178+
11321179
// ========== getNetworkInterface() Node-Affinity Tests ==========
11331180

11341181
/**

0 commit comments

Comments
 (0)