func()

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
}