internal/node/hybrid/validator.go (87 lines of code) (raw):

package hybrid import ( "fmt" "strings" "github.com/aws/eks-hybrid/internal/api" "github.com/aws/eks-hybrid/internal/util/file" ) func extractFlagValue(args []string, flag string) string { flagPrefix := "--" + flag + "=" var flagValue string // get last instance of flag value if it exists for _, arg := range args { if strings.HasPrefix(arg, flagPrefix) { flagValue = strings.TrimPrefix(arg, flagPrefix) } } return flagValue } func (hnp *HybridNodeProvider) withHybridValidators() { hnp.validator = func(cfg *api.NodeConfig) error { if cfg.Spec.Cluster.Name == "" { return fmt.Errorf("Name is missing in cluster configuration") } if cfg.Spec.Cluster.Region == "" { return fmt.Errorf("Region is missing in cluster configuration") } if hostnameOverride := extractFlagValue(cfg.Spec.Kubelet.Flags, hostnameOverrideFlag); hostnameOverride != "" { return fmt.Errorf("hostname-override kubelet flag is not supported for hybrid nodes but found override: %s", hostnameOverride) } if !cfg.IsIAMRolesAnywhere() && !cfg.IsSSM() { return fmt.Errorf("Either IAMRolesAnywhere or SSM must be provided for hybrid node configuration") } if cfg.IsIAMRolesAnywhere() && cfg.IsSSM() { return fmt.Errorf("Only one of IAMRolesAnywhere or SSM must be provided for hybrid node configuration") } if cfg.IsIAMRolesAnywhere() { if err := validateRolesAnywhereNode(cfg); err != nil { return err } } if cfg.IsSSM() { if cfg.Spec.Hybrid.SSM.ActivationCode == "" { return fmt.Errorf("ActivationCode is missing in hybrid ssm configuration") } if cfg.Spec.Hybrid.SSM.ActivationID == "" { return fmt.Errorf("ActivationID is missing in hybrid ssm configuration") } } return nil } } func (hnp *HybridNodeProvider) ValidateConfig() error { hnp.logger.Info("Validating configuration...") if err := hnp.validator(hnp.nodeConfig); err != nil { return err } return nil } func validateRolesAnywhereNode(node *api.NodeConfig) error { if node.Spec.Hybrid.IAMRolesAnywhere.RoleARN == "" { return fmt.Errorf("RoleARN is missing in hybrid iam roles anywhere configuration") } if node.Spec.Hybrid.IAMRolesAnywhere.ProfileARN == "" { return fmt.Errorf("ProfileARN is missing in hybrid iam roles anywhere configuration") } if node.Spec.Hybrid.IAMRolesAnywhere.TrustAnchorARN == "" { return fmt.Errorf("TrustAnchorARN is missing in hybrid iam roles anywhere configuration") } if node.Spec.Hybrid.IAMRolesAnywhere.NodeName == "" { return fmt.Errorf("NodeName can't be empty in hybrid iam roles anywhere configuration") } if len(node.Spec.Hybrid.IAMRolesAnywhere.NodeName) > 64 { return fmt.Errorf("NodeName can't be longer than 64 characters in hybrid iam roles anywhere configuration") } if node.Spec.Hybrid.IAMRolesAnywhere.CertificatePath == "" { return fmt.Errorf("CertificatePath is missing in hybrid iam roles anywhere configuration") } if node.Spec.Hybrid.IAMRolesAnywhere.PrivateKeyPath == "" { return fmt.Errorf("PrivateKeyPath is missing in hybrid iam roles anywhere configuration") } if !file.Exists(node.Spec.Hybrid.IAMRolesAnywhere.CertificatePath) { return fmt.Errorf("IAM Roles Anywhere certificate %s not found", node.Spec.Hybrid.IAMRolesAnywhere.CertificatePath) } if !file.Exists(node.Spec.Hybrid.IAMRolesAnywhere.PrivateKeyPath) { return fmt.Errorf("IAM Roles Anywhere private key %s not found", node.Spec.Hybrid.IAMRolesAnywhere.PrivateKeyPath) } return nil }