Files
odo/vendor/github.com/devfile/api/v2/pkg/validation/projects.go

111 lines
4.0 KiB
Go
Generated

//
//
// Copyright Red Hat
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package validation
import (
"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2"
"github.com/hashicorp/go-multierror"
)
// ValidateStarterProjects checks if starter project has only one remote configured
// and if the checkout remote matches the remote configured
func ValidateStarterProjects(starterProjects []v1alpha2.StarterProject) (returnedErr error) {
for _, starterProject := range starterProjects {
var gitSource v1alpha2.GitLikeProjectSource
if starterProject.Git != nil {
gitSource = starterProject.Git.GitLikeProjectSource
} else {
continue
}
if starterProjectErr := validateSingleRemoteGitSrc("starterProject", starterProject.Name, gitSource); starterProjectErr != nil {
newErr := resolveErrorMessageWithImportAttributes(starterProjectErr, starterProject.Attributes)
returnedErr = multierror.Append(returnedErr, newErr)
}
}
return returnedErr
}
// ValidateProjects checks if the project has more than one remote configured then a checkout
// remote is mandatory and if the checkout remote matches the renote configured
func ValidateProjects(projects []v1alpha2.Project) (returnedErr error) {
for _, project := range projects {
var gitSource v1alpha2.GitLikeProjectSource
if project.Git != nil {
gitSource = project.Git.GitLikeProjectSource
} else {
continue
}
switch len(gitSource.Remotes) {
case 0:
newErr := resolveErrorMessageWithImportAttributes(&MissingProjectRemoteError{projectName: project.Name}, project.Attributes)
returnedErr = multierror.Append(returnedErr, newErr)
case 1:
if gitSource.CheckoutFrom != nil && gitSource.CheckoutFrom.Remote != "" {
if err := validateRemoteMap(gitSource.Remotes, gitSource.CheckoutFrom.Remote, "project", project.Name); err != nil {
newErr := resolveErrorMessageWithImportAttributes(err, project.Attributes)
returnedErr = multierror.Append(returnedErr, newErr)
}
}
default: // len(gitSource.Remotes) >= 2
if gitSource.CheckoutFrom == nil || gitSource.CheckoutFrom.Remote == "" {
newErr := resolveErrorMessageWithImportAttributes(&MissingProjectCheckoutFromRemoteError{projectName: project.Name}, project.Attributes)
returnedErr = multierror.Append(returnedErr, newErr)
continue
}
if err := validateRemoteMap(gitSource.Remotes, gitSource.CheckoutFrom.Remote, "project", project.Name); err != nil {
newErr := resolveErrorMessageWithImportAttributes(err, project.Attributes)
returnedErr = multierror.Append(returnedErr, newErr)
}
}
}
return returnedErr
}
// validateRemoteMap checks if the checkout remote is present in the project remote map
func validateRemoteMap(remotes map[string]string, checkoutRemote, objectType, objectName string) error {
if _, ok := remotes[checkoutRemote]; !ok {
return &InvalidProjectCheckoutRemoteError{objectName: objectName, objectType: objectType, checkoutRemote: checkoutRemote}
}
return nil
}
// validateSingleRemoteGitSrc validates a git src for a single remote only
func validateSingleRemoteGitSrc(objectType, objectName string, gitSource v1alpha2.GitLikeProjectSource) (err error) {
switch len(gitSource.Remotes) {
case 0:
err = &MissingRemoteError{objectType: objectType, objectName: objectName}
case 1:
if gitSource.CheckoutFrom != nil && gitSource.CheckoutFrom.Remote != "" {
err = validateRemoteMap(gitSource.Remotes, gitSource.CheckoutFrom.Remote, objectType, objectName)
}
default: // len(gitSource.Remotes) >= 2
err = &MultipleRemoteError{objectType: objectType, objectName: objectName}
}
return err
}