@@ -33,9 +33,11 @@ import (
3333 "github.com/codefresh-io/venona/venonactl/pkg/logger"
3434 templates "github.com/codefresh-io/venona/venonactl/pkg/templates/kubernetes"
3535
36+ "github.com/Masterminds/semver"
3637 "k8s.io/apimachinery/pkg/api/resource"
3738 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3839 "k8s.io/apimachinery/pkg/runtime"
40+ "k8s.io/apimachinery/pkg/version"
3941 "k8s.io/client-go/kubernetes/scheme"
4042)
4143
5254 }
5355)
5456
57+ var requiredK8sVersion , _ = semver .NewConstraint (">= 1.10.0" )
58+
5559func unescape (s string ) template.HTML {
5660 return template .HTML (s )
5761}
@@ -149,8 +153,22 @@ func getKubeObjectsFromTempalte(values map[string]interface{}, pattern string, l
149153 return KubeObjectsFromTemplates (templatesMap , values , pattern , logger )
150154}
151155
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+
154172 nodes , err := client .CoreV1 ().Nodes ().List (metav1.ListOptions {})
155173 if err != nil {
156174 return result , err
@@ -159,7 +177,6 @@ func ensureClusterRequirements(client *kubernetes.Clientset, req validationReque
159177 return result , errors .New ("Nodes not found" )
160178 }
161179
162- result .isValid = true
163180 if len (nodes .Items ) == 0 {
164181 result .message = append (result .message , "No nodes in cluster" )
165182 result .isValid = false
@@ -181,6 +198,20 @@ func ensureClusterRequirements(client *kubernetes.Clientset, req validationReque
181198 return result , nil
182199}
183200
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+
184215func testNode (n v1.Node , req validationRequest ) []string {
185216 result := []string {}
186217
0 commit comments