DaanHoogland commented on code in PR #8790:
URL: https://github.com/apache/cloudstack/pull/8790#discussion_r1537322738


##########
plugins/storage/volume/linstor/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java:
##########
@@ -302,26 +308,89 @@ public boolean connectPhysicalDisk(String volumePath, 
KVMStoragePool pool, Map<S
         return true;
     }
 
+    private Optional<ResourceWithVolumes> getResourceByPath(final 
List<ResourceWithVolumes> resources, String path) {
+        return resources.stream()
+                .filter(rsc -> rsc.getVolumes().stream()
+                        .anyMatch(v -> v.getDevicePath().equals(path)))
+                .findFirst();
+    }
+
+    private boolean tryDisconnectLinstor(String volumePath, KVMStoragePool 
pool)
+    {
+        s_logger.debug("Linstor: Using storpool: " + pool.getUuid());
+        final DevelopersApi api = getLinstorAPI(pool);
+
+        Optional<ResourceWithVolumes> optRsc;
+        try
+        {
+            List<ResourceWithVolumes> resources = api.viewResources(
+                    Collections.singletonList(localNodeName),
+                    null,
+                    null,
+                    null,
+                    null,
+                    null);
+
+            optRsc = getResourceByPath(resources, volumePath);
+        } catch (ApiException apiEx) {
+            // couldn't query linstor controller
+            s_logger.error(apiEx.getBestMessage());
+            return false;
+        }
+
+
+        if (optRsc.isPresent()) {
+            try {
+                Resource rsc = optRsc.get();
+
+                // if diskless resource remove it, in the worst case it will 
be transformed to a tiebreaker
+                if (rsc.getFlags() != null &&
+                        rsc.getFlags().contains(ApiConsts.FLAG_DRBD_DISKLESS) 
&&
+                        !rsc.getFlags().contains(ApiConsts.FLAG_TIE_BREAKER)) {
+                    ApiCallRcList delAnswers = 
api.resourceDelete(rsc.getName(), localNodeName);
+                    logLinstorAnswers(delAnswers);
+                }
+
+                // remove allow-two-primaries
+                ResourceDefinitionModify rdm = new ResourceDefinitionModify();
+                
rdm.deleteProps(Collections.singletonList("DrbdOptions/Net/allow-two-primaries"));
+                ApiCallRcList answers = 
api.resourceDefinitionModify(rsc.getName(), rdm);
+                if (answers.hasError()) {
+                    s_logger.error(
+                            String.format("Failed to remove 
'allow-two-primaries' on %s: %s",
+                                    rsc.getName(), 
LinstorUtil.getBestErrorMessage(answers)));
+                    // do not fail here as removing allow-two-primaries 
property isn't fatal
+                }
+            } catch (ApiException apiEx) {
+                s_logger.error(apiEx.getBestMessage());
+                // do not fail here as removing allow-two-primaries property 
or deleting diskless isn't fatal
+            }
+
+            return true;
+        }
+
+        s_logger.warn("Linstor: Couldn't find resource for this path: " + 
volumePath);
+        return false;
+    }
+
     @Override
     public boolean disconnectPhysicalDisk(String volumePath, KVMStoragePool 
pool)
     {
         s_logger.debug("Linstor: disconnectPhysicalDisk " + pool.getUuid() + 
":" + volumePath);
-        return true;
+        if (MapStorageUuidToStoragePool.containsValue(pool)) {
+            return tryDisconnectLinstor(volumePath, pool);
+        }
+        return false;
     }
 
     @Override
     public boolean disconnectPhysicalDisk(Map<String, String> 
volumeToDisconnect)
     {
+        // as of now this is only relevant for iscsi targets
+        s_logger.warn("Linstor: disconnectPhysicalDisk(Map<String, String> 
volumeToDisconnect) called?");

Review Comment:
   ok, I would make it INFO , but change at your discretion.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to