@@ -33,9 +33,11 @@ import (
33
33
"github.com/codefresh-io/venona/venonactl/pkg/logger"
34
34
templates "github.com/codefresh-io/venona/venonactl/pkg/templates/kubernetes"
35
35
36
+ "github.com/Masterminds/semver"
36
37
"k8s.io/apimachinery/pkg/api/resource"
37
38
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
38
39
"k8s.io/apimachinery/pkg/runtime"
40
+ "k8s.io/apimachinery/pkg/version"
39
41
"k8s.io/client-go/kubernetes/scheme"
40
42
)
41
43
52
54
}
53
55
)
54
56
57
+ var requiredK8sVersion , _ = semver .NewConstraint (">= 1.10.0" )
58
+
55
59
func unescape (s string ) template.HTML {
56
60
return template .HTML (s )
57
61
}
@@ -149,8 +153,22 @@ func getKubeObjectsFromTempalte(values map[string]interface{}, pattern string, l
149
153
return KubeObjectsFromTemplates (templatesMap , values , pattern , logger )
150
154
}
151
155
152
- func ensureClusterRequirements (client * kubernetes.Clientset , req validationRequest ) (validationResult , error ) {
153
- result := validationResult {}
156
+ func ensureClusterRequirements (client * kubernetes.Clientset , req validationRequest , logger logger.Logger ) (validationResult , error ) {
157
+ result := validationResult {true , nil }
158
+
159
+ v , err := client .ServerVersion ()
160
+ if err != nil {
161
+ // should not fail if can't get version
162
+ logger .Warn ("Failed to validate kubernetes version" , "cause" , err )
163
+ } else if res , err := testKubernetesVersion (v ); ! res {
164
+ if err != nil {
165
+ logger .Warn ("Failed to validate kubernetes version" , "cause" , err )
166
+ } else {
167
+ result .isValid = false
168
+ result .message = append (result .message , fmt .Sprintf ("Cluster does not meet the version requirements, minimum supported version is: '1.10.0' found version: '%v'" , v ))
169
+ }
170
+ }
171
+
154
172
nodes , err := client .CoreV1 ().Nodes ().List (metav1.ListOptions {})
155
173
if err != nil {
156
174
return result , err
@@ -159,7 +177,6 @@ func ensureClusterRequirements(client *kubernetes.Clientset, req validationReque
159
177
return result , errors .New ("Nodes not found" )
160
178
}
161
179
162
- result .isValid = true
163
180
if len (nodes .Items ) == 0 {
164
181
result .message = append (result .message , "No nodes in cluster" )
165
182
result .isValid = false
@@ -181,6 +198,20 @@ func ensureClusterRequirements(client *kubernetes.Clientset, req validationReque
181
198
return result , nil
182
199
}
183
200
201
+ func testKubernetesVersion (version * version.Info ) (bool , error ) {
202
+ v , err := semver .NewVersion (version .String ())
203
+ if err != nil {
204
+ return false , err
205
+ }
206
+ // extract only major, minor and patch
207
+ verStr := fmt .Sprintf ("%v.%v.%v" , v .Major (), v .Minor (), v .Patch ())
208
+ v , err = semver .NewVersion (verStr )
209
+ if err != nil {
210
+ return false , err
211
+ }
212
+ return requiredK8sVersion .Check (v ), nil
213
+ }
214
+
184
215
func testNode (n v1.Node , req validationRequest ) []string {
185
216
result := []string {}
186
217
0 commit comments