-
Notifications
You must be signed in to change notification settings - Fork 232
/
Copy pathoperator.go
137 lines (115 loc) · 5.15 KB
/
operator.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package nmstate
import (
"context"
"fmt"
"github.com/lib/pq"
"github.com/openshift/assisted-service/internal/common"
"github.com/openshift/assisted-service/internal/featuresupport"
"github.com/openshift/assisted-service/internal/operators/api"
operatorscommon "github.com/openshift/assisted-service/internal/operators/common"
"github.com/openshift/assisted-service/models"
logutil "github.com/openshift/assisted-service/pkg/log"
"github.com/sirupsen/logrus"
)
type operator struct {
log logrus.FieldLogger
}
var Operator = models.MonitoredOperator{
Name: Name,
Namespace: Namespace,
OperatorType: models.OperatorTypeOlm,
SubscriptionName: SubscriptionName,
TimeoutSeconds: 60 * 60,
Bundles: pq.StringArray{
operatorscommon.BundleVirtualization.ID,
},
}
// New NMSTATEperator creates new instance of a Local Storage Operator installation plugin
func NewNmstateOperator(log logrus.FieldLogger) *operator {
return &operator{
log: log,
}
}
// GetName reports the name of an operator this Operator manages
func (o *operator) GetName() string {
return Operator.Name
}
func (o *operator) GetFullName() string {
return FullName
}
// GetDependencies provides a list of dependencies of the Operator
func (o *operator) GetDependencies(cluster *common.Cluster) ([]string, error) {
return make([]string, 0), nil
}
// GetClusterValidationID returns cluster validation ID for the Operator
func (o *operator) GetClusterValidationID() string {
return string(models.ClusterValidationIDNmstateRequirementsSatisfied)
}
// GetHostValidationID returns host validation ID for the Operator
func (o *operator) GetHostValidationID() string {
return string(models.HostValidationIDNmstateRequirementsSatisfied)
}
// ValidateCluster verifies whether this operator is valid for given cluster
func (o *operator) ValidateCluster(_ context.Context, cluster *common.Cluster) (api.ValidationResult, error) {
if !featuresupport.IsFeatureCompatibleWithArchitecture(models.FeatureSupportLevelIDNMSTATE, cluster.OpenshiftVersion, cluster.CPUArchitecture) {
return api.ValidationResult{Status: api.Failure, ValidationId: o.GetClusterValidationID(), Reasons: []string{fmt.Sprintf(
"%s is not supported for %s CPU architecture.", o.GetFullName(), cluster.CPUArchitecture)}}, nil
}
if ok, _ := common.BaseVersionLessThan(NmstateMinOpenshiftVersion, cluster.OpenshiftVersion); ok {
message := fmt.Sprintf("%s is only supported for openshift versions %s and above", o.GetFullName(), NmstateMinOpenshiftVersion)
return api.ValidationResult{Status: api.Failure, ValidationId: o.GetClusterValidationID(), Reasons: []string{message}}, nil
}
return api.ValidationResult{Status: api.Success, ValidationId: o.GetClusterValidationID(), Reasons: []string{}}, nil
}
// ValidateHost returns validationResult based on node type requirements such as memory and cpu
func (o *operator) ValidateHost(ctx context.Context, cluster *common.Cluster, host *models.Host, _ *models.ClusterHostRequirementsDetails) (api.ValidationResult, error) {
return api.ValidationResult{Status: api.Success, ValidationId: o.GetHostValidationID()}, nil
}
// GenerateManifests generates manifests for the operator
func (o *operator) GenerateManifests(c *common.Cluster) (map[string][]byte, []byte, error) {
return Manifests()
}
// GetProperties provides description of operator properties: none required
func (o *operator) GetProperties() models.OperatorProperties {
return models.OperatorProperties{}
}
// GetMonitoredOperator returns MonitoredOperator corresponding to the NMSTATE
func (o *operator) GetMonitoredOperator() *models.MonitoredOperator {
return &Operator
}
// GetHostRequirements provides operator's requirements towards the host
func (o *operator) GetHostRequirements(ctx context.Context, cluster *common.Cluster, host *models.Host) (*models.ClusterHostRequirementsDetails, error) {
log := logutil.FromContext(ctx, o.log)
preflightRequirements, err := o.GetPreflightRequirements(ctx, cluster)
if err != nil {
log.WithError(err).Errorf("Cannot retrieve preflight requirements for host %s", host.ID)
return nil, err
}
return preflightRequirements.Requirements.Worker.Quantitative, nil
}
// GetPreflightRequirements returns operator hardware requirements that can be determined with cluster data only
func (o *operator) GetPreflightRequirements(context context.Context, cluster *common.Cluster) (*models.OperatorHardwareRequirements, error) {
dependecies, err := o.GetDependencies(cluster)
if err != nil {
return &models.OperatorHardwareRequirements{}, err
}
return &models.OperatorHardwareRequirements{
OperatorName: o.GetName(),
Dependencies: dependecies,
Requirements: &models.HostTypeHardwareRequirementsWrapper{
Master: &models.HostTypeHardwareRequirements{
Quantitative: &models.ClusterHostRequirementsDetails{},
},
Worker: &models.HostTypeHardwareRequirements{
Quantitative: &models.ClusterHostRequirementsDetails{},
},
},
}, nil
}
func (o *operator) GetFeatureSupportID() models.FeatureSupportLevelID {
return models.FeatureSupportLevelIDNMSTATE
}
// GetBundleLabels returns the bundle labels for the operator
func (o *operator) GetBundleLabels() []string {
return []string(Operator.Bundles)
}