You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by mi...@apache.org on 2020/04/21 21:14:13 UTC
[trafficcontrol] branch master updated: Fixing the query to get mid
servers (#4634)
This is an automated email from the ASF dual-hosted git repository.
mitchell852 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 509a3c0 Fixing the query to get mid servers (#4634)
509a3c0 is described below
commit 509a3c00bfaf18030f8154ed7af8ea34b3dc4f4c
Author: Srijeet Chatterjee <30...@users.noreply.github.com>
AuthorDate: Tue Apr 21 15:14:03 2020 -0600
Fixing the query to get mid servers (#4634)
* Fixing the query to get mid servers
* Fixing review comment
---
traffic_ops/traffic_ops_golang/server/servers.go | 13 +-
.../traffic_ops_golang/server/servers_test.go | 193 +++++++++++++++++++++
2 files changed, 198 insertions(+), 8 deletions(-)
diff --git a/traffic_ops/traffic_ops_golang/server/servers.go b/traffic_ops/traffic_ops_golang/server/servers.go
index 966fb69..42766c5 100644
--- a/traffic_ops/traffic_ops_golang/server/servers.go
+++ b/traffic_ops/traffic_ops_golang/server/servers.go
@@ -335,14 +335,11 @@ func getMidServers(servers []tc.ServerNullable, tx *sqlx.Tx) ([]tc.ServerNullabl
edgeIDs := strings.Join(ids, ",")
// TODO: include secondary parent?
q := selectQuery() + `
-WHERE s.id IN (
- SELECT mid.id FROM server mid
- JOIN cachegroup cg ON cg.id IN (
- SELECT cg.parent_cachegroup_id
- FROM server s
- JOIN cachegroup cg ON cg.id = s.cachegroup
- WHERE s.id IN (` + edgeIDs + `))
- JOIN type t ON mid.type = (SELECT id FROM type WHERE name = 'MID'))
+WHERE t.name = 'MID' AND s.cachegroup IN (
+SELECT cg.parent_cachegroup_id FROM cachegroup AS cg
+WHERE cg.id IN (
+SELECT s.cachegroup FROM server AS s
+WHERE s.id IN (` + edgeIDs + `)))
`
rows, err := tx.Queryx(q)
if err != nil {
diff --git a/traffic_ops/traffic_ops_golang/server/servers_test.go b/traffic_ops/traffic_ops_golang/server/servers_test.go
index da8b691..1e510f6 100644
--- a/traffic_ops/traffic_ops_golang/server/servers_test.go
+++ b/traffic_ops/traffic_ops_golang/server/servers_test.go
@@ -178,6 +178,199 @@ func TestGetServersByCachegroup(t *testing.T) {
}
+func TestGetMidServers(t *testing.T) {
+ mockDB, mock, err := sqlmock.New()
+ if err != nil {
+ t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
+ }
+ defer mockDB.Close()
+
+ db := sqlx.NewDb(mockDB, "sqlmock")
+ defer db.Close()
+
+ testServers := getTestServers()
+ testServers = testServers[0:2]
+
+ testServers[1].Cachegroup = "parentCacheGroup"
+ testServers[1].CachegroupID = 2
+ testServers[1].Type = "MID"
+
+ cols := test.ColsFromStructByTag("db", tc.Server{})
+ rows := sqlmock.NewRows(cols)
+
+ for _, ts := range testServers {
+ rows = rows.AddRow(
+ ts.Cachegroup,
+ ts.CachegroupID,
+ ts.CDNID,
+ ts.CDNName,
+ ts.DomainName,
+ ts.GUID,
+ ts.HostName,
+ ts.HTTPSPort,
+ ts.ID,
+ ts.ILOIPAddress,
+ ts.ILOIPGateway,
+ ts.ILOIPNetmask,
+ ts.ILOPassword,
+ ts.ILOUsername,
+ ts.InterfaceMtu,
+ ts.InterfaceName,
+ ts.IP6Address,
+ ts.IP6IsService,
+ ts.IP6Gateway,
+ ts.IPAddress,
+ ts.IPIsService,
+ ts.IPNetmask,
+ ts.IPGateway,
+ ts.LastUpdated,
+ ts.MgmtIPAddress,
+ ts.MgmtIPGateway,
+ ts.MgmtIPNetmask,
+ ts.OfflineReason,
+ ts.PhysLocation,
+ ts.PhysLocationID,
+ ts.Profile,
+ ts.ProfileDesc,
+ ts.ProfileID,
+ ts.Rack,
+ ts.RevalPending,
+ ts.RouterHostName,
+ ts.RouterPortName,
+ ts.Status,
+ ts.StatusID,
+ ts.TCPPort,
+ ts.Type,
+ ts.TypeID,
+ ts.UpdPending,
+ ts.XMPPID,
+ ts.XMPPPasswd,
+ )
+ }
+ mock.ExpectBegin()
+ mock.ExpectQuery("SELECT").WillReturnRows(rows)
+ v := map[string]string{}
+
+ user := auth.CurrentUser{}
+
+ servers, userErr, sysErr, errCode := getServers(v, db.MustBegin(), &user)
+
+ if userErr != nil || sysErr != nil {
+ t.Errorf("getServers expected: no errors, actual: %v %v with status: %s", userErr, sysErr, http.StatusText(errCode))
+ }
+
+ cols2 := test.ColsFromStructByTag("db", tc.Server{})
+ rows2 := sqlmock.NewRows(cols2)
+
+ cgs := []tc.CacheGroup{}
+ testCG1 := tc.CacheGroup{
+ ID: 1,
+ Name: "Cachegroup",
+ ShortName: "cg1",
+ Latitude: 38.7,
+ Longitude: 90.7,
+ ParentCachegroupID: 2,
+ SecondaryParentCachegroupID: 2,
+ LocalizationMethods: []tc.LocalizationMethod{
+ tc.LocalizationMethodDeepCZ,
+ tc.LocalizationMethodCZ,
+ tc.LocalizationMethodGeo,
+ },
+ Type: "EDGE_LOC",
+ TypeID: 6,
+ LastUpdated: tc.TimeNoMod{Time: time.Now()},
+ Fallbacks: []string{
+ "cachegroup2",
+ "cachegroup3",
+ },
+ FallbackToClosest: true,
+ }
+ cgs = append(cgs, testCG1)
+ testCG2 := tc.CacheGroup{
+ ID: 2,
+ Name: "parentCacheGroup",
+ ShortName: "pg1",
+ Latitude: 38.7,
+ Longitude: 90.7,
+ ParentCachegroupID: 1,
+ SecondaryParentCachegroupID: 1,
+ LocalizationMethods: []tc.LocalizationMethod{
+ tc.LocalizationMethodDeepCZ,
+ tc.LocalizationMethodCZ,
+ tc.LocalizationMethodGeo,
+ },
+ Type: "MID_LOC",
+ TypeID: 7,
+ LastUpdated: tc.TimeNoMod{Time: time.Now()},
+ }
+ cgs = append(cgs, testCG2)
+
+ ts := servers[1]
+ rows2 = rows2.AddRow(
+ ts.Cachegroup,
+ ts.CachegroupID,
+ ts.CDNID,
+ ts.CDNName,
+ ts.DomainName,
+ ts.GUID,
+ ts.HostName,
+ ts.HTTPSPort,
+ ts.ID,
+ ts.ILOIPAddress,
+ ts.ILOIPGateway,
+ ts.ILOIPNetmask,
+ ts.ILOPassword,
+ ts.ILOUsername,
+ ts.InterfaceMtu,
+ ts.InterfaceName,
+ ts.IP6Address,
+ ts.IP6IsService,
+ ts.IP6Gateway,
+ ts.IPAddress,
+ ts.IPIsService,
+ ts.IPNetmask,
+ ts.IPGateway,
+ ts.LastUpdated,
+ ts.MgmtIPAddress,
+ ts.MgmtIPGateway,
+ ts.MgmtIPNetmask,
+ ts.OfflineReason,
+ ts.PhysLocation,
+ ts.PhysLocationID,
+ ts.Profile,
+ ts.ProfileDesc,
+ ts.ProfileID,
+ ts.Rack,
+ ts.RevalPending,
+ ts.RouterHostName,
+ ts.RouterPortName,
+ ts.Status,
+ ts.StatusID,
+ ts.TCPPort,
+ ts.Type,
+ ts.TypeID,
+ ts.UpdPending,
+ ts.XMPPID,
+ ts.XMPPPasswd,
+ )
+
+ mock.ExpectBegin()
+ mock.ExpectQuery("SELECT").WillReturnRows(rows2)
+ mid, userErr, sysErr, errCode := getMidServers(servers, db.MustBegin())
+
+ if userErr != nil || sysErr != nil {
+ t.Fatalf("getMidServers expected: no errors, actual: %v %v with status: %s", userErr, sysErr, http.StatusText(errCode))
+ }
+ if len(mid) != 1 {
+ t.Fatalf("getMidServers expected: len(mid) == 1, actual: %v", len(mid))
+ }
+ if mid[0].Type != "MID" || *(mid[0].CachegroupID) != 2 || *(mid[0].Cachegroup) != "parentCacheGroup" {
+ t.Fatalf("getMidServers expected: Type == MID, actual: %v", mid[0].Type)
+ t.Fatalf("getMidServers expected: CachegroupID == 2, actual: %v", *(mid[0].CachegroupID))
+ t.Fatalf("getMidServers expected: Cachegroup == parentCacheGroup, actual: %v", *(mid[0].Cachegroup))
+ }
+}
+
type SortableServers []tc.Server
func (s SortableServers) Len() int {