You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by sh...@apache.org on 2019/06/15 01:50:53 UTC

[trafficcontrol] branch master updated: Fix TO ats config meta to accept names

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

shihta pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new 92f30df  Fix TO ats config meta to accept names
92f30df is described below

commit 92f30df0e6debd710158a26c84ed4f8ded4db74c
Author: Robert Butts <ro...@apache.org>
AuthorDate: Tue Jun 11 21:11:33 2019 -0600

    Fix TO ats config meta to accept names
    
    Fixes #3673
---
 traffic_ops/traffic_ops_golang/ats/config.go       | 24 +++++++++++++++++++++-
 traffic_ops/traffic_ops_golang/ats/meta.go         | 10 +++++++--
 .../traffic_ops_golang/dbhelpers/db_helpers.go     | 23 +++++++++++++++++++++
 traffic_ops/traffic_ops_golang/routing/routes.go   |  2 +-
 4 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/traffic_ops/traffic_ops_golang/ats/config.go b/traffic_ops/traffic_ops_golang/ats/config.go
index 06225d4..8e9c1d8 100644
--- a/traffic_ops/traffic_ops_golang/ats/config.go
+++ b/traffic_ops/traffic_ops_golang/ats/config.go
@@ -99,6 +99,29 @@ func getCDNNameFromNameOrID(tx *sql.Tx, cdnNameOrID string) (string, error, erro
 	return cdnName, nil, nil, http.StatusOK
 }
 
