pkg/providers/vsphere/yaml_util.go (76 lines of code) (raw):
package vsphere
import (
"github.com/go-logr/logr"
"github.com/pkg/errors"
vspherev1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1"
"github.com/aws/eks-anywhere/pkg/yamlutil"
)
const (
// VSphereFailureDomainKind is kind for capv failure domain.
VSphereFailureDomainKind = "VSphereFailureDomain"
// VSphereDeploymentZoneKind is kind for capv vsphere deployment zone.
VSphereDeploymentZoneKind = "VSphereDeploymentZone"
)
// FailureDomainsYamlProcessor handles parsing and transformation of failure domains YAML into FailureDomains Objects.
type FailureDomainsYamlProcessor struct {
parser *yamlutil.Parser
failureDomainsBuilder *FailureDomainsBuilder
}
// FailureDomainsBuilder implements yamlutil.Builder
// It's a wrapper around FailureDomains to provide yaml parsing functionality.
type FailureDomainsBuilder struct {
FailureDomains *FailureDomains
}
// NewFailureDomainsYamlProcessor initializes and returns a new FailureDomainsYamlProcessor.
func NewFailureDomainsYamlProcessor(logger logr.Logger) *FailureDomainsYamlProcessor {
parser := yamlutil.NewParser(logger)
return &FailureDomainsYamlProcessor{
parser: parser,
failureDomainsBuilder: &FailureDomainsBuilder{
FailureDomains: new(FailureDomains),
},
}
}
// ProcessYAML processes the YAML content and returns the failure domains.
func (fbp *FailureDomainsYamlProcessor) ProcessYAML(failureDomainYaml []byte) (*FailureDomains, error) {
if err := fbp.registerFailureDomainMappings(); err != nil {
return nil, errors.Wrap(err, "registering failure domains mappings in the yaml processor")
}
if err := fbp.parser.Parse(failureDomainYaml, fbp.failureDomainsBuilder); err != nil {
return nil, errors.Wrap(err, "parsing vsphere failure domains yaml")
}
return fbp.failureDomainsBuilder.FailureDomains, nil
}
func (fbp *FailureDomainsYamlProcessor) registerFailureDomainMappings() error {
err := fbp.parser.RegisterMappings(
yamlutil.NewMapping(
VSphereDeploymentZoneKind, func() yamlutil.APIObject {
return &vspherev1.VSphereDeploymentZone{}
},
),
yamlutil.NewMapping(
VSphereFailureDomainKind, func() yamlutil.APIObject {
return &vspherev1.VSphereFailureDomain{}
},
),
)
if err != nil {
return errors.Wrap(err, "registering failure domain mappings")
}
return nil
}
// BuildFromParsed reads parsed objects in ObjectLookup and sets them in the FailureDomains.
func (fb *FailureDomainsBuilder) BuildFromParsed(lookup yamlutil.ObjectLookup) error {
fb.ProcessFailureDomainObjects(fb.FailureDomains, lookup)
return nil
}
// ProcessFailureDomainObjects finds all necessary objects in the parsed objects and sets them in FailureDomains.
func (fb *FailureDomainsBuilder) ProcessFailureDomainObjects(f *FailureDomains, lookup yamlutil.ObjectLookup) {
for _, obj := range lookup {
if obj.GetObjectKind().GroupVersionKind().Kind == VSphereDeploymentZoneKind {
g := new(FailureDomainGroup)
g.VsphereDeploymentZone = obj.(*vspherev1.VSphereDeploymentZone)
fb.ProcessFailureDomainGroupObjects(g, lookup)
f.Groups = append(f.Groups, *g)
}
}
}
// ProcessFailureDomainGroupObjects looks in the parsed objects for the VsphereFailureDomain by the kind, apiversion
// and VsphereFailureDomain name. Once it is found, it sets in the FailureDomainGroup.
// VsphereDeploymentZone needs to be already set in the FailureDomainGroup.
func (fb *FailureDomainsBuilder) ProcessFailureDomainGroupObjects(g *FailureDomainGroup, lookup yamlutil.ObjectLookup) {
vsphereFailureDomainName := g.VsphereDeploymentZone.Spec.FailureDomain
vsphereFailureDomainKey := yamlutil.Key(g.VsphereDeploymentZone.APIVersion, VSphereFailureDomainKind, vsphereFailureDomainName)
obj := lookup[vsphereFailureDomainKey]
if obj != nil {
g.VsphereFailureDomain = obj.(*vspherev1.VSphereFailureDomain)
}
}