This is an automated email from the ASF dual-hosted git repository. ocket8888 pushed a commit to branch 5.0.x in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
commit a2ee75cb452deebb9b1e1ded6a1a16b19248d9dd Author: Robert O Butts <[email protected]> AuthorDate: Wed Jan 13 08:33:46 2021 -0700 Add atscfg parent.config topology comment (#5414) (cherry picked from commit c08571586b651372435b627eedcabef479f69519) --- lib/go-atscfg/parentdotconfig.go | 50 +++- lib/go-atscfg/parentdotconfig_test.go | 346 ++++++++++++++++++++++++--- traffic_ops_ort/atstccfg/cfgfile/wrappers.go | 5 +- 3 files changed, 365 insertions(+), 36 deletions(-) diff --git a/lib/go-atscfg/parentdotconfig.go b/lib/go-atscfg/parentdotconfig.go index 082e1a7..a6e94ac 100644 --- a/lib/go-atscfg/parentdotconfig.go +++ b/lib/go-atscfg/parentdotconfig.go @@ -66,6 +66,19 @@ const ParentConfigCacheParamNotAParent = "not_a_parent" type OriginHost string type OriginFQDN string +// ParentConfigOpts contains settings to configure parent.config generation options. +type ParentConfigOpts struct { + // AddComments is whether to add informative comments to the generated file, about what was generated and why. + // Note this does not include the header comment, which is configured separately with HdrComment. + // These comments are human-readable and not guarnateed to be consistent between versions. Automating anything based on them is strongly discouraged. + AddComments bool + + // HdrComment is the header comment to include at the beginning of the file. + // This should be the text desired, without comment syntax (like # or //). The file's comment syntax will be added. + // To omit the header comment, pass the empty string. + HdrComment string +} + func MakeParentDotConfig( dses []DeliveryService, server *Server, @@ -78,7 +91,7 @@ func MakeParentDotConfig( cacheGroupArr []tc.CacheGroupNullable, dss []tc.DeliveryServiceServer, cdn *tc.CDN, - hdrComment string, + opt ParentConfigOpts, ) (Cfg, error) { warnings := []string{} @@ -110,7 +123,10 @@ func MakeParentDotConfig( sort.Sort(dsesSortByName(dses)) - hdr := makeHdrComment(hdrComment) + hdr := "" + if opt.HdrComment != "" { + hdr = makeHdrComment(opt.HdrComment) + } textArr := []string{} processedOriginsToDSNames := map[string]tc.DeliveryServiceName{} @@ -299,11 +315,12 @@ func MakeParentDotConfig( dsParams, atsMajorVer, dsOrigins[DeliveryServiceID(*ds.ID)], + opt.AddComments, ) warnings = append(warnings, topoWarnings...) if err != nil { // we don't want to fail generation with an error if one ds is malformed - warnings = append(warnings, err.Error()) // GetTopologyParentConfigLine includes error context + warnings = append(warnings, err.Error()) // getTopologyParentConfigLine includes error context continue } @@ -330,8 +347,10 @@ func MakeParentDotConfig( if parentSelectAlg := serverParams[ParentConfigParamAlgorithm]; strings.TrimSpace(parentSelectAlg) != "" { algorithm = "round_robin=" + parentSelectAlg } + textLine += makeParentComment(opt.AddComments, *ds.XMLID, "") textLine += "dest_domain=" + orgURI.Hostname() + " port=" + orgURI.Port() + " parent=" + *ds.OriginShield + " " + algorithm + " go_direct=true\n" } else if ds.MultiSiteOrigin != nil && *ds.MultiSiteOrigin { + textLine += makeParentComment(opt.AddComments, *ds.XMLID, "") textLine += "dest_domain=" + orgURI.Hostname() + " port=" + orgURI.Port() + " " if len(parentInfos) == 0 { } @@ -343,9 +362,11 @@ func MakeParentDotConfig( parents, secondaryParents, parentWarns := getMSOParentStrs(&ds, parentInfos[OriginHost(orgURI.Hostname())], atsMajorVer, dsParams.Algorithm, dsParams.TryAllPrimariesBeforeSecondary) warnings = append(warnings, parentWarns...) + textLine += parents + secondaryParents + ` round_robin=` + dsParams.Algorithm + ` qstring=` + parentQStr + ` go_direct=false parent_is_proxy=false` textLine += getParentRetryStr(true, atsMajorVer, dsParams.ParentRetry, dsParams.UnavailableServerRetryResponses, dsParams.MaxSimpleRetries, dsParams.MaxUnavailableServerRetries) textLine += "\n" // TODO remove, and join later on "\n" instead of ""? + textArr = append(textArr, textLine) } } else { @@ -365,6 +386,7 @@ func MakeParentDotConfig( continue } + text += makeParentComment(opt.AddComments, *ds.XMLID, "") // TODO encode this in a DSType func, IsGoDirect() ? if *ds.Type == tc.DSTypeHTTPNoCache || *ds.Type == tc.DSTypeHTTPLive || *ds.Type == tc.DSTypeDNSLive { text += `dest_domain=` + orgURI.Hostname() + ` port=` + orgURI.Port() + ` go_direct=true` + "\n" @@ -392,6 +414,7 @@ func MakeParentDotConfig( text += `dest_domain=` + orgURI.Hostname() + ` port=` + orgURI.Port() + ` ` + parents + ` ` + secondaryParents + ` ` + roundRobin + ` ` + goDirect + ` qstring=` + parentQStr + "\n" } + textArr = append(textArr, text) } processedOriginsToDSNames[*ds.OrgServerFQDN] = tc.DeliveryServiceName(*ds.XMLID) @@ -418,7 +441,10 @@ func MakeParentDotConfig( } sort.Sort(sort.StringSlice(textArr)) - text := hdr + strings.Join(textArr, "") + defaultDestText + text := hdr + strings.Join(textArr, "") + + text += makeParentComment(opt.AddComments, "", "") + defaultDestText + return Cfg{ Text: text, ContentType: ContentTypeParentDotConfig, @@ -427,6 +453,17 @@ func MakeParentDotConfig( }, nil } +// makeParentComment creates the parent line comment and returns it. +// If addComments is false, returns the empty string. This exists for composability. +// Either dsName or topology may be the empty string. +// The returned comment includes a trailing newline. +func makeParentComment(addComments bool, dsName string, topology string) string { + if !addComments { + return "" + } + return "# ds '" + dsName + "' topology '" + topology + "'" + "\n" +} + type parentConfigDS struct { Name tc.DeliveryServiceName QStringIgnore tc.QStringIgnore @@ -695,7 +732,7 @@ func getParentDSParams(ds DeliveryService, profileParentConfigParams map[string] return params, warnings } -// GetTopologyParentConfigLine returns the topology parent.config line, any warnings, and any error +// getTopologyParentConfigLine returns the topology parent.config line, any warnings, and any error func getTopologyParentConfigLine( server *Server, servers []Server, @@ -709,6 +746,7 @@ func getTopologyParentConfigLine( dsParams parentDSParams, atsMajorVer int, dsOrigins map[ServerID]struct{}, + addComments bool, ) (string, []string, error) { warnings := []string{} txt := "" @@ -728,6 +766,7 @@ func getTopologyParentConfigLine( return "", warnings, errors.New("DS " + *ds.XMLID + " topology '" + *ds.Topology + "' not found in Topologies!") } + txt += makeParentComment(addComments, *ds.XMLID, *ds.Topology) txt += "dest_domain=" + orgURI.Hostname() + " port=" + orgURI.Port() serverPlacement, err := getTopologyPlacement(tc.CacheGroupName(*server.Cachegroup), topology, cacheGroups, ds) @@ -762,6 +801,7 @@ func getTopologyParentConfigLine( txt += getTopologyParentIsProxyStr(serverPlacement.IsLastCacheTier) txt += getParentRetryStr(serverPlacement.IsLastCacheTier, atsMajorVer, dsParams.ParentRetry, dsParams.UnavailableServerRetryResponses, dsParams.MaxSimpleRetries, dsParams.MaxUnavailableServerRetries) txt += "\n" + return txt, warnings, nil } diff --git a/lib/go-atscfg/parentdotconfig_test.go b/lib/go-atscfg/parentdotconfig_test.go index 2c2b342..f888b2b 100644 --- a/lib/go-atscfg/parentdotconfig_test.go +++ b/lib/go-atscfg/parentdotconfig_test.go @@ -28,7 +28,7 @@ import ( ) func TestMakeParentDotConfig(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds0 := makeParentDS() ds0Type := tc.DSTypeHTTP @@ -132,7 +132,7 @@ func TestMakeParentDotConfig(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds0.example.net") { t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", txt) @@ -146,7 +146,7 @@ func TestMakeParentDotConfig(t *testing.T) { } func TestMakeParentDotConfigCapabilities(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds0 := makeParentDS() ds0Type := tc.DSTypeHTTP @@ -254,7 +254,7 @@ func TestMakeParentDotConfigCapabilities(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) lines := strings.Split(txt, "\n") @@ -290,7 +290,7 @@ func TestMakeParentDotConfigCapabilities(t *testing.T) { } func TestMakeParentDotConfigMSOSecondaryParent(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds0 := makeParentDS() ds0Type := tc.DSTypeHTTP @@ -395,7 +395,7 @@ func TestMakeParentDotConfigMSOSecondaryParent(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) txtx := strings.Replace(txt, " ", "", -1) @@ -405,7 +405,7 @@ func TestMakeParentDotConfigMSOSecondaryParent(t *testing.T) { } func TestMakeParentDotConfigTopologies(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds0 := makeParentDS() ds0Type := tc.DSTypeHTTP @@ -528,7 +528,7 @@ func TestMakeParentDotConfigTopologies(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds0.example.net") { t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", txt) @@ -547,7 +547,7 @@ func TestMakeParentDotConfigTopologies(t *testing.T) { // TestMakeParentDotConfigNotInTopologies tests when a given edge is NOT in a Topology, that it doesn't add a remap line. func TestMakeParentDotConfigNotInTopologies(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds0 := makeParentDS() ds0Type := tc.DSTypeHTTP @@ -666,7 +666,7 @@ func TestMakeParentDotConfigNotInTopologies(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if strings.Contains(txt, "dest_domain=ds0.example.net") { t.Errorf("expected parent 'dest_domain=ds0.example.net' to NOT contain Topology DS without this edge: '%v'", txt) @@ -677,7 +677,7 @@ func TestMakeParentDotConfigNotInTopologies(t *testing.T) { } func TestMakeParentDotConfigTopologiesCapabilities(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds0 := makeParentDS() ds0.ID = util.IntPtr(42) @@ -821,7 +821,7 @@ func TestMakeParentDotConfigTopologiesCapabilities(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds0.example.net") { t.Errorf("expected parent 'dest_domain=ds0.example.net' without required capabilities: '%v'", txt) @@ -835,7 +835,7 @@ func TestMakeParentDotConfigTopologiesCapabilities(t *testing.T) { } func TestMakeParentDotConfigTopologiesOmitOfflineParents(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds0 := makeParentDS() ds0Type := tc.DSTypeHTTP @@ -960,7 +960,7 @@ func TestMakeParentDotConfigTopologiesOmitOfflineParents(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds0.example.net") { t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", txt) @@ -978,7 +978,7 @@ func TestMakeParentDotConfigTopologiesOmitOfflineParents(t *testing.T) { } func TestMakeParentDotConfigTopologiesOmitDifferentCDNParents(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds0 := makeParentDS() ds0Type := tc.DSTypeHTTP @@ -1104,7 +1104,7 @@ func TestMakeParentDotConfigTopologiesOmitDifferentCDNParents(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds0.example.net") { t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", txt) @@ -1122,7 +1122,7 @@ func TestMakeParentDotConfigTopologiesOmitDifferentCDNParents(t *testing.T) { } func TestMakeParentDotConfigTopologiesMSO(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds1 := makeParentDS() ds1.ID = util.IntPtr(43) @@ -1240,7 +1240,7 @@ func TestMakeParentDotConfigTopologiesMSO(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds1.example.net") { t.Errorf("expected parent 'dest_domain=ds1.example.net', actual: '%v'", txt) @@ -1254,7 +1254,7 @@ func TestMakeParentDotConfigTopologiesMSO(t *testing.T) { } func TestMakeParentDotConfigTopologiesMSOWithCapabilities(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds1 := makeParentDS() ds1.ID = util.IntPtr(43) @@ -1381,7 +1381,7 @@ func TestMakeParentDotConfigTopologiesMSOWithCapabilities(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds1.example.net") { t.Errorf("expected parent 'dest_domain=ds1.example.net', actual: '%v'", txt) @@ -1395,7 +1395,7 @@ func TestMakeParentDotConfigTopologiesMSOWithCapabilities(t *testing.T) { } func TestMakeParentDotConfigMSOWithCapabilities(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds1 := makeParentDS() ds1.ID = util.IntPtr(43) @@ -1508,7 +1508,7 @@ func TestMakeParentDotConfigMSOWithCapabilities(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds1.example.net") { t.Errorf("expected parent 'dest_domain=ds1.example.net', actual: '%v'", txt) @@ -1522,7 +1522,7 @@ func TestMakeParentDotConfigMSOWithCapabilities(t *testing.T) { } func TestMakeParentDotConfigTopologiesMSOParams(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds1 := makeParentDS() ds1.ID = util.IntPtr(43) @@ -1672,7 +1672,7 @@ func TestMakeParentDotConfigTopologiesMSOParams(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds1.example.net") { t.Errorf("expected parent 'dest_domain=ds1.example.net', actual: '%v'", txt) @@ -1698,7 +1698,7 @@ func TestMakeParentDotConfigTopologiesMSOParams(t *testing.T) { } func TestMakeParentDotConfigTopologiesParams(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds1 := makeParentDS() ds1.ID = util.IntPtr(43) @@ -1848,7 +1848,7 @@ func TestMakeParentDotConfigTopologiesParams(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds1.example.net") { t.Errorf("expected parent 'dest_domain=ds1.example.net', actual: '%v'", txt) @@ -1875,7 +1875,7 @@ func TestMakeParentDotConfigTopologiesParams(t *testing.T) { func TestMakeParentDotConfigSecondaryMode(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds0 := makeParentDS() ds0Type := tc.DSTypeHTTP @@ -2019,7 +2019,7 @@ func TestMakeParentDotConfigSecondaryMode(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds0.example.net") { t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", txt) @@ -2036,7 +2036,7 @@ func TestMakeParentDotConfigSecondaryMode(t *testing.T) { } func TestMakeParentDotConfigNoSecondaryMode(t *testing.T) { - hdr := "myHeaderComment" + hdr := ParentConfigOpts{AddComments: false, HdrComment: "myHeaderComment"} ds0 := makeParentDS() ds0Type := tc.DSTypeHTTP @@ -2174,7 +2174,7 @@ func TestMakeParentDotConfigNoSecondaryMode(t *testing.T) { } txt := cfg.Text - testComment(t, txt, hdr) + testComment(t, txt, hdr.HdrComment) if !strings.Contains(txt, "dest_domain=ds0.example.net") { t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", txt) @@ -2188,6 +2188,292 @@ func TestMakeParentDotConfigNoSecondaryMode(t *testing.T) { if strings.Contains(txt, "secondary_mode") { t.Errorf("expected no secondary_mode for DSes without ParentConfigParamSecondaryMode parameter, actual: '%v'", txt) } + + if strings.Contains(txt, `topology 't0'`) { + t.Errorf("expected no comment with topology name, actual: '%v'", txt) + } + if strings.Contains(txt, `ds 'ds1'`) { + t.Errorf("expected no comment with delivery service name, actual: '%v'", txt) + } +} + +func TestMakeParentDotConfigComments(t *testing.T) { + hdr := ParentConfigOpts{AddComments: true, HdrComment: "myHeaderComment"} + + ds0 := makeParentDS() + ds0Type := tc.DSTypeHTTP + ds0.Type = &ds0Type + ds0.QStringIgnore = util.IntPtr(int(tc.QStringIgnoreUseInCacheKeyAndPassUp)) + ds0.OrgServerFQDN = util.StrPtr("http://ds0.example.net") + + ds1 := makeParentDS() + ds1.ID = util.IntPtr(43) + ds1Type := tc.DSTypeDNS + ds1.Type = &ds1Type + ds1.QStringIgnore = util.IntPtr(int(tc.QStringIgnoreDrop)) + ds1.OrgServerFQDN = util.StrPtr("http://ds1.example.net") + + dses := []DeliveryService{*ds0, *ds1} + + parentConfigParams := []tc.Parameter{ + { + Name: ParentConfigParamQStringHandling, + ConfigFile: "parent.config", + Value: "myQStringHandlingParam", + Profiles: []byte(`["serverprofile"]`), + }, + { + Name: ParentConfigParamAlgorithm, + ConfigFile: "parent.config", + Value: tc.AlgorithmConsistentHash, + Profiles: []byte(`["serverprofile"]`), + }, + { + Name: ParentConfigParamQString, + ConfigFile: "parent.config", + Value: "myQstringParam", + Profiles: []byte(`["serverprofile"]`), + }, + } + + serverParams := []tc.Parameter{ + { + Name: "trafficserver", + ConfigFile: "package", + Value: "7", + Profiles: []byte(`["global"]`), + }, + } + + server := makeTestParentServer() + + mid0 := makeTestParentServer() + mid0.Cachegroup = util.StrPtr("midCG") + mid0.HostName = util.StrPtr("mymid0") + mid0.ID = util.IntPtr(45) + setIP(mid0, "192.168.2.2") + + mid1 := makeTestParentServer() + mid1.Cachegroup = util.StrPtr("midCG") + mid1.HostName = util.StrPtr("mymid1") + mid1.ID = util.IntPtr(46) + setIP(mid1, "192.168.2.3") + + servers := []Server{*server, *mid0, *mid1} + + topologies := []tc.Topology{} + serverCapabilities := map[int]map[ServerCapability]struct{}{} + dsRequiredCapabilities := map[int]map[ServerCapability]struct{}{} + + eCG := &tc.CacheGroupNullable{} + eCG.Name = server.Cachegroup + eCG.ID = server.CachegroupID + eCG.ParentName = mid0.Cachegroup + eCG.ParentCachegroupID = mid0.CachegroupID + eCGType := tc.CacheGroupEdgeTypeName + eCG.Type = &eCGType + + mCG := &tc.CacheGroupNullable{} + mCG.Name = mid0.Cachegroup + mCG.ID = mid0.CachegroupID + mCGType := tc.CacheGroupMidTypeName + mCG.Type = &mCGType + + cgs := []tc.CacheGroupNullable{*eCG, *mCG} + + dss := []tc.DeliveryServiceServer{ + { + Server: util.IntPtr(*server.ID), + DeliveryService: util.IntPtr(*ds0.ID), + }, + { + Server: util.IntPtr(*server.ID), + DeliveryService: util.IntPtr(*ds1.ID), + }, + } + cdn := &tc.CDN{ + DomainName: "cdndomain.example", + Name: "my-cdn-name", + } + + cfg, err := MakeParentDotConfig(dses, server, servers, topologies, serverParams, parentConfigParams, serverCapabilities, dsRequiredCapabilities, cgs, dss, cdn, hdr) + if err != nil { + t.Fatal(err) + } + txt := cfg.Text + + testComment(t, txt, hdr.HdrComment) + + if !strings.Contains(txt, "dest_domain=ds0.example.net") { + t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", txt) + } + if !strings.Contains(txt, "dest_domain=ds1.example.net") { + t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", txt) + } + if !strings.Contains(txt, "qstring=myQStringHandlingParam") { + t.Errorf("expected qstring from param 'qstring=myQStringHandlingParam', actual: '%v'", txt) + } + if !strings.Contains(txt, "# ds 'ds1'") { + t.Errorf("expected comment with delivery service name, actual: '%v'", txt) + } +} + +func TestMakeParentDotConfigCommentTopology(t *testing.T) { + hdr := ParentConfigOpts{AddComments: true, HdrComment: "myHeaderComment"} + + ds0 := makeParentDS() + ds0Type := tc.DSTypeHTTP + ds0.Type = &ds0Type + ds0.QStringIgnore = util.IntPtr(int(tc.QStringIgnoreUseInCacheKeyAndPassUp)) + ds0.OrgServerFQDN = util.StrPtr("http://ds0.example.net") + ds0.ProfileID = util.IntPtr(311) + ds0.ProfileName = util.StrPtr("ds0Profile") + + ds1 := makeParentDS() + ds1.ID = util.IntPtr(43) + ds1Type := tc.DSTypeDNS + ds1.Type = &ds1Type + ds1.QStringIgnore = util.IntPtr(int(tc.QStringIgnoreDrop)) + ds1.OrgServerFQDN = util.StrPtr("http://ds1.example.net") + ds1.Topology = util.StrPtr("t0") + ds1.ProfileID = util.IntPtr(312) + ds1.ProfileName = util.StrPtr("ds1Profile") + + dses := []DeliveryService{*ds0, *ds1} + + parentConfigParams := []tc.Parameter{ + { + Name: ParentConfigParamQStringHandling, + ConfigFile: "parent.config", + Value: "myQStringHandlingParam", + Profiles: []byte(`["serverprofile"]`), + }, + { + Name: ParentConfigParamAlgorithm, + ConfigFile: "parent.config", + Value: tc.AlgorithmConsistentHash, + Profiles: []byte(`["serverprofile"]`), + }, + { + Name: ParentConfigParamQString, + ConfigFile: "parent.config", + Value: "myQstringParam", + Profiles: []byte(`["serverprofile"]`), + }, + } + + serverParams := []tc.Parameter{ + { + Name: "trafficserver", + ConfigFile: "package", + Value: "8", + Profiles: []byte(`["global"]`), + }, + } + + server := makeTestParentServer() + server.Cachegroup = util.StrPtr("edgeCG") + server.CachegroupID = util.IntPtr(400) + + mid0 := makeTestParentServer() + mid0.Cachegroup = util.StrPtr("midCG") + mid0.CachegroupID = util.IntPtr(500) + mid0.HostName = util.StrPtr("mymid") + mid0.ID = util.IntPtr(45) + setIP(mid0, "192.168.2.2") + + mid1 := makeTestParentServer() + mid1.Cachegroup = util.StrPtr("midCG2") + mid1.CachegroupID = util.IntPtr(501) + mid1.HostName = util.StrPtr("mymid1") + mid1.ID = util.IntPtr(46) + setIP(mid1, "192.168.2.3") + + servers := []Server{*server, *mid0, *mid1} + + topologies := []tc.Topology{ + { + Name: "t0", + Nodes: []tc.TopologyNode{ + { + Cachegroup: "edgeCG", + Parents: []int{1, 2}, + }, + { + Cachegroup: "midCG", + }, + { + Cachegroup: "midCG2", + }, + }, + }, + } + + serverCapabilities := map[int]map[ServerCapability]struct{}{} + dsRequiredCapabilities := map[int]map[ServerCapability]struct{}{} + + eCG := &tc.CacheGroupNullable{} + eCG.Name = server.Cachegroup + eCG.ID = server.CachegroupID + eCG.ParentName = mid0.Cachegroup + eCG.ParentCachegroupID = mid0.CachegroupID + eCG.SecondaryParentName = mid1.Cachegroup + eCG.SecondaryParentCachegroupID = mid1.CachegroupID + eCGType := tc.CacheGroupEdgeTypeName + eCG.Type = &eCGType + + mCG := &tc.CacheGroupNullable{} + mCG.Name = mid0.Cachegroup + mCG.ID = mid0.CachegroupID + mCGType := tc.CacheGroupMidTypeName + mCG.Type = &mCGType + + mCG2 := &tc.CacheGroupNullable{} + mCG2.Name = mid1.Cachegroup + mCG2.ID = mid1.CachegroupID + mCGType2 := tc.CacheGroupMidTypeName + mCG2.Type = &mCGType2 + + cgs := []tc.CacheGroupNullable{*eCG, *mCG, *mCG2} + + dss := []tc.DeliveryServiceServer{ + { + Server: util.IntPtr(*server.ID), + DeliveryService: util.IntPtr(*ds0.ID), + }, + { + Server: util.IntPtr(*server.ID), + DeliveryService: util.IntPtr(*ds1.ID), + }, + } + cdn := &tc.CDN{ + DomainName: "cdndomain.example", + Name: "my-cdn-name", + } + + cfg, err := MakeParentDotConfig(dses, server, servers, topologies, serverParams, parentConfigParams, serverCapabilities, dsRequiredCapabilities, cgs, dss, cdn, hdr) + if err != nil { + t.Fatal(err) + } + txt := cfg.Text + + testComment(t, txt, hdr.HdrComment) + + if !strings.Contains(txt, "dest_domain=ds0.example.net") { + t.Errorf("expected parent 'dest_domain=ds0.example.net', actual: '%v'", txt) + } + if !strings.Contains(txt, "dest_domain=ds1.example.net") { + t.Errorf("expected parent 'dest_domain=ds1.example.net', actual: '%v'", txt) + } + if !strings.Contains(txt, "qstring=myQStringHandlingParam") { + t.Errorf("expected qstring from param 'qstring=myQStringHandlingParam', actual: '%v'", txt) + } + if strings.Contains(txt, "secondary_mode") { + t.Errorf("expected no secondary_mode for DSes without ParentConfigParamSecondaryMode parameter, actual: '%v'", txt) + } + if !strings.Contains(txt, `# ds 'ds1' topology 't0'`) { + t.Errorf("expected comment with delivery service and topology, actual: '%v'", txt) + } } func makeTestParentServer() *Server { diff --git a/traffic_ops_ort/atstccfg/cfgfile/wrappers.go b/traffic_ops_ort/atstccfg/cfgfile/wrappers.go index b189b5b..cd485bd 100644 --- a/traffic_ops_ort/atstccfg/cfgfile/wrappers.go +++ b/traffic_ops_ort/atstccfg/cfgfile/wrappers.go @@ -126,7 +126,10 @@ func MakeParentDotConfig(toData *config.TOData, fileName string, hdrCommentTxt s toData.CacheGroups, toData.DeliveryServiceServers, toData.CDN, - hdrCommentTxt, + atscfg.ParentConfigOpts{ + HdrComment: hdrCommentTxt, + AddComments: true, // TODO add a CLI flag? + }, ) }
