blob: 50e95fd4e99c24a4c066967fd7af63c4bf01d470 [file] [log] [blame]
package manager
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import (
"reflect"
"testing"
"github.com/apache/trafficcontrol/lib/go-tc"
)
func TestCreateServerHealthPollURL(t *testing.T) {
tmpl := `http://${hostname}/_astats?application=&inf.name=${interface_name}`
srv := tc.TrafficServer{
Interfaces: []tc.ServerInterfaceInfo{
{
IPAddresses: []tc.ServerIPAddress{
{
Address: "192.0.2.42",
Gateway: nil,
ServiceAddress: true,
},
{
Address: "1::3:3:7",
Gateway: nil,
ServiceAddress: true,
},
},
MaxBandwidth: nil,
MTU: nil,
Monitor: true,
Name: "george",
},
},
}
expectedV4 := "http://192.0.2.42/_astats?application=system&inf.name=george"
expectedV6 := "http://[1::3:3:7]/_astats?application=system&inf.name=george"
actualV4, actualV6 := createServerHealthPollURLs(tmpl, srv)
if expectedV4 != actualV4 {
t.Errorf("incorrect IPv4 polling URL; expected: '%s', actual: '%s'", expectedV4, actualV4)
}
if expectedV6 != actualV6 {
t.Errorf("incorrect IPv6 polling URL; expected: '%s', actual: '%s'", expectedV6, actualV6)
}
}
func TestCreateServerHealthPollURLTemplatePort(t *testing.T) {
tmpl := "http://${hostname}:1234/_astats?application=&inf.name=${interface_name}"
srv := tc.TrafficServer{
Interfaces: []tc.ServerInterfaceInfo{
{
IPAddresses: []tc.ServerIPAddress{
{
Address: "192.0.2.42",
Gateway: nil,
ServiceAddress: true,
},
{
Address: "1::3:3:7",
Gateway: nil,
ServiceAddress: true,
},
},
MaxBandwidth: nil,
MTU: nil,
Monitor: true,
Name: "george",
},
},
Port: 1234,
}
expectedV4 := "http://192.0.2.42:1234/_astats?application=system&inf.name=george"
expectedV6 := "http://[1::3:3:7]:1234/_astats?application=system&inf.name=george"
actualV4, actualV6 := createServerHealthPollURLs(tmpl, srv)
if expectedV4 != actualV4 {
t.Errorf("incorrect IPv4 polling URL; expected: '%s', actual: '%s'", expectedV4, actualV4)
}
if expectedV6 != actualV6 {
t.Errorf("incorrect IPv6 polling URL; expected: '%s', actual: '%s'", expectedV6, actualV6)
}
}
func TestCreateServerHealthPollURLServerPort(t *testing.T) {
tmpl := "http://${hostname}/_astats?application=&inf.name=${interface_name}"
srv := tc.TrafficServer{
HTTPSPort: 910,
Interfaces: []tc.ServerInterfaceInfo{
{
IPAddresses: []tc.ServerIPAddress{
{
Address: "192.0.2.42",
Gateway: nil,
ServiceAddress: true,
},
{
Address: "1::3:3:7",
Gateway: nil,
ServiceAddress: true,
},
},
MaxBandwidth: nil,
MTU: nil,
Monitor: true,
Name: "george",
},
},
Port: 5678,
}
expectedV4 := "http://192.0.2.42:5678/_astats?application=system&inf.name=george"
expectedV6 := "http://[1::3:3:7]:5678/_astats?application=system&inf.name=george"
actualV4, actualV6 := createServerHealthPollURLs(tmpl, srv)
if expectedV4 != actualV4 {
t.Errorf("incorrect IPv4 polling URL; expected: '%s', actual: '%s'", expectedV4, actualV4)
}
if expectedV6 != actualV6 {
t.Errorf("incorrect IPv6 polling URL; expected: '%s', actual: '%s'", expectedV6, actualV6)
}
}
func TestCreateServerHealthPollURLServerPortHTTPS(t *testing.T) {
tmpl := "hTTps://${hostname}/_astats?application=&inf.name=${interface_name}"
srv := tc.TrafficServer{
HTTPSPort: 910,
Interfaces: []tc.ServerInterfaceInfo{
{
IPAddresses: []tc.ServerIPAddress{
{
Address: "192.0.2.42",
Gateway: nil,
ServiceAddress: true,
},
{
Address: "1::3:3:7",
Gateway: nil,
ServiceAddress: true,
},
},
MaxBandwidth: nil,
MTU: nil,
Monitor: true,
Name: "george",
},
},
Port: 5678,
}
expectedV4 := "https://192.0.2.42:910/_astats?application=system&inf.name=george"
expectedV6 := "https://[1::3:3:7]:910/_astats?application=system&inf.name=george"
actualV4, actualV6 := createServerHealthPollURLs(tmpl, srv)
if expectedV4 != actualV4 {
t.Errorf("incorrect IPv4 polling URL; expected: '%s', actual: '%s'", expectedV4, actualV4)
}
if expectedV6 != actualV6 {
t.Errorf("incorrect IPv6 polling URL; expected: '%s', actual: '%s'", expectedV6, actualV6)
}
}
func TestCreateServerHealthPollURLTemplateAndServerPort(t *testing.T) {
// if both template and server ports exist, template takes precedence
tmpl := "http://${hostname}:1234/_astats?application=&inf.name=${interface_name}"
srv := tc.TrafficServer{
HTTPSPort: 910,
Interfaces: []tc.ServerInterfaceInfo{
{
IPAddresses: []tc.ServerIPAddress{
{
Address: "192.0.2.42",
Gateway: nil,
ServiceAddress: true,
},
{
Address: "1::3:3:7",
Gateway: nil,
ServiceAddress: true,
},
},
MaxBandwidth: nil,
MTU: nil,
Monitor: true,
Name: "george",
},
},
Port: 5678,
}
expectedV4 := "http://192.0.2.42:1234/_astats?application=system&inf.name=george"
expectedV6 := "http://[1::3:3:7]:1234/_astats?application=system&inf.name=george"
actualV4, actualV6 := createServerHealthPollURLs(tmpl, srv)
if expectedV4 != actualV4 {
t.Errorf("incorrect IPv4 polling URL; expected: '%s', actual: '%s'", expectedV4, actualV4)
}
if expectedV6 != actualV6 {
t.Errorf("incorrect IPv6 polling URL; expected: '%s', actual: '%s'", expectedV6, actualV6)
}
}
func TestCreateServerStatPollURL(t *testing.T) {
tmpl := `http://${hostname}/_astats?application=&inf.name=${interface_name}`
srv := tc.TrafficServer{
Interfaces: []tc.ServerInterfaceInfo{
{
IPAddresses: []tc.ServerIPAddress{
{
Address: "192.0.2.42",
Gateway: nil,
ServiceAddress: true,
},
{
Address: "1::3:3:7",
Gateway: nil,
ServiceAddress: true,
},
},
MaxBandwidth: nil,
MTU: nil,
Monitor: true,
Name: "george",
},
},
}
expectedV4 := "http://192.0.2.42/_astats?application=&inf.name=george"
expectedV6 := "http://[1::3:3:7]/_astats?application=&inf.name=george"
healthV4, healthV6 := createServerHealthPollURLs(tmpl, srv)
actualV4 := createServerStatPollURL(healthV4)
actualV6 := createServerStatPollURL(healthV6)
if expectedV4 != actualV4 {
t.Errorf("incorrect IPv4 polling URL; expected: '%s', actual: '%s'", expectedV4, actualV4)
}
if expectedV6 != actualV6 {
t.Errorf("incorrect IPv6 polling URL; expected: '%s', actual: '%s'", expectedV6, actualV6)
}
}
func TestGetCacheGroupsToPoll(t *testing.T) {
monitors := map[string]tc.TrafficMonitor{
"tm2": {
HostName: "tm2",
Location: "tm-group-2",
ServerStatus: "ONLINE",
},
"tm1": {
HostName: "tm1",
Location: "tm-group-1",
ServerStatus: "ONLINE",
},
"tm3": {
HostName: "tm3",
Location: "tm-group-3",
ServerStatus: "ONLINE",
},
}
caches := map[string]tc.TrafficServer{
"cache2": {
CacheGroup: "cache-group-2",
ServerStatus: "REPORTED",
},
"cache1": {
CacheGroup: "cache-group-1",
ServerStatus: "REPORTED",
},
"cache3": {
CacheGroup: "cache-group-3",
ServerStatus: "REPORTED",
},
}
cacheGroups := map[string]tc.TMCacheGroup{
"tm-group-2": {
Name: "tm-group-2",
Coordinates: tc.MonitoringCoordinates{
Latitude: 38.39,
Longitude: -99.58,
},
},
"tm-group-1": {
Name: "tm-group-1",
Coordinates: tc.MonitoringCoordinates{
Latitude: 37.32,
Longitude: -121.34,
},
},
"tm-group-3": {
Name: "tm-group-3",
Coordinates: tc.MonitoringCoordinates{
Latitude: 37.22,
Longitude: -77.53,
},
},
"cache-group-3": {
Name: "cache-group-3",
Coordinates: tc.MonitoringCoordinates{
Latitude: 41.93,
Longitude: -74.17,
},
},
"cache-group-1": {
Name: "cache-group-1",
Coordinates: tc.MonitoringCoordinates{
Latitude: 35.04,
Longitude: -120.12,
},
},
"cache-group-2": {
Name: "cache-group-2",
Coordinates: tc.MonitoringCoordinates{
Latitude: 40.92,
Longitude: -98.49,
},
},
}
type testCase struct {
DistributedPolling bool
TMName string
ExpectedTMGroup string
ExpectedToPoll map[string]tc.TMCacheGroup
ExpectErr bool
}
for _, tc := range []testCase{
{
DistributedPolling: true,
TMName: "tm1",
ExpectedTMGroup: "tm-group-1",
ExpectedToPoll: map[string]tc.TMCacheGroup{
"cache-group-1": cacheGroups["cache-group-1"],
},
ExpectErr: false,
},
{
DistributedPolling: true,
TMName: "tm2",
ExpectedTMGroup: "tm-group-2",
ExpectedToPoll: map[string]tc.TMCacheGroup{
"cache-group-2": cacheGroups["cache-group-2"],
},
ExpectErr: false,
},
{
DistributedPolling: true,
TMName: "tm3",
ExpectedTMGroup: "tm-group-3",
ExpectedToPoll: map[string]tc.TMCacheGroup{
"cache-group-3": cacheGroups["cache-group-3"],
},
ExpectErr: false,
},
{
DistributedPolling: false,
TMName: "tm3",
ExpectedTMGroup: "tm-group-3",
ExpectedToPoll: map[string]tc.TMCacheGroup{
"cache-group-1": cacheGroups["cache-group-1"],
"cache-group-2": cacheGroups["cache-group-2"],
"cache-group-3": cacheGroups["cache-group-3"],
},
ExpectErr: false,
},
} {
tmGroup, tmStatus, toPoll, err := getCacheGroupsToPoll(tc.DistributedPolling, tc.TMName, monitors, caches, cacheGroups)
if tc.ExpectErr != (err != nil) {
t.Errorf("getting cachegroups to poll -- expect error: %t, actual error: %v", tc.ExpectErr, err)
}
if tc.ExpectedTMGroup != tmGroup {
t.Errorf("getting TM group -- expected: %s, actual: %s", tc.ExpectedTMGroup, tmGroup)
}
if tmStatus != "ONLINE" {
t.Errorf("expected TM status: ONLINE, actual: %s", tmStatus)
}
if !reflect.DeepEqual(tc.ExpectedToPoll, toPoll) {
t.Errorf("getting cachegroups to poll -- expected: %+v, actual: %+v", tc.ExpectedToPoll, toPoll)
}
}
}