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


##########
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:
   why would this be a warn?
   
   correct me if mistaken, but either
   - the disk should be disconnected by linstor and this is an ERROR
   - the disk detach should not have been tried by linstor and this is an ERROR
   - the call is in error but someone/-where else the real logic is performed 
and this is not even INFO
   am I missing something?



-- 
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