diff --git a/krm-functions/dnn-fn/fn/function.go b/krm-functions/dnn-fn/fn/function.go new file mode 100644 index 00000000..3d02c9da --- /dev/null +++ b/krm-functions/dnn-fn/fn/function.go @@ -0,0 +1,167 @@ +/* + Copyright 2023 The Nephio Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package fn + +import ( + "strings" + + "fmt" + + "github.com/GoogleContainerTools/kpt-functions-sdk/go/fn" + infrav1alpha1 "github.com/nephio-project/api/infra/v1alpha1" + nephioreqv1alpha1 "github.com/nephio-project/api/nf_requirements/v1alpha1" + "github.com/nephio-project/nephio/krm-functions/lib/condkptsdk" + "github.com/nephio-project/nephio/krm-functions/lib/kubeobject" + ipam_common "github.com/nokia/k8s-ipam/apis/alloc/common/v1alpha1" + ipamv1alpha1 "github.com/nokia/k8s-ipam/apis/alloc/ipam/v1alpha1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type DnnFn struct { + sdk condkptsdk.KptCondSDK + ClusterContext *infrav1alpha1.ClusterContext + rl *fn.ResourceList +} + +// Run is the entry point of the KRM function (called by the upstream fn SDK) +func Run(rl *fn.ResourceList) (bool, error) { + var err error + myFn := DnnFn{rl: rl} + + myFn.sdk, err = condkptsdk.New( + rl, + &condkptsdk.Config{ + For: corev1.ObjectReference{ + APIVersion: nephioreqv1alpha1.GroupVersion.Identifier(), + Kind: nephioreqv1alpha1.DataNetworkKind, + }, + Owns: map[corev1.ObjectReference]condkptsdk.ResourceKind{ + { + APIVersion: ipamv1alpha1.GroupVersion.Identifier(), + Kind: ipamv1alpha1.IPAllocationKind, + }: condkptsdk.ChildRemote, + }, + Watch: map[corev1.ObjectReference]condkptsdk.WatchCallbackFn{ + { + APIVersion: infrav1alpha1.GroupVersion.Identifier(), + Kind: infrav1alpha1.ClusterContextKind, + }: myFn.ClusterContextCallbackFn, + }, + PopulateOwnResourcesFn: myFn.desiredOwnedResourceList, + GenerateResourceFn: myFn.updateDnnResource, + }, + ) + if err != nil { + rl.Results.ErrorE(err) + return false, nil + } + return myFn.sdk.Run() +} + +// called for all CLusterContext resources in the package +func (f *DnnFn) ClusterContextCallbackFn(o *fn.KubeObject) error { + var err error + + if f.ClusterContext != nil { + return fmt.Errorf("multiple ClusterContext objects found in the kpt package") + } + f.ClusterContext, err = KubeObjectToStruct[infrav1alpha1.ClusterContext](o) + if err != nil { + return err + } + return f.ClusterContext.Spec.Validate() +} + +// desiredOwnedResourceList returns with the list of all KubeObjects that the DNN "for object" should own in the package +func (f *DnnFn) desiredOwnedResourceList(o *fn.KubeObject) (fn.KubeObjects, error) { + if f.ClusterContext == nil { + // no ClusterContext in the package + return nil, fmt.Errorf("ClusterContext is missing from the kpt package") + } + + // get "parent"| DNN struct + dnn, err := KubeObjectToStruct[nephioreqv1alpha1.DataNetwork](o) + if err != nil { + return nil, err + } + + // add IPAllocation for each pool + resources := fn.KubeObjects{} + for _, pool := range dnn.Spec.Pools { + ipalloc := ipamv1alpha1.BuildIPAllocation( + metav1.ObjectMeta{ + Name: fmt.Sprintf("%s-%s", dnn.Name, pool.Name), + }, + ipamv1alpha1.IPAllocationSpec{ + Kind: ipamv1alpha1.PrefixKindPool, + NetworkInstance: dnn.Spec.NetworkInstance, + PrefixLength: &pool.PrefixLength, + AllocationLabels: ipam_common.AllocationLabels{ + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + ipam_common.NephioSiteKey: *f.ClusterContext.Spec.SiteCode, // NOTE: at this point ClusterContext is validated, so this is safe + }, + }, + }, + }, + ipamv1alpha1.IPAllocationStatus{}, + ) + + ipallocObj, err := fn.NewFromTypedObject(ipalloc) + if err != nil { + return nil, err + } + resources = append(resources, ipallocObj) + } + return resources, nil +} + +// updateDnnResource assembles the Status of the DNN "for object" from the status of the owned IPAllocations +func (f *DnnFn) updateDnnResource(dnnObj_ *fn.KubeObject, owned fn.KubeObjects) (*fn.KubeObject, error) { + dnnObj, err := kubeobject.NewFromKubeObject[nephioreqv1alpha1.DataNetwork](dnnObj_) + if err != nil { + return nil, err + } + dnn, err := dnnObj.GetGoStruct() + if err != nil { + return nil, err + } + + // get IPAllocation status of all pools + ipallocs, err := FilterByType[ipamv1alpha1.IPAllocation](owned) + if err != nil { + return nil, err + } + for _, ipalloc := range ipallocs { + if ipalloc.Spec.Kind == ipamv1alpha1.PrefixKindPool { + poolName, found := strings.CutPrefix(ipalloc.Name, dnn.Name+"-") + if found { + status := nephioreqv1alpha1.PoolStatus{ + Name: poolName, + IPAllocation: ipalloc.Status, + } + dnn.Status.Pools = append(dnn.Status.Pools, status) + } else { + f.rl.Results.Warningf("found an IPAllocation owned by DNN %q with a suspicious name: %v", dnn.Name, ipalloc.Name) + } + } + } + + err = dnnObj.SetStatus(dnn) + return &dnnObj.KubeObject, err +} diff --git a/krm-functions/dnn-fn/golden_test.go b/krm-functions/dnn-fn/fn/golden_test.go similarity index 98% rename from krm-functions/dnn-fn/golden_test.go rename to krm-functions/dnn-fn/fn/golden_test.go index bfb703d9..af2e6e73 100644 --- a/krm-functions/dnn-fn/golden_test.go +++ b/krm-functions/dnn-fn/fn/golden_test.go @@ -14,7 +14,7 @@ limitations under the License. */ -package main +package fn import ( "testing" diff --git a/krm-functions/dnn-fn/lib.go b/krm-functions/dnn-fn/fn/lib.go similarity index 97% rename from krm-functions/dnn-fn/lib.go rename to krm-functions/dnn-fn/fn/lib.go index 9f4fb06c..ae7c309b 100644 --- a/krm-functions/dnn-fn/lib.go +++ b/krm-functions/dnn-fn/fn/lib.go @@ -14,7 +14,7 @@ limitations under the License. */ -package main +package fn import ( "fmt" @@ -71,7 +71,7 @@ func KubeObjectToStruct[T any](obj *fn.KubeObject) (*T, error) { } // FilterByType returns the objects in `objs` whose Group-Version-Kind matches with the GVK of `T`. -// It also converts the matching KubeObjects to `*T`.` +// It also converts the KubeObjects to `*T`.` func FilterByType[T any, PT PtrIsRuntimeObject[T]](objs fn.KubeObjects) ([]*T, error) { result := make([]*T, 0, len(objs)) for _, o := range objs.Where(fn.IsGroupVersionKind(GetGVKOrPanic[T, PT]())) { diff --git a/krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/Kptfile b/krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/Kptfile similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/Kptfile rename to krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/Kptfile diff --git a/krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/_expected_results.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/_expected_results.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/_expected_results.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/_expected_results.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/capacity.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/capacity.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/capacity.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/capacity.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/cluster_context.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/cluster_context.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/cluster_context.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/cluster_context.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/dnn.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/dnn.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/dnn.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/dnn.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/ipallocations.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/ipallocations.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/clustercontext_without_sitecode/ipallocations.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/clustercontext_without_sitecode/ipallocations.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/Kptfile b/krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/Kptfile similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/Kptfile rename to krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/Kptfile diff --git a/krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/_expected_error.txt b/krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/_expected_error.txt similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/_expected_error.txt rename to krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/_expected_error.txt diff --git a/krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/_expected_results.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/_expected_results.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/_expected_results.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/_expected_results.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/capacity.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/capacity.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/capacity.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/capacity.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/dnn.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/dnn.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/dnn.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/dnn.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/ipallocations.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/ipallocations.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/missing_clustercontext/ipallocations.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/missing_clustercontext/ipallocations.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/missing_kptfile/_expected_error.txt b/krm-functions/dnn-fn/fn/testdata/failure_cases/missing_kptfile/_expected_error.txt similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/missing_kptfile/_expected_error.txt rename to krm-functions/dnn-fn/fn/testdata/failure_cases/missing_kptfile/_expected_error.txt diff --git a/krm-functions/dnn-fn/testdata/failure_cases/missing_kptfile/capacity.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/missing_kptfile/capacity.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/missing_kptfile/capacity.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/missing_kptfile/capacity.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/missing_kptfile/cluster_context.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/missing_kptfile/cluster_context.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/missing_kptfile/cluster_context.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/missing_kptfile/cluster_context.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/missing_kptfile/dnn.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/missing_kptfile/dnn.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/missing_kptfile/dnn.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/missing_kptfile/dnn.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/Kptfile b/krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/Kptfile similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/Kptfile rename to krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/Kptfile diff --git a/krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/_expected_results.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/_expected_results.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/_expected_results.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/_expected_results.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/capacity.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/capacity.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/capacity.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/capacity.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/cluster_context.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/cluster_context.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/cluster_context.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/cluster_context.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/cluster_context_2.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/cluster_context_2.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/cluster_context_2.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/cluster_context_2.yaml diff --git a/krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/dnn.yaml b/krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/dnn.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/failure_cases/multiple_clustercontexts/dnn.yaml rename to krm-functions/dnn-fn/fn/testdata/failure_cases/multiple_clustercontexts/dnn.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/create_owned_resources/Kptfile b/krm-functions/dnn-fn/fn/testdata/golden/create_owned_resources/Kptfile similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/create_owned_resources/Kptfile rename to krm-functions/dnn-fn/fn/testdata/golden/create_owned_resources/Kptfile diff --git a/krm-functions/dnn-fn/testdata/golden/create_owned_resources/_expected.yaml b/krm-functions/dnn-fn/fn/testdata/golden/create_owned_resources/_expected.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/create_owned_resources/_expected.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/create_owned_resources/_expected.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/create_owned_resources/capacity.yaml b/krm-functions/dnn-fn/fn/testdata/golden/create_owned_resources/capacity.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/create_owned_resources/capacity.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/create_owned_resources/capacity.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/create_owned_resources/cluster_context.yaml b/krm-functions/dnn-fn/fn/testdata/golden/create_owned_resources/cluster_context.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/create_owned_resources/cluster_context.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/create_owned_resources/cluster_context.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/create_owned_resources/dnn.yaml b/krm-functions/dnn-fn/fn/testdata/golden/create_owned_resources/dnn.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/create_owned_resources/dnn.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/create_owned_resources/dnn.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/deleted_pool/Kptfile b/krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/Kptfile similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/deleted_pool/Kptfile rename to krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/Kptfile diff --git a/krm-functions/dnn-fn/testdata/golden/deleted_pool/_expected.yaml b/krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/_expected.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/deleted_pool/_expected.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/_expected.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/deleted_pool/capacity.yaml b/krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/capacity.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/deleted_pool/capacity.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/capacity.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/deleted_pool/cluster_context.yaml b/krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/cluster_context.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/deleted_pool/cluster_context.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/cluster_context.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/deleted_pool/dnn.yaml b/krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/dnn.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/deleted_pool/dnn.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/dnn.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/deleted_pool/ipallocations.yaml b/krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/ipallocations.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/deleted_pool/ipallocations.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/deleted_pool/ipallocations.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/garbage_collection/Kptfile b/krm-functions/dnn-fn/fn/testdata/golden/garbage_collection/Kptfile similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/garbage_collection/Kptfile rename to krm-functions/dnn-fn/fn/testdata/golden/garbage_collection/Kptfile diff --git a/krm-functions/dnn-fn/testdata/golden/garbage_collection/_expected.yaml b/krm-functions/dnn-fn/fn/testdata/golden/garbage_collection/_expected.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/garbage_collection/_expected.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/garbage_collection/_expected.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/garbage_collection/capacity.yaml b/krm-functions/dnn-fn/fn/testdata/golden/garbage_collection/capacity.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/garbage_collection/capacity.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/garbage_collection/capacity.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/garbage_collection/cluster_context.yaml b/krm-functions/dnn-fn/fn/testdata/golden/garbage_collection/cluster_context.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/garbage_collection/cluster_context.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/garbage_collection/cluster_context.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/garbage_collection/ipallocations.yaml b/krm-functions/dnn-fn/fn/testdata/golden/garbage_collection/ipallocations.yaml similarity index 93% rename from krm-functions/dnn-fn/testdata/golden/garbage_collection/ipallocations.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/garbage_collection/ipallocations.yaml index 2eff9d85..b9d524b2 100644 --- a/krm-functions/dnn-fn/testdata/golden/garbage_collection/ipallocations.yaml +++ b/krm-functions/dnn-fn/fn/testdata/golden/garbage_collection/ipallocations.yaml @@ -10,5 +10,4 @@ spec: matchLabels: nephio.org/site: edge1 networkInstance: {} - prefixLength: 8 - \ No newline at end of file + prefixLength: 8 \ No newline at end of file diff --git a/krm-functions/dnn-fn/testdata/golden/set_dnn_status/Kptfile b/krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/Kptfile similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/set_dnn_status/Kptfile rename to krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/Kptfile diff --git a/krm-functions/dnn-fn/testdata/golden/set_dnn_status/_expected.yaml b/krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/_expected.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/set_dnn_status/_expected.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/_expected.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/set_dnn_status/capacity.yaml b/krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/capacity.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/set_dnn_status/capacity.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/capacity.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/set_dnn_status/cluster_context.yaml b/krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/cluster_context.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/set_dnn_status/cluster_context.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/cluster_context.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/set_dnn_status/dnn.yaml b/krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/dnn.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/set_dnn_status/dnn.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/dnn.yaml diff --git a/krm-functions/dnn-fn/testdata/golden/set_dnn_status/ipallocations.yaml b/krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/ipallocations.yaml similarity index 100% rename from krm-functions/dnn-fn/testdata/golden/set_dnn_status/ipallocations.yaml rename to krm-functions/dnn-fn/fn/testdata/golden/set_dnn_status/ipallocations.yaml diff --git a/krm-functions/dnn-fn/main.go b/krm-functions/dnn-fn/main.go index 8ea19a37..a935eeb4 100644 --- a/krm-functions/dnn-fn/main.go +++ b/krm-functions/dnn-fn/main.go @@ -18,157 +18,13 @@ package main import ( "os" - "strings" - - "fmt" "github.com/GoogleContainerTools/kpt-functions-sdk/go/fn" - infrav1alpha1 "github.com/nephio-project/api/infra/v1alpha1" - nephioreqv1alpha1 "github.com/nephio-project/api/nf_requirements/v1alpha1" - "github.com/nephio-project/nephio/krm-functions/lib/condkptsdk" - "github.com/nephio-project/nephio/krm-functions/lib/kubeobject" - ipam_common "github.com/nokia/k8s-ipam/apis/alloc/common/v1alpha1" - ipamv1alpha1 "github.com/nokia/k8s-ipam/apis/alloc/ipam/v1alpha1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + dnn_fn "github.com/nephio-project/nephio/krm-functions/dnn-fn/fn" ) -type DnnFn struct { - sdk condkptsdk.KptCondSDK - ClusterContext *infrav1alpha1.ClusterContext - rl *fn.ResourceList -} - -// Run is the entry point of the KRM function (called by the upstream fn SDK) -func Run(rl *fn.ResourceList) (bool, error) { - var err error - myFn := DnnFn{rl: rl} - - myFn.sdk, err = condkptsdk.New( - rl, - &condkptsdk.Config{ - For: corev1.ObjectReference{ - APIVersion: nephioreqv1alpha1.GroupVersion.Identifier(), - Kind: nephioreqv1alpha1.DataNetworkKind, - }, - Owns: map[corev1.ObjectReference]condkptsdk.ResourceKind{ - { - APIVersion: ipamv1alpha1.GroupVersion.Identifier(), - Kind: ipamv1alpha1.IPAllocationKind, - }: condkptsdk.ChildRemote, - }, - Watch: map[corev1.ObjectReference]condkptsdk.WatchCallbackFn{ - { - APIVersion: infrav1alpha1.GroupVersion.Identifier(), - Kind: infrav1alpha1.ClusterContextKind, - }: myFn.ClusterContextCallbackFn, - }, - PopulateOwnResourcesFn: myFn.desiredOwnedResourceList, - GenerateResourceFn: myFn.updateDnnResource, - }, - ) - if err != nil { - rl.Results.ErrorE(err) - return false, nil - } - return myFn.sdk.Run() -} - -// called for all CLusterContext resources in the package -func (f *DnnFn) ClusterContextCallbackFn(o *fn.KubeObject) error { - var err error - - if f.ClusterContext != nil { - return fmt.Errorf("multiple ClusterContext objects found in the kpt package") - } - f.ClusterContext, err = KubeObjectToStruct[infrav1alpha1.ClusterContext](o) - if err != nil { - return err - } - return f.ClusterContext.Spec.Validate() -} - -// desiredOwnedResourceList returns with the list of all KubeObjects that the DNN "for object" should own in the package -func (f *DnnFn) desiredOwnedResourceList(o *fn.KubeObject) (fn.KubeObjects, error) { - if f.ClusterContext == nil { - // no ClusterContext in the package - return nil, fmt.Errorf("ClusterContext is missing from the kpt package") - } - - // get "parent"| DNN struct - dnn, err := KubeObjectToStruct[nephioreqv1alpha1.DataNetwork](o) - if err != nil { - return nil, err - } - - // add IPAllocation for each pool - resources := fn.KubeObjects{} - for _, pool := range dnn.Spec.Pools { - ipalloc := ipamv1alpha1.BuildIPAllocation( - metav1.ObjectMeta{ - Name: fmt.Sprintf("%s-%s", dnn.Name, pool.Name), - }, - ipamv1alpha1.IPAllocationSpec{ - Kind: ipamv1alpha1.PrefixKindPool, - NetworkInstance: dnn.Spec.NetworkInstance, - PrefixLength: &pool.PrefixLength, - AllocationLabels: ipam_common.AllocationLabels{ - Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - ipam_common.NephioSiteKey: *f.ClusterContext.Spec.SiteCode, // NOTE: at this point ClusterContext is validated, so this is safe - }, - }, - }, - }, - ipamv1alpha1.IPAllocationStatus{}, - ) - - ipallocObj, err := fn.NewFromTypedObject(ipalloc) - if err != nil { - return nil, err - } - resources = append(resources, ipallocObj) - } - return resources, nil -} - -// updateDnnResource assembles the Status of the DNN "for object" from the status of the owned IPAllocations -func (f *DnnFn) updateDnnResource(dnnObj_ *fn.KubeObject, owned fn.KubeObjects) (*fn.KubeObject, error) { - dnnObj, err := kubeobject.NewFromKubeObject[nephioreqv1alpha1.DataNetwork](dnnObj_) - if err != nil { - return nil, err - } - dnn, err := dnnObj.GetGoStruct() - if err != nil { - return nil, err - } - - // get IPAllocation status of all pools - ipallocs, err := FilterByType[ipamv1alpha1.IPAllocation](owned) - if err != nil { - return nil, err - } - for _, ipalloc := range ipallocs { - if ipalloc.Spec.Kind == ipamv1alpha1.PrefixKindPool { - poolName, found := strings.CutPrefix(ipalloc.Name, dnn.Name+"-") - if found { - status := nephioreqv1alpha1.PoolStatus{ - Name: poolName, - IPAllocation: ipalloc.Status, - } - dnn.Status.Pools = append(dnn.Status.Pools, status) - } else { - f.rl.Results.Warningf("found an IPAllocation owned by DNN %q with a suspicious name: %v", dnn.Name, ipalloc.Name) - } - } - } - - err = dnnObj.SetStatus(dnn) - return &dnnObj.KubeObject, err -} - func main() { - runner := fn.ResourceListProcessorFunc(Run) + runner := fn.ResourceListProcessorFunc(dnn_fn.Run) if err := fn.AsMain(runner); err != nil { os.Exit(1)