This is an automated email from the ASF dual-hosted git repository.
rawlin 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 f03e361 For topology-based deliveryservices, exclude deliveryservice
server assignments when querying servers by dsId (#5054)
f03e361 is described below
commit f03e361f541d7a1ba5ec511d3fbb68bf1cc999f5
Author: Zach Hoffman <[email protected]>
AuthorDate: Wed Sep 23 17:01:14 2020 -0600
For topology-based deliveryservices, exclude deliveryservice server
assignments when querying servers by dsId (#5054)
* Exclude deliveryservice server assignments when querying servers by dsId
for topology-based deliveryservices
* Use TO Go client to make deliveryservice server instead of a direct DB
query
---
traffic_ops/testing/api/v3/servers_test.go | 32 +++++++++++++++++++++++-
traffic_ops/traffic_ops_golang/server/servers.go | 19 +++++++-------
2 files changed, 41 insertions(+), 10 deletions(-)
diff --git a/traffic_ops/testing/api/v3/servers_test.go
b/traffic_ops/testing/api/v3/servers_test.go
index a6b09d4..8cb7883 100644
--- a/traffic_ops/testing/api/v3/servers_test.go
+++ b/traffic_ops/testing/api/v3/servers_test.go
@@ -316,7 +316,7 @@ func GetTestServersDetails(t *testing.T) {
}
func GetTestServersQueryParameters(t *testing.T) {
- dses, _, err := TOSession.GetDeliveryServicesNullableWithHdr(nil)
+ dses, _, err := TOSession.GetDeliveryServicesV30WithHdr(nil,
url.Values{})
if err != nil {
t.Fatalf("Failed to get Delivery Services: %v", err)
}
@@ -361,6 +361,36 @@ func GetTestServersQueryParameters(t *testing.T) {
if !foundTopDs {
t.Fatalf("unable to find deliveryservice %s", topDsXmlId)
}
+
+ /* Create a deliveryservice server assignment that should not show up
in the
+ * client.GetServersWithHdr() response because ds-top is topology-based
+ */
+ const otherServerHostname = "topology-edge-02"
+ serverResponse, _, err :=
TOSession.GetServersWithHdr(&url.Values{"hostName":
[]string{otherServerHostname}}, nil)
+ if err != nil {
+ t.Fatalf("getting server by hostname %s: %s",
otherServerHostname, err)
+ }
+ if len(serverResponse.Response) != 1 {
+ t.Fatalf("unable to find server with hostname %s",
otherServerHostname)
+ }
+ otherServer := serverResponse.Response[0]
+
+ dsTopologyField, dsFirstHeaderRewriteField, innerHeaderRewriteField,
lastHeaderRewriteField := *ds.Topology, *ds.FirstHeaderRewrite,
*ds.InnerHeaderRewrite, *ds.LastHeaderRewrite
+ ds.Topology, ds.FirstHeaderRewrite, ds.InnerHeaderRewrite,
ds.LastHeaderRewrite = nil, nil, nil, nil
+ ds, _, err = TOSession.UpdateDeliveryServiceV30(*ds.ID, ds)
+ if err != nil {
+ t.Fatalf("unable to temporary remove topology-related fields
from deliveryservice %s: %s", topDsXmlId, err)
+ }
+ _, _, err = TOSession.CreateDeliveryServiceServers(*ds.ID,
[]int{*otherServer.ID}, false)
+ if err != nil {
+ t.Fatalf("unable to assign server %s to deliveryservice %s:
%s", *otherServer.HostName, topDsXmlId, err)
+ }
+ ds.Topology, ds.FirstHeaderRewrite, ds.InnerHeaderRewrite,
ds.LastHeaderRewrite = &dsTopologyField, &dsFirstHeaderRewriteField,
&innerHeaderRewriteField, &lastHeaderRewriteField
+ ds, _, err = TOSession.UpdateDeliveryServiceV30(*ds.ID, ds)
+ if err != nil {
+ t.Fatalf("unable to re-add topology-related fields to
deliveryservice %s: %s", topDsXmlId, err)
+ }
+
params.Set("dsId", strconv.Itoa(*ds.ID))
expectedHostnames := map[string]bool{
"edge1-cdn1-cg3": true,
diff --git a/traffic_ops/traffic_ops_golang/server/servers.go
b/traffic_ops/traffic_ops_golang/server/servers.go
index f23aebd..4be0d29 100644
--- a/traffic_ops/traffic_ops_golang/server/servers.go
+++ b/traffic_ops/traffic_ops_golang/server/servers.go
@@ -64,24 +64,25 @@ JOIN type t ON s.type = t.id
/* language=SQL */
const dssTopologiesJoinSubquery = `
-SELECT
- td.id deliveryservice,
- s.id "server"
+(SELECT
+ ARRAY_AGG(CAST(ROW(td.id, s.id, NULL) AS deliveryservice_server))
FROM "server" s
JOIN cachegroup c on s.cachegroup = c.id
LEFT JOIN topology_cachegroup tc ON c.name = tc.cachegroup
LEFT JOIN deliveryservice td ON td.topology = tc.topology
-UNION
+),
`
/* language=SQL */
const deliveryServiceServersJoin = `
FULL OUTER JOIN (
-%s
-SELECT
- dss.deliveryservice,
- dss."server"
-FROM deliveryservice_server dss
+SELECT (dss.dss_record).deliveryservice, (dss.dss_record).server FROM (
+ SELECT UNNEST(COALESCE(
+ %s
+ (SELECT
+ ARRAY_AGG(CAST(ROW(dss.deliveryservice, dss."server",
NULL) AS deliveryservice_server))
+ FROM deliveryservice_server dss)
+ )) AS dss_record) AS dss
) dss ON dss.server = s.id
JOIN deliveryservice d ON cdn.id = d.cdn_id AND dss.deliveryservice = d.id
`