| package atscfg |
| |
| /* |
| * 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 ( |
| "encoding/json" |
| "strings" |
| "testing" |
| |
| "github.com/apache/trafficcontrol/lib/go-tc" |
| ) |
| |
| func TestMakeMetaConfig(t *testing.T) { |
| serverHostName := tc.CacheName("myServer") |
| server := &ServerInfo{ |
| CacheGroupID: 42, |
| CDN: "mycdn", |
| CDNID: 43, |
| DomainName: "myserverdomain.invalid", |
| HostName: "myserver", |
| HTTPSPort: 443, |
| ID: 44, |
| IP: "192.168.2.9", |
| ParentCacheGroupID: 45, |
| ParentCacheGroupType: "MID_LOC", |
| ProfileID: 46, |
| ProfileName: "myserverprofile", |
| Port: 80, |
| SecondaryParentCacheGroupID: 47, |
| SecondaryParentCacheGroupType: "MID_LOC", |
| Type: "EDGE", |
| } |
| |
| tmURL := "https://myto.invalid" |
| tmReverseProxyURL := "https://myrp.myto.invalid" |
| locationParams := map[string]ConfigProfileParams{ |
| "remap.config": ConfigProfileParams{ |
| FileNameOnDisk: "remap.config", |
| Location: "/my/location/", |
| }, |
| "regex_revalidate.config": ConfigProfileParams{ |
| FileNameOnDisk: "regex_revalidate.config", |
| Location: "/my/location/", |
| URL: "http://myurl/remap.config", // cdn-scoped endpoint |
| APIURI: "http://myapi/remap.config", |
| }, |
| "cache.config": ConfigProfileParams{ |
| FileNameOnDisk: "cache.config", // cache.config on mids is server-scoped |
| Location: "/my/location/", |
| }, |
| "ip_allow.config": ConfigProfileParams{ |
| FileNameOnDisk: "ip_allow.config", |
| Location: "/my/location/", |
| }, |
| "volume.config": ConfigProfileParams{ |
| FileNameOnDisk: "volume.config", |
| Location: "/my/location/", |
| }, |
| "ssl_multicert.config": ConfigProfileParams{ |
| FileNameOnDisk: "ssl_multicert.config", |
| Location: "/my/location/", |
| }, |
| "uri_signing_mydsname.config": ConfigProfileParams{ |
| FileNameOnDisk: "uri_signing_mydsname.config", |
| Location: "/my/location/", |
| }, |
| "uri_signing_nonexistentds.config": ConfigProfileParams{ |
| FileNameOnDisk: "uri_signing_nonexistentds.config", |
| Location: "/my/location/", |
| }, |
| "regex_remap_nonexistentds.config": ConfigProfileParams{ |
| FileNameOnDisk: "regex_remap_nonexistentds.config", |
| Location: "/my/location/", |
| }, |
| "url_sig_nonexistentds.config": ConfigProfileParams{ |
| FileNameOnDisk: "url_sig_nonexistentds.config", |
| Location: "/my/location/", |
| }, |
| "hdr_rw_nonexistentds.config": ConfigProfileParams{ |
| FileNameOnDisk: "hdr_rw_nonexistentds.config", |
| Location: "/my/location/", |
| }, |
| "hdr_rw_mid_nonexistentds.config": ConfigProfileParams{ |
| FileNameOnDisk: "hdr_rw_mid_nonexistentds.config", |
| Location: "/my/location/", |
| }, |
| "unknown.config": ConfigProfileParams{ |
| FileNameOnDisk: "unknown.config", |
| Location: "/my/location/", |
| }, |
| "custom.config": ConfigProfileParams{ |
| FileNameOnDisk: "custom.config", |
| Location: "/my/location/", |
| }, |
| "external.config": ConfigProfileParams{ |
| FileNameOnDisk: "external.config", |
| Location: "/my/location/", |
| URL: "http://myurl/remap.config", |
| }, |
| } |
| uriSignedDSes := []tc.DeliveryServiceName{"mydsname"} |
| dses := map[tc.DeliveryServiceName]struct{}{"mydsname": {}} |
| |
| scopeParams := map[string]string{"custom.config": string(tc.ATSConfigMetaDataConfigFileScopeProfiles)} |
| |
| txt := MakeMetaConfig(serverHostName, server, tmURL, tmReverseProxyURL, locationParams, uriSignedDSes, scopeParams, dses) |
| |
| cfg := tc.ATSConfigMetaData{} |
| if err := json.Unmarshal([]byte(txt), &cfg); err != nil { |
| t.Fatalf("MakeMetaConfig returned invalid JSON: " + err.Error()) |
| } |
| |
| if cfg.Info.ProfileID != int(server.ProfileID) { |
| t.Errorf("expected Info.ProfileID %v actual %v", server.ProfileID, cfg.Info.ProfileID) |
| } |
| |
| if cfg.Info.TOReverseProxyURL != tmReverseProxyURL { |
| t.Errorf("expected Info.TOReverseProxyURL %v actual %v", tmReverseProxyURL, cfg.Info.TOReverseProxyURL) |
| } |
| |
| if cfg.Info.TOURL != tmURL { |
| t.Errorf("expected Info.TOURL %v actual %v", tmURL, cfg.Info.TOURL) |
| } |
| |
| if server.IP != cfg.Info.ServerIPv4 { |
| t.Errorf("expected Info.ServerIP %v actual %v", server.IP, cfg.Info.ServerIPv4) |
| } |
| |
| if server.Port != cfg.Info.ServerPort { |
| t.Errorf("expected Info.ServerPort %v actual %v", server.Port, cfg.Info.ServerPort) |
| } |
| |
| if server.HostName != cfg.Info.ServerName { |
| t.Errorf("expected Info.ServerName %v actual %v", server.HostName, cfg.Info.ServerName) |
| } |
| |
| if cfg.Info.CDNID != server.CDNID { |
| t.Errorf("expected Info.CDNID %v actual %v", server.CDNID, cfg.Info.CDNID) |
| } |
| |
| if cfg.Info.CDNName != string(server.CDN) { |
| t.Errorf("expected Info.CDNName %v actual %v", server.CDN, cfg.Info.CDNName) |
| } |
| if cfg.Info.ServerID != server.ID { |
| t.Errorf("expected Info.ServerID %v actual %v", server.ID, cfg.Info.ServerID) |
| } |
| if cfg.Info.ProfileName != server.ProfileName { |
| t.Errorf("expected Info.ProfileName %v actual %v", server.ProfileName, cfg.Info.ProfileName) |
| } |
| |
| expectedConfigs := map[string]func(cf tc.ATSConfigMetaDataConfigFile){ |
| "cache.config": func(cf tc.ATSConfigMetaDataConfigFile) { |
| if expected := "/my/location/"; cf.Location != expected { |
| t.Errorf("expected location '%v', actual '%v'", expected, cf.Location) |
| } |
| if expected := string(tc.ATSConfigMetaDataConfigFileScopeProfiles); cf.Scope != expected { |
| t.Errorf("expected scope '%v', actual '%v'", expected, cf.Scope) |
| } |
| }, |
| "ip_allow.config": func(cf tc.ATSConfigMetaDataConfigFile) { |
| if expected := "/my/location/"; cf.Location != expected { |
| t.Errorf("expected location '%v', actual '%v'", expected, cf.Location) |
| } |
| if expected := string(tc.ATSConfigMetaDataConfigFileScopeServers); cf.Scope != expected { |
| t.Errorf("expected scope '%v', actual '%v'", expected, cf.Scope) |
| } |
| }, |
| "volume.config": func(cf tc.ATSConfigMetaDataConfigFile) { |
| if expected := "/my/location/"; cf.Location != expected { |
| t.Errorf("expected location '%v', actual '%v'", expected, cf.Location) |
| } |
| if expected := string(tc.ATSConfigMetaDataConfigFileScopeProfiles); cf.Scope != expected { |
| t.Errorf("expected scope '%v', actual '%v'", expected, cf.Scope) |
| } |
| }, |
| "ssl_multicert.config": func(cf tc.ATSConfigMetaDataConfigFile) { |
| if expected := "/my/location/"; cf.Location != expected { |
| t.Errorf("expected location '%v', actual '%v'", expected, cf.Location) |
| } |
| if expected := string(tc.ATSConfigMetaDataConfigFileScopeCDNs); cf.Scope != expected { |
| t.Errorf("expected scope '%v', actual '%v'", expected, cf.Scope) |
| } |
| }, |
| "uri_signing_mydsname.config": func(cf tc.ATSConfigMetaDataConfigFile) { |
| if expected := "/my/location/"; cf.Location != expected { |
| t.Errorf("expected location '%v', actual '%v'", expected, cf.Location) |
| } |
| if expected := string(tc.ATSConfigMetaDataConfigFileScopeProfiles); cf.Scope != expected { |
| t.Errorf("expected scope '%v', actual '%v'", expected, cf.Scope) |
| } |
| }, |
| "unknown.config": func(cf tc.ATSConfigMetaDataConfigFile) { |
| if expected := "/my/location/"; cf.Location != expected { |
| t.Errorf("expected location '%v', actual '%v'", expected, cf.Location) |
| } |
| if expected := string(tc.ATSConfigMetaDataConfigFileScopeServers); cf.Scope != expected { |
| t.Errorf("expected scope '%v', actual '%v'", expected, cf.Scope) |
| } |
| }, |
| "custom.config": func(cf tc.ATSConfigMetaDataConfigFile) { |
| if expected := "/my/location/"; cf.Location != expected { |
| t.Errorf("expected location '%v', actual '%v'", expected, cf.Location) |
| } |
| if expected := string(tc.ATSConfigMetaDataConfigFileScopeProfiles); cf.Scope != expected { |
| t.Errorf("expected scope '%v', actual '%v'", expected, cf.Scope) |
| } |
| }, |
| "remap.config": func(cf tc.ATSConfigMetaDataConfigFile) { |
| if expected := "/my/location/"; cf.Location != expected { |
| t.Errorf("expected location '%v', actual '%v'", expected, cf.Location) |
| } |
| if expected := string(tc.ATSConfigMetaDataConfigFileScopeServers); cf.Scope != expected { |
| t.Errorf("expected scope '%v', actual '%v'", expected, cf.Scope) |
| } |
| }, |
| "regex_revalidate.config": func(cf tc.ATSConfigMetaDataConfigFile) { |
| if expected := "/my/location/"; cf.Location != expected { |
| t.Errorf("expected location '%v', actual '%v'", expected, cf.Location) |
| } |
| if expected := string(tc.ATSConfigMetaDataConfigFileScopeCDNs); cf.Scope != expected { |
| t.Errorf("expected scope '%v', actual '%v'", expected, cf.Scope) |
| } |
| }, |
| "external.config": func(cf tc.ATSConfigMetaDataConfigFile) { |
| if expected := "/my/location/"; cf.Location != expected { |
| t.Errorf("expected location '%v', actual '%v'", expected, cf.Location) |
| } |
| if expected := string(tc.ATSConfigMetaDataConfigFileScopeCDNs); cf.Scope != expected { |
| t.Errorf("expected scope '%v', actual '%v'", expected, cf.Scope) |
| } |
| }, |
| } |
| |
| for _, cfgFile := range cfg.ConfigFiles { |
| if testF, ok := expectedConfigs[cfgFile.FileNameOnDisk]; !ok { |
| t.Errorf("unexpected config '" + cfgFile.FileNameOnDisk + "'") |
| } else { |
| testF(cfgFile) |
| delete(expectedConfigs, cfgFile.FileNameOnDisk) |
| } |
| } |
| |
| server.Type = "MID" |
| txt = MakeMetaConfig(serverHostName, server, tmURL, tmReverseProxyURL, locationParams, uriSignedDSes, scopeParams, dses) |
| cfg = tc.ATSConfigMetaData{} |
| if err := json.Unmarshal([]byte(txt), &cfg); err != nil { |
| t.Fatalf("MakeMetaConfig returned invalid JSON: " + err.Error()) |
| } |
| for _, cfgFile := range cfg.ConfigFiles { |
| if cfgFile.FileNameOnDisk != "cache.config" { |
| continue |
| } |
| if expected := string(tc.ATSConfigMetaDataConfigFileScopeServers); cfgFile.Scope != expected { |
| t.Errorf("expected cache.config on a Mid to be scope '%v', actual '%v'", expected, cfgFile.Scope) |
| } |
| break |
| } |
| if strings.Contains(txt, "nonexistentds") { |
| t.Errorf("expected location parameters for nonexistent delivery services to not be added to config, actual '%v'", txt) |
| } |
| |
| // check for expected apiUri vs url keys (if values are empty strings, they should be omitted from the json) |
| m := map[string]interface{}{} |
| if err := json.Unmarshal([]byte(txt), &m); err != nil { |
| t.Fatalf("MakeMetaConfig returned invalid JSON: " + err.Error()) |
| } |
| cfl := m["configFiles"].([]interface{}) |
| for _, cf := range cfl { |
| c := cf.(map[string]interface{}) |
| if c["fnameOnDisk"] == "external.config" { |
| if _, exists := c["apiUri"]; exists { |
| t.Errorf("expected: apiUri field to be omitted for external.config, actual: present") |
| } |
| if _, exists := c["url"]; !exists { |
| t.Errorf("expected: url field to be present for external.config, actual: omitted") |
| } |
| } |
| } |
| } |