You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by zr...@apache.org on 2021/09/28 20:57:05 UTC

[trafficcontrol] branch 6.0.x updated: Removed default limits values in logs API (#6235) (#6241)

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

zrhoffman pushed a commit to branch 6.0.x
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/6.0.x by this push:
     new 32943cc  Removed default limits values in logs API (#6235) (#6241)
32943cc is described below

commit 32943ccb45005a9fa966c76a30d17206207474bc
Author: Zach Hoffman <zr...@apache.org>
AuthorDate: Tue Sep 28 20:56:57 2021 +0000

    Removed default limits values in logs API (#6235) (#6241)
    
    * removed limit default values
    
    * print statements added
    
    * removed the default limit values for the log
    
    * updated the docs for logs limit functionality
    
    * removed default values in logs only for V4
    
    * removed default limits if the days query params are passed in V2 and V3
    
    * added the docs for logs - limit query params
    
    * removed write alerts and renamed to Handle err
    
    (cherry picked from commit 2977937ed17a8a208f751ece446b53407820ca04)
    
    Co-authored-by: dmohan001c <de...@comcast.com>
---
 docs/source/api/v2/logs.rst                      |  4 +-
 docs/source/api/v3/logs.rst                      |  4 +-
 docs/source/api/v4/logs.rst                      |  2 +-
 traffic_ops/traffic_ops_golang/logs/log.go       | 79 +++++++++++++++++++++++-
 traffic_ops/traffic_ops_golang/routing/routes.go |  2 +-
 5 files changed, 83 insertions(+), 8 deletions(-)

diff --git a/docs/source/api/v2/logs.rst b/docs/source/api/v2/logs.rst
index 442efa3..33da628 100644
--- a/docs/source/api/v2/logs.rst
+++ b/docs/source/api/v2/logs.rst
@@ -35,9 +35,9 @@ Request Structure
 	+-----------+----------+-------------------------------------------------------------------------------------------------------------------------------------+
 	| Name      | Required | Description                                                                                                                         |
 	+===========+==========+=====================================================================================================================================+
-	| days      | no       | An integer number of days of change logs to return                                                                                  |
+	| days      | no       | An integer number of days of change logs to return, by default there is no limit applied                                            |
 	+-----------+----------+-------------------------------------------------------------------------------------------------------------------------------------+
-	| limit     | no       | The number of records to which to limit the response                                                                                |
+	| limit     | no       | The number of records to which to limit the response, if there is no limit query params, it limits to 1000                          |
 	+-----------+----------+-------------------------------------------------------------------------------------------------------------------------------------+
 	| offset    | no       | The number of results to skip before beginning to return results. Must use in conjunction with limit                                |
 	+-----------+----------+-------------------------------------------------------------------------------------------------------------------------------------+
diff --git a/docs/source/api/v3/logs.rst b/docs/source/api/v3/logs.rst
index 2a1ddf5..6728733 100644
--- a/docs/source/api/v3/logs.rst
+++ b/docs/source/api/v3/logs.rst
@@ -35,9 +35,9 @@ Request Structure
 	+-----------+----------+-------------------------------------------------------------------------------------------------------------------------------------+
 	| Name      | Required | Description                                                                                                                         |
 	+===========+==========+=====================================================================================================================================+
-	| days      | no       | An integer number of days of change logs to return                                                                                  |
+	| days      | no       | An integer number of days of change logs to return, by default there is no limit applied                                            |
 	+-----------+----------+-------------------------------------------------------------------------------------------------------------------------------------+
-	| limit     | no       | The number of records to which to limit the response                                                                                |
+	| limit     | no       | The number of records to which to limit the response, if there is no limit query params, it limits to 1000                          |
 	+-----------+----------+-------------------------------------------------------------------------------------------------------------------------------------+
 	| offset    | no       | The number of results to skip before beginning to return results. Must use in conjunction with limit                                |
 	+-----------+----------+-------------------------------------------------------------------------------------------------------------------------------------+
diff --git a/docs/source/api/v4/logs.rst b/docs/source/api/v4/logs.rst
index 74ee027..ac7ce82 100644
--- a/docs/source/api/v4/logs.rst
+++ b/docs/source/api/v4/logs.rst
@@ -37,7 +37,7 @@ Request Structure
 	+===========+==========+=====================================================================================================================================+
 	| days      | no       | An integer number of days of change logs to return                                                                                  |
 	+-----------+----------+-------------------------------------------------------------------------------------------------------------------------------------+
-	| limit     | no       | The number of records to which to limit the response                                                                                |
+	| limit     | no       | The number of records to which to limit the response, by default there is no limit applied                                          |
 	+-----------+----------+-------------------------------------------------------------------------------------------------------------------------------------+
 	| offset    | no       | The number of results to skip before beginning to return results. Must use in conjunction with limit                                |
 	+-----------+----------+-------------------------------------------------------------------------------------------------------------------------------------+
diff --git a/traffic_ops/traffic_ops_golang/logs/log.go b/traffic_ops/traffic_ops_golang/logs/log.go
index c8c5569..25cbb9a 100644
--- a/traffic_ops/traffic_ops_golang/logs/log.go
+++ b/traffic_ops/traffic_ops_golang/logs/log.go
@@ -63,10 +63,32 @@ func Get(w http.ResponseWriter, r *http.Request) {
 	if pLimit, ok := inf.IntParams["limit"]; ok {
 		limit = pLimit
 	}
+	setLastSeenCookie(w)
+	logs, count, err := getLog(inf, days, limit)
+	if err != nil {
+		api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, err, err)
+		return
+	}
+	api.WriteRespWithSummary(w, r, logs, count)
+}
+
+// Get is the handler for GET requests to /logs V4.0.
+func Getv40(w http.ResponseWriter, r *http.Request) {
+	inf, userErr, sysErr, errCode := api.NewInfo(r, nil, []string{"days", "limit"})
+	if userErr != nil || sysErr != nil {
+		api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
+		return
+	}
+	defer inf.Close()
+	days := DefaultLogDays
+	if pDays, ok := inf.IntParams["days"]; ok {
+		days = pDays
+	}
 
 	a := tc.Alerts{}
 	setLastSeenCookie(w)
-	logs, count, err := getLog(inf, days, limit)
+	logs, count, err := getLogV40(inf, days)
+
 	if err != nil {
 		a.AddNewAlert(tc.ErrorLevel, err.Error())
 		api.WriteAlerts(w, r, http.StatusInternalServerError, a)
@@ -135,11 +157,64 @@ FROM "log" as l JOIN tm_user as u ON l.tm_user = u.id`
 
 const countQuery = `SELECT count(l.tm_user) FROM log as l`
 
+func getLogV40(inf *api.APIInfo, days int) ([]tc.Log, uint64, error) {
+	var count = uint64(0)
+	var whereCount string
+
+	queryParamsToQueryCols := map[string]dbhelpers.WhereColumnInfo{
+		"username": {Column: "u.username", Checker: nil},
+	}
+	where, _, pagination, queryValues, errs :=
+		dbhelpers.BuildWhereAndOrderByAndPagination(inf.Params, queryParamsToQueryCols)
+
+	if len(errs) > 0 {
+		return nil, 0, util.JoinErrs(errs)
+	}
+
+	timeInterval := fmt.Sprintf("l.last_updated > now() - INTERVAL '%d' DAY", days)
+	if where != "" {
+		whereCount = ", tm_user as u\n" + where + " AND l.tm_user = u.id"
+		where = where + " AND " + timeInterval
+	} else {
+		whereCount = where
+		where = "\nWHERE " + timeInterval
+	}
+	queryCount := countQuery + whereCount
+	rowCount, err := inf.Tx.NamedQuery(queryCount, queryValues)
+	if err != nil {
+		return nil, count, fmt.Errorf("querying log count for a given user: %w", err)
+	}
+	defer rowCount.Close()
+	for rowCount.Next() {
+		if err = rowCount.Scan(&count); err != nil {
+			return nil, count, fmt.Errorf("scanning logs: %w", err)
+		}
+	}
+
+	query := selectFromQuery + where + "\n ORDER BY last_updated DESC" + pagination
+	rows, err := inf.Tx.NamedQuery(query, queryValues)
+	if err != nil {
+		return nil, count, fmt.Errorf("querying logs: %w", err)
+	}
+	defer rows.Close()
+	ls := []tc.Log{}
+	for rows.Next() {
+		l := tc.Log{}
+		if err = rows.Scan(&l.ID, &l.Level, &l.Message, &l.User, &l.TicketNum, &l.LastUpdated); err != nil {
+			return nil, count, fmt.Errorf("scanning logs: %w", err)
+		}
+		ls = append(ls, l)
+	}
+	return ls, count, nil
+}
+
 func getLog(inf *api.APIInfo, days int, limit int) ([]tc.Log, uint64, error) {
 	var count = uint64(0)
 	var whereCount string
 	if _, ok := inf.Params["limit"]; !ok {
-		inf.Params["limit"] = strconv.Itoa(DefaultLogLimit)
+		if _, ok := inf.Params["days"]; !ok {
+			inf.Params["limit"] = strconv.Itoa(DefaultLogLimit)
+		}
 	} else {
 		inf.Params["limit"] = strconv.Itoa(limit)
 	}
diff --git a/traffic_ops/traffic_ops_golang/routing/routes.go b/traffic_ops/traffic_ops_golang/routing/routes.go
index 9ae855b..5a8170c 100644
--- a/traffic_ops/traffic_ops_golang/routing/routes.go
+++ b/traffic_ops/traffic_ops_golang/routing/routes.go
@@ -216,7 +216,7 @@ func Routes(d ServerData) ([]Route, []RawRoute, http.Handler, error) {
 		{api.Version{Major: 4, Minor: 0}, http.MethodPost, `divisions/?$`, api.CreateHandler(&division.TODivision{}), auth.PrivLevelOperations, Authenticated, nil, 4537138003},
 		{api.Version{Major: 4, Minor: 0}, http.MethodDelete, `divisions/{id}$`, api.DeleteHandler(&division.TODivision{}), auth.PrivLevelOperations, Authenticated, nil, 43253822373},
 
-		{api.Version{Major: 4, Minor: 0}, http.MethodGet, `logs/?$`, logs.Get, auth.PrivLevelReadOnly, Authenticated, nil, 4483405503},
+		{api.Version{Major: 4, Minor: 0}, http.MethodGet, `logs/?$`, logs.Getv40, auth.PrivLevelReadOnly, Authenticated, nil, 4483405503},
 		{api.Version{Major: 4, Minor: 0}, http.MethodGet, `logs/newcount/?$`, logs.GetNewCount, auth.PrivLevelReadOnly, Authenticated, nil, 44058330123},
 
 		//Content invalidation jobs