in pkg/utils/validator/clusterresourceplacement.go [382:425]
func validateRolloutStrategy(rolloutStrategy placementv1beta1.RolloutStrategy) error {
allErr := make([]error, 0)
if rolloutStrategy.Type != "" && rolloutStrategy.Type != placementv1beta1.RollingUpdateRolloutStrategyType &&
rolloutStrategy.Type != placementv1beta1.ExternalRolloutStrategyType {
allErr = append(allErr, fmt.Errorf("unsupported rollout strategy type `%s`", rolloutStrategy.Type))
}
if rolloutStrategy.RollingUpdate != nil {
if rolloutStrategy.Type == placementv1beta1.ExternalRolloutStrategyType {
allErr = append(allErr, fmt.Errorf("rollingUpdateConifg is not valid for ExternalRollout strategy type"))
}
if rolloutStrategy.RollingUpdate.UnavailablePeriodSeconds != nil && *rolloutStrategy.RollingUpdate.UnavailablePeriodSeconds < 0 {
allErr = append(allErr, fmt.Errorf("unavailablePeriodSeconds must be greater than or equal to 0, got %d", *rolloutStrategy.RollingUpdate.UnavailablePeriodSeconds))
}
if rolloutStrategy.RollingUpdate.MaxUnavailable != nil {
value, err := intstr.GetScaledValueFromIntOrPercent(rolloutStrategy.RollingUpdate.MaxUnavailable, 10, true)
if err != nil {
allErr = append(allErr, fmt.Errorf("maxUnavailable `%+v` is invalid: %w", rolloutStrategy.RollingUpdate.MaxUnavailable, err))
}
if value < 0 {
allErr = append(allErr, fmt.Errorf("maxUnavailable must be greater than or equal to 0, got `%+v`", rolloutStrategy.RollingUpdate.MaxUnavailable))
}
}
if rolloutStrategy.RollingUpdate.MaxSurge != nil {
value, err := intstr.GetScaledValueFromIntOrPercent(rolloutStrategy.RollingUpdate.MaxSurge, 10, true)
if err != nil {
allErr = append(allErr, fmt.Errorf("maxSurge `%+v` is invalid: %w", rolloutStrategy.RollingUpdate.MaxSurge, err))
}
if value < 0 {
allErr = append(allErr, fmt.Errorf("maxSurge must be greater than or equal to 0, got `%+v`", rolloutStrategy.RollingUpdate.MaxSurge))
}
}
}
// server-side apply strategy type is only valid for server-side apply strategy type
if rolloutStrategy.ApplyStrategy != nil {
if rolloutStrategy.ApplyStrategy.Type != placementv1beta1.ApplyStrategyTypeServerSideApply && rolloutStrategy.ApplyStrategy.ServerSideApplyConfig != nil {
allErr = append(allErr, errors.New("serverSideApplyConfig is only valid for ServerSideApply strategy type"))
}
}
return apiErrors.NewAggregate(allErr)
}