dg4prez closed pull request #2964: Cherry Pick PR #2919 to 3.0.x
URL: https://github.com/apache/trafficcontrol/pull/2964
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/lib/go-tc/deliveryservices.go b/lib/go-tc/deliveryservices.go
index effa7118f..ec8a04e31 100644
--- a/lib/go-tc/deliveryservices.go
+++ b/lib/go-tc/deliveryservices.go
@@ -385,7 +385,7 @@ func (ds *DeliveryServiceNullableV12) Validate(tx *sql.Tx) 
error {
 
 func (ds *DeliveryServiceNullable) Sanitize() {
        ds.DeliveryServiceNullableV12.Sanitize()
-       signedAlgorithm := "url_sig"
+       signedAlgorithm := SigningAlgorithmURLSig
        if ds.Signed && (ds.SigningAlgorithm == nil || *ds.SigningAlgorithm == 
"") {
                ds.SigningAlgorithm = &signedAlgorithm
        }
diff --git a/lib/go-tc/enum.go b/lib/go-tc/enum.go
index 4ab943f1c..283734633 100644
--- a/lib/go-tc/enum.go
+++ b/lib/go-tc/enum.go
@@ -137,6 +137,8 @@ func DSTypeCategoryFromString(s string) DSTypeCategory {
        }
 }
 
+const SigningAlgorithmURLSig = "url_sig"
+
 // CacheStatus represents the Traffic Server status set in Traffic Ops 
(online, offline, admin_down, reported). The string values of this type should 
match the Traffic Ops values.
 type CacheStatus string
 
diff --git 
a/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservicesv13.go 
b/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservicesv13.go
index 6075e3faa..9a12e0120 100644
--- a/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservicesv13.go
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/deliveryservicesv13.go
@@ -204,18 +204,10 @@ func create(tx *sql.Tx, cfg config.Config, user 
*auth.CurrentUser, ds tc.Deliver
 
        ds.ExampleURLs = MakeExampleURLs(ds.Protocol, *ds.Type, 
*ds.RoutingName, *ds.MatchList, cdnDomain)
 
-       if err := ensureHeaderRewriteParams(tx, *ds.ID, *ds.XMLID, 
ds.EdgeHeaderRewrite, edgeTier, *ds.Type); err != nil {
-               return tc.DeliveryServiceNullable{}, 
http.StatusInternalServerError, nil, errors.New("creating edge header rewrite 
parameters: " + err.Error())
-       }
-       if err := ensureHeaderRewriteParams(tx, *ds.ID, *ds.XMLID, 
ds.MidHeaderRewrite, midTier, *ds.Type); err != nil {
-               return tc.DeliveryServiceNullable{}, 
http.StatusInternalServerError, nil, errors.New("creating mid header rewrite 
parameters: " + err.Error())
-       }
-       if err := ensureRegexRemapParams(tx, *ds.ID, *ds.XMLID, ds.RegexRemap); 
err != nil {
-               return tc.DeliveryServiceNullable{}, 
http.StatusInternalServerError, nil, errors.New("creating regex remap 
parameters: " + err.Error())
-       }
-       if err := ensureCacheURLParams(tx, *ds.ID, *ds.XMLID, ds.CacheURL); err 
!= nil {
-               return tc.DeliveryServiceNullable{}, 
http.StatusInternalServerError, nil, errors.New("creating cache url parameters: 
" + err.Error())
+       if err := EnsureParams(tx, *ds.ID, *ds.XMLID, ds.EdgeHeaderRewrite, 
ds.MidHeaderRewrite, ds.RegexRemap, ds.CacheURL, ds.SigningAlgorithm, dsType); 
err != nil {
+               return tc.DeliveryServiceNullable{}, 
http.StatusInternalServerError, nil, errors.New("ensuring ds parameters:: " + 
err.Error())
        }
+
        if dnssecEnabled {
                if err := PutDNSSecKeys(tx, &cfg, *ds.XMLID, cdnName, 
ds.ExampleURLs); err != nil {
                        return tc.DeliveryServiceNullable{}, 
http.StatusInternalServerError, nil, errors.New("creating DNSSEC keys: " + 
err.Error())
@@ -529,17 +521,8 @@ func update(tx *sql.Tx, cfg config.Config, user 
*auth.CurrentUser, ds *tc.Delive
                }
        }
 
-       if err := ensureHeaderRewriteParams(tx, *ds.ID, *ds.XMLID, 
ds.EdgeHeaderRewrite, edgeTier, *ds.Type); err != nil {
-               return tc.DeliveryServiceNullable{}, 
http.StatusInternalServerError, nil, errors.New("creating edge header rewrite 
parameters: " + err.Error())
-       }
-       if err := ensureHeaderRewriteParams(tx, *ds.ID, *ds.XMLID, 
ds.MidHeaderRewrite, midTier, *ds.Type); err != nil {
-               return tc.DeliveryServiceNullable{}, 
http.StatusInternalServerError, nil, errors.New("creating mid header rewrite 
parameters: " + err.Error())
-       }
-       if err := ensureRegexRemapParams(tx, *ds.ID, *ds.XMLID, ds.RegexRemap); 
err != nil {
-               return tc.DeliveryServiceNullable{}, 
http.StatusInternalServerError, nil, errors.New("creating mid regex remap 
parameters: " + err.Error())
-       }
-       if err := ensureCacheURLParams(tx, *ds.ID, *ds.XMLID, ds.CacheURL); err 
!= nil {
-               return tc.DeliveryServiceNullable{}, 
http.StatusInternalServerError, nil, errors.New("creating mid cacheurl 
parameters: " + err.Error())
+       if err := EnsureParams(tx, *ds.ID, *ds.XMLID, ds.EdgeHeaderRewrite, 
ds.MidHeaderRewrite, ds.RegexRemap, ds.CacheURL, ds.SigningAlgorithm, dsType); 
err != nil {
+               return tc.DeliveryServiceNullable{}, 
http.StatusInternalServerError, nil, errors.New("ensuring ds parameters:: " + 
err.Error())
        }
 
        if err := updatePrimaryOrigin(tx, user, *ds); err != nil {
@@ -631,7 +614,7 @@ func readGetDeliveryServices(params map[string]string, tx 
*sqlx.Tx, user *auth.C
                if ds.DeepCachingType != nil {
                        *ds.DeepCachingType = 
tc.DeepCachingTypeFromString(string(*ds.DeepCachingType))
                }
-               ds.Signed = ds.SigningAlgorithm != nil && *ds.SigningAlgorithm 
== "url_sig"
+               ds.Signed = ds.SigningAlgorithm != nil && *ds.SigningAlgorithm 
== tc.SigningAlgorithmURLSig
                dses = append(dses, ds)
        }
 
@@ -810,6 +793,27 @@ const (
        edgeTier
 )
 
+// EnsureParams ensures the given delivery service's necessary parameters 
exist on profiles of servers assigned to the delivery service.
+// Note the edgeHeaderRewrite, midHeaderRewrite, regexRemap, and cacheURL may 
be nil, if the delivery service does not have those values.
+func EnsureParams(tx *sql.Tx, dsID int, xmlID string, edgeHeaderRewrite 
*string, midHeaderRewrite *string, regexRemap *string, cacheURL *string, 
signingAlgorithm *string, dsType tc.DSType) error {
+       if err := ensureHeaderRewriteParams(tx, dsID, xmlID, edgeHeaderRewrite, 
edgeTier, dsType); err != nil {
+               return errors.New("creating edge header rewrite parameters: " + 
err.Error())
+       }
+       if err := ensureHeaderRewriteParams(tx, dsID, xmlID, midHeaderRewrite, 
midTier, dsType); err != nil {
+               return errors.New("creating mid header rewrite parameters: " + 
err.Error())
+       }
+       if err := ensureRegexRemapParams(tx, dsID, xmlID, regexRemap); err != 
nil {
+               return errors.New("creating mid regex remap parameters: " + 
err.Error())
+       }
+       if err := ensureCacheURLParams(tx, dsID, xmlID, cacheURL); err != nil {
+               return errors.New("creating mid cacheurl parameters: " + 
err.Error())
+       }
+       if err := ensureURLSigParams(tx, dsID, xmlID, signingAlgorithm); err != 
nil {
+               return errors.New("creating urlsig parameters: " + err.Error())
+       }
+       return nil
+}
+
 func ensureHeaderRewriteParams(tx *sql.Tx, dsID int, xmlID string, hdrRW 
*string, tier tierType, dsType tc.DSType) error {
        if tier == midTier && dsType.IsLive() && !dsType.IsNational() {
                return nil // live local DSes don't get remap rules
@@ -841,6 +845,18 @@ ON CONFLICT DO NOTHING
        return nil
 }
 
+func ensureURLSigParams(tx *sql.Tx, dsID int, xmlID string, signingAlgorithm 
*string) error {
+       configFile := "url_sig_" + xmlID + ".config"
+       if signingAlgorithm == nil || *signingAlgorithm != 
tc.SigningAlgorithmURLSig {
+               return deleteLocationParam(tx, configFile)
+       }
+       locationParamID, err := ensureLocation(tx, configFile)
+       if err != nil {
+               return err
+       }
+       return createDSLocationProfileParams(tx, locationParamID, dsID)
+}
+
 func ensureRegexRemapParams(tx *sql.Tx, dsID int, xmlID string, regexRemap 
*string) error {
        configFile := "regex_remap_" + xmlID + ".config"
        if regexRemap == nil || *regexRemap == "" {
diff --git a/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers.go 
b/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers.go
index a9888b0f6..5dbecdc07 100644
--- a/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers.go
+++ b/traffic_ops/traffic_ops_golang/deliveryservice/servers/servers.go
@@ -23,6 +23,7 @@ import (
        "database/sql"
        "encoding/json"
        "errors"
+       "fmt"
        "net/http"
        "strconv"
 
@@ -240,7 +241,7 @@ func GetReplaceHandler(w http.ResponseWriter, r 
*http.Request) {
                return
        }
 
-       xmlID, ok, err := deliveryservice.GetXMLID(inf.Tx.Tx, *dsId)
+       ds, ok, err := GetDSInfo(inf.Tx.Tx, *dsId)
        if err != nil {
                api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, 
nil, errors.New("deliveryserviceserver getting XMLID: "+err.Error()))
                return
@@ -249,7 +250,7 @@ func GetReplaceHandler(w http.ResponseWriter, r 
*http.Request) {
                api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest, 
errors.New("no delivery service with that ID exists"), nil)
                return
        }
-       if userErr, sysErr, errCode := tenant.Check(inf.User, xmlID, 
inf.Tx.Tx); userErr != nil || sysErr != nil {
+       if userErr, sysErr, errCode := tenant.Check(inf.User, ds.Name, 
inf.Tx.Tx); userErr != nil || sysErr != nil {
                api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
                return
        }
@@ -282,6 +283,12 @@ func GetReplaceHandler(w http.ResponseWriter, r 
*http.Request) {
                }
                respServers = append(respServers, server)
        }
+
+       if err := deliveryservice.EnsureParams(inf.Tx.Tx, *dsId, ds.Name, 
ds.EdgeHeaderRewrite, ds.MidHeaderRewrite, ds.RegexRemap, ds.CacheURL, 
ds.SigningAlgorithm, ds.Type); err != nil {
+               api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, 
nil, errors.New("deliveryservice_server replace ensuring ds parameters: 
"+err.Error()))
+               return
+       }
+
        api.WriteRespAlertObj(w, r, tc.SuccessLevel, "server assignements 
complete", tc.DSSMapResponse{*dsId, *payload.Replace, respServers})
 }
 
@@ -301,19 +308,20 @@ func GetCreateHandler(w http.ResponseWriter, r 
*http.Request) {
        }
        defer inf.Close()
 
-       if userErr, sysErr, errCode := tenant.Check(inf.User, 
inf.Params["xml_id"], inf.Tx.Tx); userErr != nil || sysErr != nil {
+       dsName := inf.Params["xml_id"]
+
+       if userErr, sysErr, errCode := tenant.Check(inf.User, dsName, 
inf.Tx.Tx); userErr != nil || sysErr != nil {
                api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
                return
        }
 
-       dsID := 0
-       if err := inf.Tx.Tx.QueryRow(selectDeliveryService(), 
inf.Params["xml_id"]).Scan(&dsID); err != nil {
-               if err == sql.ErrNoRows {
-                       api.HandleErr(w, r, inf.Tx.Tx, http.StatusNotFound, 
nil, errors.New("delivery service not found"))
-                       return
-               }
+       ds, ok, err := GetDSInfoByName(inf.Tx.Tx, dsName)
+       if err != nil {
                api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, 
nil, errors.New("ds servers create scanning: "+err.Error()))
                return
+       } else if !ok {
+               api.HandleErr(w, r, inf.Tx.Tx, http.StatusNotFound, nil, 
errors.New("delivery service not found"))
+               return
        }
 
        // get list of server Ids to insert
@@ -322,10 +330,10 @@ func GetCreateHandler(w http.ResponseWriter, r 
*http.Request) {
                api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest, 
errors.New("malformed JSON"), nil)
                return
        }
-       payload.XmlId = inf.Params["xml_id"]
+       payload.XmlId = dsName
        serverNames := payload.ServerNames
 
-       res, err := inf.Tx.Tx.Exec(`INSERT INTO deliveryservice_server 
(deliveryservice, server) SELECT $1, id FROM server WHERE host_name = 
ANY($2::text[])`, dsID, pq.Array(serverNames))
+       res, err := inf.Tx.Tx.Exec(`INSERT INTO deliveryservice_server 
(deliveryservice, server) SELECT $1, id FROM server WHERE host_name = 
ANY($2::text[])`, ds.ID, pq.Array(serverNames))
        if err != nil {
                if pqErr, ok := err.(*pq.Error); ok {
                        err, eType := 
dbhelpers.ParsePQUniqueConstraintError(pqErr)
@@ -348,12 +356,13 @@ func GetCreateHandler(w http.ResponseWriter, r 
*http.Request) {
                api.HandleErr(w, r, inf.Tx.Tx, http.StatusNotFound, 
errors.New("servers not found"), nil)
                return
        }
-       api.WriteResp(w, r, tc.DeliveryServiceServers{payload.ServerNames, 
payload.XmlId})
-}
 
-func selectDeliveryService() string {
-       query := `SELECT id FROM deliveryservice WHERE xml_id = $1`
-       return query
+       if err := deliveryservice.EnsureParams(inf.Tx.Tx, ds.ID, ds.Name, 
ds.EdgeHeaderRewrite, ds.MidHeaderRewrite, ds.RegexRemap, ds.CacheURL, 
ds.SigningAlgorithm, ds.Type); err != nil {
+               api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, 
nil, errors.New("deliveryservice_server replace ensuring ds parameters: 
"+err.Error()))
+               return
+       }
+
+       api.WriteResp(w, r, tc.DeliveryServiceServers{payload.ServerNames, 
payload.XmlId})
 }
 
 func insertIdsQuery() string {
@@ -592,3 +601,70 @@ func updateQuery() string {
       RETURNING last_updated`
        return query
 }
+
+type DSInfo struct {
+       ID                int
+       Name              string
+       Type              tc.DSType
+       EdgeHeaderRewrite *string
+       MidHeaderRewrite  *string
+       RegexRemap        *string
+       SigningAlgorithm  *string
+       CacheURL          *string
+}
+
+// GetDSInfo loads the DeliveryService fields needed by Delivery Service 
Servers from the database, from the ID. Returns the data, whether the delivery 
service was found, and any error.
+func GetDSInfo(tx *sql.Tx, id int) (DSInfo, bool, error) {
+       qry := `
+SELECT
+  ds.xml_id,
+  tp.name as type,
+  ds.edge_header_rewrite,
+  ds.mid_header_rewrite,
+  ds.regex_remap,
+  ds.signing_algorithm,
+  ds.cacheurl
+FROM
+  deliveryservice ds
+  JOIN type tp ON ds.type = tp.id
+WHERE
+  ds.id = $1
+`
+       di := DSInfo{ID: id}
+       if err := tx.QueryRow(qry, id).Scan(&di.Name, &di.Type, 
&di.EdgeHeaderRewrite, &di.MidHeaderRewrite, &di.RegexRemap, 
&di.SigningAlgorithm, &di.CacheURL); err != nil {
+               if err == sql.ErrNoRows {
+                       return DSInfo{}, false, nil
+               }
+               return DSInfo{}, false, fmt.Errorf("querying delivery service 
server ds info '%v': %v", id, err)
+       }
+       di.Type = tc.DSTypeFromString(string(di.Type))
+       return di, true, nil
+}
+
+// GetDSInfoByName loads the DeliveryService fields needed by Delivery Service 
Servers from the database, from the ID. Returns the data, whether the delivery 
service was found, and any error.
+func GetDSInfoByName(tx *sql.Tx, dsName string) (DSInfo, bool, error) {
+       qry := `
+SELECT
+  ds.id,
+  tp.name as type,
+  ds.edge_header_rewrite,
+  ds.mid_header_rewrite,
+  ds.regex_remap,
+  ds.signing_algorithm,
+  ds.cacheurl
+FROM
+  deliveryservice ds
+  JOIN type tp ON ds.type = tp.id
+WHERE
+  ds.xml_id = $1
+`
+       di := DSInfo{Name: dsName}
+       if err := tx.QueryRow(qry, dsName).Scan(&di.ID, &di.Type, 
&di.EdgeHeaderRewrite, &di.MidHeaderRewrite, &di.RegexRemap, 
&di.SigningAlgorithm, &di.CacheURL); err != nil {
+               if err == sql.ErrNoRows {
+                       return DSInfo{}, false, nil
+               }
+               return DSInfo{}, false, fmt.Errorf("querying delivery service 
server ds info by name '%v': %v", dsName, err)
+       }
+       di.Type = tc.DSTypeFromString(string(di.Type))
+       return di, true, nil
+}


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to