69 lines
2.0 KiB
Go
69 lines
2.0 KiB
Go
// Copyright 2022 The Kubernetes Authors.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"sigs.k8s.io/kustomize/kyaml/resid"
|
|
"sigs.k8s.io/kustomize/kyaml/yaml"
|
|
)
|
|
|
|
// MakeResIds returns all of an RNode's current and previous Ids
|
|
func MakeResIds(n *yaml.RNode) ([]resid.ResId, error) {
|
|
var result []resid.ResId
|
|
apiVersion := n.Field(yaml.APIVersionField)
|
|
var group, version string
|
|
if apiVersion != nil {
|
|
group, version = resid.ParseGroupVersion(yaml.GetValue(apiVersion.Value))
|
|
}
|
|
result = append(result, resid.NewResIdWithNamespace(
|
|
resid.Gvk{Group: group, Version: version, Kind: n.GetKind()}, n.GetName(), n.GetNamespace()),
|
|
)
|
|
prevIds, err := PrevIds(n)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result = append(result, prevIds...)
|
|
return result, nil
|
|
}
|
|
|
|
// PrevIds returns all of an RNode's previous Ids
|
|
func PrevIds(n *yaml.RNode) ([]resid.ResId, error) {
|
|
var ids []resid.ResId
|
|
// TODO: merge previous names and namespaces into one list of
|
|
// pairs on one annotation so there is no chance of error
|
|
annotations := n.GetAnnotations(
|
|
BuildAnnotationPreviousNames,
|
|
BuildAnnotationPreviousNamespaces,
|
|
BuildAnnotationPreviousKinds)
|
|
if _, ok := annotations[BuildAnnotationPreviousNames]; !ok {
|
|
return nil, nil
|
|
}
|
|
names := strings.Split(annotations[BuildAnnotationPreviousNames], ",")
|
|
ns := strings.Split(annotations[BuildAnnotationPreviousNamespaces], ",")
|
|
kinds := strings.Split(annotations[BuildAnnotationPreviousKinds], ",")
|
|
// This should never happen
|
|
if len(names) != len(ns) || len(names) != len(kinds) {
|
|
return nil, fmt.Errorf(
|
|
"number of previous names, " +
|
|
"number of previous namespaces, " +
|
|
"number of previous kinds not equal")
|
|
}
|
|
apiVersion := n.GetApiVersion()
|
|
group, version := resid.ParseGroupVersion(apiVersion)
|
|
ids = make([]resid.ResId, 0, len(names))
|
|
for i := range names {
|
|
gvk := resid.Gvk{
|
|
Group: group,
|
|
Version: version,
|
|
Kind: kinds[i],
|
|
}
|
|
ids = append(ids, resid.NewResIdWithNamespace(
|
|
gvk, names[i], ns[i]))
|
|
}
|
|
return ids, nil
|
|
}
|