This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 60c9c9adb6723cdff0b1f66002886f7faad56579
Merge: 39152323e3b a851ee375c1
Author: Rohit Yadav <[email protected]>
AuthorDate: Wed Sep 4 12:38:07 2024 +0530

    Merge remote-tracking branch 'origin/4.19'
    
    Signed-off-by: Rohit Yadav <[email protected]>

 .../api/response/StoragePoolResponse.java          | 12 +++++
 .../storage/image/TemplateServiceImpl.java         |  5 --
 plugins/storage/volume/linstor/CHANGELOG.md        | 12 +++++
 .../kvm/storage/LinstorStorageAdaptor.java         | 57 +++++++++++++++-------
 .../storage/datastore/util/LinstorUtil.java        | 11 +++--
 .../api/query/dao/StoragePoolJoinDaoImpl.java      | 13 +++++
 .../configuration/ConfigurationManagerImpl.java    | 14 ++++++
 .../com/cloud/storage/VolumeApiServiceImpl.java    |  6 ++-
 .../apache/cloudstack/snapshot/SnapshotHelper.java | 22 ++++++---
 .../SecondaryStorageManagerImpl.java               |  5 ++
 systemvm/debian/opt/cloud/bin/cs/CsFile.py         |  1 -
 systemvm/debian/opt/cloud/bin/cs_vpnusers.py       |  2 -
 ui/src/views/setting/ConfigurationValue.vue        |  2 +-
 .../main/java/com/cloud/utils/net/NetUtils.java    | 12 +++++
 .../java/com/cloud/utils/net/NetUtilsTest.java     | 11 +++++
 15 files changed, 145 insertions(+), 40 deletions(-)

