-
Notifications
You must be signed in to change notification settings - Fork 2
/
operator_dependency_validator.go
88 lines (71 loc) · 2.71 KB
/
operator_dependency_validator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package dependency
import (
"context"
"errors"
"fmt"
"github.com/cloudogu/cesapp-lib/core"
)
const K8sDoguOperatorClientDependencyName = "k8s-dogu-operator"
// operatorDependencyValidator is responsible to validate the `k8s-dogu-operator` client dependency for dogus
type operatorDependencyValidator struct {
version *core.Version
}
// NewOperatorDependencyValidator creates a new operator dependency validator
func NewOperatorDependencyValidator(version *core.Version) *operatorDependencyValidator {
return &operatorDependencyValidator{
version: version,
}
}
// ValidateAllDependencies looks into all client dependencies (mandatory- and optional ones) and checks weather they're
// all installed and that in the correct version
func (odv *operatorDependencyValidator) ValidateAllDependencies(_ context.Context, dogu *core.Dogu) error {
var allProblems error
errMandatoryDependencies := odv.validateMandatoryDependencies(dogu)
errOptionalDependencies := odv.validateOptionalDependencies(dogu)
if errMandatoryDependencies != nil || errOptionalDependencies != nil {
allProblems = errors.Join(errMandatoryDependencies, errOptionalDependencies)
}
return allProblems
}
func (odv *operatorDependencyValidator) checkVersion(dependency core.Dependency) (bool, error) {
comparator, err := core.ParseVersionComparator(dependency.Version)
if err != nil {
return false, fmt.Errorf("failed to parse dependency version: %w", err)
}
allows, err := comparator.Allows(*odv.version)
if err != nil {
return false, fmt.Errorf("failed to compare dependency version with operator version: %w", err)
}
return allows, nil
}
func (odv *operatorDependencyValidator) validateMandatoryDependencies(dogu *core.Dogu) error {
dependencies := dogu.GetDependenciesOfType(core.DependencyTypeClient)
for _, dependency := range dependencies {
if dependency.Name == K8sDoguOperatorClientDependencyName {
allows, err := odv.checkVersion(dependency)
if err != nil {
return fmt.Errorf("failed to check version: %w", err)
}
if !allows {
dependencyError := dependencyValidationError{
sourceError: fmt.Errorf("%s parsed version does not fulfill version requirement of %s dogu %s", dependency.Version, odv.version.Raw, dependency.Name),
dependency: dependency,
}
return &dependencyError
}
}
}
return nil
}
func (odv *operatorDependencyValidator) validateOptionalDependencies(dogu *core.Dogu) error {
dependencies := dogu.GetOptionalDependenciesOfType(core.DependencyTypeClient)
for _, dependency := range dependencies {
if dependency.Name == K8sDoguOperatorClientDependencyName {
_, err := odv.checkVersion(dependency)
if err != nil {
return fmt.Errorf("failed to check version: %w", err)
}
}
}
return nil
}