This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch 4.18
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.18 by this push:
new 223a9b8031c Quota tariff events (#8030)
223a9b8031c is described below
commit 223a9b8031c4f2a7cf1165c960b291ba169996e3
Author: Henrique Sato <[email protected]>
AuthorDate: Wed Mar 6 13:33:39 2024 -0300
Quota tariff events (#8030)
Co-authored-by: Henrique Sato <[email protected]>
---
api/src/main/java/com/cloud/event/EventTypes.java | 11 ++++++++++
.../cloudstack/api/ApiCommandResourceType.java | 3 ++-
.../org/apache/cloudstack/quota/QuotaTariff.java | 25 ++++++++++++++++++++++
.../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 +++++++++++++++-
ui/src/components/view/SearchView.vue | 3 ++-
ui/src/components/widgets/ResourceLabel.vue | 4 ++--
ui/src/utils/plugins.js | 1 +
13 files changed, 96 insertions(+), 9 deletions(-)
diff --git a/api/src/main/java/com/cloud/event/EventTypes.java
b/api/src/main/java/com/cloud/event/EventTypes.java
index f7678d99d32..f579fdb23f1 100644
--- a/api/src/main/java/com/cloud/event/EventTypes.java
+++ b/api/src/main/java/com/cloud/event/EventTypes.java
@@ -29,6 +29,7 @@ import org.apache.cloudstack.api.response.PodResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.config.Configuration;
import org.apache.cloudstack.ha.HAConfig;
+import org.apache.cloudstack.quota.QuotaTariff;
import org.apache.cloudstack.usage.Usage;
import com.cloud.dc.DataCenter;
@@ -693,6 +694,11 @@ public class EventTypes {
// SystemVM
public static final String EVENT_LIVE_PATCH_SYSTEMVM =
"LIVE.PATCH.SYSTEM.VM";
+ // Quota
+ public static final String EVENT_QUOTA_TARIFF_CREATE =
"QUOTA.TARIFF.CREATE";
+ public static final String EVENT_QUOTA_TARIFF_DELETE =
"QUOTA.TARIFF.DELETE";
+ public static final String EVENT_QUOTA_TARIFF_UPDATE =
"QUOTA.TARIFF.UPDATE";
+
static {
// TODO: need a way to force author adding event types to declare the
entity details as well, with out braking
@@ -1118,6 +1124,11 @@ public class EventTypes {
entityEventDetails.put(EVENT_IMAGE_STORE_DATA_MIGRATE,
ImageStore.class);
entityEventDetails.put(EVENT_LIVE_PATCH_SYSTEMVM, "SystemVMs");
+
+ // Quota
+ entityEventDetails.put(EVENT_QUOTA_TARIFF_CREATE, QuotaTariff.class);
+ entityEventDetails.put(EVENT_QUOTA_TARIFF_DELETE, QuotaTariff.class);
+ entityEventDetails.put(EVENT_QUOTA_TARIFF_UPDATE, QuotaTariff.class);
}
public static String getEntityForEvent(String eventName) {
diff --git
a/api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java
b/api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java
index 0a7ece7b7d8..1549167bc39 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java
@@ -77,7 +77,8 @@ public enum ApiCommandResourceType {
Pod(com.cloud.dc.Pod.class),
VmSnapshot(com.cloud.vm.snapshot.VMSnapshot.class),
Role(org.apache.cloudstack.acl.Role.class),
- VpnCustomerGateway(com.cloud.network.Site2SiteCustomerGateway.class);
+ VpnCustomerGateway(com.cloud.network.Site2SiteCustomerGateway.class),
+ QuotaTariff(org.apache.cloudstack.quota.QuotaTariff.class);
private final Class<?> clazz;
diff --git a/api/src/main/java/org/apache/cloudstack/quota/QuotaTariff.java
b/api/src/main/java/org/apache/cloudstack/quota/QuotaTariff.java
new file mode 100644
index 00000000000..7de66a168f9
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/quota/QuotaTariff.java
@@ -0,0 +1,25 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.quota;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface QuotaTariff extends InternalIdentity, Identity {
+
+}
diff --git a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java
b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java
index 1ab2c196ff8..4fe86b4d950 100644
--- a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java
+++ b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java
@@ -1461,9 +1461,9 @@ public abstract class GenericDaoBase<T, ID extends
Serializable> extends Compone
} else {
_idField.set(entity, id);
}
- } else {
- id = (ID)_idField.get(entity);
}
+
+ id = (ID)_idField.get(entity);
}
} catch (final IllegalAccessException e) {
throw new CloudRuntimeException("Yikes! ", e);
diff --git
a/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDaoImpl.java
b/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDaoImpl.java
index 470c84ac4e1..f73a7447d3e 100644
---
a/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDaoImpl.java
+++
b/framework/quota/src/main/java/org/apache/cloudstack/quota/dao/QuotaTariffDaoImpl.java
@@ -231,4 +231,14 @@ public class QuotaTariffDaoImpl extends
GenericDaoBase<QuotaTariffVO, Long> impl
return quotaTariffs.get(0);
}
+
+ @Override
+ public QuotaTariffVO findByIdIncludingRemoved(Long id) {
+ return Transaction.execute(TransactionLegacy.USAGE_DB,
(TransactionCallback<QuotaTariffVO>) status ->
super.findByIdIncludingRemoved(id));
+ }
+
+ @Override
+ public QuotaTariffVO findByUuidIncludingRemoved(String uuid) {
+ return Transaction.execute(TransactionLegacy.USAGE_DB,
(TransactionCallback<QuotaTariffVO>) status ->
super.findByUuidIncludingRemoved(uuid));
+ }
}
diff --git
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
index 7bc2870e36a..d7721d88cbb 100644
---
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,7 +16,7 @@
//under the License.
package org.apache.cloudstack.quota.vo;
-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;
@@ -37,7 +37,7 @@ import java.util.UUID;
@Entity
@Table(name = "quota_tariff")
-public class QuotaTariffVO implements InternalIdentity {
+public class QuotaTariffVO implements QuotaTariff {
private static final long serialVersionUID = -7117933766387653203L;
@Id
@@ -240,6 +240,7 @@ public class QuotaTariffVO implements InternalIdentity {
return description;
}
+ @Override
public String getUuid() {
return uuid;
}
diff --git
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
index 2bbdb57fa7e..ea2edc3506d 100644
---
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
@@ -20,6 +20,7 @@ import com.cloud.user.Account;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandResourceType;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseCmd;
@@ -27,6 +28,7 @@ import org.apache.cloudstack.api.Parameter;
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;
@@ -70,6 +72,7 @@ public class QuotaTariffCreateCmd extends BaseCmd {
@Override
public void execute() {
+ CallContext.current().setEventDetails(String.format("Tariff: %s,
description: %s, value: %s", getName(), getDescription(), getValue()));
QuotaTariffVO result = responseBuilder.createQuotaTariff(this);
if (result == null) {
@@ -134,4 +137,8 @@ public class QuotaTariffCreateCmd extends BaseCmd {
this.endDate = endDate;
}
+ @Override
+ public ApiCommandResourceType getApiResourceType() {
+ return ApiCommandResourceType.QuotaTariff;
+ }
}
diff --git
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
index 6fd46dc487e..6c2aa5866d7 100644
---
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
@@ -21,12 +21,14 @@ import com.cloud.user.Account;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiCommandResourceType;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.Parameter;
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;
@@ -49,6 +51,7 @@ public class QuotaTariffDeleteCmd extends BaseCmd {
@Override
public void execute() {
+ CallContext.current().setEventDetails(String.format("Tariff id: %s",
getId()));
boolean result = responseBuilder.deleteQuotaTariff(getId());
SuccessResponse response = new SuccessResponse(getCommandName());
response.setSuccess(result);
@@ -60,4 +63,8 @@ public class QuotaTariffDeleteCmd extends BaseCmd {
return Account.ACCOUNT_ID_SYSTEM;
}
+ @Override
+ public ApiCommandResourceType getApiResourceType() {
+ return ApiCommandResourceType.QuotaTariff;
+ }
}
diff --git
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
index e2aad3a86f3..0bec1a63dcb 100644
---
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
@@ -20,6 +20,7 @@ import com.cloud.user.Account;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandResourceType;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseCmd;
@@ -27,6 +28,7 @@ import org.apache.cloudstack.api.Parameter;
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;
@@ -111,6 +113,7 @@ public class QuotaTariffUpdateCmd extends BaseCmd {
@Override
public void execute() {
+ CallContext.current().setEventDetails(String.format("Tariff: %s,
description: %s, value: %s", getName(), getDescription(), getValue()));
final QuotaTariffVO result =
_responseBuilder.updateQuotaTariffPlan(this);
if (result == null) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed
to update quota tariff plan");
@@ -125,4 +128,8 @@ public class QuotaTariffUpdateCmd extends BaseCmd {
return Account.ACCOUNT_ID_SYSTEM;
}
+ @Override
+ public ApiCommandResourceType getApiResourceType() {
+ return ApiCommandResourceType.QuotaTariff;
+ }
}
diff --git
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
index 32b49a72ae4..d7171499b7c 100644
---
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
@@ -43,6 +43,7 @@ import org.apache.cloudstack.api.command.QuotaStatementCmd;
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.QuotaService;
import org.apache.cloudstack.quota.QuotaStatement;
@@ -75,6 +76,8 @@ import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.UserDao;
import com.cloud.utils.Pair;
import com.cloud.utils.db.Filter;
+import com.cloud.event.ActionEvent;
+import com.cloud.event.EventTypes;
@Component
public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
@@ -380,6 +383,7 @@ public class QuotaResponseBuilderImpl implements
QuotaResponseBuilder {
}
@Override
+ @ActionEvent(eventType = EventTypes.EVENT_QUOTA_TARIFF_UPDATE,
eventDescription = "updating Quota Tariff")
public QuotaTariffVO updateQuotaTariffPlan(QuotaTariffUpdateCmd cmd) {
String name = cmd.getName();
Double value = cmd.getValue();
@@ -403,6 +407,9 @@ public class QuotaResponseBuilderImpl implements
QuotaResponseBuilder {
QuotaTariffVO newQuotaTariff =
persistNewQuotaTariff(currentQuotaTariff, name, 0, currentQuotaTariffStartDate,
cmd.getEntityOwnerId(), endDate, value, description,
activationRule);
_quotaTariffDao.updateQuotaTariff(currentQuotaTariff);
+
+ CallContext.current().setEventResourceId(newQuotaTariff.getId());
+
return newQuotaTariff;
}
@@ -619,6 +626,7 @@ public class QuotaResponseBuilderImpl implements
QuotaResponseBuilder {
}
@Override
+ @ActionEvent(eventType = EventTypes.EVENT_QUOTA_TARIFF_CREATE,
eventDescription = "creating Quota Tariff")
public QuotaTariffVO createQuotaTariff(QuotaTariffCreateCmd cmd) {
String name = cmd.getName();
int usageType = cmd.getUsageType();
@@ -640,9 +648,14 @@ public class QuotaResponseBuilderImpl implements
QuotaResponseBuilder {
throw new InvalidParameterValueException(String.format("The quota
tariff's start date [%s] cannot be less than now [%s]", startDate, now));
}
- 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);
@@ -651,6 +664,9 @@ public class QuotaResponseBuilderImpl implements
QuotaResponseBuilder {
}
quotaTariff.setRemoved(_quotaService.computeAdjustedTime(new Date()));
+
+ CallContext.current().setEventResourceId(quotaTariff.getId());
+
return _quotaTariffDao.updateQuotaTariff(quotaTariff);
}
}
diff --git a/ui/src/components/view/SearchView.vue
b/ui/src/components/view/SearchView.vue
index 190db440fd1..1a3642dd452 100644
--- a/ui/src/components/view/SearchView.vue
+++ b/ui/src/components/view/SearchView.vue
@@ -339,7 +339,8 @@ export default {
{ value: 'Template' },
{ value: 'User' },
{ value: 'VirtualMachine' },
- { value: 'Volume' }
+ { value: 'Volume' },
+ { value: 'QuotaTariff' }
]
this.fields[resourceTypeIndex].loading = false
}
diff --git a/ui/src/components/widgets/ResourceLabel.vue
b/ui/src/components/widgets/ResourceLabel.vue
index c200c6a6655..6e44ce54a5d 100644
--- a/ui/src/components/widgets/ResourceLabel.vue
+++ b/ui/src/components/widgets/ResourceLabel.vue
@@ -58,11 +58,11 @@ export default {
created () {
if (this.resourceType) {
var routePrefix = this.$getRouteFromResourceType(this.resourceType)
- if (routePrefix && this.resourceId) {
+ if (routePrefix && this.resourceId && this.resourceType !==
'QuotaTariff') {
this.resourceRoute = '/' + routePrefix + '/' + this.resourceId
}
this.resourceIcon = this.$getIconFromResourceType(this.resourceType)
- this.resourceIconTooltip = this.$t('label.' +
this.resourceType.toString().toLowerCase())
+ this.resourceIconTooltip = this.$t('label.' +
this.resourceType.toString().match(/[A-Z][a-z]*/g).join('.').toLowerCase())
}
}
}
diff --git a/ui/src/utils/plugins.js b/ui/src/utils/plugins.js
index 7223f050368..be6276dbd0c 100644
--- a/ui/src/utils/plugins.js
+++ b/ui/src/utils/plugins.js
@@ -417,6 +417,7 @@ export const resourceTypePlugin = {
case 'AffinityGroup':
case 'VpnCustomerGateway':
case 'AutoScaleVmGroup':
+ case 'QuotaTariff':
return resourceType.toLowerCase()
}
return ''