You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2019/06/17 14:23:19 UTC

[airavata-django-portal] 06/11: AIRAVATA-2990 Username filtering

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

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit f5c6b685d5dba874465ee1c2c6717e1db77769c3
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Tue Jun 11 16:29:47 2019 -0400

    AIRAVATA-2990 Username filtering
---
 .../statistics/ExperimentStatisticsContainer.vue   | 103 +++++++++++++++++----
 .../django_airavata_api/js/service_config.js       |   8 +-
 django_airavata/apps/api/views.py                  |   2 +-
 3 files changed, 92 insertions(+), 21 deletions(-)

diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentStatisticsContainer.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentStatisticsContainer.vue
index 0a59ff1..9aa9ff8 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentStatisticsContainer.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/statistics/ExperimentStatisticsContainer.vue
@@ -8,9 +8,12 @@
     <div class="row">
       <div class="col">
         <b-card header="Filter">
-          <b-input-group class="w-100">
+          <b-input-group class="w-100 mb-2">
             <b-input-group-prepend is-text>
-              <i class="fa fa-calendar-week" aria-hidden="true"></i>
+              <i
+                class="fa fa-calendar-week"
+                aria-hidden="true"
+              ></i>
             </b-input-group-prepend>
             <flat-pickr
               :value="dateRange"
@@ -19,10 +22,50 @@
               class="form-control"
             />
             <b-input-group-append>
-              <b-button @click="getPast24Hours" variant="outline-secondary">Past 24 Hours</b-button>
-              <b-button @click="getPastWeek" variant="outline-secondary">Past Week</b-button>
+              <b-button
+                @click="getPast24Hours"
+                variant="outline-secondary"
+              >Past 24 Hours</b-button>
+              <b-button
+                @click="getPastWeek"
+                variant="outline-secondary"
+              >Past Week</b-button>
             </b-input-group-append>
           </b-input-group>
+          <b-dropdown
+            text="Add Filters"
+            class="mb-2"
+          >
+            <b-dropdown-item
+              v-if="!usernameFilterEnabled"
+              @click="usernameFilterEnabled=true"
+            >Username</b-dropdown-item>
+            <b-dropdown-item>Application Name</b-dropdown-item>
+            <b-dropdown-item>Hostname</b-dropdown-item>
+          </b-dropdown>
+          <b-input-group
+            v-if="usernameFilterEnabled"
+            class="mb-2"
+          >
+            <b-form-input
+              v-model="usernameFilter"
+              placeholder="Username"
+              @keydown.native.enter="loadStatistics"
+            />
+            <b-input-group-append>
+              <b-button @click="removeUsernameFilter"><i class="fa fa-times"></i><span class="sr-only">Remove username
+                  filter</span></b-button>
+            </b-input-group-append>
+          </b-input-group>
+          <template slot="footer">
+            <div class="d-flex justify-content-end">
+              <b-button
+                @click="loadStatistics"
+                class="ml-auto"
+                variant="primary"
+              >Get Statistics</b-button>
+            </div>
+          </template>
         </b-card>
       </div>
     </div>
@@ -33,7 +76,7 @@
           header-text-variant="white"
           :count="experimentStatistics.allExperimentCount || 0"
           title="Total Experiments"
-          @click="selectExperiments(experimentStatistics.allExperiments)"
+          @click="selectedExperimentSummariesKey = 'allExperiments'"
         >
           <span slot="link-text">All</span>
         </experiment-statistics-card>
@@ -44,7 +87,7 @@
           :count="experimentStatistics.createdExperimentCount || 0"
           :states="createdStates"
           title="Created Experiments"
-          @click="selectExperiments(experimentStatistics.createdExperiments)"
+          @click="selectedExperimentSummariesKey = 'createdExperiments'"
         >
         </experiment-statistics-card>
       </div>
@@ -55,7 +98,7 @@
           :count="experimentStatistics.runningExperimentCount || 0"
           :states="runningStates"
           title="Running Experiments"
-          @click="selectExperiments(experimentStatistics.runningExperiments)"
+          @click="selectedExperimentSummariesKey = 'runningExperiments'"
         >
         </experiment-statistics-card>
 
@@ -68,7 +111,7 @@
           :count="experimentStatistics.completedExperimentCount || 0"
           :states="completedStates"
           title="Completed Experiments"
-          @click="selectExperiments(experimentStatistics.completedExperiments)"
+          @click="selectedExperimentSummariesKey = 'completedExperiments'"
         >
         </experiment-statistics-card>
       </div>
