Skip to content
This repository was archived by the owner on Nov 24, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7c2c692
Add topology field to deliveryservice
rawlinp Mar 31, 2020
9d858bd
adds topology field to dns/http forms and to all ds tables
mitchell852 Apr 22, 2020
8071573
changes ds/server query to the one that fetches all servers associate…
mitchell852 Apr 22, 2020
6a51622
removes the ability to assign/unassign servers if a ds has a topology
mitchell852 Apr 22, 2020
0487aa4
adds topology field to any_map. whoops...forgot about any_map.
mitchell852 Apr 22, 2020
fef449a
Add DSv30 struct, move Topology field into 3.0 API
rawlinp May 14, 2020
deddc74
Add TO API tests
rawlinp May 14, 2020
93dd351
Add changelog entries
rawlinp May 14, 2020
bacb7a1
Move original v2 doc updates to v3
rawlinp May 14, 2020
237320a
resolves outstanding TP todos regarding topologies
mitchell852 May 15, 2020
bcaa81f
manage servers menu item only pertains to ds's w/o a topology assigned
mitchell852 May 15, 2020
753366f
fixes link to topology details
mitchell852 May 15, 2020
46d204d
Add Parameters data dependency back to TO API user test
rawlinp May 18, 2020
277c97e
identifier -> name
rawlinp May 18, 2020
f5809af
Remove redundant type declarations
rawlinp May 18, 2020
0e656a3
gofmt (I blame Goland)
rawlinp May 18, 2020
4677caa
Merge branch 'master' into deliveryservice-topologies
rawlinp May 26, 2020
3d22b7a
Fix broken unit test due to change in master
rawlinp May 26, 2020
765f55e
removes unecessary api services in favor of an existing service
mitchell852 May 26, 2020
4f730a8
using strict equality operator instead
mitchell852 May 26, 2020
63d4170
better syntax to check null/undefined
mitchell852 May 26, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
- Added an optional readiness check service to cdn-in-a-box that exits successfully when it is able to get a `200 OK` from all delivery services
- [Flexible Topologies (in progress)](https://github.com/apache/trafficcontrol/blob/master/blueprints/flexible-topologies.md)
- Traffic Ops: Added an API 3.0 endpoint, /api/3.0/topologies, to create, read, update and delete flexible topologies.
- Traffic Ops: Added new `topology` field to the /api/3.0/deliveryservices APIs
- Traffic Ops: Added support for `topology` query parameter to `GET /api/3.0/cachegroups` to return all cachegroups used in the given topology.
- Traffic Portal: Added the ability to create, read, update and delete flexible topologies.
- Traffic Portal: Added the ability to assign topologies to delivery services
- Updated /servers/details to use multiple interfaces in API v3

### Fixed
Expand Down
11 changes: 9 additions & 2 deletions docs/source/api/v3/deliveryservices.rst
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ Request Structure
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
| tenant | no | Show only the :term:`Delivery Services` belonging to the :term:`Tenant` identified by this integral, unique identifier |
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
| topology | no | Show only the :term:`Delivery Services` assigned to the :term:`Topology` identified by this unique name |
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
| type | no | Return only :term:`Delivery Services` of the :term:`Delivery Service` :ref:`ds-types` identified by this integral, unique identifier |
+--------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
| accessibleTo | no | Return the :term:`Delivery Services` accessible from a :term:`Tenant` *or it's children* identified by this integral, unique identifier |
Expand Down Expand Up @@ -133,6 +135,7 @@ Response Structure
:rangeSliceBlockSize: An integer that defines the byte block size for the ATS Slice Plugin. It can only and must be set if ``rangeRequestHandling`` is set to 3.
:sslKeyVersion: This integer indicates the :ref:`ds-ssl-key-version`
:tenantId: The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
:topology: The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
:trRequestHeaders: If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
:type: The :ref:`ds-types` of this :term:`Delivery Service`
Expand Down Expand Up @@ -234,7 +237,8 @@ Response Structure
],
"maxOriginConnections": 0,
"ecsEnabled": false,
"rangeSliceBlockSize": null
"rangeSliceBlockSize": null,
"topology": null
}]}


