| 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) |
| } |
| } |
| } |