internal/tools/checks/checkAllDefinitionsAreReferenced.go (30 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package checks import ( "fmt" "github.com/Azure/alzlib" "github.com/Azure/alzlib/internal/tools/checker" mapset "github.com/deckarep/golang-set/v2" ) var CheckAllDefinitionsAreReferenced = checker.NewValidatorCheck("All definitions are referenced", checkAllDefinitionsAreReferenced) func checkAllDefinitionsAreReferenced(azany any) error { az, ok := azany.(*alzlib.AlzLib) if !ok { return fmt.Errorf("checkAllDefinitionsAreReferenced: expected *alzlib.AlzLib, got %T", azany) } // Test if we have policy (set) definitions that are not referenced by any archetype referencedPds := mapset.NewThreadUnsafeSet[string]() referencedPsds := mapset.NewThreadUnsafeSet[string]() referencedRds := mapset.NewThreadUnsafeSet[string]() for _, archetypeName := range az.Archetypes() { archetype := az.Archetype(archetypeName) // nolint: errcheck referencedPds = referencedPds.Union(archetype.PolicyDefinitions) referencedPsds = referencedPsds.Union(archetype.PolicySetDefinitions) referencedRds = referencedRds.Union(archetype.RoleDefinitions) } unreferencedPds := mapset.NewThreadUnsafeSet(az.PolicyDefinitions()...).Difference(referencedPds).ToSlice() unreferencedPsds := mapset.NewThreadUnsafeSet(az.PolicySetDefinitions()...).Difference(referencedPsds).ToSlice() unreferencedRds := mapset.NewThreadUnsafeSet(az.RoleDefinitions()...).Difference(referencedRds).ToSlice() if len(unreferencedPds) > 0 || len(unreferencedPsds) > 0 || len(unreferencedRds) > 0 { return fmt.Errorf("checkAllDefinitionsAreReferenced: found unreferenced definitions [policyDefinitions] [policySetDefinitions] [roleDefinitions]: %v, %v, %v", unreferencedPds, unreferencedPsds, unreferencedRds) } return nil }