Expand Down Expand Up @@ -304,6 +308,7 @@ Request Structure
:rangeSliceBlockSize: An integer that defines the byte block size for the ATS Slice Plugin. It can only and must be set if ``rangeRequestHandling`` is set to 3. It can only be between (inclusive) 262144 (256KB) - 33554432 (32MB).
:sslKeyVersion: This integer indicates the :ref:`ds-ssl-key-version`
:tenantId: The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
:topology: The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
:trRequestHeaders: If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
:type: The :ref:`ds-types` of this :term:`Delivery Service`
Expand Down Expand Up @@ -423,6 +428,7 @@ Response Structure
:rangeSliceBlockSize: An integer that defines the byte block size for the ATS Slice Plugin. It can only and must be set if ``rangeRequestHandling`` is set to 3.
:sslKeyVersion: This integer indicates the :ref:`ds-ssl-key-version`
:tenantId: The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
:topology: The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
:trRequestHeaders: If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
:type: The :ref:`ds-types` of this :term:`Delivery Service`
Expand Down Expand Up @@ -520,7 +526,8 @@ Response Structure
"signingAlgorithm": null,
"tenant": "root",
"ecsEnabled": true,
"rangeSliceBlockSize": null
"rangeSliceBlockSize": null,
"topology": null
}
]}

Expand Down
1 change: 1 addition & 0 deletions docs/source/api/v3/deliveryservices_id.rst
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ Request Structure
:rangeSliceBlockSize: An integer that defines the byte block size for the ATS Slice Plugin. It can only and must be set if ``rangeRequestHandling`` is set to 3. It can only be between (inclusive) 262144 (256KB) - 33554432 (32MB).
:sslKeyVersion: This integer indicates the :ref:`ds-ssl-key-version`
:tenantId: The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
:topology: The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
:trRequestHeaders: If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
:typeId: The integral, unique identifier of the :ref:`ds-types` of this :term:`Delivery Service`
Expand Down
4 changes: 3 additions & 1 deletion docs/source/api/v3/deliveryservices_id_safe.rst
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ Response Structure
:rangeSliceBlockSize: An integer that defines the byte block size for the ATS Slice Plugin. It can only and must be set if ``rangeRequestHandling`` is set to 3.
:sslKeyVersion: This integer indicates the :ref:`ds-ssl-key-version`
:tenantId: The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
:topology: The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
:trRequestHeaders: If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
:type: The :ref:`ds-types` of this :term:`Delivery Service`
Expand Down Expand Up @@ -233,7 +234,8 @@ Response Structure
],
"maxOriginConnections": 0,
"ecsEnabled": false,
"rangeSliceBlockSize": null
"rangeSliceBlockSize": null,
"topology": null
}
]}

Expand Down
4 changes: 3 additions & 1 deletion docs/source/api/v3/servers_id_deliveryservices.rst
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ Response Structure
:rangeSliceBlockSize: An integer that defines the byte block size for the ATS Slice Plugin. It can only and must be set if ``rangeRequestHandling`` is set to 3.
:sslKeyVersion: This integer indicates the :ref:`ds-ssl-key-version`
:tenantId: The integral, unique identifier of the :ref:`ds-tenant` who owns this :term:`Delivery Service`
:topology: The unique name of the :term:`Topology` that this :term:`Delivery Service` is assigned to
:trRequestHeaders: If defined, this defines the :ref:`ds-tr-req-headers` used by Traffic Router for this :term:`Delivery Service`
:trResponseHeaders: If defined, this defines the :ref:`ds-tr-resp-headers` used by Traffic Router for this :term:`Delivery Service`
:type: The :ref:`ds-types` of this :term:`Delivery Service`
Expand Down Expand Up @@ -236,7 +237,8 @@ Response Structure
],
"maxOriginConnections": 0,
"ecsEnabled": false,
"rangeSliceBlockSize": null
"rangeSliceBlockSize": null,
"topology": null
}]}


Expand Down
15 changes: 14 additions & 1 deletion lib/go-tc/deliveryservices.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,9 +159,14 @@ type DeliveryServiceV11 struct {
XMLID string `json:"xmlId"`
}

