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 3192836086 Update CDN in a Box enroller to use TO API v5 (#7795)
3192836086 is described below
commit 319283608617c7c92db5daf0ccfd0c9a42a08905
Author: Zach Hoffman <[email protected]>
AuthorDate: Tue Sep 12 21:48:17 2023 -0600
Update CDN in a Box enroller to use TO API v5 (#7795)
* Session.CreateServerCapabilityV5 -> Session.CreateServerCapability
* Session.GetServerCapabilitiesV5 -> Session.GetServerCapabilities
* Session.UpdateServerCapabilityV5 -> Session.UpdateServerCapability
* Update CiaB enroller to use TO API v5
* Update field names for API v5
* Remove server response ID validation
---
infrastructure/cdn-in-a-box/enroller/Dockerfile | 1 +
infrastructure/cdn-in-a-box/enroller/enroller.go | 65 +++++++++-------------
.../cdn-in-a-box/enroller/server_template.json | 9 ++-
.../cdn-in-a-box/traffic_ops/to-access.sh | 2 +-
.../deliveryservices/010-demo1.json | 2 +-
.../deliveryservices/020-demo2.json | 2 +-
.../testing/api/v5/server_capabilities_test.go | 12 ++--
traffic_ops/v5-client/servercapability.go | 12 ++--
8 files changed, 47 insertions(+), 58 deletions(-)
diff --git a/infrastructure/cdn-in-a-box/enroller/Dockerfile
b/infrastructure/cdn-in-a-box/enroller/Dockerfile
index 9c431ae837..35a51fa657 100644
--- a/infrastructure/cdn-in-a-box/enroller/Dockerfile
+++ b/infrastructure/cdn-in-a-box/enroller/Dockerfile
@@ -40,6 +40,7 @@ COPY ./go.mod ./go.sum
/go/src/github.com/apache/trafficcontrol/
COPY ./vendor/ /go/src/github.com/apache/trafficcontrol/vendor/
COPY ./traffic_ops/toclientlib/
/go/src/github.com/apache/trafficcontrol/traffic_ops/toclientlib/
COPY ./traffic_ops/v4-client/
/go/src/github.com/apache/trafficcontrol/traffic_ops/v4-client/
+COPY ./traffic_ops/v5-client/
/go/src/github.com/apache/trafficcontrol/traffic_ops/v5-client/
COPY ./infrastructure/cdn-in-a-box/
/go/src/github.com/apache/trafficcontrol/infrastructure/cdn-in-a-box/
# varnishcfg requires t3c for ToData struct and not needed for enroller
diff --git a/infrastructure/cdn-in-a-box/enroller/enroller.go
b/infrastructure/cdn-in-a-box/enroller/enroller.go
index c3a031afed..22bdb274c7 100644
--- a/infrastructure/cdn-in-a-box/enroller/enroller.go
+++ b/infrastructure/cdn-in-a-box/enroller/enroller.go
@@ -34,7 +34,7 @@ import (
log "github.com/apache/trafficcontrol/lib/go-log"
tc "github.com/apache/trafficcontrol/lib/go-tc"
- client "github.com/apache/trafficcontrol/traffic_ops/v4-client"
+ client "github.com/apache/trafficcontrol/traffic_ops/v5-client"
"github.com/fsnotify/fsnotify"
"github.com/kelseyhightower/envconfig"
@@ -51,7 +51,7 @@ func newSession(reqTimeout time.Duration, toURL string,
toUser string, toPass st
return session{s}, err
}
-func (s session) getParameter(m tc.Parameter, header http.Header)
(tc.Parameter, error) {
+func (s session) getParameter(m tc.ParameterV5, header http.Header)
(tc.ParameterV5, error) {
// TODO: s.GetParameterByxxx() does not seem to work with values with
spaces --
// doing this the hard way for now
opts := client.RequestOptions{Header: header}
@@ -70,7 +70,7 @@ func (s session) getParameter(m tc.Parameter, header
http.Header) (tc.Parameter,
// enrollType takes a json file and creates a Type object using the TO API
func enrollType(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.Type
+ var s tc.TypeV5
err := dec.Decode(&s)
if err != nil {
log.Infof("error decoding Type: %s", err)
@@ -100,7 +100,7 @@ func enrollType(toSession *session, r io.Reader) error {
// enrollCDN takes a json file and creates a CDN object using the TO API
func enrollCDN(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.CDN
+ var s tc.CDNV5
err := dec.Decode(&s)
if err != nil {
log.Infof("error decoding CDN: %v", err)
@@ -128,7 +128,7 @@ func enrollCDN(toSession *session, r io.Reader) error {
func enrollASN(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.ASN
+ var s tc.ASNV5
err := dec.Decode(&s)
if err != nil {
log.Infof("error decoding ASN: %s\n", err)
@@ -158,7 +158,7 @@ func enrollASN(toSession *session, r io.Reader) error {
// enrollCachegroup takes a json file and creates a Cachegroup object using
the TO API
func enrollCachegroup(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.CacheGroupNullable
+ var s tc.CacheGroupNullableV5
err := dec.Decode(&s)
if err != nil {
log.Infof("error decoding Cache Group: '%s'", err)
@@ -187,7 +187,7 @@ func enrollCachegroup(toSession *session, r io.Reader)
error {
func enrollTopology(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.Topology
+ var s tc.TopologyV5
err := dec.Decode(&s)
if err != nil && err != io.EOF {
log.Infof("error decoding Topology: %s", err)
@@ -216,7 +216,7 @@ func enrollTopology(toSession *session, r io.Reader) error {
func enrollDeliveryService(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.DeliveryServiceV4
+ var s tc.DeliveryServiceV5
err := dec.Decode(&s)
if err != nil {
log.Infof("error decoding DeliveryService: %v", err)
@@ -227,7 +227,7 @@ func enrollDeliveryService(toSession *session, r io.Reader)
error {
if err != nil {
for _, alert := range alerts.Alerts.Alerts {
if strings.Contains(alert.Text, "already exists") {
- log.Infof("Delivery Service '%s' already
exists", *s.XMLID)
+ log.Infof("Delivery Service '%s' already
exists", s.XMLID)
return nil
}
}
@@ -318,10 +318,7 @@ func enrollDeliveryServiceServer(toSession *session, r
io.Reader) error {
if len(servers.Response) == 0 {
return errors.New("no server with hostName " + sn)
}
- if servers.Response[0].ID == nil {
- return fmt.Errorf("Traffic Ops gave back a
representation for server '%s' with null or undefined ID", sn)
- }
- serverIDs = append(serverIDs, *servers.Response[0].ID)
+ serverIDs = append(serverIDs, servers.Response[0].ID)
}
resp, _, err := toSession.CreateDeliveryServiceServers(dsID, serverIDs,
true, client.RequestOptions{})
if err != nil {
@@ -333,7 +330,7 @@ func enrollDeliveryServiceServer(toSession *session, r
io.Reader) error {
func enrollDivision(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.Division
+ var s tc.DivisionV5
err := dec.Decode(&s)
if err != nil {
log.Infof("error decoding Division: %s", err)
@@ -361,21 +358,18 @@ func enrollDivision(toSession *session, r io.Reader)
error {
func enrollOrigin(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.Origin
+ var s tc.OriginV5
err := dec.Decode(&s)
if err != nil {
log.Infof("error decoding Origin: %v", err)
return err
}
- if s.Name == nil {
- return errors.New("cannot create an Origin with no name")
- }
alerts, _, err := toSession.CreateOrigin(s, client.RequestOptions{})
if err != nil {
for _, alert := range alerts.Alerts.Alerts {
if alert.Level == tc.ErrorLevel.String() &&
strings.Contains(alert.Text, "already exists") {
- log.Infof("Origin '%s' already exists", *s.Name)
+ log.Infof("Origin '%s' already exists", s.Name)
return nil
}
}
@@ -392,7 +386,7 @@ func enrollOrigin(toSession *session, r io.Reader) error {
func enrollParameter(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var params []tc.Parameter
+ var params []tc.ParameterV5
err := dec.Decode(¶ms)
if err != nil {
log.Infof("error decoding Parameter: %s\n", err)
@@ -469,7 +463,7 @@ func enrollParameter(toSession *session, r io.Reader) error
{
func enrollPhysLocation(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.PhysLocation
+ var s tc.PhysLocationV5
err := dec.Decode(&s)
if err != nil {
err = fmt.Errorf("error decoding Physical Location: %v", err)
@@ -500,7 +494,7 @@ func enrollPhysLocation(toSession *session, r io.Reader)
error {
func enrollRegion(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.Region
+ var s tc.RegionV5
err := dec.Decode(&s)
if err != nil {
log.Infof("error decoding Region: %s\n", err)
@@ -529,7 +523,7 @@ func enrollRegion(toSession *session, r io.Reader) error {
func enrollStatus(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.StatusNullable
+ var s tc.StatusV5
err := dec.Decode(&s)
if err != nil {
log.Infof("error decoding Status: %s", err)
@@ -557,7 +551,7 @@ func enrollStatus(toSession *session, r io.Reader) error {
func enrollTenant(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.Tenant
+ var s tc.TenantV5
err := dec.Decode(&s)
if err != nil {
log.Infof("error decoding Tenant: %s", err)
@@ -568,7 +562,7 @@ func enrollTenant(toSession *session, r io.Reader) error {
if err != nil {
for _, alert := range alerts.Alerts.Alerts {
if alert.Level == tc.ErrorLevel.String() &&
strings.Contains(alert.Text, "already exists") {
- log.Infof("tenant %s already exists", s.Name)
+ log.Infof("tenant %s already exists", *s.Name)
return nil
}
}
@@ -617,7 +611,7 @@ func enrollUser(toSession *session, r io.Reader) error {
// enrollProfile takes a json file and creates a Profile object using the TO
API
func enrollProfile(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var profile tc.Profile
+ var profile tc.ProfileV5
err := dec.Decode(&profile)
if err != nil {
@@ -700,7 +694,7 @@ func enrollProfile(toSession *session, r io.Reader) error {
if p.Value != nil {
value = *p.Value
}
- param := tc.Parameter{ConfigFile: configFile, Name: name,
Value: value, Secure: secure}
+ param := tc.ParameterV5{ConfigFile: configFile, Name: name,
Value: value, Secure: secure}
eparam, err := toSession.getParameter(param, nil)
if err != nil {
// create it
@@ -750,7 +744,7 @@ func enrollProfile(toSession *session, r io.Reader) error {
// enrollServer takes a json file and creates a Server object using the TO API
func enrollServer(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.ServerV40
+ var s tc.ServerV5
err := dec.Decode(&s)
if err != nil {
log.Infof("error decoding Server: %v", err)
@@ -774,7 +768,7 @@ func enrollServer(toSession *session, r io.Reader) error {
// enrollServerCapability takes a json file and creates a ServerCapabilityV41
object using the TO API
func enrollServerCapability(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.ServerCapabilityV41
+ var s tc.ServerCapabilityV5
err := dec.Decode(&s)
if err != nil {
err = fmt.Errorf("error decoding Server Capability: %v", err)
@@ -782,7 +776,7 @@ func enrollServerCapability(toSession *session, r
io.Reader) error {
return err
}
- alerts, _, err := toSession.CreateServerCapabilityV41(s,
client.RequestOptions{})
+ alerts, _, err := toSession.CreateServerCapability(s,
client.RequestOptions{})
if err != nil {
err = fmt.Errorf("error creating Server Capability: %v -
alerts: %+v", err, alerts.Alerts)
log.Infoln(err)
@@ -827,11 +821,6 @@ func enrollFederation(toSession *session, r io.Reader)
error {
return err
}
deliveryService := deliveryServices.Response[0]
- if deliveryService.CDNName == nil || deliveryService.ID
== nil || deliveryService.XMLID == nil {
- err = fmt.Errorf("Delivery Service '%s' as
returned from Traffic Ops had null or undefined CDN name and/or ID", xmlID)
- log.Infoln(err)
- return err
- }
cdnName = *deliveryService.CDNName
cdnFederation = tc.CDNFederation{
CName: mapping.CName,
@@ -938,7 +927,7 @@ func createFederationResolversOfType(toSession *session,
resolverTypeName tc.Fed
var resolverIDs []int
for _, ipAddress := range ipAddresses {
- resolver := tc.FederationResolver{
+ resolver := tc.FederationResolverV5{
IPAddress: &ipAddress,
TypeID: &typeID,
}
@@ -958,7 +947,7 @@ func createFederationResolversOfType(toSession *session,
resolverTypeName tc.Fed
// enrollServerServerCapability takes a json file and creates a
ServerServerCapability object using the TO API
func enrollServerServerCapability(toSession *session, r io.Reader) error {
dec := json.NewDecoder(r)
- var s tc.ServerServerCapability
+ var s tc.ServerServerCapabilityV5
err := dec.Decode(&s)
if err != nil {
err = fmt.Errorf("error decoding Server/Capability
relationship: %s", err)
@@ -986,7 +975,7 @@ func enrollServerServerCapability(toSession *session, r
io.Reader) error {
log.Infoln(err.Error())
return err
}
- s.ServerID = resp.Response[0].ID
+ s.ServerID = &resp.Response[0].ID
alerts, _, err := toSession.CreateServerServerCapability(s,
client.RequestOptions{})
if err != nil {
diff --git a/infrastructure/cdn-in-a-box/enroller/server_template.json
b/infrastructure/cdn-in-a-box/enroller/server_template.json
index f31a5c124e..97831b67f2 100644
--- a/infrastructure/cdn-in-a-box/enroller/server_template.json
+++ b/infrastructure/cdn-in-a-box/enroller/server_template.json
@@ -1,7 +1,7 @@
{
"hostName": "$MY_HOSTNAME",
"domainName": "$MY_DOMAINNAME",
- "cachegroup": "$MY_CACHE_GROUP",
+ "cacheGroup": "$MY_CACHE_GROUP",
"interfaces": [
{
"ipAddresses": [],
@@ -11,10 +11,9 @@
}
],
"type": "$MY_TYPE",
- "physLocation": "Apachecon North America 2018",
- "profileNames": ["$MY_PROFILE"],
- "cdnName": "$MY_CDN",
- "updPending": false,
+ "physicalLocation": "Apachecon North America 2018",
+ "profiles": ["$MY_PROFILE"],
+ "cdn": "$MY_CDN",
"status": "$MY_STATUS",
"tcpPort": $MY_TCP_PORT,
"httpsPort": $MY_HTTPS_PORT
diff --git a/infrastructure/cdn-in-a-box/traffic_ops/to-access.sh
b/infrastructure/cdn-in-a-box/traffic_ops/to-access.sh
index f86d11f920..0abb08875e 100755
--- a/infrastructure/cdn-in-a-box/traffic_ops/to-access.sh
+++ b/infrastructure/cdn-in-a-box/traffic_ops/to-access.sh
@@ -281,7 +281,7 @@ to-enroll() {
# replace env references in the file
<"/server_template.json" envsubst | #first envsubst expands
$MY_TCP_PORT and $MY_HTTPS_PORT so they are valid JSON
- jq '.cdnName = "$MY_CDN"' |
+ jq '.cdn = "$MY_CDN"' |
if [[ -n "$MY_IP" && -n "$MY_GATEWAY" ]]; then
jq '.interfaces[0].ipAddresses += [({} | .address =
"$MY_IP" | .gateway = "$MY_GATEWAY" | .serviceAddress = true)]'
else
diff --git
a/infrastructure/cdn-in-a-box/traffic_ops_data/deliveryservices/010-demo1.json
b/infrastructure/cdn-in-a-box/traffic_ops_data/deliveryservices/010-demo1.json
index 7c5f5cfbdc..c490f89d45 100644
---
a/infrastructure/cdn-in-a-box/traffic_ops_data/deliveryservices/010-demo1.json
+++
b/infrastructure/cdn-in-a-box/traffic_ops_data/deliveryservices/010-demo1.json
@@ -7,7 +7,7 @@
"orgServerFqdn": "http://origin.infra.ciab.test",
"cdnName": "$CDN_NAME",
"type": "HTTP",
- "active": true,
+ "active": "ACTIVE",
"dscp": 0,
"geoLimit": 0,
"geoProvider": 0,
diff --git
a/infrastructure/cdn-in-a-box/traffic_ops_data/deliveryservices/020-demo2.json
b/infrastructure/cdn-in-a-box/traffic_ops_data/deliveryservices/020-demo2.json
index 38f74e5730..4d73513d55 100644
---
a/infrastructure/cdn-in-a-box/traffic_ops_data/deliveryservices/020-demo2.json
+++
b/infrastructure/cdn-in-a-box/traffic_ops_data/deliveryservices/020-demo2.json
@@ -7,7 +7,7 @@
"orgServerFqdn": "http://origin.infra.ciab.test",
"cdnName": "$CDN_NAME",
"type": "DNS",
- "active": true,
+ "active": "ACTIVE",
"dscp": 0,
"geoLimit": 0,
"geoProvider": 0,
diff --git a/traffic_ops/testing/api/v5/server_capabilities_test.go
b/traffic_ops/testing/api/v5/server_capabilities_test.go
index 36645126b1..1d4fd1d396 100644
--- a/traffic_ops/testing/api/v5/server_capabilities_test.go
+++ b/traffic_ops/testing/api/v5/server_capabilities_test.go
@@ -138,21 +138,21 @@ func TestServerCapabilities(t *testing.T) {
switch method {
case "GET":
t.Run(name, func(t *testing.T) {
- resp, reqInf, err :=
testCase.ClientSession.GetServerCapabilitiesV5(testCase.RequestOpts)
+ resp, reqInf, err :=
testCase.ClientSession.GetServerCapabilities(testCase.RequestOpts)
for _, check := range
testCase.Expectations {
check(t,
reqInf, resp.Response, resp.Alerts, err)
}
})
case "POST":
t.Run(name, func(t *testing.T) {
- resp, reqInf, err :=
testCase.ClientSession.CreateServerCapabilityV5(testCase.RequestBody,
testCase.RequestOpts)
+ resp, reqInf, err :=
testCase.ClientSession.CreateServerCapability(testCase.RequestBody,
testCase.RequestOpts)
for _, check := range
testCase.Expectations {
check(t,
reqInf, resp.Response, resp.Alerts, err)
}
})
case "PUT":
t.Run(name, func(t *testing.T) {
- resp, reqInf, err :=
testCase.ClientSession.UpdateServerCapabilityV5(testCase.RequestOpts.QueryParameters["name"][0],
testCase.RequestBody, testCase.RequestOpts)
+ resp, reqInf, err :=
testCase.ClientSession.UpdateServerCapability(testCase.RequestOpts.QueryParameters["name"][0],
testCase.RequestBody, testCase.RequestOpts)
for _, check := range
testCase.Expectations {
check(t,
reqInf, resp.Response, resp.Alerts, err)
}
@@ -200,13 +200,13 @@ func validateServerCapabilitiesSort() utils.CkReqFunc {
func CreateTestServerCapabilities(t *testing.T) {
for _, sc := range testData.ServerCapabilities {
- resp, _, err := TOSession.CreateServerCapabilityV5(sc,
client.RequestOptions{})
+ resp, _, err := TOSession.CreateServerCapability(sc,
client.RequestOptions{})
assert.RequireNoError(t, err, "Unexpected error creating Server
Capability '%s': %v - alerts: %+v", sc.Name, err, resp.Alerts)
}
}
func DeleteTestServerCapabilities(t *testing.T) {
- serverCapabilities, _, err :=
TOSession.GetServerCapabilitiesV5(client.RequestOptions{})
+ serverCapabilities, _, err :=
TOSession.GetServerCapabilities(client.RequestOptions{})
assert.NoError(t, err, "Cannot get Server Capabilities: %v - alerts:
%+v", err, serverCapabilities.Alerts)
for _, serverCapability := range serverCapabilities.Response {
@@ -215,7 +215,7 @@ func DeleteTestServerCapabilities(t *testing.T) {
// Retrieve the Server Capability to see if it got deleted
opts := client.NewRequestOptions()
opts.QueryParameters.Set("name", serverCapability.Name)
- getServerCapability, _, err :=
TOSession.GetServerCapabilitiesV5(opts)
+ getServerCapability, _, err :=
TOSession.GetServerCapabilities(opts)
assert.NoError(t, err, "Error getting Server Capability '%s'
after deletion: %v - alerts: %+v", serverCapability.Name, err,
getServerCapability.Alerts)
assert.Equal(t, 0, len(getServerCapability.Response), "Expected
Server Capability '%s' to be deleted, but it was found in Traffic Ops",
serverCapability.Name)
}
diff --git a/traffic_ops/v5-client/servercapability.go
b/traffic_ops/v5-client/servercapability.go
index 766dec468e..b955b5cfa1 100644
--- a/traffic_ops/v5-client/servercapability.go
+++ b/traffic_ops/v5-client/servercapability.go
@@ -26,22 +26,22 @@ import (
// endpoint.
const apiServerCapabilities = "/server_capabilities"
-// CreateServerCapabilityV5 creates the given Server Capability.
-func (to *Session) CreateServerCapabilityV5(sc tc.ServerCapabilityV5, opts
RequestOptions) (tc.ServerCapabilityDetailResponseV5, toclientlib.ReqInf,
error) {
+// CreateServerCapability creates the given Server Capability.
+func (to *Session) CreateServerCapability(sc tc.ServerCapabilityV5, opts
RequestOptions) (tc.ServerCapabilityDetailResponseV5, toclientlib.ReqInf,
error) {
var scResp tc.ServerCapabilityDetailResponseV5
reqInf, err := to.post(apiServerCapabilities, opts, sc, &scResp)
return scResp, reqInf, err
}
-// GetServerCapabilitiesV5 returns all the Server Capabilities in Traffic Ops.
-func (to *Session) GetServerCapabilitiesV5(opts RequestOptions)
(tc.ServerCapabilitiesResponseV5, toclientlib.ReqInf, error) {
+// GetServerCapabilities returns all the Server Capabilities in Traffic Ops.
+func (to *Session) GetServerCapabilities(opts RequestOptions)
(tc.ServerCapabilitiesResponseV5, toclientlib.ReqInf, error) {
var data tc.ServerCapabilitiesResponseV5
reqInf, err := to.get(apiServerCapabilities, opts, &data)
return data, reqInf, err
}
-// UpdateServerCapabilityV5 updates a Server Capability by name.
-func (to *Session) UpdateServerCapabilityV5(name string, sc
tc.ServerCapabilityV5, opts RequestOptions)
(tc.ServerCapabilityDetailResponseV5, toclientlib.ReqInf, error) {
+// UpdateServerCapability updates a Server Capability by name.
+func (to *Session) UpdateServerCapability(name string, sc
tc.ServerCapabilityV5, opts RequestOptions)
(tc.ServerCapabilityDetailResponseV5, toclientlib.ReqInf, error) {
if opts.QueryParameters == nil {
opts.QueryParameters = url.Values{}
}