func addMetaObjConfigDir()

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
}