in pkg/gcv/configs/config.go [155:253]
func convertLegacyConstraintTemplate(u *unstructured.Unstructured, regoLib []string) error {
targetMap, found, err := unstructured.NestedMap(u.Object, "spec", "targets")
if err != nil && !found {
return nil
}
if u.GroupVersionKind().Version != "v1alpha1" {
return errors.Errorf("only v1alpha1 constraint templates are eligible for legacy conversion")
}
// Make name match kind as appropriate
ctKind, found, err := unstructured.NestedString(u.Object, "spec", "crd", "spec", "names", "kind")
if err != nil {
return errors.Wrapf(err, "invalid kind at spec.crd.spec.names.kind")
}
if !found {
return errors.Errorf("No kind found at spec.crd.spec.names.kind")
}
if len(targetMap) != 1 {
return errors.Errorf("got invalid number of targets %d", len(targetMap))
}
// Transcode target
var targets []interface{}
for name, targetIface := range targetMap {
legacyTarget, ok := targetIface.(map[string]interface{})
if !ok {
return errors.Errorf("wrong type in legacy target")
}
target := map[string]interface{}{}
regoIface, found := legacyTarget["rego"]
if !found {
return errors.Errorf("no rego specified in template")
}
rego, ok := regoIface.(string)
if !ok {
return errors.Errorf("failed to get rego from template")
}
rr, err := regorewriter.New(regorewriter.NewPackagePrefixer("lib"), []string{"data.validator"}, nil)
if err != nil {
return errors.Wrapf(err, "failed to create rego rewriter")
}
for idx, lib := range regoLib {
path := fmt.Sprintf("idx-%d.rego", idx)
m, err := ast.ParseModule(path, lib)
if err != nil {
return fmt.Errorf("failed to ParseModule with path %s: %w", path, err)
}
if err := rr.AddLib(path, m); err != nil {
return errors.Wrapf(err, "failed to add lib %d", idx)
}
}
path := "template-rego"
m, err := ast.ParseModule(path, injectRegoAdapter(rego))
if err != nil {
return fmt.Errorf("failed to ParseModule with path %s: %w", path, err)
}
if err := rr.AddEntryPoint(path, m); err != nil {
return errors.Wrapf(err, "failed to add source")
}
srcs, err := rr.Rewrite()
if err != nil {
return errors.Wrapf(err, "failed to rewrite")
}
if len(srcs.EntryPoints) != 1 {
return errors.Errorf("invalid number of entrypoints")
}
newRego, err := srcs.EntryPoints[0].Content()
if err != nil {
return errors.Wrapf(err, "failed to convert rego to bytes")
}
var libs []interface{}
for _, lib := range srcs.Libs {
libBytes, err := lib.Content()
if err != nil {
return errors.Wrapf(err, "failed to convert lib to bytes")
}
libs = append(libs, string(libBytes))
}
target["rego"] = string(newRego)
target["libs"] = libs
target["target"] = name
targets = append(targets, target)
}
if err := unstructured.SetNestedSlice(u.Object, targets, "spec", "targets"); err != nil {
return errors.Wrapf(err, "failed to set transcoded target spec")
}
originalName := u.GetName()
u.SetName(strings.ToLower(ctKind))
setAnnotation(u, OriginalName, originalName)
return nil
}