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 {