+// getServerNameFromNameOrID returns the server name from a parameter which may be the name or ID.
+// This also checks and verifies the existence of the given server, and returns an appropriate user error if it doesn't exist.
+// Returns the name, any user error, any system error, and any error code.
+func getServerNameFromNameOrID(tx *sql.Tx, serverNameOrID string) (string, error, error, int) {
+	if serverID, err := strconv.Atoi(serverNameOrID); err == nil {
+		serverName, ok, err := dbhelpers.GetServerNameFromID(tx, int64(serverID))
+		if err != nil {
+			return "", nil, fmt.Errorf("getting server name from id %v: %v", serverID, err), http.StatusInternalServerError
+		} else if !ok {
+			return "", errors.New("server not found"), nil, http.StatusNotFound
+		}
+		return string(serverName), nil, nil, http.StatusOK
+	}
+
+	serverName := serverNameOrID
+	if ok, err := dbhelpers.ServerExists(serverName, tx); err != nil {
+		return "", nil, fmt.Errorf("checking server name '%v' existence: %v", serverName, err), http.StatusInternalServerError
+	} else if !ok {
+		return "", errors.New("server not found"), nil, http.StatusNotFound
+	}
+	return serverName, nil, nil, http.StatusOK
+}
+
 func headerComment(tx *sql.Tx, name string) (string, error) {
 	nameVersionStr, err := GetNameVersionString(tx)
 	if err != nil {
@@ -106,4 +129,3 @@ func headerComment(tx *sql.Tx, name string) (string, error) {
 	}
 	return "# DO NOT EDIT - Generated for " + name + " by " + nameVersionStr + " on " + time.Now().Format(HeaderCommentDateFormat) + "\n", nil
 }
-
diff --git a/traffic_ops/traffic_ops_golang/ats/meta.go b/traffic_ops/traffic_ops_golang/ats/meta.go
index a7eb994..c2dbe9c 100644
--- a/traffic_ops/traffic_ops_golang/ats/meta.go
+++ b/traffic_ops/traffic_ops_golang/ats/meta.go
@@ -31,14 +31,20 @@ import (
 )
 
 func GetConfigMetaData(w http.ResponseWriter, r *http.Request) {
-	inf, userErr, sysErr, errCode := api.NewInfo(r, []string{"id"}, []string{"id"})
+	inf, userErr, sysErr, errCode := api.NewInfo(r, []string{"server-name-or-id"}, nil)
 	if userErr != nil || sysErr != nil {
 		api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
 		return
 	}
 	defer inf.Close()
 
-	server, ok, err := getServerInfoByID(inf.Tx.Tx, inf.IntParams["id"])
+	serverName, userErr, sysErr, errCode := getServerNameFromNameOrID(inf.Tx.Tx, inf.Params["server-name-or-id"])
+	if userErr != nil || sysErr != nil {
+		api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
+		return
+	}
+
+	server, ok, err := getServerInfoByHost(inf.Tx.Tx, serverName)
 	if err != nil {
 		api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("GetConfigMetaData getting server info: "+err.Error()))
 		return
diff --git a/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go b/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go
index 1ce496f..97bbc93 100644
--- a/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go
+++ b/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go
@@ -230,6 +230,29 @@ func GetCDNDomainFromName(tx *sql.Tx, cdnName tc.CDNName) (string, bool, error)
 	return domain, true, nil
 }
 
+// ServerExists returns true if the server exists.
+func ServerExists(serverName string, tx *sql.Tx) (bool, error) {
+	id := 0
+	if err := tx.QueryRow(`SELECT id FROM server WHERE host_name = $1`, serverName).Scan(&id); err != nil {
+		if err == sql.ErrNoRows {
+			return false, nil
+		}
+		return false, errors.New("querying server name: " + err.Error())
+	}
+	return true, nil
+}
+
+func GetServerNameFromID(tx *sql.Tx, id int64) (string, bool, error) {
+	name := ""
+	if err := tx.QueryRow(`SELECT host_name FROM server WHERE id = $1`, id).Scan(&name); err != nil {
+		if err == sql.ErrNoRows {
+			return "", false, nil
+		}
+		return "", false, errors.New("querying server name: " + err.Error())
+	}
+	return name, true, nil
+}
+
 func GetCDNDSes(tx *sql.Tx, cdn tc.CDNName) (map[tc.DeliveryServiceName]struct{}, error) {
 	dses := map[tc.DeliveryServiceName]struct{}{}
 	qry := `SELECT xml_id from deliveryservice where cdn_id = (select id from cdn where name = $1)`
diff --git a/traffic_ops/traffic_ops_golang/routing/routes.go b/traffic_ops/traffic_ops_golang/routing/routes.go
index 179bf56..f8fb469 100644
--- a/traffic_ops/traffic_ops_golang/routing/routes.go
+++ b/traffic_ops/traffic_ops_golang/routing/routes.go
@@ -377,7 +377,7 @@ func Routes(d ServerData) ([]Route, []RawRoute, http.Handler, error) {
 		{1.1, http.MethodPut, `snapshot/{cdn}/?$`, crconfig.SnapshotHandler, auth.PrivLevelOperations, Authenticated, nil},
 
 		// ATS config files
-		{1.1, http.MethodGet, `servers/{id}/configfiles/ats/?(\.json)?$`, ats.GetConfigMetaData, auth.PrivLevelOperations, Authenticated, nil},
+		{1.1, http.MethodGet, `servers/{server-name-or-id}/configfiles/ats/?(\.json)?$`, ats.GetConfigMetaData, auth.PrivLevelOperations, Authenticated, nil},
 		{1.1, http.MethodGet, `cdns/{cdn-name-or-id}/configfiles/ats/regex_revalidate.config/?(\.json)?$`, ats.GetRegexRevalidateDotConfig, auth.PrivLevelOperations, Authenticated, nil},
 		{1.1, http.MethodGet, `cdns/{cdn-name-or-id}/configfiles/ats/hdr_rw_mid_{xml-id}.config/?(\.json)?$`, ats.GetMidHeaderRewriteDotConfig, auth.PrivLevelOperations, Authenticated, nil},
 		{1.1, http.MethodGet, `cdns/{cdn-name-or-id}/configfiles/ats/hdr_rw_{xml-id}.config/?(\.json)?$`, ats.GetEdgeHeaderRewriteDotConfig, auth.PrivLevelOperations, Authenticated, nil},