type DeliveryServiceNullableV15 DeliveryServiceNullable // this type alias should always alias the latest minor version of the deliveryservices endpoints
type DeliveryServiceNullableV30 DeliveryServiceNullable // this type alias should always alias the latest minor version of the deliveryservices endpoints

type DeliveryServiceNullable struct {
DeliveryServiceNullableV15
Topology *string `json:"topology" db:"topology"`
}

type DeliveryServiceNullableV15 struct {
DeliveryServiceNullableV14
EcsEnabled bool `json:"ecsEnabled" db:"ecs_enabled"`
RangeSliceBlockSize *int `json:"rangeSliceBlockSize" db:"range_slice_block_size"`
Expand Down Expand Up @@ -415,6 +420,14 @@ func (ds *DeliveryServiceNullable) validateTypeFields(tx *sql.Tx) error {
validation.By(requiredIfMatchesTypeName([]string{DNSRegexType, HTTPRegexType}, typeName))),
"rangeRequestHandling": validation.Validate(ds.RangeRequestHandling,
validation.By(requiredIfMatchesTypeName([]string{DNSRegexType, HTTPRegexType}, typeName))),
"topology": validation.Validate(ds,
validation.By(func(dsi interface{}) error {
ds := dsi.(*DeliveryServiceNullable)
if ds.Topology != nil && DSType(typeName).IsSteering() {
return fmt.Errorf("steering deliveryservice types cannot be assigned to a topology")
}
return nil
})),
}
toErrs := tovalidate.ToErrors(errs)
if len(toErrs) > 0 {
Expand Down
164 changes: 78 additions & 86 deletions traffic_ops/ort/atstccfg/cfgfile/cfgfile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,94 +210,86 @@ func randDS() *tc.DeliveryServiceNullable {
deepCachingTypeNever := tc.DeepCachingTypeNever
dsTypeHTTP := tc.DSTypeHTTP
protocol := tc.DSProtocolHTTP
return &tc.DeliveryServiceNullable{
EcsEnabled: *randBool(),
RangeSliceBlockSize: randInt(),
DeliveryServiceNullableV14: tc.DeliveryServiceNullableV14{
ConsistentHashRegex: randStr(),
ConsistentHashQueryParams: []string{
*randStr(),
*randStr(),
},
MaxOriginConnections: randInt(),
DeliveryServiceNullableV13: tc.DeliveryServiceNullableV13{
DeepCachingType: &deepCachingTypeNever,
FQPacingRate: randInt(),
SigningAlgorithm: randStr(),
Tenant: randStr(),
TRResponseHeaders: randStr(),
TRRequestHeaders: randStr(),
DeliveryServiceNullableV12: tc.DeliveryServiceNullableV12{
DeliveryServiceNullableV11: tc.DeliveryServiceNullableV11{
Active: randBool(),
AnonymousBlockingEnabled: randBool(),
CacheURL: randStr(),
CCRDNSTTL: randInt(),
CDNID: randInt(),
CDNName: randStr(),
CheckPath: randStr(),
DisplayName: randStr(),
DNSBypassCNAME: randStr(),
DNSBypassIP: randStr(),
DNSBypassIP6: randStr(),
DNSBypassTTL: randInt(),
DSCP: randInt(),
EdgeHeaderRewrite: randStr(),
GeoLimit: randInt(),
GeoLimitCountries: randStr(),
GeoLimitRedirectURL: randStr(),
GeoProvider: randInt(),
GlobalMaxMBPS: randInt(),
GlobalMaxTPS: randInt(),
HTTPBypassFQDN: randStr(),
ID: randInt(),
InfoURL: randStr(),
InitialDispersion: randInt(),
IPV6RoutingEnabled: randBool(),
LastUpdated: &tc.TimeNoMod{Time: time.Now()},
LogsEnabled: randBool(),
LongDesc: randStr(),
LongDesc1: randStr(),
LongDesc2: randStr(),
MatchList: &[]tc.DeliveryServiceMatch{
tc.DeliveryServiceMatch{
Type: tc.DSMatchTypeHostRegex,
SetNumber: 0,
Pattern: `\.*foo\.*`,
},
},
MaxDNSAnswers: randInt(),
MidHeaderRewrite: randStr(),
MissLat: randFloat64(),
MissLong: randFloat64(),
MultiSiteOrigin: randBool(),
OriginShield: randStr(),
OrgServerFQDN: randStr(),
ProfileDesc: randStr(),
ProfileID: randInt(),
ProfileName: randStr(),
Protocol: &protocol,
QStringIgnore: randInt(),
RangeRequestHandling: randInt(),
RegexRemap: randStr(),
RegionalGeoBlocking: randBool(),
RemapText: randStr(),
RoutingName: randStr(),
Signed: *randBool(),
SSLKeyVersion: randInt(),
TenantID: randInt(),
Type: &dsTypeHTTP,
TypeID: randInt(),
XMLID: randStr(),
ExampleURLs: []string{
*randStr(),
*randStr(),
},
},
},
},
ds := tc.DeliveryServiceNullable{}
ds.EcsEnabled = *randBool()
ds.RangeSliceBlockSize = randInt()
ds.ConsistentHashRegex = randStr()
ds.ConsistentHashQueryParams = []string{
*randStr(),
*randStr(),
}
ds.MaxOriginConnections = randInt()
ds.DeepCachingType = &deepCachingTypeNever
ds.FQPacingRate = randInt()
ds.SigningAlgorithm = randStr()
ds.Tenant = randStr()
ds.TRResponseHeaders = randStr()
ds.TRRequestHeaders = randStr()
ds.Active = randBool()
ds.AnonymousBlockingEnabled = randBool()
ds.CacheURL = randStr()
ds.CCRDNSTTL = randInt()
ds.CDNID = randInt()
ds.CDNName = randStr()
ds.CheckPath = randStr()
ds.DisplayName = randStr()
ds.DNSBypassCNAME = randStr()
ds.DNSBypassIP = randStr()
ds.DNSBypassIP6 = randStr()
ds.DNSBypassTTL = randInt()
ds.DSCP = randInt()
ds.EdgeHeaderRewrite = randStr()
ds.GeoLimit = randInt()
ds.GeoLimitCountries = randStr()
ds.GeoLimitRedirectURL = randStr()
ds.GeoProvider = randInt()
ds.GlobalMaxMBPS = randInt()
ds.GlobalMaxTPS = randInt()
ds.HTTPBypassFQDN = randStr()
ds.ID = randInt()
ds.InfoURL = randStr()
ds.InitialDispersion = randInt()
ds.IPV6RoutingEnabled = randBool()
ds.LastUpdated = &tc.TimeNoMod{Time: time.Now()}
ds.LogsEnabled = randBool()
ds.LongDesc = randStr()
ds.LongDesc1 = randStr()
ds.LongDesc2 = randStr()
ds.MatchList = &[]tc.DeliveryServiceMatch{
{
Type: tc.DSMatchTypeHostRegex,
SetNumber: 0,
Pattern: `\.*foo\.*`,
},
}
ds.MaxDNSAnswers = randInt()
ds.MidHeaderRewrite = randStr()
ds.MissLat = randFloat64()
ds.MissLong = randFloat64()
ds.MultiSiteOrigin = randBool()
ds.OriginShield = randStr()
ds.OrgServerFQDN = randStr()
ds.ProfileDesc = randStr()
ds.ProfileID = randInt()
ds.ProfileName = randStr()
ds.Protocol = &protocol
ds.QStringIgnore = randInt()
ds.RangeRequestHandling = randInt()
ds.RegexRemap = randStr()
ds.RegionalGeoBlocking = randBool()
ds.RemapText = randStr()
ds.RoutingName = randStr()
ds.Signed = *randBool()
ds.SSLKeyVersion = randInt()
ds.TenantID = randInt()
ds.Type = &dsTypeHTTP
ds.TypeID = randInt()
ds.XMLID = randStr()
ds.ExampleURLs = []string{
*randStr(),
*randStr(),
}
return &ds
}

func randServer() *tc.Server {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import (
)

func TestCacheGroupsDeliveryServices(t *testing.T) {
WithObjs(t, []TCObj{CDNs, Types, Tenants, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, DeliveryServices, CacheGroupsDeliveryServices}, func() {})
WithObjs(t, []TCObj{CDNs, Types, Tenants, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, Topologies, DeliveryServices, CacheGroupsDeliveryServices}, func() {})
}

// TODO this is the name hard-coded in the create servers test; change to be dynamic
Expand Down
4 changes: 2 additions & 2 deletions traffic_ops/testing/api/v3/cdnfederations_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ import (
var fedIDs []int

func TestCDNFederations(t *testing.T) {
WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants, DeliveryServices, CDNFederations}, func() {
WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants, CacheGroups, Topologies, DeliveryServices, CDNFederations}, func() {
UpdateTestCDNFederations(t)
GetTestCDNFederations(t)
})
}

func TestFederationFederationResolvers(t *testing.T) {
WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants, DeliveryServices, CDNFederations, FederationResolvers}, func() {
WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants, CacheGroups, Topologies, DeliveryServices, CDNFederations, FederationResolvers}, func() {
AssignTestFederationFederationResolvers(t)
GetTestFederationFederationResolvers(t)
})
Expand Down
2 changes: 1 addition & 1 deletion traffic_ops/testing/api/v3/crconfig_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import (
)

func TestCRConfig(t *testing.T) {
WithObjs(t, []TCObj{CDNs, Types, Tenants, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, DeliveryServices}, func() {
WithObjs(t, []TCObj{CDNs, Types, Tenants, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, Topologies, DeliveryServices}, func() {
UpdateTestCRConfigSnapshot(t)
SnapshotTestCDNbyName(t)
SnapshotTestCDNbyInvalidName(t)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import (
)

func TestDeliveryServicesRequiredCapabilities(t *testing.T) {
WithObjs(t, []TCObj{CDNs, Types, Tenants, Users, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, ServerCapabilities, DeliveryServices, DeliveryServicesRequiredCapabilities}, func() {
WithObjs(t, []TCObj{CDNs, Types, Tenants, Users, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, ServerCapabilities, Topologies, DeliveryServices, DeliveryServicesRequiredCapabilities}, func() {
InvalidDeliveryServicesRequiredCapabilityAddition(t)
GetTestDeliveryServicesRequiredCapabilities(t)
})
Expand Down
25 changes: 24 additions & 1 deletion traffic_ops/testing/api/v3/deliveryservices_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,13 @@ import (
)

func TestDeliveryServices(t *testing.T) {
WithObjs(t, []TCObj{CDNs, Types, Tenants, Users, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, DeliveryServices}, func() {
WithObjs(t, []TCObj{CDNs, Types, Tenants, Users, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, Topologies, DeliveryServices}, func() {
GetAccessibleToTest(t)
UpdateTestDeliveryServices(t)
UpdateNullableTestDeliveryServices(t)
UpdateDeliveryServiceWithInvalidRemapText(t)
UpdateDeliveryServiceWithInvalidSliceRangeRequest(t)
UpdateDeliveryServiceWithInvalidTopology(t)
GetTestDeliveryServices(t)
DeliveryServiceMinorVersionsTest(t)
DeliveryServiceTenancyTest(t)
Expand Down Expand Up @@ -204,6 +205,28 @@ func UpdateNullableTestDeliveryServices(t *testing.T) {
}
}

// UpdateDeliveryServiceWithInvalidTopology ensures that a topology cannot be assigned to (CLIENT_)STEERING delivery services.
func UpdateDeliveryServiceWithInvalidTopology(t *testing.T) {
dses, _, err := TOSession.GetDeliveryServicesNullable()
if err != nil {
t.Fatalf("cannot GET Delivery Services: %v", err)
}

found := false
for _, ds := range dses {
if *ds.Type == tc.DSTypeClientSteering {
found = true
ds.Topology = util.StrPtr("my-topology")
if _, err := TOSession.UpdateDeliveryServiceNullable(strconv.Itoa(*ds.ID), &ds); err == nil {
t.Errorf("assigning topology to CLIENT_STEERING delivery service - expected: error, actual: no error")
}
}
}
if !found {
t.Fatalf("expected at least one CLIENT_STEERING delivery service")
}
}

// UpdateDeliveryServiceWithInvalidRemapText ensures that a delivery service can't be updated with a remap text value with a line break in it.
func UpdateDeliveryServiceWithInvalidRemapText(t *testing.T) {
firstDS := testData.DeliveryServices[0]
Expand Down
Loading