This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new cc527523fa Allow users to inform timezones on APIs that have the date
parameter (#7032)
cc527523fa is described below
commit cc527523fa71d7a8580e2d9e57f75f94a172312d
Author: João Jandre <[email protected]>
AuthorDate: Mon Jan 9 12:50:55 2023 -0300
Allow users to inform timezones on APIs that have the date parameter (#7032)
Co-authored-by: dahn <[email protected]>
---
.../java/org/apache/cloudstack/api/BaseCmd.java | 2 +-
.../api/command/user/job/ListAsyncJobsCmd.java | 2 +-
.../com/cloud/api/dispatch/ParamProcessWorker.java | 57 ++++++++++++----------
ui/src/components/view/StatsTab.vue | 41 ++--------------
4 files changed, 37 insertions(+), 65 deletions(-)
diff --git a/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java
b/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java
index 23354454e3..e431f63557 100644
--- a/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java
@@ -103,7 +103,7 @@ public abstract class BaseCmd {
GET, POST, PUT, DELETE
}
public static enum CommandType {
- BOOLEAN, DATE, FLOAT, DOUBLE, INTEGER, SHORT, LIST, LONG, OBJECT, MAP,
STRING, TZDATE, UUID
+ BOOLEAN, DATE, FLOAT, DOUBLE, INTEGER, SHORT, LIST, LONG, OBJECT, MAP,
STRING, UUID
}
private Object _responseObject;
diff --git
a/api/src/main/java/org/apache/cloudstack/api/command/user/job/ListAsyncJobsCmd.java
b/api/src/main/java/org/apache/cloudstack/api/command/user/job/ListAsyncJobsCmd.java
index 3f035d45ae..d2574ff442 100644
---
a/api/src/main/java/org/apache/cloudstack/api/command/user/job/ListAsyncJobsCmd.java
+++
b/api/src/main/java/org/apache/cloudstack/api/command/user/job/ListAsyncJobsCmd.java
@@ -33,7 +33,7 @@ public class ListAsyncJobsCmd extends
BaseListAccountResourcesCmd {
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
- @Parameter(name = ApiConstants.START_DATE, type = CommandType.TZDATE,
description = "The start date of the async job (use format
\"yyyy-MM-dd'T'HH:mm:ss'+'SSSS\")")
+ @Parameter(name = ApiConstants.START_DATE, type = CommandType.DATE,
description = "The start date of the async job (use format
\"yyyy-MM-dd'T'HH:mm:ss'+'SSSS\")")
private Date startDate;
/////////////////////////////////////////////////////
diff --git
a/server/src/main/java/com/cloud/api/dispatch/ParamProcessWorker.java
b/server/src/main/java/com/cloud/api/dispatch/ParamProcessWorker.java
index c23933438b..9f07db4b03 100644
--- a/server/src/main/java/com/cloud/api/dispatch/ParamProcessWorker.java
+++ b/server/src/main/java/com/cloud/api/dispatch/ParamProcessWorker.java
@@ -63,8 +63,10 @@ import com.cloud.utils.exception.CloudRuntimeException;
public class ParamProcessWorker implements DispatchWorker {
private static final Logger s_logger =
Logger.getLogger(ParamProcessWorker.class.getName());
- public final DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd");
- public final DateFormat newInputFormat = new SimpleDateFormat("yyyy-MM-dd
HH:mm:ss");
+ private static final String inputFormatString = "yyyy-MM-dd";
+ private static final String newInputFormatString = "yyyy-MM-dd HH:mm:ss";
+ public static final DateFormat inputFormat = new
SimpleDateFormat(inputFormatString);
+ public static final DateFormat newInputFormat = new
SimpleDateFormat(newInputFormatString);
@Inject
protected AccountManager _accountMgr;
@@ -333,26 +335,7 @@ public class ParamProcessWorker implements DispatchWorker {
field.set(cmdObj, Boolean.valueOf(paramObj.toString()));
break;
case DATE:
- // This piece of code is for maintaining backward compatibility
- // and support both the date formats(Bug 9724)
- final boolean isObjInNewDateFormat =
isObjInNewDateFormat(paramObj.toString());
- if (isObjInNewDateFormat) {
- final DateFormat newFormat = newInputFormat;
- synchronized (newFormat) {
- field.set(cmdObj,
newFormat.parse(paramObj.toString()));
- }
- } else {
- final DateFormat format = inputFormat;
- synchronized (format) {
- Date date = format.parse(paramObj.toString());
- if (field.getName().equals("startDate")) {
- date = messageDate(date, 0, 0, 0);
- } else if (field.getName().equals("endDate")) {
- date = messageDate(date, 23, 59, 59);
- }
- field.set(cmdObj, date);
- }
- }
+ parseAndSetDate(field, cmdObj, paramObj);
break;
case FLOAT:
// Assuming that the parameters have been checked for required
before now,
@@ -428,9 +411,6 @@ public class ParamProcessWorker implements DispatchWorker {
}
}
break;
- case TZDATE:
- field.set(cmdObj,
DateUtil.parseTZDateString(paramObj.toString()));
- break;
case MAP:
default:
field.set(cmdObj, paramObj);
@@ -442,6 +422,33 @@ public class ParamProcessWorker implements DispatchWorker {
" is not accessible]");
}
}
+ private void parseAndSetDate(Field field, BaseCmd cmdObj, Object paramObj)
throws IllegalAccessException, ParseException {
+ try {
+ field.set(cmdObj, DateUtil.parseTZDateString(paramObj.toString()));
+ return;
+ } catch (ParseException parseException) {
+ s_logger.debug(String.format("Could not parse date [%s] with
timezone parser, trying to parse without timezone.", paramObj));
+ }
+ if (isObjInNewDateFormat(paramObj.toString())) {
+ s_logger.debug(String.format("Parsing date [%s] using the [%s]
format.", paramObj, newInputFormatString));
+ final DateFormat newFormat = newInputFormat;
+ synchronized (newFormat) {
+ field.set(cmdObj, newFormat.parse(paramObj.toString()));
+ }
+ } else {
+ s_logger.debug(String.format("Parsing date [%s] using the [%s]
format.", paramObj, inputFormatString));
+ final DateFormat format = inputFormat;
+ synchronized (format) {
+ Date date = format.parse(paramObj.toString());
+ if (field.getName().equals("startDate")) {
+ date = messageDate(date, 0, 0, 0);
+ } else if (field.getName().equals("endDate")) {
+ date = messageDate(date, 23, 59, 59);
+ }
+ field.set(cmdObj, date);
+ }
+ }
+ }
private boolean isObjInNewDateFormat(final String string) {
final Matcher matcher = BaseCmd.newInputDateFormat.matcher(string);
diff --git a/ui/src/components/view/StatsTab.vue
b/ui/src/components/view/StatsTab.vue
index 613868c8be..45026c0ff1 100644
--- a/ui/src/components/view/StatsTab.vue
+++ b/ui/src/components/view/StatsTab.vue
@@ -289,26 +289,12 @@ export default {
mounted () {
this.fetchData()
},
- computed: {
- usebrowsertimezone: function () {
- return this.$store.getters.usebrowsertimezone
- }
- },
watch: {
resource: function (newItem) {
if (!newItem || !newItem.id) {
return
}
this.fetchData()
- },
- usebrowsertimezone: function () {
- if (this.startDate) {
- this.startDate = this.onToggleUseBrowserTimezone(new
Date(this.startDate))
- }
- if (this.endDate) {
- this.endDate = this.onToggleUseBrowserTimezone(new Date(this.endDate))
- }
- this.fetchData()
}
},
methods: {
@@ -355,32 +341,11 @@ export default {
},
getStartDate () {
var now = new Date()
- if (!this.$store.getters.usebrowsertimezone) {
- var dateInUTC = new Date(now.getTime() + now.getTimezoneOffset() *
60000)
- return dateInUTC.setHours(dateInUTC.getHours() - 1)
- }
now.setHours(now.getHours() - 1)
return now
},
getEndDate () {
- var now = new Date()
- if (this.$store.getters.usebrowsertimezone) {
- return now
- }
- return new Date(now.getTime() + now.getTimezoneOffset() * 60000)
- },
- onToggleUseBrowserTimezone (date) {
- if (this.$store.getters.usebrowsertimezone) {
- return this.$toLocalDate(date)
- }
- return new Date(date.getTime() + date.getTimezoneOffset() * 60000)
- },
- convertAndFormatDateAppropriately (date) {
- if (this.$store.getters.usebrowsertimezone) {
- var dateInUTC = new Date(date).toISOString().split('T')
- return dateInUTC[0] + ' ' + dateInUTC[1].split('-')[0].split('.')[0]
- }
- return moment(date).format('YYYY-MM-DD HH:mm:ss')
+ return new Date()
},
fetchData () {
this.loaded = false
@@ -388,10 +353,10 @@ export default {
this.formatPeriod()
var params = { id: this.resource.id }
if (this.startDate) {
- params.startDate =
this.convertAndFormatDateAppropriately(this.startDate)
+ params.startDate = moment(this.startDate).format()
}
if (this.endDate) {
- params.endDate = this.convertAndFormatDateAppropriately(this.endDate)
+ params.endDate = moment(this.endDate).format()
}
api('listVirtualMachinesUsageHistory', params).then(response => {
this.handleStatsResponse(response)