in pkg/apis/ndbcontroller/v1/validation.go [172:236]
func (nc *NdbCluster) IsValidSpecUpdate(newNc *NdbCluster) (bool, field.ErrorList) {
var errList field.ErrorList
specPath := field.NewPath("spec")
managementNodePath := specPath.Child("managementNode")
dataNodePath := specPath.Child("dataNode")
mysqldPath := specPath.Child("mysqlNode")
if nc.Spec.RedundancyLevel == 1 {
// MySQL Cluster replica = 1 => updating MySQL config via
// rolling restart is not possible. Disallow any spec update.
errList = append(errList,
field.InternalError(specPath,
errors.New("operator cannot handle any spec update to a MySQL Cluster whose replica is 1")))
return false, errList
}
// Do not allow decreasing Spec.DataNode.NodeCount
if nc.Spec.DataNode.NodeCount > newNc.Spec.DataNode.NodeCount {
errList = append(errList,
field.Invalid(dataNodePath.Child("nodeCount"), newNc.Spec.DataNode.NodeCount,
"spec.dataNode.nodeCount cannot be reduced once MySQL Cluster has been started"))
}
// Do not allow updating Spec.RedundancyLevel
if nc.Spec.RedundancyLevel != newNc.Spec.RedundancyLevel {
errList = append(errList,
cannotUpdateFieldError(specPath.Child("redundancyLevel"), newNc.Spec.RedundancyLevel))
}
// Do not allow updating Resource field of various ndbPodSpecs
if nc.Spec.ManagementNode != nil {
if err := validateNdbPodSpecResources(
managementNodePath.Child("ndbPodSpec"),
nc.Spec.ManagementNode.NdbPodSpec, newNc.Spec.ManagementNode.NdbPodSpec); err != nil {
errList = append(errList, err)
}
}
if err := validateNdbPodSpecResources(
dataNodePath.Child("ndbPodSpec"), nc.Spec.DataNode.NdbPodSpec, newNc.Spec.DataNode.NdbPodSpec); err != nil {
errList = append(errList, err)
}
if nc.GetMySQLServerNodeCount() != 0 &&
newNc.GetMySQLServerNodeCount() != 0 {
if err := validateNdbPodSpecResources(
mysqldPath.Child("ndbPodSpec"), nc.Spec.MysqlNode.NdbPodSpec, newNc.Spec.MysqlNode.NdbPodSpec); err != nil {
errList = append(errList, err)
}
}
if nc.GetMySQLServerConnectionPoolSize() > newNc.GetMySQLServerConnectionPoolSize() {
// Do not allow reducing connection pool size as that leads to chaos when reserving nodeIds
errList = append(errList,
field.Invalid(mysqldPath.Child("connectionPoolSize"),
newNc.GetMySQLServerConnectionPoolSize(),
"connectionPoolSize cannot be reduced once MySQL Cluster has been started"))
}
// Check if the new NdbCluster valid is spec
if isValid, specErrList := newNc.HasValidSpec(); !isValid {
errList = append(errList, specErrList...)
}
return errList == nil, errList
}