
This commit also introduces a dochelper concept. This provides some convenience methods to the document pkg that help extract data from known document types as well as walk document relationships to discover related information such as BMC credentials for baremetal hosts. Once merged, a follow up patchset will leverage these within the cloud-init code to deduplicate some of these lookups. Change-Id: Ie6a770ce4b34adbea30281917f0cb2fdc460b4fb
112 lines
3.2 KiB
Go
112 lines
3.2 KiB
Go
package document
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"sigs.k8s.io/kustomize/v3/pkg/gvk"
|
|
"sigs.k8s.io/kustomize/v3/pkg/types"
|
|
)
|
|
|
|
// Selector provides abstraction layer in front of kustomize selector
|
|
type Selector struct {
|
|
types.Selector
|
|
}
|
|
|
|
// NewSelector returns instance of Selector container
|
|
func NewSelector() Selector {
|
|
return Selector{}
|
|
}
|
|
|
|
// Following set of functions allows to build selector object
|
|
// by name, gvk, label selector and annotation selector
|
|
|
|
// ByName select by name
|
|
func (s Selector) ByName(name string) Selector {
|
|
s.Name = name
|
|
return s
|
|
}
|
|
|
|
// ByNamespace select by namepace
|
|
func (s Selector) ByNamespace(namespace string) Selector {
|
|
s.Namespace = namespace
|
|
return s
|
|
}
|
|
|
|
// ByGvk select by gvk
|
|
func (s Selector) ByGvk(group, version, kind string) Selector {
|
|
s.Gvk = gvk.Gvk{Group: group, Version: version, Kind: kind}
|
|
return s
|
|
}
|
|
|
|
// ByKind select by Kind
|
|
func (s Selector) ByKind(kind string) Selector {
|
|
s.Gvk = gvk.Gvk{Kind: kind}
|
|
return s
|
|
}
|
|
|
|
// ByLabel select by label selector
|
|
func (s Selector) ByLabel(labelSelector string) Selector {
|
|
if s.LabelSelector != "" {
|
|
s.LabelSelector = strings.Join([]string{s.LabelSelector, labelSelector}, ",")
|
|
} else {
|
|
s.LabelSelector = labelSelector
|
|
}
|
|
return s
|
|
}
|
|
|
|
// ByAnnotation select by annotation selector.
|
|
func (s Selector) ByAnnotation(annotationSelector string) Selector {
|
|
if s.AnnotationSelector != "" {
|
|
s.AnnotationSelector = strings.Join([]string{s.AnnotationSelector, annotationSelector}, ",")
|
|
} else {
|
|
s.AnnotationSelector = annotationSelector
|
|
}
|
|
return s
|
|
}
|
|
|
|
// NewEphemeralCloudDataSelector returns selector to get BaremetalHost for ephemeral node
|
|
func NewEphemeralCloudDataSelector() Selector {
|
|
return NewSelector().ByKind(SecretKind).ByLabel(EphemeralUserDataSelector)
|
|
}
|
|
|
|
// NewEphemeralBMHSelector returns selector to get BaremetalHost for ephemeral node
|
|
func NewEphemeralBMHSelector() Selector {
|
|
return NewSelector().ByKind(BareMetalHostKind).ByLabel(EphemeralHostSelector)
|
|
}
|
|
|
|
// NewBMCCredentialsSelector returns selector to get BaremetalHost BMC credentials
|
|
func NewBMCCredentialsSelector(name string) Selector {
|
|
return NewSelector().ByKind(SecretKind).ByName(name)
|
|
}
|
|
|
|
// NewNetworkDataSelector returns selector that can be used to get secret with
|
|
// network data bmhDoc argument is a document interface, that should hold fields
|
|
// spec.networkData.name and spec.networkData.namespace where to find the secret,
|
|
// if either of these fields are not defined in Document error will be returned
|
|
func NewNetworkDataSelector(bmhDoc Document) (Selector, error) {
|
|
selector := NewSelector()
|
|
// extract the network data document pointer from the bmh document
|
|
netConfDocName, err := bmhDoc.GetString("spec.networkData.name")
|
|
if err != nil {
|
|
return selector, err
|
|
}
|
|
netConfDocNamespace, err := bmhDoc.GetString("spec.networkData.namespace")
|
|
if err != nil {
|
|
return selector, err
|
|
}
|
|
|
|
// try and find these documents in our bundle
|
|
selector = selector.
|
|
ByKind(SecretKind).
|
|
ByNamespace(netConfDocNamespace).
|
|
ByName(netConfDocName)
|
|
|
|
return selector, nil
|
|
}
|
|
|
|
// NewDeployToK8sSelector returns a selector to get documents that are to be deployed
|
|
// to kubernetes cluster.
|
|
func NewDeployToK8sSelector() Selector {
|
|
return NewSelector().ByAnnotation(DeployToK8sSelector)
|
|
}
|