From c9fbffebef78c2fe95aedaf767e83ec0898175aa Mon Sep 17 00:00:00 2001 From: michaelhtm <98621731+michaelhtm@users.noreply.github.com> Date: Fri, 4 Oct 2024 17:52:00 -0700 Subject: [PATCH] Ignore CEL expressions for CRDs We are deciding to ignore CEL expressions for CRDs for now, since CRDs get some variables injected by kubernetes that don't have specific types. --- internal/resourcegroup/builder.go | 52 ++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/internal/resourcegroup/builder.go b/internal/resourcegroup/builder.go index 12fb17b6..250c21dc 100644 --- a/internal/resourcegroup/builder.go +++ b/internal/resourcegroup/builder.go @@ -121,25 +121,41 @@ func (b *GraphBuilder) NewResourceGroup(rg *v1alpha1.ResourceGroup) (*ResourceGr return nil, fmt.Errorf("failed to get schema for resource %s: %w", rgResource.Name, err) } - // 4. Emulate the resource, this is later used to verify the validity of the - // CEL expressions. - emulatedResource, err := b.resourceEmulator.GenerateDummyCR(gvk, resourceSchema) - if err != nil { - return nil, fmt.Errorf("failed to generate dummy CR for resource %s: %w", rgResource.Name, err) - } + var emulatedResource *unstructured.Unstructured + var resourceVariables []*ResourceVariable - // 5. Extract CEL celExpressions from the schema. - celExpressions, err := parser.ParseResource(unstructuredResource, resourceSchema) - if err != nil { - return nil, fmt.Errorf("failed to extract CEL expressions from schema for resource %s: %w", rgResource.Name, err) - } - resourceVariables := []*ResourceVariable{} - for _, celExpression := range celExpressions { - resourceVariables = append(resourceVariables, &ResourceVariable{ - // Assume variables are static, we'll validate them later - Kind: ResourceVariableKindStatic, - CELField: celExpression, - }) + // TODO(michaelhtm): CRDs are not supported for extraction currently + // implement new logic specific to CRDs + if gvk.Kind == "CustomResourceDefinition" { + emulatedResource, err := parser.ParseSchemalessResource(unstructuredResource) + if err != nil { + return nil, fmt.Errorf("failed to parse schemaless resource %s: %w", rgResource.Name, err) + } + if emulatedResource != nil { + return nil, fmt.Errorf("failed, CEL expressions are not supported for CRDs, resource %s", rgResource.Name) + } + } else { + + // 4. Emulate the resource, this is later used to verify the validity of the + // CEL expressions. + emulatedResource, err = b.resourceEmulator.GenerateDummyCR(gvk, resourceSchema) + if err != nil { + return nil, fmt.Errorf("failed to generate dummy CR for resource %s: %w", rgResource.Name, err) + } + + // 5. Extract CEL celExpressions from the schema. + celExpressions, err := parser.ParseResource(unstructuredResource, resourceSchema) + if err != nil { + return nil, fmt.Errorf("failed to extract CEL expressions from schema for resource %s: %w", rgResource.Name, err) + } + resourceVariables = []*ResourceVariable{} + for _, celExpression := range celExpressions { + resourceVariables = append(resourceVariables, &ResourceVariable{ + // Assume variables are static, we'll validate them later + Kind: ResourceVariableKindStatic, + CELField: celExpression, + }) + } } resources[rgResource.Name] = &Resource{