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

zrhoffman 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 c927950f06 Fix t3c for TO resp with profile or profileNames (#6823)
c927950f06 is described below

commit c927950f064030cb9f36db087272c71e75147f0f
Author: Robert O Butts <[email protected]>
AuthorDate: Fri May 13 16:28:56 2022 -0600

    Fix t3c for TO resp with profile or profileNames (#6823)
---
 cache-config/t3cutil/toreq/clientfuncs.go |  4 +--
 cache-config/t3cutil/toreq/conversions.go | 49 +++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/cache-config/t3cutil/toreq/clientfuncs.go 
b/cache-config/t3cutil/toreq/clientfuncs.go
index 4efeef2adb..54ea949607 100644
--- a/cache-config/t3cutil/toreq/clientfuncs.go
+++ b/cache-config/t3cutil/toreq/clientfuncs.go
@@ -130,7 +130,7 @@ func (cl *TOClient) GetServers(reqHdr http.Header) 
([]atscfg.Server, toclientlib
        servers := []atscfg.Server{}
        reqInf := toclientlib.ReqInf{}
        err := torequtil.GetRetry(cl.NumRetries, "servers", &servers, func(obj 
interface{}) error {
-               toServers, toReqInf, err := cl.c.GetServers(*ReqOpts(reqHdr))
+               toServers, toReqInf, err := 
cl.GetServersCompat(*ReqOpts(reqHdr))
                if err != nil {
                        return errors.New("getting servers from Traffic Ops '" 
+ torequtil.MaybeIPStr(reqInf.RemoteAddr) + "': " + err.Error())
                }
@@ -158,7 +158,7 @@ func (cl *TOClient) GetServerByHostName(serverHostName 
string, reqHdr http.Heade
        err := torequtil.GetRetry(cl.NumRetries, "server-name-"+serverHostName, 
&server, func(obj interface{}) error {
                params := url.Values{}
                params.Add("hostName", serverHostName)
-               toServers, toReqInf, err := 
cl.c.GetServers(toclient.RequestOptions{
+               toServers, toReqInf, err := 
cl.GetServersCompat(toclient.RequestOptions{
                        QueryParameters: params,
                        Header:          reqHdr,
                })
diff --git a/cache-config/t3cutil/toreq/conversions.go 
b/cache-config/t3cutil/toreq/conversions.go
index 74c232493a..ab098a5eaa 100644
--- a/cache-config/t3cutil/toreq/conversions.go
+++ b/cache-config/t3cutil/toreq/conversions.go
@@ -192,3 +192,52 @@ func (cl *TOClient) SetServerUpdateStatusCompat(serverName 
string, configApplyTi
        reqInf, err := cl.c.TOClient.Req(http.MethodPost, path, nil, 
opts.Header, &alerts)
        return alerts, reqInf, err
 }
+
+// GetServersCompat gets servers from any Traffic Ops built from the ATC 
`master` branch, and converts the different formats to the latest.
+// This makes t3c work with old or new Traffic Ops deployed from `master`,
+// though it doesn't make a version of t3c older than this work with a new TO,
+// which isn't logically possible from the client.
+func (cl *TOClient) GetServersCompat(opts toclient.RequestOptions) 
(tc.ServersV4Response, toclientlib.ReqInf, error) {
+       path := "/servers"
+       objs := struct {
+               Response []ServerV40PlusLegacy `json:"response"`
+               tc.Alerts
+       }{}
+
+       if len(opts.QueryParameters) > 0 {
+               path += "?" + opts.QueryParameters.Encode()
+       }
+       reqInf, err := cl.c.TOClient.Req(http.MethodGet, path, nil, 
opts.Header, &objs)
+       if err != nil {
+               return tc.ServersV4Response{}, reqInf, errors.New("request: " + 
err.Error())
+       }
+
+       resp := tc.ServersV4Response{Alerts: objs.Alerts}
+       for _, sv := range objs.Response {
+               newSv, err := ServerV40FromLegacy(sv)
+               if err != nil {
+                       return tc.ServersV4Response{}, reqInf, 
errors.New("converting server from possible legacy format: " + err.Error())
+               }
+               resp.Response = append(resp.Response, newSv)
+       }
+       return resp, reqInf, nil
+}
+
+type ServerV40PlusLegacy struct {
+       tc.ServerV40
+       Profile     string `json:"profile" db:"profile"`
+       ProfileDesc string `json:"profileDesc" db:"profile_desc"`
+       ProfileID   int    `json:"profileId" db:"profile_id"`
+}
+
+func ServerV40FromLegacy(old ServerV40PlusLegacy) (tc.ServerV40, error) {
+       new := old.ServerV40
+       if len(new.ProfileNames) != 0 {
+               return new, nil
+       }
+       if old.Profile == "" {
+               return tc.ServerV40{}, errors.New("got server with neither 
profileNames nor profile")
+       }
+       new.ProfileNames = []string{old.Profile}
+       return new, nil
+}

Reply via email to