This is an automated email from the ASF dual-hosted git repository. nvazquez pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit db564b12b693a8b88c7111f269d33e8a9d713791 Merge: e87c6cfcb1d f25d35c5d6b Author: nvazquez <nicovazque...@gmail.com> AuthorDate: Thu Mar 14 22:46:48 2024 -0300 Merge branch '4.19' api/src/main/java/com/cloud/event/EventTypes.java | 11 ++ .../cloudstack/api/ApiCommandResourceType.java | 3 +- .../org/apache/cloudstack/quota/QuotaTariff.java | 25 +++++ .../security/dao/SecurityGroupVMMapDaoImpl.java | 2 +- .../com/cloud/upgrade/dao/Upgrade41900to41910.java | 66 +++++++++++ .../META-INF/db/schema-41900to41910-cleanup.sql | 20 ++++ .../resources/META-INF/db/schema-41900to41910.sql | 32 ++++++ .../java/com/cloud/utils/db/GenericDaoBase.java | 4 +- .../cloudstack/quota/dao/QuotaTariffDaoImpl.java | 10 ++ .../apache/cloudstack/quota/vo/QuotaTariffVO.java | 5 +- .../api/command/QuotaTariffCreateCmd.java | 7 ++ .../api/command/QuotaTariffDeleteCmd.java | 7 ++ .../api/command/QuotaTariffUpdateCmd.java | 7 ++ .../api/response/QuotaResponseBuilderImpl.java | 18 ++- .../kvm/resource/LibvirtDomainXMLParser.java | 11 +- .../kvm/resource/LibvirtDomainXMLParserTest.java | 122 +++++++++++++++++++++ .../driver/LinstorPrimaryDataStoreDriverImpl.java | 27 +++-- .../storage/datastore/util/LinstorUtil.java | 38 ++++--- .../cloudstack/vm/UnmanagedVMsManagerImpl.java | 3 +- ui/src/components/view/SearchView.vue | 3 +- ui/src/components/widgets/ResourceLabel.vue | 4 +- ui/src/config/section/compute.js | 4 +- ui/src/utils/plugins.js | 1 + 23 files changed, 388 insertions(+), 42 deletions(-) diff --cc framework/quota/src/main/java/org/apache/cloudstack/quota/vo/QuotaTariffVO.java index 5b07cadb94a,d7721d88cbb..40a751c6200 --- a/framework/quota/src/main/java/org/apache/cloudstack/quota/vo/QuotaTariffVO.java +++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/vo/QuotaTariffVO.java @@@ -16,8 -16,7 +16,8 @@@ //under the License. package org.apache.cloudstack.quota.vo; +import com.cloud.utils.DateUtil; - import org.apache.cloudstack.api.InternalIdentity; + import org.apache.cloudstack.quota.QuotaTariff; import org.apache.cloudstack.quota.constant.QuotaTypes; import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils; diff --cc plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffCreateCmd.java index 8e5de241064,ea2edc3506d..ef9ffc23d13 --- a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffCreateCmd.java +++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffCreateCmd.java @@@ -27,7 -28,9 +28,8 @@@ import org.apache.cloudstack.api.Parame import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.QuotaResponseBuilder; import org.apache.cloudstack.api.response.QuotaTariffResponse; + import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.quota.vo.QuotaTariffVO; -import org.apache.log4j.Logger; import javax.inject.Inject; diff --cc plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffDeleteCmd.java index 699854ebac3,6c2aa5866d7..7810760c56e --- a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffDeleteCmd.java +++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffDeleteCmd.java @@@ -27,6 -28,8 +28,7 @@@ import org.apache.cloudstack.api.Parame import org.apache.cloudstack.api.response.QuotaResponseBuilder; import org.apache.cloudstack.api.response.QuotaTariffResponse; import org.apache.cloudstack.api.response.SuccessResponse; + import org.apache.cloudstack.context.CallContext; -import org.apache.log4j.Logger; import javax.inject.Inject; diff --cc plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffUpdateCmd.java index d5c5ca198b8,0bec1a63dcb..175500604d6 --- a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffUpdateCmd.java +++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/command/QuotaTariffUpdateCmd.java @@@ -27,7 -28,9 +28,8 @@@ import org.apache.cloudstack.api.Parame import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.QuotaResponseBuilder; import org.apache.cloudstack.api.response.QuotaTariffResponse; + import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.quota.vo.QuotaTariffVO; -import org.apache.log4j.Logger; import javax.inject.Inject; diff --cc plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java index d7f2832831a,d7171499b7c..d4996887a40 --- a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java +++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java @@@ -44,8 -43,8 +44,9 @@@ import org.apache.cloudstack.api.comman import org.apache.cloudstack.api.command.QuotaTariffCreateCmd; import org.apache.cloudstack.api.command.QuotaTariffListCmd; import org.apache.cloudstack.api.command.QuotaTariffUpdateCmd; + import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.quota.QuotaManager; +import org.apache.cloudstack.quota.QuotaManagerImpl; import org.apache.cloudstack.quota.QuotaService; import org.apache.cloudstack.quota.QuotaStatement; import org.apache.cloudstack.quota.constant.QuotaConfig; @@@ -643,13 -645,17 +651,18 @@@ public class QuotaResponseBuilderImpl i } if (startDate.compareTo(now) < 0) { - throw new InvalidParameterValueException(String.format("The quota tariff's start date [%s] cannot be less than now [%s]", startDate, now)); + throw new InvalidParameterValueException(String.format("The value passed as Quota tariff's start date is in the past: [%s]. " + + "Please, inform a date in the future or do not pass the parameter to use the current date and time.", startDate)); } - return persistNewQuotaTariff(null, name, usageType, startDate, cmd.getEntityOwnerId(), endDate, value, description, activationRule); + QuotaTariffVO newQuotaTariff = persistNewQuotaTariff(null, name, usageType, startDate, cmd.getEntityOwnerId(), endDate, value, description, activationRule); + + CallContext.current().setEventResourceId(newQuotaTariff.getId()); + + return newQuotaTariff; } + @ActionEvent(eventType = EventTypes.EVENT_QUOTA_TARIFF_DELETE, eventDescription = "removing Quota Tariff") public boolean deleteQuotaTariff(String quotaTariffUuid) { QuotaTariffVO quotaTariff = _quotaTariffDao.findByUuid(quotaTariffUuid); diff --cc plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java index 407e7e766c0,328b3d21d0a..016ab0e993f --- a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java +++ b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java @@@ -215,9 -215,10 +216,10 @@@ public class LinstorPrimaryDataStoreDri } throw new CloudRuntimeException("Linstor: Unable to delete resource definition: " + rscDefName); } - s_logger.info(String.format("Linstor: Deleted resource %s", rscDefName)); ++ logger.info(String.format("Linstor: Deleted resource %s", rscDefName)); } catch (ApiException apiEx) { - s_logger.error("Linstor: ApiEx - " + apiEx.getMessage()); + logger.error("Linstor: ApiEx - " + apiEx.getMessage()); throw new CloudRuntimeException(apiEx.getBestMessage(), apiEx); } } @@@ -865,8 -867,8 +867,8 @@@ Host host = null; for (String nodeName : linstorNodeNames) { host = _hostDao.findByName(nodeName); - if (host != null) { + if (host != null && host.getResourceState() == ResourceState.Enabled) { - s_logger.info(String.format("Linstor: Make resource %s available on node %s ...", rscName, nodeName)); + logger.info(String.format("Linstor: Make resource %s available on node %s ...", rscName, nodeName)); ApiCallRcList answers = api.resourceMakeAvailableOnNode(rscName, nodeName, new ResourceMakeAvailable()); if (!answers.hasError()) { break; // found working host @@@ -892,21 -894,16 +894,16 @@@ } private Optional<RemoteHostEndPoint> getDiskfullEP(DevelopersApi api, String rscName) throws ApiException { - com.linbit.linstor.api.model.StoragePool linSP = - LinstorUtil.getDiskfulStoragePool(api, rscName); - if (linSP != null) - { - Host host = _hostDao.findByName(linSP.getNodeName()); - if (host == null) - { - logger.error("Linstor: Host '" + linSP.getNodeName() + "' not found."); - return Optional.empty(); - } - else - { - return Optional.of(RemoteHostEndPoint.getHypervisorHostEndPoint(host)); + List<com.linbit.linstor.api.model.StoragePool> linSPs = LinstorUtil.getDiskfulStoragePools(api, rscName); + if (linSPs != null) { + for (com.linbit.linstor.api.model.StoragePool sp : linSPs) { + Host host = _hostDao.findByName(sp.getNodeName()); + if (host != null && host.getResourceState() == ResourceState.Enabled) { + return Optional.of(RemoteHostEndPoint.getHypervisorHostEndPoint(host)); + } } } - s_logger.error("Linstor: No diskfull host found."); ++ logger.error("Linstor: No diskfull host found."); return Optional.empty(); } @@@ -958,9 -955,11 +955,11 @@@ } else { answer = new Answer(cmd, false, "Unable to get matching Linstor endpoint."); + deleteResourceDefinition(pool, rscName); } } catch (ApiException exc) { - s_logger.error("copy template failed: ", exc); + logger.error("copy template failed: ", exc); + deleteResourceDefinition(pool, rscName); throw new CloudRuntimeException(exc.getBestMessage()); } return answer;