@@ -80,7 +123,7 @@
           :count="experimentStatistics.cancelledExperimentCount || 0"
           :states="canceledStates"
           title="Cancelled Experiments"
-          @click="selectExperiments(experimentStatistics.cancelledExperiments)"
+          @click="selectedExperimentSummariesKey = 'cancelledExperiments'"
         >
         </experiment-statistics-card>
       </div>
@@ -92,7 +135,7 @@
           :count="experimentStatistics.failedExperimentCount || 0"
           :states="failedStates"
           title="Failed Experiments"
-          @click="selectExperiments(experimentStatistics.failedExperiments)"
+          @click="selectedExperimentSummariesKey = 'failedExperiments'"
         >
         </experiment-statistics-card>
 
@@ -152,15 +195,22 @@ export default {
     const toTime = new Date();
     return {
       experimentStatistics: {},
-      selectedExperimentSummaries: null,
+      selectedExperimentSummariesKey: null,
       fromTime: fromTime,
       toTime: toTime,
       dateRange: [fromTime, toTime],
       dateConfig: {
         mode: "range",
         wrap: true,
+        dateFormat: "Y-m-d H:i",
         maxDate: new Date()
-      }
+      },
+      usernameFilterEnabled: false,
+      usernameFilter: null,
+      applicationNameFilterEnabled: false,
+      applicationNameFilter: null,
+      hostnameFilterEnabled: false,
+      hostnameFilter: null
     };
   },
   created() {
@@ -241,12 +291,16 @@ export default {
     },
     toTimeDisplay() {
       return moment(this.toTime).format("MMM Do YYYY");
+    },
+    selectedExperimentSummaries() {
+      if (this.selectedExperimentSummariesKey && this.experimentStatistics && this.selectedExperimentSummariesKey in this.experimentStatistics) {
+        return this.experimentStatistics[this.selectedExperimentSummariesKey];
+      } else {
+        return []
+      }
     }
   },
   methods: {
-    selectExperiments(experiments) {
-      this.selectedExperimentSummaries = experiments;
-    },
     dateRangeChanged(selectedDates) {
       [this.fromTime, this.toTime] = selectedDates;
       if (this.fromTime && this.toTime) {
@@ -254,10 +308,16 @@ export default {
       }
     },
     loadStatistics() {
-      services.ExperimentStatisticsService.get({
+      const requestData = {
         fromTime: this.fromTime.toJSON(),
         toTime: this.toTime.toJSON()
-      }).then(stats => (this.experimentStatistics = stats));
+      };
+      if (this.usernameFilterEnabled && this.usernameFilter) {
+        requestData["userName"] = this.usernameFilter;
+      }
+      services.ExperimentStatisticsService.get(requestData).then(
+        stats => (this.experimentStatistics = stats)
+      );
     },
     getPast24Hours() {
       this.fromTime = this.daysAgo(1);
@@ -273,12 +333,17 @@ export default {
     },
     updateDateRange() {
       this.dateRange = [
-        moment(this.fromTime).format("YYYY-MM-DD"),
-        moment(this.toTime).format("YYYY-MM-DD")
+        moment(this.fromTime).format("YYYY-MM-DD HH:mm"),
+        moment(this.toTime).format("YYYY-MM-DD HH:mm")
       ];
     },
     daysAgo(days) {
       return new Date(Date.now() - days * 24 * 60 * 60 * 1000);
+    },
+    removeUsernameFilter() {
+      this.usernameFilter = null;
+      this.usernameFilterEnabled = false;
+      this.loadStatistics();
     }
   }
 };
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/service_config.js b/django_airavata/apps/api/static/django_airavata_api/js/service_config.js
index 0770e81..ef94c66 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/service_config.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/service_config.js
@@ -194,7 +194,13 @@ export default {
       get: {
         url: "/api/experiment-statistics",
         requestType: "get",
-        queryParams: ["fromTime", "toTime"],
+        queryParams: [
+          "fromTime",
+          "toTime",
+          "userName",
+          "applicationName",
+          "resourceHostName"
+        ],
         modelClass: ExperimentStatistics
       }
     }
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index e58326e..637f3f7 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -1463,7 +1463,7 @@ class ExperimentStatisticsView(APIView):
             to_time = datetime.utcnow().timestamp() * 1000
         username = request.GET.get('userName', None)
         application_name = request.GET.get('applicationName', None)
-        resource_hostname = request.GET.get('requestHostName', None)
+        resource_hostname = request.GET.get('resourceHostName', None)
         statistics = request.airavata_client.getExperimentStatistics(
             request.authz_token, settings.GATEWAY_ID, from_time, to_time,
             username, application_name, resource_hostname)