in pkg/controller/elasticsearch/validation/validations.go [179:223]
func hasCorrectNodeRoles(es esv1.Elasticsearch) field.ErrorList {
v, err := version.Parse(es.Spec.Version)
if err != nil {
return field.ErrorList{field.Invalid(field.NewPath("spec").Child("version"), es.Spec.Version, parseVersionErrMsg)}
}
seenMaster := false
var errs field.ErrorList
confField := func(index int) *field.Path {
return field.NewPath("spec").Child("nodeSets").Index(index).Child("config")
}
for i, ns := range es.Spec.NodeSets {
cfg := esv1.ElasticsearchSettings{}
if err := esv1.UnpackConfig(ns.Config, v, &cfg); err != nil {
errs = append(errs, field.Invalid(confField(i), ns.Config, cfgInvalidMsg))
continue
}
// check that node.roles is not used with an older Elasticsearch version
if cfg.Node != nil && cfg.Node.Roles != nil && !v.GTE(version.From(7, 9, 0)) {
errs = append(errs, field.Invalid(confField(i), ns.Config, nodeRolesInOldVersionMsg))
continue
}
// check that node.roles and node attributes are not mixed
nodeRoleAttrs := getNodeRoleAttrs(cfg)
if cfg.Node != nil && len(cfg.Node.Roles) > 0 && len(nodeRoleAttrs) > 0 {
errs = append(errs, field.Forbidden(confField(i), fmt.Sprintf(mixedRoleConfigMsg, strings.Join(nodeRoleAttrs, ","))))
}
// Check if this nodeSet has the master role.
seenMaster = seenMaster || (cfg.Node.IsConfiguredWithRole(esv1.MasterRole) && !cfg.Node.IsConfiguredWithRole(esv1.VotingOnlyRole) && ns.Count > 0)
}
if !seenMaster {
errs = append(errs, field.Required(field.NewPath("spec").Child("nodeSets"), masterRequiredMsg))
}
return errs
}