Add more guardrails to release config compilation

Throw an error if a release config dir appears to contribute flagging
overrides to a release config without actually doing so (by having
release_configs/{name}.textproto).

Bug: None
Test: manual, TH
Change-Id: Ie71cd6898bda4b8da8d58c3e23fb89ed17ebebd1
This commit is contained in:
LaMont Jones
2024-07-12 12:26:26 -07:00
parent 96fbf8ba93
commit 92b54c4907
2 changed files with 47 additions and 2 deletions

View File

@@ -42,6 +42,10 @@ type ReleaseConfigMap struct {
// Flags declared this directory's flag_declarations/*.textproto
FlagDeclarations []rc_proto.FlagDeclaration
// Potential aconfig and build flag contributions in this map directory.
// This is used to detect errors.
FlagValueDirs map[string][]string
}
type ReleaseConfigDirMap map[string]int
@@ -317,6 +321,21 @@ func (configs *ReleaseConfigs) LoadReleaseConfigMap(path string, ConfigDirIndex
return err
}
subDirs := func(subdir string) (ret []string) {
if flagVersions, err := os.ReadDir(filepath.Join(dir, subdir)); err == nil {
for _, e := range flagVersions {
if e.IsDir() && validReleaseConfigName(e.Name()) {
ret = append(ret, e.Name())
}
}
}
return
}
m.FlagValueDirs = map[string][]string{
"aconfig": subDirs("aconfig"),
"flag_values": subDirs("flag_values"),
}
err = WalkTextprotoFiles(dir, "release_configs", func(path string, d fs.DirEntry, err error) error {
releaseConfigContribution := &ReleaseConfigContribution{path: path, DeclarationIndex: ConfigDirIndex}
LoadMessage(path, &releaseConfigContribution.proto)
@@ -424,6 +443,27 @@ func (configs *ReleaseConfigs) GenerateReleaseConfigs(targetRelease string) erro
}
}
// Look for ignored flagging values. Gather the entire list to make it easier to fix them.
errors := []string{}
for _, contrib := range configs.ReleaseConfigMaps {
dirName := filepath.Dir(contrib.path)
for k, names := range contrib.FlagValueDirs {
for _, rcName := range names {
if config, err := configs.GetReleaseConfig(rcName); err == nil {
rcPath := filepath.Join(dirName, "release_configs", fmt.Sprintf("%s.textproto", config.Name))
if _, err := os.Stat(rcPath); err != nil {
errors = append(errors, fmt.Sprintf("%s exists but %s does not contribute to %s",
filepath.Join(dirName, k, rcName), dirName, config.Name))
}
}
}
}
}
if len(errors) > 0 {
return fmt.Errorf("%s", strings.Join(errors, "\n"))
}
releaseConfig, err := configs.GetReleaseConfig(targetRelease)
if err != nil {
return err

View File

@@ -31,8 +31,9 @@ import (
)
var (
disableWarnings bool
containerRegexp, _ = regexp.Compile("^[a-z][a-z0-9]*([._][a-z][a-z0-9]*)*$")
disableWarnings bool
containerRegexp, _ = regexp.Compile("^[a-z][a-z0-9]*([._][a-z][a-z0-9]*)*$")
releaseConfigRegexp, _ = regexp.Compile("^[a-z][a-z0-9]*([._][a-z0-9]*)*$")
)
type StringList []string
@@ -179,6 +180,10 @@ func validContainer(container string) bool {
return containerRegexp.MatchString(container)
}
func validReleaseConfigName(name string) bool {
return releaseConfigRegexp.MatchString(name)
}
// Returns the default value for release config artifacts.
func GetDefaultOutDir() string {
outEnv := os.Getenv("OUT_DIR")