in lib/go-atscfg/meta.go [152:299]
func addMetaObjConfigDir(
configFiles []CfgMeta,
configDir string,
server *Server,
locationParams map[string]configProfileParams, // map[configFile]params; 'location' and 'URL' Parameters on serverHostName's Profile
uriSignedDSes []tc.DeliveryServiceName,
dses map[tc.DeliveryServiceName]DeliveryService,
cacheGroupArr []tc.CacheGroupNullableV5,
topologies []tc.TopologyV5,
atsMajorVersion uint,
) ([]CfgMeta, []string, error) {
warnings := []string{}
if server.CacheGroup == "" {
return nil, warnings, errors.New("server missing Cachegroup")
}
cacheGroups, err := makeCGMap(cacheGroupArr)
if err != nil {
return nil, warnings, errors.New("making CG map: " + err.Error())
}
// Note there may be multiple files with the same name in different directories.
configFilesM := map[string][]CfgMeta{} // map[fileShortName]CfgMeta
for _, fi := range configFiles {
configFilesM[fi.Name] = append(configFilesM[fi.Path], fi)
}
// add all strictly required files, all of which should be in the base config directory.
// If they don't exist, create them.
// If they exist with a relative path, prepend configDir.
// If any exist with a relative path, or don't exist, and configDir is empty, return an error.
for _, fileName := range requiredFiles(atsMajorVersion) {
if _, ok := configFilesM[fileName]; ok {
continue
}
if configDir == "" {
return nil, warnings, errors.New("required file '" + fileName + "' has no location Parameter, and ATS config directory not found.")
}
configFilesM[fileName] = []CfgMeta{{
Name: fileName,
Path: configDir,
}}
}
for fileName, fis := range configFilesM {
newFis := []CfgMeta{}
for _, fi := range fis {
if !filepath.IsAbs(fi.Path) {
if configDir == "" {
return nil, warnings, errors.New("file '" + fileName + "' has location Parameter with relative path '" + fi.Path + "', but ATS config directory was not found.")
}
absPath := filepath.Join(configDir, fi.Path)
fi.Path = absPath
}
newFis = append(newFis, fi)
}
configFilesM[fileName] = newFis
}
nameTopologies := makeTopologyNameMap(topologies)
for _, ds := range dses {
if ds.XMLID == "" {
warnings = append(warnings, "got Delivery Service with nil XMLID - not considering!")
continue
}
err := error(nil)
// Note we log errors, but don't return them.
// If an individual DS has an error, we don't want to break the rest of the CDN.
if ds.Topology != nil && *ds.Topology != "" {
topology := nameTopologies[TopologyName(*ds.Topology)]
placement, err := getTopologyPlacement(tc.CacheGroupName(server.CacheGroup), topology, cacheGroups, &ds)
if err != nil {
return nil, warnings, errors.New("getting topology placement: " + err.Error())
}
if placement.IsFirstCacheTier {
if (ds.FirstHeaderRewrite != nil && *ds.FirstHeaderRewrite != "") || ds.MaxOriginConnections != nil || ds.ServiceCategory != nil {
fileName := FirstHeaderRewriteConfigFileName(ds.XMLID)
if configFilesM, err = ensureConfigFile(configFilesM, fileName, configDir); err != nil {
warnings = append(warnings, "ensuring config file '"+fileName+"': "+err.Error())
}
}
}
if placement.IsInnerCacheTier {
if (ds.InnerHeaderRewrite != nil && *ds.InnerHeaderRewrite != "") || ds.MaxOriginConnections != nil || ds.ServiceCategory != nil {
fileName := InnerHeaderRewriteConfigFileName(ds.XMLID)
if configFilesM, err = ensureConfigFile(configFilesM, fileName, configDir); err != nil {
warnings = append(warnings, "ensuring config file '"+fileName+"': "+err.Error())
}
}
}
if placement.IsLastCacheTier {
if (ds.LastHeaderRewrite != nil && *ds.LastHeaderRewrite != "") || ds.MaxOriginConnections != nil || ds.ServiceCategory != nil {
fileName := LastHeaderRewriteConfigFileName(ds.XMLID)
if configFilesM, err = ensureConfigFile(configFilesM, fileName, configDir); err != nil {
warnings = append(warnings, "ensuring config file '"+fileName+"': "+err.Error())
}
}
}
} else if strings.HasPrefix(server.Type, tc.EdgeTypePrefix) {
if (ds.EdgeHeaderRewrite != nil || ds.MaxOriginConnections != nil || ds.ServiceCategory != nil) &&
strings.HasPrefix(server.Type, tc.EdgeTypePrefix) {
fileName := "hdr_rw_" + ds.XMLID + ".config"
if configFilesM, err = ensureConfigFile(configFilesM, fileName, configDir); err != nil {
warnings = append(warnings, "ensuring config file '"+fileName+"': "+err.Error())
}
}
} else if strings.HasPrefix(server.Type, tc.MidTypePrefix) {
if (ds.MidHeaderRewrite != nil || ds.MaxOriginConnections != nil || ds.ServiceCategory != nil) &&
ds.Type != nil && tc.DSType(*ds.Type).UsesMidCache() &&
strings.HasPrefix(server.Type, tc.MidTypePrefix) {
fileName := "hdr_rw_mid_" + ds.XMLID + ".config"
if configFilesM, err = ensureConfigFile(configFilesM, fileName, configDir); err != nil {
warnings = append(warnings, "ensuring config file '"+fileName+"': "+err.Error())
}
}
}
if ds.RegexRemap != nil {
configFile := "regex_remap_" + ds.XMLID + ".config"
if configFilesM, err = ensureConfigFile(configFilesM, configFile, configDir); err != nil {
warnings = append(warnings, "ensuring config file '"+configFile+"': "+err.Error())
}
}
if ds.SigningAlgorithm != nil && *ds.SigningAlgorithm == tc.SigningAlgorithmURLSig {
configFile := "url_sig_" + ds.XMLID + ".config"
if configFilesM, err = ensureConfigFile(configFilesM, configFile, configDir); err != nil {
warnings = append(warnings, "ensuring config file '"+configFile+"': "+err.Error())
}
}
if ds.SigningAlgorithm != nil && *ds.SigningAlgorithm == tc.SigningAlgorithmURISigning {
configFile := "uri_signing_" + ds.XMLID + ".config"
if configFilesM, err = ensureConfigFile(configFilesM, configFile, configDir); err != nil {
warnings = append(warnings, "ensuring config file '"+configFile+"': "+err.Error())
}
}
}
newFiles := []CfgMeta{}
for _, fis := range configFilesM {
for _, fi := range fis {
newFiles = append(newFiles, fi)
}
}
return newFiles, warnings, nil
}