Files
capsule/pkg/template/functions/resource.go
T
Oliver Bähler da74cfdab7 fix: allow replications to own replications without blocking controller updates (#2107)
* chore

* perfromance improvements

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* perfromance improvements

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat(performance): removed duplicate client calls from all admission paths

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat(performance): removed duplicate client calls from all admission paths

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat(performance): removed duplicate client calls from all admission paths

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat(performance): removed duplicate client calls from all admission paths

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat(performance): removed duplicate client calls from all admission paths

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat(performance): removed duplicate client calls from all admission paths

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat(performance): removed duplicate client calls from all admission paths

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add globalresourcequota api

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add globalresourcequota api

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add globalresourcequota api

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add globalresourcequota api

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add globalresourcequota api

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add globalresourcequota api

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* fix: remove resource rejections checks

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* fix: allow replications to own replications without blocking controller updates

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* fix: allow replications to own replications without blocking controller updates

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* fix: allow replications to own replications without blocking controller updates

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

---------

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>
2026-08-26 21:59:57 +02:00

102 lines
2.2 KiB
Go

// Copyright 2020-2026 Project Capsule Authors
// SPDX-License-Identifier: Apache-2.0
package functions
import "fmt"
func getResourceByName(name string, resources any) (map[string]any, error) {
return findResource(
resources,
fmt.Sprintf("metadata.name %q", name),
func(metadata map[string]any) bool {
return metadata["name"] == name
},
)
}
func mustGetResourceByName(name string, resources any) (map[string]any, error) {
resource, err := getResourceByName(name, resources)
if err != nil {
return nil, err
}
if len(resource) == 0 {
return nil, fmt.Errorf("resource with metadata.name %q was not found", name)
}
return resource, nil
}
func getResourceByNamespacedName(namespace, name string, resources any) (map[string]any, error) {
return findResource(
resources,
fmt.Sprintf("metadata.namespace %q and metadata.name %q", namespace, name),
func(metadata map[string]any) bool {
resourceNamespace, _ := metadata["namespace"].(string)
return resourceNamespace == namespace && metadata["name"] == name
},
)
}
func findResource(
resources any,
description string,
matches func(map[string]any) bool,
) (map[string]any, error) {
items, err := resourceItems(resources)
if err != nil {
return nil, err
}
var match map[string]any
for index, item := range items {
metadata, ok := item["metadata"].(map[string]any)
if !ok {
return nil, fmt.Errorf("resource at index %d has invalid or missing metadata", index)
}
if !matches(metadata) {
continue
}
if match != nil {
return nil, fmt.Errorf("multiple resources match %s", description)
}
match = item
}
if match == nil {
return map[string]any{}, nil
}
return match, nil
}
func resourceItems(resources any) ([]map[string]any, error) {
switch value := resources.(type) {
case nil:
return nil, nil
case []map[string]any:
return value, nil
case []any:
items := make([]map[string]any, 0, len(value))
for index, item := range value {
resource, ok := item.(map[string]any)
if !ok {
return nil, fmt.Errorf("resource at index %d must be an object, got %T", index, item)
}
items = append(items, resource)
}
return items, nil
default:
return nil, fmt.Errorf("resources must be a list of objects, got %T", resources)
}
}