diff --cc 
engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
index 39d4618f81c,c040e1a7ad6..518a3869833
--- 
a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
+++ 
b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
@@@ -530,14 -529,9 +530,9 @@@ public class TemplateServiceImpl implem
                          // download.
                          for (VMTemplateVO tmplt : toBeDownloaded) {
                              if (tmplt.getUrl() == null) { // If url is null, 
skip downloading
 -                                s_logger.info("Skip downloading template " + 
tmplt.getUniqueName() + " since no url is specified.");
 +                                logger.info("Skip downloading template " + 
tmplt.getUniqueName() + " since no url is specified.");
                                  continue;
                              }
-                             // if this is private template, skip sync to a 
new image store
-                             if (isSkipTemplateStoreDownload(tmplt, zoneId)) {
-                                 logger.info("Skip sync downloading private 
template " + tmplt.getUniqueName() + " to a new image store");
-                                 continue;
-                             }
  
                              // if this is a region store, and there is 
already an DOWNLOADED entry there without install_path information, which
                              // means that this is a duplicate entry from 
migration of previous NFS to staging.
diff --cc 
plugins/storage/volume/linstor/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java
index 5d037d63433,83a84a91622..cc411543c44
--- 
a/plugins/storage/volume/linstor/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java
+++ 
b/plugins/storage/volume/linstor/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java
@@@ -242,15 -239,19 +244,19 @@@ public class LinstorStorageAdaptor impl
       * @throws ApiException if any problem connecting to the Linstor 
controller
       */
      private void allow2PrimariesIfInUse(DevelopersApi api, String rscName) 
throws ApiException {
-         if (LinstorUtil.isResourceInUse(api, rscName)) {
+         String inUseNode = LinstorUtil.isResourceInUse(api, rscName);
+         if (inUseNode != null && !inUseNode.equalsIgnoreCase(localNodeName)) {
              // allow 2 primaries for live migration, should be removed by 
disconnect on the other end
-             ResourceDefinitionModify rdm = new ResourceDefinitionModify();
+             ResourceConnectionModify rcm = new ResourceConnectionModify();
              Properties props = new Properties();
              props.put("DrbdOptions/Net/allow-two-primaries", "yes");
-             rdm.setOverrideProps(props);
-             ApiCallRcList answers = api.resourceDefinitionModify(rscName, 
rdm);
+             props.put("DrbdOptions/Net/protocol", "C");
+             rcm.setOverrideProps(props);
+             ApiCallRcList answers = api.resourceConnectionModify(rscName, 
inUseNode, localNodeName, rcm);
              if (answers.hasError()) {
-                 logger.error("Unable to set 'allow-two-primaries' on {} ", 
rscName);
 -                s_logger.error(String.format(
++                logger.error(String.format(
+                         "Unable to set protocol C and 'allow-two-primaries' 
on %s/%s/%s",
+                         inUseNode, localNodeName, rscName));
                  // do not fail here as adding allow-two-primaries property is 
only a problem while live migrating
              }
          }
@@@ -290,6 -291,23 +296,23 @@@
          return true;
      }
  
+     private void removeTwoPrimariesRcProps(DevelopersApi api, String 
inUseNode, String rscName) throws ApiException {
+         ResourceConnectionModify rcm = new ResourceConnectionModify();
+         List<String> deleteProps = new ArrayList<>();
+         deleteProps.add("DrbdOptions/Net/allow-two-primaries");
+         deleteProps.add("DrbdOptions/Net/protocol");
+         rcm.deleteProps(deleteProps);
+         ApiCallRcList answers = api.resourceConnectionModify(rscName, 
localNodeName, inUseNode, rcm);
+         if (answers.hasError()) {
 -            s_logger.error(
++            logger.error(
+                     String.format("Failed to remove 'protocol' and 
'allow-two-primaries' on %s/%s/%s: %s",
+                             localNodeName,
+                             inUseNode,
+                             rscName, 
LinstorUtil.getBestErrorMessage(answers)));
+             // do not fail here as removing allow-two-primaries property 
isn't fatal
+         }
+     }
+ 
      private boolean tryDisconnectLinstor(String volumePath, KVMStoragePool 
pool)
      {
          if (volumePath == null) {
@@@ -319,9 -337,18 +342,18 @@@
  
  
          if (optRsc.isPresent()) {
+             Resource rsc = optRsc.get();
              try {
-                 Resource rsc = optRsc.get();
+                 String inUseNode = LinstorUtil.isResourceInUse(api, 
rsc.getName());
+                 if (inUseNode != null && 
!inUseNode.equalsIgnoreCase(localNodeName)) {
+                     removeTwoPrimariesRcProps(api, inUseNode, rsc.getName());
+                 }
+             } catch (ApiException apiEx) {
 -                s_logger.error(apiEx.getBestMessage());
++                logger.error(apiEx.getBestMessage());
+                 // do not fail here as removing allow-two-primaries property 
or deleting diskless isn't fatal
+             }
  
+             try {
                  // 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) 
&&
@@@ -329,19 -356,8 +361,8 @@@
                      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()) {
-                     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());
 +                logger.error(apiEx.getBestMessage());
                  // do not fail here as removing allow-two-primaries property 
or deleting diskless isn't fatal
              }
  
diff --cc 
plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/util/LinstorUtil.java
index 8fdba049603,b857b4ebb83..49b8655ed63
--- 
a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/util/LinstorUtil.java
+++ 
b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/util/LinstorUtil.java
@@@ -199,10 -198,13 +199,13 @@@ public class LinstorUtil 
          List<Resource> rscs = api.resourceList(rscName, null, null);
          if (rscs != null) {
              return rscs.stream()
-                     .anyMatch(rsc -> rsc.getState() != null && 
Boolean.TRUE.equals(rsc.getState().isInUse()));
+                     .filter(rsc -> rsc.getState() != null && 
Boolean.TRUE.equals(rsc.getState().isInUse()))
+                     .map(Resource::getNodeName)
+                     .findFirst()
+                     .orElse(null);
 -       }
 -        s_logger.error("isResourceInUse: null returned from resourceList");
 +        }
 +        LOGGER.error("isResourceInUse: null returned from resourceList");
-         return false;
+         return null;
      }
  
      /**
diff --cc 
server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
index fce4b3496fc,9df33b47257..47be195ad23
--- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
@@@ -307,7 -303,10 +307,9 @@@ import com.google.common.base.Precondit
  import com.google.common.collect.Sets;
  import com.googlecode.ipv6.IPv6Network;
  
+ import static 
com.cloud.configuration.Config.SecStorageAllowedInternalDownloadSites;
+ 
  public class ConfigurationManagerImpl extends ManagerBase implements 
ConfigurationManager, ConfigurationService, Configurable {
 -    public static final Logger s_logger = 
Logger.getLogger(ConfigurationManagerImpl.class);
      public static final String PERACCOUNT = "peraccount";
      public static final String PERZONE = "perzone";
  
@@@ -1320,6 -1316,18 +1322,18 @@@
              }
          }
  
+         if (type.equals(String.class)) {
+             if 
(name.equalsIgnoreCase(SecStorageAllowedInternalDownloadSites.key()) && 
StringUtils.isNotEmpty(value)) {
+                 final String[] cidrs = value.split(",");
+                 for (final String cidr : cidrs) {
+                     if (!NetUtils.isValidIp4(cidr) && 
!NetUtils.isValidIp6(cidr) && !NetUtils.getCleanIp4Cidr(cidr).equals(cidr)) {
 -                        s_logger.error(String.format("Invalid CIDR %s value 
specified for the config %s", cidr, name));
++                        logger.error(String.format("Invalid CIDR %s value 
specified for the config %s", cidr, name));
+                         throw new 
InvalidParameterValueException(String.format("Invalid CIDR %s value specified 
for the config %s", cidr, name));
+                     }
+                 }
+             }
+         }
+ 
          if (configuration == null ) {
              //range validation has to be done per case basis, for now
              //return in case of Configkey parameters
diff --cc 
services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java
index 08af3ee02eb,cd6f23923e1..ec1e8a81979
--- 
a/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java
+++ 
b/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java
@@@ -399,6 -403,9 +401,9 @@@ public class SecondaryStorageManagerImp
          String[] cidrs = _allowedInternalSites.split(",");
          for (String cidr : cidrs) {
              if (NetUtils.isValidIp4Cidr(cidr) || NetUtils.isValidIp4(cidr) || 
!cidr.startsWith("0.0.0.0")) {
+                 if (NetUtils.getCleanIp4Cidr(cidr).equals(cidr)) {
 -                    s_logger.warn(String.format("Invalid CIDR %s in %s", 
cidr, SecStorageAllowedInternalDownloadSites.key()));
++                    logger.warn(String.format("Invalid CIDR %s in %s", cidr, 
SecStorageAllowedInternalDownloadSites.key()));
+                 }
                  allowedCidrs.add(cidr);
              }
          }

Reply via email to