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

ocket8888 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 9a7db19  PUT /snapshot?cdn=not-found returns 404 (#4556)
9a7db19 is described below

commit 9a7db19f5e169252c34cd945a6eaa0b36e0a564c
Author: Jeremy Mitchell <[email protected]>
AuthorDate: Wed Apr 1 11:42:43 2020 -0600

    PUT /snapshot?cdn=not-found returns 404 (#4556)
    
    * adds 404 if cdn name not found as well as a couple of snapshot tests
    
    * uses dbhelpers.GetCDNIDFromName to get more granular error info
---
 traffic_ops/client/crconfig.go                     | 24 ++++++++++-
 traffic_ops/testing/api/v2/crconfig_test.go        | 46 ++++++++++++++++++++++
 traffic_ops/traffic_ops_golang/crconfig/handler.go | 11 ++++++
 3 files changed, 80 insertions(+), 1 deletion(-)

diff --git a/traffic_ops/client/crconfig.go b/traffic_ops/client/crconfig.go
index 2bbe99b..27f15de 100644
--- a/traffic_ops/client/crconfig.go
+++ b/traffic_ops/client/crconfig.go
@@ -17,10 +17,16 @@ package client
 
 import (
        "encoding/json"
+       "fmt"
+       "github.com/apache/trafficcontrol/lib/go-tc"
        "net/http"
        "net/url"
 )
 
+const (
+       API_SNAPSHOT = apiBase + "/snapshot"
+)
+
 type OuterResponse struct {
        Response json.RawMessage `json:"response"`
 }
@@ -40,9 +46,25 @@ func (to *Session) GetCRConfig(cdn string) ([]byte, ReqInf, 
error) {
        return []byte(resp.Response), reqInf, nil
 }
 
+// SnapshotCRConfig snapshots a CDN by name.
 func (to *Session) SnapshotCRConfig(cdn string) (ReqInf, error) {
-       uri := apiBase + `/snapshot?cdn=` + url.QueryEscape(cdn)
+       uri := fmt.Sprintf("%s?cdn=%s", API_SNAPSHOT, url.QueryEscape(cdn))
        _, remoteAddr, err := to.request(http.MethodPut, uri, nil)
        reqInf := ReqInf{RemoteAddr: remoteAddr, CacheHitStatus: 
CacheHitStatusMiss}
        return reqInf, err
 }
+
+// SnapshotCDNByID snapshots a CDN by ID.
+func (to *Session) SnapshotCRConfigByID(id int) (tc.Alerts, ReqInf, error) {
+       url := fmt.Sprintf("%s?cdnID=%d", API_SNAPSHOT, id)
+       resp, remoteAddr, err := to.request(http.MethodPut, url, nil)
+       reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss, RemoteAddr: 
remoteAddr}
+       if err != nil {
+               return tc.Alerts{}, reqInf, err
+       }
+       defer resp.Body.Close()
+       var alerts tc.Alerts
+       err = json.NewDecoder(resp.Body).Decode(&alerts)
+       return alerts, reqInf, nil
+}
+
diff --git a/traffic_ops/testing/api/v2/crconfig_test.go 
b/traffic_ops/testing/api/v2/crconfig_test.go
index 47a38e5..cce4404 100644
--- a/traffic_ops/testing/api/v2/crconfig_test.go
+++ b/traffic_ops/testing/api/v2/crconfig_test.go
@@ -26,6 +26,10 @@ import (
 func TestCRConfig(t *testing.T) {
        WithObjs(t, []TCObj{CDNs, Types, Tenants, Parameters, Profiles, 
Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, 
DeliveryServices}, func() {
                UpdateTestCRConfigSnapshot(t)
+               SnapshotTestCDNbyName(t)
+               SnapshotTestCDNbyInvalidName(t)
+               SnapshotTestCDNbyID(t)
+               SnapshotTestCDNbyInvalidID(t)
        })
 }
 
@@ -134,3 +138,45 @@ func UpdateTestCRConfigSnapshot(t *testing.T) {
                t.Fatalf("cannot DELETE Parameter by name: %v - %v", err, 
delResp)
        }
 }
+
+func SnapshotTestCDNbyName(t *testing.T) {
+
+       firstCDN := testData.CDNs[0]
+       _, err := TOSession.SnapshotCRConfig(firstCDN.Name)
+       if err != nil {
+               t.Errorf("failed to snapshot CDN by name: %v", err)
+       }
+}
+
+func SnapshotTestCDNbyInvalidName(t *testing.T) {
+
+       invalidCDNName := "cdn-invalid"
+       _, err := TOSession.SnapshotCRConfig(invalidCDNName)
+       if err == nil {
+               t.Errorf("snapshot occurred on invalid cdn name: %v - %v", 
invalidCDNName, err)
+       }
+}
+
+func SnapshotTestCDNbyID(t *testing.T) {
+
+       firstCDN := testData.CDNs[0]
+       // Retrieve the CDN by name so we can get the id for the snapshot
+       resp, _, err := TOSession.GetCDNByName(firstCDN.Name)
+       if err != nil {
+               t.Errorf("cannot GET CDN by name: '%s', %v", firstCDN.Name, err)
+       }
+       remoteCDN := resp[0]
+       alert, _, err := TOSession.SnapshotCRConfigByID(remoteCDN.ID)
+       if err != nil {
+               t.Errorf("failed to snapshot CDN by id: %v - %v", err, alert)
+       }
+}
+
+func SnapshotTestCDNbyInvalidID(t *testing.T) {
+
+       invalidCDNID := 999999
+       alert, _, err := TOSession.SnapshotCRConfigByID(invalidCDNID)
+       if err == nil {
+               t.Errorf("snapshot occurred on invalid cdn id: %v - %v - %v", 
invalidCDNID, err, alert)
+       }
+}
diff --git a/traffic_ops/traffic_ops_golang/crconfig/handler.go 
b/traffic_ops/traffic_ops_golang/crconfig/handler.go
index eba20dc..0798e4c 100644
--- a/traffic_ops/traffic_ops_golang/crconfig/handler.go
+++ b/traffic_ops/traffic_ops_golang/crconfig/handler.go
@@ -31,6 +31,7 @@ import (
        "github.com/apache/trafficcontrol/lib/go-rfc"
        "github.com/apache/trafficcontrol/lib/go-tc"
        "github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/api"
+       
"github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/dbhelpers"
        
"github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/deliveryservice"
        
"github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/monitoring"
 )
@@ -174,6 +175,16 @@ func snapshotHandler(w http.ResponseWriter, r 
*http.Request, deprecated bool) {
                        return
                }
                cdn = name
+       } else {
+               _, ok, err := dbhelpers.GetCDNIDFromName(inf.Tx.Tx, 
tc.CDNName(cdn))
+               if err != nil {
+                       api.HandleErrOptionalDeprecation(w, r, inf.Tx.Tx, 
http.StatusInternalServerError, nil, errors.New("Error getting CDN ID from 
name: "+err.Error()), deprecated, &alt)
+                       return
+               }
+               if !ok {
+                       api.HandleErrOptionalDeprecation(w, r, inf.Tx.Tx, 
http.StatusNotFound, errors.New("No CDN ID found with that name"), nil, 
deprecated, &alt)
+                       return
+               }
        }
 
        crConfig, err := Make(inf.Tx.Tx, cdn, inf.User.UserName, r.Host, 
r.URL.Path, inf.Config.Version, inf.Config.CRConfigUseRequestHost, 
inf.Config.CRConfigEmulateOldPath)

Reply via email to