Repository: redhat-certification/chart-verifier
Pull request #213 (2021-10-28 21:28:31)

[DO NOT MERGE] Add new kubeVersion check and annotation
DO NOT MERGE, merge needs to sync with: https://github.com/openshift-helm-charts/development/pull/59

Adds a new ```v1.1/has-kubeversion``` check to the 1.1 profiles.

It ensure sthe chart kubeVersion is set to a valid semantic version. From this the supported OpenShiftVersions are determined and included in an annotation in the report.  

Also added to profile 1.1 the rename  of annotation : certifiedOpenShiftVersions to testedOpenShiftVersion


Patch:
diff --git a/config/profile-community-1.1.yaml b/config/profile-community-1.1.yaml
index 909131e..d49f546 100644
--- a/config/profile-community-1.1.yaml
+++ b/config/profile-community-1.1.yaml
@@ -4,8 +4,9 @@ vendorType: community
 version: v1.1
 annotations:
   - "Digest"
-  - "OCPVersion"
+  - "TestedOpenShiftVersion"
   - "LastCertifiedTimestamp"
+  - "SupportedOpenShiftVersions"
 checks:
     - name: v1.0/has-readme
       type: Optional
@@ -17,7 +18,7 @@ checks:
       type: Optional
     - name: v1.0/contains-values-schema
       type: Optional
-    - name: v1.0/has-kubeversion
+    - name: v1.1/has-kubeversion
       type: Optional
     - name: v1.0/not-contains-crds
       type: Optional
diff --git a/config/profile-partner-1.1.yaml b/config/profile-partner-1.1.yaml
index d53c3d4..bfc5ac9 100644
--- a/config/profile-partner-1.1.yaml
+++ b/config/profile-partner-1.1.yaml
@@ -4,8 +4,9 @@ vendorType: partner
 version: v1.1
 annotations:
   - "Digest"
-  - "OCPVersion"
+  - "TestedOpenShiftVersion"
   - "LastCertifiedTimestamp"
+  - "SupportedOpenShiftVersions"
 checks:
     - name: v1.0/has-readme
       type: Mandatory
@@ -17,7 +18,7 @@ checks:
       type: Mandatory
     - name: v1.0/contains-values-schema
       type: Mandatory
-    - name: v1.0/has-kubeversion
+    - name: v1.1/has-kubeversion
       type: Mandatory
     - name: v1.0/not-contains-crds
       type: Mandatory
diff --git a/config/profile-redhat-1.1.yaml b/config/profile-redhat-1.1.yaml
index afac339..4da5252 100644
--- a/config/profile-redhat-1.1.yaml
+++ b/config/profile-redhat-1.1.yaml
@@ -4,8 +4,9 @@ vendorType: redhat
 version: v1.1
 annotations:
   - "Digest"
-  - "OCPVersion"
+  - "TestedOpenShiftVersion"
   - "LastCertifiedTimestamp"
+  - "SupportedOpenShiftVersions"
 checks:
     - name: v1.0/has-readme
       type: Mandatory
@@ -17,7 +18,7 @@ checks:
       type: Mandatory
     - name: v1.0/contains-values-schema
       type: Mandatory
-    - name: v1.0/has-kubeversion
+    - name: v1.1/has-kubeversion
       type: Mandatory
     - name: v1.0/not-contains-crds
       type: Mandatory
diff --git a/go.mod b/go.mod
index 606a215..0f31624 100644
--- a/go.mod
+++ b/go.mod
@@ -4,6 +4,7 @@ go 1.17
 
 require (
 	github.com/Masterminds/semver v1.5.0
+	github.com/Masterminds/sprig v2.22.0+incompatible
 	github.com/google/go-cmp v0.5.6
 	github.com/helm/chart-testing/v3 v3.4.0
 	github.com/imdario/mergo v0.3.12
diff --git a/pkg/chartverifier/checks/checks.go b/pkg/chartverifier/checks/checks.go
index a78b907..e3628f7 100644
--- a/pkg/chartverifier/checks/checks.go
+++ b/pkg/chartverifier/checks/checks.go
@@ -20,11 +20,14 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/Masterminds/sprig"
 	"github.com/pkg/errors"
+	"golang.org/x/mod/semver"
 	"helm.sh/helm/v3/pkg/lint"
 	"helm.sh/helm/v3/pkg/lint/support"
 
 	"github.com/redhat-certification/chart-verifier/pkg/chartverifier/pyxis"
+	"github.com/redhat-certification/chart-verifier/pkg/tool"
 )
 
 const (
@@ -38,6 +41,7 @@ const (
 	ChartTestFilesDoesNotExist   = "Chart test files do not exist"
 	KuberVersionSpecified        = "Kubernetes version specified"
 	KuberVersionNotSpecified     = "Kubernetes version is not specified"
+	KuberVersionProcessingError  = "Error converting kubeVersion to an OCP range"
 	ValuesSchemaFileExist        = "Values schema file exist"
 	ValuesSchemaFileDoesNotExist = "Values schema file does not exist"
 	ValuesFileExist              = "Values file exist"
@@ -168,7 +172,27 @@ func HasKubeVersion(opts *CheckOptions) (Result, error) {
 	if c.Metadata.KubeVersion != "" {
 		r.SetResult(true, KuberVersionSpecified)
 	}
+	return r, nil
+}
+
+func HasKubeVersion_V1_1(opts *CheckOptions) (Result, error) {
+
+	c, _, err := LoadChartFromURI(opts.URI)
+	if err != nil {
+		return NewResult(false, err.Error()), err
+	}
 
+	r := NewResult(false, KuberVersionNotSpecified)
+
+	if c.Metadata.KubeVersion != "" {
+		OCPRange, err := getOCPRange(c.Metadata.KubeVersion)
+		if err != nil {
+			r = NewResult(false, err.Error())
+		} else {
+			opts.AnnotationHolder.SetSupportedOpenShiftVersions(OCPRange)
+			r = NewResult(true, KuberVersionSpecified)
+		}
+	}
 	return r, nil
 }
 
@@ -337,3 +361,42 @@ func parseImageReference(image string) pyxis.ImageReference {
 	return imageRef
 
 }
+
+func getOCPRange(kubeVersionRange string) (string, error) {
+
+	semverCompare := sprig.GenericFuncMap()["semverCompare"].(func(string, string) (bool, error))
+	minOCPVersion := ""
+	maxOCPVersion := ""
+	for kubeVersion, OCPVersion := range tool.GetKubeOpenShiftVersionMap() {
+		match, err := semverCompare(kubeVersionRange, kubeVersion)
+		if err != nil {
+			return "", fmt.Errorf("%s : %s", KuberVersionProcessingError, err)
+		}
+		if match {
+			testOCPVersion := fmt.Sprintf("v%s", OCPVersion)
+			if minOCPVersion == "" || semver.Compare(testOCPVersion, fmt.Sprintf("v%s", minOCPVersion)) < 0 {
+				minOCPVersion = OCPVersion
+			}
+			if maxOCPVersion == "" || semver.Compare(testOCPVersion, fmt.Sprintf("v%s", maxOCPVersion)) > 0 {
+				maxOCPVersion = OCPVersion
+			}
+		}
+	}
+	// Check if min ocp range is open ended, for example 1.* or >-=1.20
+	// To do this see if 1.999 is valid for the min OCP version range, not perfect but works until kubernetes hits 2.0.
+	if minOCPVersion != "" {
+		match, _ := semverCompare(kubeVersionRange, "1.999")
+		if match {
+			return fmt.Sprintf(">=%s", minOCPVersion), nil
+		} else {
+			if minOCPVersion == maxOCPVersion {
+				return minOCPVersion, nil
+			} else {
+				return fmt.Sprintf("%s - %s", minOCPVersion, maxOCPVersion), nil
+			}
+		}
+	}
+
+	return "", fmt.Errorf("%s : Failed to determine a minimum OCP version", KuberVersionProcessingError)
+
+}
diff --git a/pkg/chartverifier/checks/registry.go b/pkg/chartverifier/checks/registry.go
index 8f9c407..198c5d7 100644
--- a/pkg/chartverifier/checks/registry.go
+++ b/pkg/chartverifier/checks/registry.go
@@ -54,6 +54,7 @@ func (r *Result) AddResult(outcome bool, reason string) Result {
 type AnnotationHolder interface {
 	SetCertifiedOpenShiftVersion(version string)
 	GetCertifiedOpenShiftVersionFlag() string
+	SetSupportedOpenShiftVersions(versions string)
 }
 
 type CheckName string
diff --git a/pkg/chartverifier/profiles/default.go b/pkg/chartverifier/profiles/default.go
index 7763501..e2d3c36 100644
--- a/pkg/chartverifier/profiles/default.go
+++ b/pkg/chartverifier/profiles/default.go
@@ -8,6 +8,7 @@ import (
 
 const (
 	CheckVersion10        = "v1.0"
+	CheckVersion11        = "v1.1"
 	DefaultProfile        = "partner"
 	DefaultProfileVersion = "v1.1"
 )
@@ -26,7 +27,7 @@ func getDefaultProfile(msg string) *Profile {
 	profile.Vendor = DefaultProfile
 	profile.Version = DefaultProfileVersion
 
-	profile.Annotations = []Annotation{DigestAnnotation, OCPVersionAnnotation, LastCertifiedTimestampAnnotation}
+	profile.Annotations = []Annotation{DigestAnnotation, TestedOCPVersionAnnotation, LastCertifiedTimestampAnnotation, SupportedOCPVersionsAnnotation}
 
 	profile.Checks = []*Check{
 		{Name: fmt.Sprintf("%s/%s", CheckVersion10, checks.HasReadmeName), Type: checks.MandatoryCheckType},
@@ -34,7 +35,7 @@ func getDefaultProfile(msg string) *Profile {
 		{Name: fmt.Sprintf("%s/%s", CheckVersion10, checks.ContainsTestName), Type: checks.MandatoryCheckType},
 		{Name: fmt.Sprintf("%s/%s", CheckVersion10, checks.ContainsValuesName), Type: checks.MandatoryCheckType},
 		{Name: fmt.Sprintf("%s/%s", CheckVersion10, checks.ContainsValuesSchemaName), Type: checks.MandatoryCheckType},
-		{Name: fmt.Sprintf("%s/%s", CheckVersion10, checks.HasKubeversionName), Type: checks.MandatoryCheckType},
+		{Name: fmt.Sprintf("%s/%s", CheckVersion11, checks.HasKubeversionName), Type: checks.MandatoryCheckType},
 		{Name: fmt.Sprintf("%s/%s", CheckVersion10, checks.NotContainsCRDsName), Type: checks.MandatoryCheckType},
 		{Name: fmt.Sprintf("%s/%s", CheckVersion10, checks.HelmLintName), Type: checks.MandatoryCheckType},
 		{Name: fmt.Sprintf("%s/%s", CheckVersion10, checks.NotContainCsiObjectsName), Type: checks.MandatoryCheckType},
diff --git a/pkg/chartverifier/profiles/profile.go b/pkg/chartverifier/profiles/profile.go
index f56c04e..7d917bc 100644
--- a/pkg/chartverifier/profiles/profile.go
+++ b/pkg/chartverifier/profiles/profile.go
@@ -22,7 +22,9 @@ type VendorVersion string
 const (
 	DigestAnnotation                 Annotation = "Digest"
 	OCPVersionAnnotation             Annotation = "OCPVersion"
+	TestedOCPVersionAnnotation       Annotation = "TestedOpenShiftVersion"
 	LastCertifiedTimestampAnnotation Annotation = "LastCertifiedTimestamp"
+	SupportedOCPVersionsAnnotation   Annotation = "SupportedOpenShiftVersions"
 
 	VendorTypeConfigName string = "profile.vendortype"
 	VersionConfigName    string = "profile.version"
diff --git a/pkg/chartverifier/report.go b/pkg/chartverifier/report.go
index 06bc4c7..d1b9338 100644
--- a/pkg/chartverifier/report.go
+++ b/pkg/chartverifier/report.go
@@ -50,9 +50,12 @@ type ToolMetadata struct {
 	Version                    string  `json:"verifier-version" yaml:"verifier-version"`
 	Profile                    Profile `json:"profile" yaml:"profile"`
 	ChartUri                   string  `json:"chart-uri" yaml:"chart-uri"`
+	Digest                     string  `json:"digest" yaml:"digest"`
 	Digests                    Digests `json:"digests" yaml:"digests"`
 	LastCertifiedTimestamp     string  `json:"lastCertifiedTimestamp,omitempty" yaml:"lastCertifiedTimestamp,omitempty"`
 	CertifiedOpenShiftVersions string  `json:"certifiedOpenShiftVersions,omitempty" yaml:"certifiedOpenShiftVersions,omitempty"`
+	TestedOpenShiftVersion     string  `json:"testedOpenShiftVersion,omitempty" yaml:"testedOpenShiftVersion,omitempty"`
+	SupportedOpenShiftVersions string  `json:"supportedOpenShiftVersions,omitempty" yaml:"supportedOpenShiftVersions,omitempty"`
 }
 
 type Digests struct {
diff --git a/pkg/chartverifier/report/logs.txt b/pkg/chartverifier/report/logs.txt
new file mode 100644
index 0000000..e69de29
diff --git a/pkg/chartverifier/report/reporter.go b/pkg/chartverifier/report/reporter.go
index 4e5ef1f..945ec3c 100644
--- a/pkg/chartverifier/report/reporter.go
+++ b/pkg/chartverifier/report/reporter.go
@@ -21,7 +21,9 @@ const (
 
 	DigestsAnnotationName                string = "digest"
 	LastCertifiedTimestampAnnotationName string = "lastCertifiedTimestamp"
-	CertifiedOCPVersionAnnotationName    string = "certifiedOpenShiftVersions"
+	CertifiedOCPVersionsAnnotationName   string = "certifiedOpenShiftVersions"
+	TestedOCPVersionAnnotationName       string = "testedOpenShiftVersion"
+	SupportedOCPVersionsAnnotationName   string = "supportedOpenShiftVersions"
 )
 
 func All(opts *ReportOptions) (OutputReport, error) {
@@ -88,7 +90,7 @@ func Annotations(opts *ReportOptions) (OutputReport, error) {
 		outputReport.AnnotationsReport = append(outputReport.AnnotationsReport, annotation)
 	}
 
-	name = fmt.Sprintf("%s/%s", anotationsPrefix, CertifiedOCPVersionAnnotationName)
+	name = fmt.Sprintf("%s/%s", anotationsPrefix, CertifiedOCPVersionsAnnotationName)
 	value = report.Metadata.ToolMetadata.CertifiedOpenShiftVersions
 	if len(value) > 0 {
 		annotation := Annotation{}
@@ -97,6 +99,24 @@ func Annotations(opts *ReportOptions) (OutputReport, error) {
 		outputReport.AnnotationsReport = append(outputReport.AnnotationsReport, annotation)
 	}
 
+	name = fmt.Sprintf("%s/%s", anotationsPrefix, TestedOCPVersionAnnotationName)
+	value = report.Metadata.ToolMetadata.TestedOpenShiftVersion
+	if len(value) > 0 {
+		annotation := Annotation{}
+		annotation.Name = name
+		annotation.Value = value
+		outputReport.AnnotationsReport = append(outputReport.AnnotationsReport, annotation)
+	}
+
+	name = fmt.Sprintf("%s/%s", anotationsPrefix, SupportedOCPVersionsAnnotationName)
+	value = report.Metadata.ToolMetadata.SupportedOpenShiftVersions
+	if len(value) > 0 {
+		annotation := Annotation{}
+		annotation.Name = name
+		annotation.Value = value
+		outputReport.AnnotationsReport = append(outputReport.AnnotationsReport, annotation)
+	}
+
 	return outputReport, nil
 }
 
diff --git a/pkg/chartverifier/reportBuilder.go b/pkg/chartverifier/reportBuilder.go
index 83bc93f..d2105c4 100644
--- a/pkg/chartverifier/reportBuilder.go
+++ b/pkg/chartverifier/reportBuilder.go
@@ -41,7 +41,8 @@ type ReportBuilder interface {
 	SetChartUri(name string) ReportBuilder
 	AddCheck(check checks.Check, result checks.Result) ReportBuilder
 	SetChart(chart *helmchart.Chart) ReportBuilder
-	SetCertifiedOpenShiftVersion(version string) ReportBuilder
+	SetTestedOpenShiftVersion(version string) ReportBuilder
+	SetSupportedOpenShiftVersions(versions string) ReportBuilder
 	Build() (*Report, error)
 }
 
@@ -51,9 +52,10 @@ type CheckResult struct {
 }
 
 type reportBuilder struct {
-	Chart      *helmchart.Chart
-	Report     Report
-	OCPVersion string
+	Chart                *helmchart.Chart
+	Report               Report
+	OCPVersion           string
+	SupportedOCPVersions string
 }
 
 func NewReportBuilder() ReportBuilder {
@@ -62,11 +64,16 @@ func NewReportBuilder() ReportBuilder {
 	return &b
 }
 
-func (r *reportBuilder) SetCertifiedOpenShiftVersion(version string) ReportBuilder {
+func (r *reportBuilder) SetTestedOpenShiftVersion(version string) ReportBuilder {
 	r.OCPVersion = version
 	return r
 }
 
+func (r *reportBuilder) SetSupportedOpenShiftVersions(versions string) ReportBuilder {
+	r.SupportedOCPVersions = versions
+	return r
+}
+
 func (r *reportBuilder) SetToolVersion(version string) ReportBuilder {
 	r.Report.Metadata.ToolMetadata.Version = version
 	return r
@@ -101,6 +108,7 @@ func (r *reportBuilder) Build() (*Report, error) {
 		switch annotation {
 		case profiles.DigestAnnotation:
 			r.Report.Metadata.ToolMetadata.Digests.Chart = GenerateSha(r.Chart.Raw)
+			r.Report.Metadata.ToolMetadata.Digest = r.Report.Metadata.ToolMetadata.Digests.Chart
 		case profiles.LastCertifiedTimestampAnnotation:
 			r.Report.Metadata.ToolMetadata.LastCertifiedTimestamp = time.Now().Format("2006-01-02T15:04:05.999999-07:00")
 		case profiles.OCPVersionAnnotation:
@@ -109,6 +117,18 @@ func (r *reportBuilder) Build() (*Report, error) {
 			} else {
 				r.Report.Metadata.ToolMetadata.CertifiedOpenShiftVersions = r.OCPVersion
 			}
+		case profiles.TestedOCPVersionAnnotation:
+			if len(r.OCPVersion) == 0 {
+				r.Report.Metadata.ToolMetadata.TestedOpenShiftVersion = "N/A"
+			} else {
+				r.Report.Metadata.ToolMetadata.TestedOpenShiftVersion = r.OCPVersion
+			}
+		case profiles.SupportedOCPVersionsAnnotation:
+			if len(r.SupportedOCPVersions) == 0 {
+				r.Report.Metadata.ToolMetadata.SupportedOpenShiftVersions = "N/A"
+			} else {
+				r.Report.Metadata.ToolMetadata.SupportedOpenShiftVersions = r.SupportedOCPVersions
+			}
 		}
 	}
 
diff --git a/pkg/chartverifier/verifier.go b/pkg/chartverifier/verifier.go
index 450848c..c835d83 100644
--- a/pkg/chartverifier/verifier.go
+++ b/pkg/chartverifier/verifier.go
@@ -45,13 +45,17 @@ type AnnotationHolder struct {
 }
 
 func (holder *AnnotationHolder) SetCertifiedOpenShiftVersion(version string) {
-	holder.Holder.SetCertifiedOpenShiftVersion(version)
+	holder.Holder.SetTestedOpenShiftVersion(version)
 }
 
 func (holder *AnnotationHolder) GetCertifiedOpenShiftVersionFlag() string {
 	return holder.CertifiedOpenShiftVersionFlag
 }
 
+func (holder *AnnotationHolder) SetSupportedOpenShiftVersions(versions string) {
+	holder.Holder.SetSupportedOpenShiftVersions(versions)
+}
+
 type verifier struct {
 	config           *viper.Viper
 	registry         checks.Registry
diff --git a/pkg/chartverifier/verifierbuilder.go b/pkg/chartverifier/verifierbuilder.go
index cb6ff77..128ca63 100644
--- a/pkg/chartverifier/verifierbuilder.go
+++ b/pkg/chartverifier/verifierbuilder.go
@@ -40,6 +40,7 @@ func init() {
 	defaultRegistry.Add(checks.ContainsValuesName, "v1.0", checks.ContainsValues)
 	defaultRegistry.Add(checks.ContainsValuesSchemaName, "v1.0", checks.ContainsValuesSchema)
 	defaultRegistry.Add(checks.HasKubeversionName, "v1.0", checks.HasKubeVersion)
+	defaultRegistry.Add(checks.HasKubeversionName, "v1.1", checks.HasKubeVersion_V1_1)
 	defaultRegistry.Add(checks.NotContainsCRDsName, "v1.0", checks.NotContainCRDs)
 	defaultRegistry.Add(checks.HelmLintName, "v1.0", checks.HelmLint)
 	defaultRegistry.Add(checks.NotContainCsiObjectsName, "v1.0", checks.NotContainCSIObjects)
@@ -55,13 +56,14 @@ func DefaultRegistry() checks.Registry {
 type FilteredRegistry map[checks.CheckName]checks.Check
 
 type verifierBuilder struct {
-	checks           FilteredRegistry
-	config           *viper.Viper
-	registry         checks.Registry
-	toolVersion      string
-	openshiftVersion string
-	values           map[string]interface{}
-	settings         *cli.EnvSettings
+	checks                      FilteredRegistry
+	config                      *viper.Viper
+	registry                    checks.Registry
+	toolVersion                 string
+	openshiftVersion            string
+	suppportedOpenshiftVersions string
+	values                      map[string]interface{}
+	settings                    *cli.EnvSettings
 }
 
 func (b *verifierBuilder) SetSettings(settings *cli.EnvSettings) VerifierBuilder {
diff --git a/pkg/tool/oc.go b/pkg/tool/oc.go
index 6b05fbd..0438146 100644
--- a/pkg/tool/oc.go
+++ b/pkg/tool/oc.go
@@ -20,15 +20,15 @@ const osVersionKey = "serverVersion"
 
 // Based on https://access.redhat.com/solutions/4870701
 var kubeOpenShiftVersionMap map[string]string = map[string]string{
-	"1.22": "4.9.0",
-	"1.21": "4.8.0",
-	"1.20": "4.7.0",
-	"1.19": "4.6.0",
-	"1.18": "4.5.0",
-	"1.17": "4.4.0",
-	"1.16": "4.3.0",
-	"1.14": "4.2.0",
-	"1.13": "4.1.0",
+	"1.22": "4.9",
+	"1.21": "4.8",
+	"1.20": "4.7",
+	"1.19": "4.6",
+	"1.18": "4.5",
+	"1.17": "4.4",
+	"1.16": "4.3",
+	"1.14": "4.2",
+	"1.13": "4.1",
 }
 
 func (o Oc) GetVersion() (string, error) {
@@ -52,3 +52,7 @@ func (o Oc) GetVersion() (string, error) {
 
 	return osVersion, nil
 }
+
+func GetKubeOpenShiftVersionMap() map[string]string {
+	return kubeOpenShiftVersionMap
+}


Test patch:
diff --git a/cmd/report_test.go b/cmd/report_test.go
index 81e8f77..8a8fde4 100644
--- a/cmd/report_test.go
+++ b/cmd/report_test.go
@@ -19,9 +19,10 @@ func TestReport(t *testing.T) {
 
 	var expectedAnnotations []report.Annotation
 	annotation1 := report.Annotation{Name: fmt.Sprintf("%s/%s", report.DefaultAnnotationsPrefix, report.DigestsAnnotationName), Value: "sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0"}
-	annotation2 := report.Annotation{Name: fmt.Sprintf("%s/%s", report.DefaultAnnotationsPrefix, report.CertifiedOCPVersionAnnotationName), Value: "4.7.8"}
+	annotation2 := report.Annotation{Name: fmt.Sprintf("%s/%s", report.DefaultAnnotationsPrefix, report.TestedOCPVersionAnnotationName), Value: "4.7.8"}
 	annotation3 := report.Annotation{Name: fmt.Sprintf("%s/%s", report.DefaultAnnotationsPrefix, report.LastCertifiedTimestampAnnotationName), Value: "2021-07-06T10:28:01.09604-04:00"}
-	expectedAnnotations = append(expectedAnnotations, annotation1, annotation2, annotation3)
+	annotation4 := report.Annotation{Name: fmt.Sprintf("%s/%s", report.DefaultAnnotationsPrefix, report.SupportedOCPVersionsAnnotationName), Value: "4.7.8"}
+	expectedAnnotations = append(expectedAnnotations, annotation1, annotation2, annotation3, annotation4)
 
 	expectedResults := &report.ResultsReport{}
 	expectedResults.Passed = "11"
@@ -186,9 +187,10 @@ func TestReport(t *testing.T) {
 
 		var expectedPrefixAnnotations []report.Annotation
 		annotationP1 := report.Annotation{Name: fmt.Sprintf("%s/%s", annotationPrefix, report.DigestsAnnotationName), Value: "sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0"}
-		annotationP2 := report.Annotation{Name: fmt.Sprintf("%s/%s", annotationPrefix, report.CertifiedOCPVersionAnnotationName), Value: "4.7.8"}
+		annotationP2 := report.Annotation{Name: fmt.Sprintf("%s/%s", annotationPrefix, report.TestedOCPVersionAnnotationName), Value: "4.7.8"}
 		annotationP3 := report.Annotation{Name: fmt.Sprintf("%s/%s", annotationPrefix, report.LastCertifiedTimestampAnnotationName), Value: "2021-07-06T10:28:01.09604-04:00"}
-		expectedPrefixAnnotations = append(expectedPrefixAnnotations, annotationP1, annotationP2, annotationP3)
+		annotationP4 := report.Annotation{Name: fmt.Sprintf("%s/%s", annotationPrefix, report.SupportedOCPVersionsAnnotationName), Value: "4.7.8"}
+		expectedPrefixAnnotations = append(expectedPrefixAnnotations, annotationP1, annotationP2, annotationP3, annotationP4)
 
 		testReport := report.OutputReport{}
 		require.NoError(t, json.Unmarshal([]byte(outBuf.String()), &testReport))
diff --git a/cmd/test/report.yaml b/cmd/test/report.yaml
index 92756c4..fa7aae3 100644
--- a/cmd/test/report.yaml
+++ b/cmd/test/report.yaml
@@ -7,11 +7,13 @@ metadata:
             VendorType: redhat
             version: v1.1
         chart-uri: pkg/chartverifier/checks/chart-0.1.0-v3.valid.tgz
+        digest: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
         digests:
             chart: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
             package: 4f29f2a95bf2b9a1c62fd215b079a01bdc5a38e9b4ff874d0fa21d0afca2e76d
         lastCertifiedTimestamp: "2021-07-06T10:28:01.09604-04:00"
-        certifiedOpenShiftVersions: 4.7.8
+        testedOpenShiftVersion: 4.7.8
+        supportedOpenShiftVersions: 4.7.8
     chart:
         name: chart
         home: ""
@@ -73,7 +75,7 @@ results:
     type: Mandatory
     outcome: PASS
     reason: Values schema file exist
-  - check: v1.0/has-kubeversion
+  - check: v1.1/has-kubeversion
     type: Mandatory
     outcome: PASS
     reason: Kubernetes version specified
diff --git a/pkg/chartverifier/checks/charttesting_test.go b/pkg/chartverifier/checks/charttesting_test.go
index c1340d2..1a2b3a3 100644
--- a/pkg/chartverifier/checks/charttesting_test.go
+++ b/pkg/chartverifier/checks/charttesting_test.go
@@ -140,6 +140,8 @@ func (holder *testAnnotationHolder) GetCertifiedOpenShiftVersionFlag() string {
 	return holder.CertifiedOpenShiftVersionFlag
 }
 
+func (holder *testAnnotationHolder) SetSupportedOpenShiftVersions(version string) {}
+
 func TestVersionSetting(t *testing.T) {
 	type testCase struct {
 		description string
diff --git a/pkg/chartverifier/checks/checks_test.go b/pkg/chartverifier/checks/checks_test.go
index 11c1634..cf7bcce 100644
--- a/pkg/chartverifier/checks/checks_test.go
+++ b/pkg/chartverifier/checks/checks_test.go
@@ -22,7 +22,6 @@ import (
 	"testing"
 
 	"github.com/redhat-certification/chart-verifier/pkg/chartverifier/pyxis"
-
 	"github.com/spf13/viper"
 	"github.com/stretchr/testify/require"
 	"helm.sh/helm/v3/pkg/cli"
@@ -475,3 +474,48 @@ func TestRequiredAnnotationsPresent(t *testing.T) {
 		})
 	}
 }
+
+func TestSemVers(t *testing.T) {
+
+	// Vault: kubeVersion: '>= 1.14.0-0'
+	// IBM: kubeversion: '>=1.10.1-0'
+	// Fortanix : kubeversion: '>= 1.16.0 < 1.22.0'
+	// Wildfly: kubeversion: ""
+	// Infispan: kubeversion: ""
+
+	type testCase struct {
+		kubeVersion string
+		OCPRange    string
+	}
+
+	type TestError struct {
+		expectedOCPRange string
+		gotOCORange      string
+	}
+
+	testCases := []testCase{
+		{kubeVersion: "~1.22-0", OCPRange: "4.9"},
+		{kubeVersion: "1.22.*", OCPRange: "4.9"},
+		{kubeVersion: "^1.22", OCPRange: ">=4.9"},
+		{kubeVersion: ">=1.20-0", OCPRange: ">=4.7"},
+		{kubeVersion: "1.21 - 1.22", OCPRange: "4.8 - 4.9"},
+		{kubeVersion: ">1.20", OCPRange: ">=4.8"},
+		{kubeVersion: "~1.21", OCPRange: "4.8"},
+		{kubeVersion: ">= 1.14.0-0", OCPRange: ">=4.2"},
+		{kubeVersion: "1.16 - 1.21", OCPRange: "4.3 - 4.8"},
+		{kubeVersion: "*", OCPRange: ">=4.1"},
+		{kubeVersion: ">=1.16.0 <1.22.0", OCPRange: "Error converting kubeVersion to an OCP range : improper constraint: >=1.16.0 <1.22.0"},
+	}
+
+	for _, test := range testCases {
+		t.Run(fmt.Sprintf("Check kube version %s", test.kubeVersion), func(t *testing.T) {
+			OCPRange, err := getOCPRange(test.kubeVersion)
+			if err != nil {
+				require.Equal(t, test.OCPRange, fmt.Sprintf("%v", err))
+			} else {
+				require.Equal(t, test.OCPRange, OCPRange)
+			}
+		})
+	}
+
+}
diff --git a/pkg/chartverifier/profiles/profile_test.go b/pkg/chartverifier/profiles/profile_test.go
index 25dcc17..01250a7 100644
--- a/pkg/chartverifier/profiles/profile_test.go
+++ b/pkg/chartverifier/profiles/profile_test.go
@@ -121,7 +121,7 @@ func TestProfileFilter(t *testing.T) {
 	defaultRegistry.Add(checks.ContainsTestName, checkVersion11, checks.ContainsTest)
 	defaultRegistry.Add(checks.ContainsValuesName, checkVersion11, checks.ContainsValues)
 	defaultRegistry.Add(checks.ContainsValuesSchemaName, checkVersion11, checks.ContainsValuesSchema)
-	defaultRegistry.Add(checks.HasKubeversionName, checkVersion11, checks.HasKubeVersion)
+	defaultRegistry.Add(checks.HasKubeversionName, checkVersion11, checks.HasKubeVersion_V1_1)
 	defaultRegistry.Add(checks.NotContainsCRDsName, checkVersion11, checks.NotContainCRDs)
 	defaultRegistry.Add(checks.HelmLintName, checkVersion11, checks.HelmLint)
 	defaultRegistry.Add(checks.NotContainsCRDsName, checkVersion11, checks.NotContainCSIObjects)
@@ -137,6 +137,7 @@ func TestProfileFilter(t *testing.T) {
 	expectedChecks[checks.IsHelmV3Name] = checks.Check{CheckId: checks.CheckId{Name: checks.IsHelmV3Name, Version: checkVersion10}, Type: checks.MandatoryCheckType, Func: checks.IsHelmV3}
 	expectedChecks[checks.ContainsTestName] = checks.Check{CheckId: checks.CheckId{Name: checks.ContainsTestName, Version: checkVersion10}, Type: checks.MandatoryCheckType, Func: checks.ContainsTest}
 	expectedChecks[checks.ContainsValuesName] = checks.Check{CheckId: checks.CheckId{Name: checks.ContainsValuesName, Version: checkVersion10}, Type: checks.MandatoryCheckType, Func: checks.ContainsValues}
+	expectedChecks[checks.HasKubeversionName] = checks.Check{CheckId: checks.CheckId{Name: checks.HasKubeversionName, Version: checkVersion11}, Type: checks.MandatoryCheckType, Func: checks.HasKubeVersion_V1_1}
 
 	config := viper.New()
 	t.Run("Checks filtered using profile subset", func(t *testing.T) {
@@ -151,14 +152,15 @@ func TestProfileFilter(t *testing.T) {
 	defaultRegistry.Add(checks.NotContainCsiObjectsName, checkVersion10, checks.NotContainCSIObjects)
 	defaultRegistry.Add(checks.ImagesAreCertifiedName, checkVersion10, checks.ImagesAreCertified)
 	defaultRegistry.Add(checks.ChartTestingName, checkVersion10, checks.ChartTesting)
+	defaultRegistry.Add(checks.RequiredAnnotationsPresentName, checkVersion10, checks.RequiredAnnotationsPresent)
 
 	expectedChecks[checks.ContainsValuesSchemaName] = checks.Check{CheckId: checks.CheckId{Name: checks.ContainsValuesSchemaName, Version: checkVersion10}, Type: checks.MandatoryCheckType, Func: checks.ContainsValuesSchema}
-	expectedChecks[checks.HasKubeversionName] = checks.Check{CheckId: checks.CheckId{Name: checks.HasKubeversionName, Version: checkVersion10}, Type: checks.MandatoryCheckType, Func: checks.HasKubeVersion}
 	expectedChecks[checks.NotContainsCRDsName] = checks.Check{CheckId: checks.CheckId{Name: checks.NotContainsCRDsName, Version: checkVersion10}, Type: checks.MandatoryCheckType, Func: checks.NotContainCRDs}
 	expectedChecks[checks.HelmLintName] = checks.Check{CheckId: checks.CheckId{Name: checks.HelmLintName, Version: checkVersion10}, Type: checks.MandatoryCheckType, Func: checks.HelmLint}
 	expectedChecks[checks.NotContainCsiObjectsName] = checks.Check{CheckId: checks.CheckId{Name: checks.NotContainCsiObjectsName, Version: checkVersion10}, Type: checks.MandatoryCheckType, Func: checks.NotContainCSIObjects}
 	expectedChecks[checks.ImagesAreCertifiedName] = checks.Check{CheckId: checks.CheckId{Name: checks.ImagesAreCertifiedName, Version: checkVersion10}, Type: checks.MandatoryCheckType, Func: checks.ImagesAreCertified}
 	expectedChecks[checks.ChartTestingName] = checks.Check{CheckId: checks.CheckId{Name: checks.ChartTestingName, Version: checkVersion10}, Type: checks.MandatoryCheckType, Func: checks.ChartTesting}
+	expectedChecks[checks.RequiredAnnotationsPresentName] = checks.Check{CheckId: checks.CheckId{Name: checks.RequiredAnnotationsPresentName, Version: checkVersion10}, Type: checks.MandatoryCheckType, Func: checks.RequiredAnnotationsPresent}
 
 	t.Run("Checks filtered using profile - full set", func(t *testing.T) {
 		filteredChecks := New(config).FilterChecks(defaultRegistry.AllChecks())
diff --git a/pkg/chartverifier/report/reporter_test.go b/pkg/chartverifier/report/reporter_test.go
index b72329f..2d47107 100644
--- a/pkg/chartverifier/report/reporter_test.go
+++ b/pkg/chartverifier/report/reporter_test.go
@@ -13,16 +13,26 @@ import (
 	helmchart "helm.sh/helm/v3/pkg/chart"
 )
 
-func TestReports(t *testing.T) {
+type testInfo struct {
+	description       string
+	path              string
+	annotationsPrefix string
+	setVendorType     string
+	expectedReport    *OutputReport
+}
+
+func TestReports_1_0(t *testing.T) {
+	var tests []testInfo
 
+	version := "v1.0"
 	testRedHatMetaDataReport := &MetadataReport{}
-	testRedHatMetaDataReport.ProfileVersion = "v1.0"
+	testRedHatMetaDataReport.ProfileVersion = version
 	testRedHatMetaDataReport.ProfileVendorType = "redhat"
 	testRedHatMetaDataReport.ChartUri = "pkg/chartverifier/checks/chart-0.1.0-v3.valid.tgz"
 	testRedHatMetaDataReport.Chart = &helmchart.Metadata{Name: "chart", Version: "0.1.0-v3.valid"}
 
 	testPartnerMetaDataReport := &MetadataReport{}
-	testPartnerMetaDataReport.ProfileVersion = "v1.0"
+	testPartnerMetaDataReport.ProfileVersion = version
 	testPartnerMetaDataReport.ProfileVendorType = "partner"
 	testPartnerMetaDataReport.ChartUri = "pkg/chartverifier/checks/chart-0.1.0-v3.valid.tgz"
 	testPartnerMetaDataReport.Chart = &helmchart.Metadata{Name: "chart", Version: "0.1.0-v3.valid"}
@@ -30,7 +40,7 @@ func TestReports(t *testing.T) {
 	var testAnnotationsReport []Annotation
 	testAnnotationsReport = append(testAnnotationsReport, Annotation{Name: fmt.Sprintf("charts.openshift.io/%s", DigestsAnnotationName), Value: "sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0"})
 	testAnnotationsReport = append(testAnnotationsReport, Annotation{Name: fmt.Sprintf("charts.openshift.io/%s", LastCertifiedTimestampAnnotationName), Value: "2021-07-02T08:09:56.881793-04:00"})
-	testAnnotationsReport = append(testAnnotationsReport, Annotation{Name: fmt.Sprintf("charts.openshift.io/%s", CertifiedOCPVersionAnnotationName), Value: "4.7.8"})
+	testAnnotationsReport = append(testAnnotationsReport, Annotation{Name: fmt.Sprintf("charts.openshift.io/%s", CertifiedOCPVersionsAnnotationName), Value: "4.7.8"})
 
 	testDigestReport := &DigestReport{}
 	testDigestReport.PackageDigest = "4f29f2a95bf2b9a1c62fd215b079a01bdc5a38e9b4ff874d0fa21d0afca2e76d"
@@ -46,25 +56,15 @@ func TestReports(t *testing.T) {
 	testAllReport.DigestsReport = testDigestReport
 	testAllReport.AnnotationsReport = testAnnotationsReport
 
-	type testInfo struct {
-		description       string
-		path              string
-		annotationsPrefix string
-		setVendorType     string
-		expectedReport    *OutputReport
-	}
-
-	var tests []testInfo
-
 	allgoodTestInfo := testInfo{}
-	allgoodTestInfo.path = "testreports/reportallgood.yaml"
-	allgoodTestInfo.description = fmt.Sprintf("test all good report %s", allgoodTestInfo.path)
+	allgoodTestInfo.path = "testreports/v1.0/reportallgood.yaml"
+	allgoodTestInfo.description = fmt.Sprintf("Version %s test all good report %s", version, allgoodTestInfo.path)
 	allgoodTestInfo.expectedReport = testAllReport
 	tests = append(tests, allgoodTestInfo)
 
 	missingMandatoryTestInfo := testInfo{}
-	missingMandatoryTestInfo.path = "testreports/reportmissingmandatory.yaml"
-	missingMandatoryTestInfo.description = fmt.Sprintf("test missing mandatory report %s", missingMandatoryTestInfo.path)
+	missingMandatoryTestInfo.path = "testreports/v1.0/reportmissingmandatory.yaml"
+	missingMandatoryTestInfo.description = fmt.Sprintf("Version %s test missing mandatory report %s", version, missingMandatoryTestInfo.path)
 	missingMandatoryTestInfo.expectedReport = &OutputReport{}
 	missingMandatoryTestInfo.expectedReport.ResultsReport = &ResultsReport{}
 	missingMandatoryTestInfo.expectedReport.ResultsReport.Passed = "9"
@@ -73,21 +73,116 @@ func TestReports(t *testing.T) {
 	tests = append(tests, missingMandatoryTestInfo)
 
 	withFailureTestInfo := testInfo{}
-	withFailureTestInfo.path = "testreports/reportwithfailure.yaml"
-	withFailureTestInfo.description = fmt.Sprintf("test missing failures report %s", missingMandatoryTestInfo.path)
+	withFailureTestInfo.path = "testreports/v1.0/reportwithfailure.yaml"
+	withFailureTestInfo.description = fmt.Sprintf("Version %s test missing failures report %s", version, missingMandatoryTestInfo.path)
 	withFailureTestInfo.expectedReport = &OutputReport{}
+	withFailureTestInfo.expectedReport.ResultsReport = &ResultsReport{}
+	withFailureTestInfo.expectedReport.ResultsReport.Passed = "9"
+	withFailureTestInfo.expectedReport.ResultsReport.Failed = "2"
+	withFailureTestInfo.expectedReport.MetadataReport = testRedHatMetaDataReport
+	tests = append(tests, withFailureTestInfo)
+
+	allsortsTestInfo := testInfo{}
+	allsortsTestInfo.path = "testreports/v1.0/reportallsorts.yaml"
+	allsortsTestInfo.description = fmt.Sprintf("Version %s test allsorts report %s", version, missingMandatoryTestInfo.path)
+	allsortsTestInfo.expectedReport = &OutputReport{}
+	allsortsTestInfo.expectedReport.ResultsReport = &ResultsReport{}
+	allsortsTestInfo.expectedReport.ResultsReport.Passed = "8"
+	allsortsTestInfo.expectedReport.ResultsReport.Failed = "3"
+	allsortsTestInfo.expectedReport.DigestsReport = &DigestReport{}
+	allsortsTestInfo.expectedReport.DigestsReport.ChartDigest = "sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0"
+	allsortsTestInfo.expectedReport.MetadataReport = testPartnerMetaDataReport
+	tests = append(tests, allsortsTestInfo)
+
+	setBehaviorTestInfo := testInfo{}
+	setBehaviorTestInfo.path = "testreports/v1.0/reportmissingmandatory.yaml"
+	setBehaviorTestInfo.description = fmt.Sprintf("Version %s test set behvaior missing mandatory report %s", version, missingMandatoryTestInfo.path)
+	setBehaviorTestInfo.setVendorType = "community"
+	setBehaviorTestInfo.expectedReport = &OutputReport{}
+	setBehaviorTestInfo.expectedReport.ResultsReport = &ResultsReport{}
+	setBehaviorTestInfo.expectedReport.ResultsReport.Passed = "1"
+	setBehaviorTestInfo.expectedReport.ResultsReport.Failed = "0"
+	setBehaviorTestInfo.annotationsPrefix = "test.report.command.io"
+	var setBehaviorAnnotationsReport []Annotation
+	setBehaviorAnnotationsReport = append(setBehaviorAnnotationsReport, Annotation{Name: fmt.Sprintf("%s/%s", setBehaviorTestInfo.annotationsPrefix, DigestsAnnotationName), Value: "sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0"})
+	setBehaviorAnnotationsReport = append(setBehaviorAnnotationsReport, Annotation{Name: fmt.Sprintf("%s/%s", setBehaviorTestInfo.annotationsPrefix, LastCertifiedTimestampAnnotationName), Value: "2021-07-02T08:09:56.881793-04:00"})
+	setBehaviorAnnotationsReport = append(setBehaviorAnnotationsReport, Annotation{Name: fmt.Sprintf("%s/%s", setBehaviorTestInfo.annotationsPrefix, CertifiedOCPVersionsAnnotationName), Value: "4.7.8"})
+	setBehaviorTestInfo.expectedReport.AnnotationsReport = setBehaviorAnnotationsReport
+	setBehaviorTestInfo.expectedReport.MetadataReport = testPartnerMetaDataReport
+	tests = append(tests, setBehaviorTestInfo)
+
+	reportTest(tests, t)
+
+}
+
+func TestReports_1_1(t *testing.T) {
+	var tests []testInfo
+
+	version := "v1.1"
+	testRedHatMetaDataReport := &MetadataReport{}
+	testRedHatMetaDataReport.ProfileVersion = version
+	testRedHatMetaDataReport.ProfileVendorType = "redhat"
+	testRedHatMetaDataReport.ChartUri = "pkg/chartverifier/checks/chart-0.1.0-v3.valid.tgz"
+	testRedHatMetaDataReport.Chart = &helmchart.Metadata{Name: "chart", Version: "0.1.0-v3.valid"}
+
+	testPartnerMetaDataReport := &MetadataReport{}
+	testPartnerMetaDataReport.ProfileVersion = version
+	testPartnerMetaDataReport.ProfileVendorType = "partner"
+	testPartnerMetaDataReport.ChartUri = "pkg/chartverifier/checks/chart-0.1.0-v3.valid.tgz"
+	testPartnerMetaDataReport.Chart = &helmchart.Metadata{Name: "chart", Version: "0.1.0-v3.valid"}
+
+	var testAnnotationsReport []Annotation
+	testAnnotationsReport = append(testAnnotationsReport, Annotation{Name: fmt.Sprintf("charts.openshift.io/%s", DigestsAnnotationName), Value: "sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0"})
+	testAnnotationsReport = append(testAnnotationsReport, Annotation{Name: fmt.Sprintf("charts.openshift.io/%s", LastCertifiedTimestampAnnotationName), Value: "2021-07-02T08:09:56.881793-04:00"})
+	testAnnotationsReport = append(testAnnotationsReport, Annotation{Name: fmt.Sprintf("charts.openshift.io/%s", TestedOCPVersionAnnotationName), Value: "4.7.8"})
+	testAnnotationsReport = append(testAnnotationsReport, Annotation{Name: fmt.Sprintf("charts.openshift.io/%s", SupportedOCPVersionsAnnotationName), Value: ">=4.7.8"})
+
+	testDigestReport := &DigestReport{}
+	testDigestReport.PackageDigest = "4f29f2a95bf2b9a1c62fd215b079a01bdc5a38e9b4ff874d0fa21d0afca2e76d"
+	testDigestReport.ChartDigest = "sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0"
+
+	testResultsReport := &ResultsReport{}
+	testResultsReport.Passed = "12"
+	testResultsReport.Failed = "0"
+
+	testAllReport := &OutputReport{}
+	testAllReport.ResultsReport = testResultsReport
+	testAllReport.MetadataReport = testRedHatMetaDataReport
+	testAllReport.DigestsReport = testDigestReport
+	testAllReport.AnnotationsReport = testAnnotationsReport
+
+	allgoodTestInfo := testInfo{}
+	allgoodTestInfo.path = "testreports/v1.1/reportallgood.yaml"
+	allgoodTestInfo.description = fmt.Sprintf("Version %s test all good report %s", version, allgoodTestInfo.path)
+	allgoodTestInfo.expectedReport = testAllReport
+	tests = append(tests, allgoodTestInfo)
+
+	missingMandatoryTestInfo := testInfo{}
+	missingMandatoryTestInfo.path = "testreports/v1.1/reportmissingmandatory.yaml"
+	missingMandatoryTestInfo.description = fmt.Sprintf("Version %s test missing mandatory report %s", version, missingMandatoryTestInfo.path)
+	missingMandatoryTestInfo.expectedReport = &OutputReport{}
 	missingMandatoryTestInfo.expectedReport.ResultsReport = &ResultsReport{}
 	missingMandatoryTestInfo.expectedReport.ResultsReport.Passed = "9"
-	missingMandatoryTestInfo.expectedReport.ResultsReport.Failed = "2"
+	missingMandatoryTestInfo.expectedReport.ResultsReport.Failed = "3"
+	missingMandatoryTestInfo.expectedReport.MetadataReport = testPartnerMetaDataReport
+	tests = append(tests, missingMandatoryTestInfo)
+
+	withFailureTestInfo := testInfo{}
+	withFailureTestInfo.path = "testreports/v1.1/reportwithfailure.yaml"
+	withFailureTestInfo.description = fmt.Sprintf("Version %s test missing failures report %s", version, missingMandatoryTestInfo.path)
+	withFailureTestInfo.expectedReport = &OutputReport{}
+	withFailureTestInfo.expectedReport.ResultsReport = &ResultsReport{}
+	withFailureTestInfo.expectedReport.ResultsReport.Passed = "10"
+	withFailureTestInfo.expectedReport.ResultsReport.Failed = "2"
 	withFailureTestInfo.expectedReport.MetadataReport = testRedHatMetaDataReport
 	tests = append(tests, withFailureTestInfo)
 
 	allsortsTestInfo := testInfo{}
-	allsortsTestInfo.path = "testreports/reportallsorts.yaml"
-	allsortsTestInfo.description = fmt.Sprintf("test allsorts report %s", missingMandatoryTestInfo.path)
+	allsortsTestInfo.path = "testreports/v1.1/reportallsorts.yaml"
+	allsortsTestInfo.description = fmt.Sprintf("Version %s test allsorts report %s", version, missingMandatoryTestInfo.path)
 	allsortsTestInfo.expectedReport = &OutputReport{}
 	allsortsTestInfo.expectedReport.ResultsReport = &ResultsReport{}
-	allsortsTestInfo.expectedReport.ResultsReport.Passed = "8"
+	allsortsTestInfo.expectedReport.ResultsReport.Passed = "9"
 	allsortsTestInfo.expectedReport.ResultsReport.Failed = "3"
 	allsortsTestInfo.expectedReport.DigestsReport = &DigestReport{}
 	allsortsTestInfo.expectedReport.DigestsReport.ChartDigest = "sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0"
@@ -95,8 +190,8 @@ func TestReports(t *testing.T) {
 	tests = append(tests, allsortsTestInfo)
 
 	setBehaviorTestInfo := testInfo{}
-	setBehaviorTestInfo.path = "testreports/reportmissingmandatory.yaml"
-	setBehaviorTestInfo.description = fmt.Sprintf("test set behvaior missing mandatory report %s", missingMandatoryTestInfo.path)
+	setBehaviorTestInfo.path = "testreports/v1.1/reportmissingmandatory.yaml"
+	setBehaviorTestInfo.description = fmt.Sprintf("Version %s test set behvaior missing mandatory report %s", version, missingMandatoryTestInfo.path)
 	setBehaviorTestInfo.setVendorType = "community"
 	setBehaviorTestInfo.expectedReport = &OutputReport{}
 	setBehaviorTestInfo.expectedReport.ResultsReport = &ResultsReport{}
@@ -106,13 +201,21 @@ func TestReports(t *testing.T) {
 	var setBehaviorAnnotationsReport []Annotation
 	setBehaviorAnnotationsReport = append(setBehaviorAnnotationsReport, Annotation{Name: fmt.Sprintf("%s/%s", setBehaviorTestInfo.annotationsPrefix, DigestsAnnotationName), Value: "sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0"})
 	setBehaviorAnnotationsReport = append(setBehaviorAnnotationsReport, Annotation{Name: fmt.Sprintf("%s/%s", setBehaviorTestInfo.annotationsPrefix, LastCertifiedTimestampAnnotationName), Value: "2021-07-02T08:09:56.881793-04:00"})
-	setBehaviorAnnotationsReport = append(setBehaviorAnnotationsReport, Annotation{Name: fmt.Sprintf("%s/%s", setBehaviorTestInfo.annotationsPrefix, CertifiedOCPVersionAnnotationName), Value: "4.7.8"})
+	setBehaviorAnnotationsReport = append(setBehaviorAnnotationsReport, Annotation{Name: fmt.Sprintf("%s/%s", setBehaviorTestInfo.annotationsPrefix, TestedOCPVersionAnnotationName), Value: "4.7.8"})
+	setBehaviorAnnotationsReport = append(setBehaviorAnnotationsReport, Annotation{Name: fmt.Sprintf("%s/%s", setBehaviorTestInfo.annotationsPrefix, SupportedOCPVersionsAnnotationName), Value: ">=4.7.8"})
 	setBehaviorTestInfo.expectedReport.AnnotationsReport = setBehaviorAnnotationsReport
 	setBehaviorTestInfo.expectedReport.MetadataReport = testPartnerMetaDataReport
 	tests = append(tests, setBehaviorTestInfo)
 
+	reportTest(tests, t)
+}
+
+func reportTest(tests []testInfo, t *testing.T) {
+
 	for _, test := range tests {
 
+		fmt.Println(fmt.Sprintf("Test: %s", test.description))
+
 		t.Run("Report test : "+test.description, func(t *testing.T) {
 			options := &ReportOptions{}
 
@@ -153,7 +256,7 @@ func TestReports(t *testing.T) {
 					reportjson, err := json.Marshal(metadata.MetadataReport)
 					assert.NoError(t, err, "Metadata report is not valid json")
 					if err == nil && !outcome {
-						fmt.Println(fmt.Sprintf("MetaDataReport :\n%s", reportjson))
+						fmt.Println(fmt.Sprintf("%s: MetaDataReport :\n%s", test.description, reportjson))
 					}
 				}
 			}
@@ -167,7 +270,7 @@ func TestReports(t *testing.T) {
 					reportjson, err := json.Marshal(annotations.AnnotationsReport)
 					assert.NoError(t, err, "Annotations report is not valid json")
 					if err == nil && !outcome {
-						fmt.Println(fmt.Sprintf("AnnotationsReport :\n%s", reportjson))
+						fmt.Println(fmt.Sprintf("%s: AnnotationsReport :\n%s", test.description, reportjson))
 					}
 				}
 			}
@@ -181,7 +284,7 @@ func TestReports(t *testing.T) {
 					reportjson, err := json.Marshal(results.ResultsReport)
 					assert.NoError(t, err, "Results report is not valid json")
 					if err == nil && !outcome {
-						fmt.Println(fmt.Sprintf("AResultsReport :\n%s", reportjson))
+						fmt.Println(fmt.Sprintf("%s: ResultsReport :\n%s", test.description, reportjson))
 					}
 				}
 			}
@@ -195,7 +298,7 @@ func TestReports(t *testing.T) {
 					reportjson, err := json.Marshal(digests.DigestsReport)
 					assert.NoError(t, err, "Digests report is not valid json")
 					if err == nil && !outcome {
-						fmt.Println(fmt.Sprintf("DigestsReport :\n%s", reportjson))
+						fmt.Println(fmt.Sprintf("%s: DigestsReport :\n%s", test.description, reportjson))
 					}
 				}
 			}
diff --git a/pkg/chartverifier/report/testreports/reportallgood.yaml b/pkg/chartverifier/report/testreports/v1.0/reportallgood.yaml
similarity index 100%
rename from pkg/chartverifier/report/testreports/reportallgood.yaml
rename to pkg/chartverifier/report/testreports/v1.0/reportallgood.yaml
diff --git a/pkg/chartverifier/report/testreports/reportallsorts.yaml b/pkg/chartverifier/report/testreports/v1.0/reportallsorts.yaml
similarity index 100%
rename from pkg/chartverifier/report/testreports/reportallsorts.yaml
rename to pkg/chartverifier/report/testreports/v1.0/reportallsorts.yaml
diff --git a/pkg/chartverifier/report/testreports/v1.0/reportmissingmandatory.yaml b/pkg/chartverifier/report/testreports/v1.0/reportmissingmandatory.yaml
new file mode 100644
index 0000000..3b75bfe
--- /dev/null
+++ b/pkg/chartverifier/report/testreports/v1.0/reportmissingmandatory.yaml
@@ -0,0 +1,80 @@
+apiversion: v1
+kind: verify-report
+metadata:
+    tool:
+        verifier-version: 1.1.0
+        profile:
+            VendorType: partner
+            version: v1.0
+        chart-uri: pkg/chartverifier/checks/chart-0.1.0-v3.valid.tgz
+        digest: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
+        digests:
+            chart: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
+            package: 4f29f2a95bf2b9a1c62fd215b079a01bdc5a38e9b4ff874d0fa21d0afca2e76d
+        lastCertifiedTimestamp: "2021-07-02T08:09:56.881793-04:00"
+        certifiedOpenShiftVersions: 4.7.8
+    chart:
+        name: chart
+        home: ""
+        sources: []
+        version: 0.1.0-v3.valid
+        description: A Helm chart for Kubernetes
+        keywords: []
+        maintainers: []
+        icon: https://www.example.com/chart-icon.png
+        apiversion: v2
+        condition: ""
+        tags: ""
+        appversion: 1.16.0
+        deprecated: false
+        annotations: {}
+        kubeversion: 1.20.0
+        dependencies: []
+        type: application
+    chart-overrides: ""
+results:
+    - check: v1.0/has-readme
+      type: Mandatory
+      outcome: PASS
+      reason: Chart has a README
+    - check: v1.0/has-kubeversion
+      type: Mandatory
+      outcome: PASS
+      reason: Kubernetes version specified
+    - check: v1.0/not-contain-csi-objects
+      type: Mandatory
+      outcome: PASS
+      reason: CSI objects do not exist
+    - check: v1.0/images-are-certified
+      type: Mandatory
+      outcome: PASS
+      reason: |-
+          Image is Red Hat certified : docker.io/ibmcom/ibmcloud-object-storage-driver@sha256:b6ec40ca7300bf9e2d0e7b9ff4272258f50d2d6ff9db766207f4a4281b2e33a1
+          Image is Red Hat certified : docker.io/ibmcom/ibmcloud-object-storage-plugin@sha256:0c361f70133a5aae4ac3cbbc250322f8dee2e71da734b818621033179508ce6f
+          Image is Red Hat certified : nginx:latest
+          Image is Red Hat certified : snyk/kubernetes-operator
+          Image is Red Hat certified : rhscl/mongodb-36-rhel7:latest
+    - check: v1.0/is-helm-v3
+      type: Mandatory
+      outcome: PASS
+      reason: API version is V2, used in Helm 3
+    - check: v1.0/contains-test
+      type: Mandatory
+      outcome: FAIL
+      reason: Chart test files do not exist
+    - check: v1.0/contains-values
+      type: Mandatory
+      outcome: PASS
+      reason: Values file exist
+    - check: v1.0/contains-values-schema
+      type: Mandatory
+      outcome: PASS
+      reason: Values schema file exist
+    - check: v1.0/not-contains-crds
+      type: Mandatory
+      outcome: PASS
+      reason: Chart does not contain CRDs
+    - check: v1.0/helm-lint
+      type: Mandatory
+      outcome: PASS
+      reason: Helm lint successful
\ No newline at end of file
diff --git a/pkg/chartverifier/report/testreports/reportwithfailure.yaml b/pkg/chartverifier/report/testreports/v1.0/reportwithfailure.yaml
similarity index 100%
rename from pkg/chartverifier/report/testreports/reportwithfailure.yaml
rename to pkg/chartverifier/report/testreports/v1.0/reportwithfailure.yaml
diff --git a/pkg/chartverifier/report/testreports/v1.1/reportallgood.yaml b/pkg/chartverifier/report/testreports/v1.1/reportallgood.yaml
new file mode 100644
index 0000000..0279475
--- /dev/null
+++ b/pkg/chartverifier/report/testreports/v1.1/reportallgood.yaml
@@ -0,0 +1,90 @@
+apiversion: v1
+kind: verify-report
+metadata:
+    tool:
+        verifier-version: 1.1.0
+        profile:
+            VendorType: redhat
+            version: v1.1
+        chart-uri: pkg/chartverifier/checks/chart-0.1.0-v3.valid.tgz
+        digest: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
+        digests:
+            chart: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
+            package: 4f29f2a95bf2b9a1c62fd215b079a01bdc5a38e9b4ff874d0fa21d0afca2e76d
+        lastCertifiedTimestamp: "2021-07-02T08:09:56.881793-04:00"
+        testedOpenShiftVersion: 4.7.8
+        supportedOpenShiftVersions: ">=4.7.8"
+    chart:
+        name: chart
+        home: ""
+        sources: []
+        version: 0.1.0-v3.valid
+        description: A Helm chart for Kubernetes
+        keywords: []
+        maintainers: []
+        icon: https://www.example.com/chart-icon.png
+        apiversion: v2
+        condition: ""
+        tags: ""
+        appversion: 1.16.0
+        deprecated: false
+        annotations: {}
+        kubeversion: 1.20.0
+        dependencies: []
+        type: application
+    chart-overrides: ""
+results:
+    - check: v1.0/has-readme
+      type: Mandatory
+      outcome: PASS
+      reason: Chart has a README
+    - check: v1.1/has-kubeversion
+      type: Mandatory
+      outcome: PASS
+      reason: Kubernetes version specified
+    - check: v1.0/not-contain-csi-objects
+      type: Mandatory
+      outcome: PASS
+      reason: CSI objects do not exist
+    - check: v1.0/images-are-certified
+      type: Mandatory
+      outcome: PASS
+      reason: |-
+          Image is Red Hat certified : docker.io/ibmcom/ibmcloud-object-storage-driver@sha256:b6ec40ca7300bf9e2d0e7b9ff4272258f50d2d6ff9db766207f4a4281b2e33a1
+          Image is Red Hat certified : docker.io/ibmcom/ibmcloud-object-storage-plugin@sha256:0c361f70133a5aae4ac3cbbc250322f8dee2e71da734b818621033179508ce6f
+          Image is Red Hat certified : nginx:latest
+          Image is Red Hat certified : snyk/kubernetes-operator
+          Image is Red Hat certified : rhscl/mongodb-36-rhel7:latest
+    - check: v1.0/is-helm-v3
+      type: Mandatory
+      outcome: PASS
+      reason: API version is V2, used in Helm 3
+    - check: v1.0/contains-test
+      type: Mandatory
+      outcome: PASS
+      reason: Chart test files exist
+    - check: v1.0/contains-values
+      type: Mandatory
+      outcome: PASS
+      reason: Values file exist
+    - check: v1.0/contains-values-schema
+      type: Mandatory
+      outcome: PASS
+      reason: Values schema file exist
+    - check: v1.0/not-contains-crds
+      type: Mandatory
+      outcome: PASS
+      reason: Chart does not contain CRDs
+    - check: v1.0/helm-lint
+      type: Mandatory
+      outcome: PASS
+      reason: Helm lint successful
+    - check: v1.0/chart-testing
+      type: Mandatory
+      outcome: PASS
+      reason: Chart tests have passed
+    - check: v1.0/required-annotations-present
+      type: Mandatory
+      outcome: PASS
+      reason: No missing required annotations
+
diff --git a/pkg/chartverifier/report/testreports/v1.1/reportallsorts.yaml b/pkg/chartverifier/report/testreports/v1.1/reportallsorts.yaml
new file mode 100644
index 0000000..7721a70
--- /dev/null
+++ b/pkg/chartverifier/report/testreports/v1.1/reportallsorts.yaml
@@ -0,0 +1,84 @@
+apiversion: v1
+kind: verify-report
+metadata:
+    tool:
+        verifier-version: 1.1.0
+        profile:
+            VendorType: partner
+            version: v1.1
+        chart-uri: pkg/chartverifier/checks/chart-0.1.0-v3.valid.tgz
+        digest: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
+        digests:
+            chart: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
+        lastCertifiedTimestamp: "2021-07-02T08:09:56.881793-04:00"
+        testedOpenShiftVersion: N/A
+        supportedOpenShiftVersions: ">=4.7.8"
+    chart:
+        name: chart
+        home: ""
+        sources: []
+        version: 0.1.0-v3.valid
+        description: A Helm chart for Kubernetes
+        keywords: []
+        maintainers: []
+        icon: https://www.example.com/chart-icon.png
+        apiversion: v2
+        condition: ""
+        tags: ""
+        appversion: 1.16.0
+        deprecated: false
+        annotations: {}
+        kubeversion: 1.20.0
+        dependencies: []
+        type: application
+    chart-overrides: ""
+results:
+    - check: v1.0/has-readme
+      type: Mandatory
+      outcome: FAIL
+      reason: Chart has a README
+    - check: v1.1/has-kubeversion
+      type: Mandatory
+      outcome: PASS
+      reason: Kubernetes version specified
+    - check: v1.0/not-contain-csi-objects
+      type: Mandatory
+      outcome: PASS
+      reason: CSI objects do not exist
+    - check: v1.0/images-are-certified
+      type: Mandatory
+      outcome: PASS
+      reason: |-
+          Image is Red Hat certified : docker.io/ibmcom/ibmcloud-object-storage-driver@sha256:b6ec40ca7300bf9e2d0e7b9ff4272258f50d2d6ff9db766207f4a4281b2e33a1
+          Image is Red Hat certified : docker.io/ibmcom/ibmcloud-object-storage-plugin@sha256:0c361f70133a5aae4ac3cbbc250322f8dee2e71da734b818621033179508ce6f
+          Image is Red Hat certified : nginx:latest
+          Image is Red Hat certified : snyk/kubernetes-operator
+          Image is Red Hat certified : rhscl/mongodb-36-rhel7:latest
+    - check: v1.0/is-helm-v3
+      type: Mandatory
+      outcome: PASS
+      reason: API version is V2, used in Helm 3
+    - check: v1.0/contains-test
+      type: Mandatory
+      outcome: PASS
+      reason: Chart test files exist
+    - check: v1.0/contains-values
+      type: Mandatory
+      outcome: FAIL
+      reason: Values file does not exist
+    - check: v1.0/contains-values-schema
+      type: Optional
+      outcome: PASS
+      reason: Values schema file exist
+    - check: v1.0/not-contains-crds
+      type: Mandatory
+      outcome: PASS
+      reason: Chart does not contain CRDs
+    - check: v1.0/helm-lint
+      type: Mandatory
+      outcome: PASS
+      reason: Helm lint successful
+    - check: v1.0/required-annotations-present
+      type: Mandatory
+      outcome: PASS
+      reason: No missing required annotations
diff --git a/pkg/chartverifier/report/testreports/reportmissingmandatory.yaml b/pkg/chartverifier/report/testreports/v1.1/reportmissingmandatory.yaml
similarity index 95%
rename from pkg/chartverifier/report/testreports/reportmissingmandatory.yaml
rename to pkg/chartverifier/report/testreports/v1.1/reportmissingmandatory.yaml
index 7686e4d..e601926 100644
--- a/pkg/chartverifier/report/testreports/reportmissingmandatory.yaml
+++ b/pkg/chartverifier/report/testreports/v1.1/reportmissingmandatory.yaml
@@ -5,14 +5,15 @@ metadata:
         verifier-version: 1.1.0
         profile:
             VendorType: partner
-            version: v1.0
+            version: v1.1
         chart-uri: pkg/chartverifier/checks/chart-0.1.0-v3.valid.tgz
         digest: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
         digests:
             chart: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
             package: 4f29f2a95bf2b9a1c62fd215b079a01bdc5a38e9b4ff874d0fa21d0afca2e76d
         lastCertifiedTimestamp: "2021-07-02T08:09:56.881793-04:00"
-        certifiedOpenShiftVersions: 4.7.8
+        testedOpenShiftVersion: 4.7.8
+        supportedOpenShiftVersions: ">=4.7.8"
     chart:
         name: chart
         home: ""
@@ -37,7 +38,7 @@ results:
       type: Mandatory
       outcome: PASS
       reason: Chart has a README
-    - check: v1.0/has-kubeversion
+    - check: v1.1/has-kubeversion
       type: Mandatory
       outcome: PASS
       reason: Kubernetes version specified
diff --git a/pkg/chartverifier/report/testreports/v1.1/reportwithfailure.yaml b/pkg/chartverifier/report/testreports/v1.1/reportwithfailure.yaml
new file mode 100644
index 0000000..5e340f6
--- /dev/null
+++ b/pkg/chartverifier/report/testreports/v1.1/reportwithfailure.yaml
@@ -0,0 +1,92 @@
+apiversion: v1
+kind: verify-report
+metadata:
+    tool:
+        verifier-version: 1.1.0
+        profile:
+            VendorType: redhat
+            version: v1.1
+        chart-uri: pkg/chartverifier/checks/chart-0.1.0-v3.valid.tgz
+        digest: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
+        digests:
+            chart: sha256:0c1c44def5c5de45212d90396062e18e0311b07789f477268fbf233c1783dbd0
+            package: 4f29f2a95bf2b9a1c62fd215b079a01bdc5a38e9b4ff874d0fa21d0afca2e76d
+        lastCertifiedTimestamp: "2021-07-02T08:09:56.881793-04:00"
+        testedOpenShiftVersion: N/A
+        supportedOpenShiftVersions: ">=4.7.8"
+    chart:
+        name: chart
+        home: ""
+        sources: []
+        version: 0.1.0-v3.valid
+        description: A Helm chart for Kubernetes
+        keywords: []
+        maintainers: []
+        icon: https://www.example.com/chart-icon.png
+        apiversion: v2
+        condition: ""
+        tags: ""
+        appversion: 1.16.0
+        deprecated: false
+        annotations: {}
+        kubeversion: 1.20.0
+        dependencies: []
+        type: application
+    chart-overrides: ""
+results:
+    - check: v1.0/has-readme
+      type: Mandatory
+      outcome: PASS
+      reason: Chart has a README
+    - check: v1.1/has-kubeversion
+      type: Mandatory
+      outcome: PASS
+      reason: Kubernetes version specified
+    - check: v1.0/not-contain-csi-objects
+      type: Mandatory
+      outcome: PASS
+      reason: CSI objects do not exist
+    - check: v1.0/images-are-certified
+      type: Mandatory
+      outcome: PASS
+      reason: |-
+          Image is Red Hat certified : docker.io/ibmcom/ibmcloud-object-storage-driver@sha256:b6ec40ca7300bf9e2d0e7b9ff4272258f50d2d6ff9db766207f4a4281b2e33a1
+          Image is Red Hat certified : docker.io/ibmcom/ibmcloud-object-storage-plugin@sha256:0c361f70133a5aae4ac3cbbc250322f8dee2e71da734b818621033179508ce6f
+          Image is Red Hat certified : nginx:latest
+          Image is Red Hat certified : snyk/kubernetes-operator
+          Image is Red Hat certified : rhscl/mongodb-36-rhel7:latest
+    - check: v1.0/is-helm-v3
+      type: Mandatory
+      outcome: PASS
+      reason: API version is V2, used in Helm 3
+    - check: v1.0/contains-test
+      type: Mandatory
+      outcome: PASS
+      reason: Chart test files exist
+    - check: v1.0/contains-values
+      type: Mandatory
+      outcome: FAIL
+      reason: Values file does not exist
+    - check: v1.0/contains-values-schema
+      type: Mandatory
+      outcome: PASS
+      reason: Values schema file exist
+    - check: v1.0/not-contains-crds
+      type: Mandatory
+      outcome: PASS
+      reason: Chart does not contain CRDs
+    - check: v1.0/helm-lint
+      type: Mandatory
+      outcome: PASS
+      reason: Helm lint successful
+    - check: v1.0/chart-testing
+      type: Mandatory
+      outcome: FAIL
+      reason: |-
+          Error running process: executing helm with args "install chart-etagd5fk9g /Users/martinmulholland/Library/Caches/chart-verifier/pkg_chartverifier_checks_chart_0_1_0_v3_valid_tgz/chart --namespace default --wait --values /var/folders/19/zzj4wrnj1_g1wdtt_zn61_tm0000gn/T/chart-testing-562801935/values.yaml": exit status 1
+          ---
+          Error: Kubernetes cluster unreachable: the server has asked for the client to provide credentials
+    - check: v1.0/required-annotations-present
+      type: Mandatory
+      outcome: PASS
+      reason: No missing required annotations
diff --git a/pkg/tool/oc_test.go b/pkg/tool/oc_test.go
index ad6e3e9..661624d 100644
--- a/pkg/tool/oc_test.go
+++ b/pkg/tool/oc_test.go
@@ -38,9 +38,9 @@ func (p fakeProcessExecutor) RunProcessAndCaptureOutput(executable string, execA
 
 func TestOCVersions(t *testing.T) {
 
-	testsData = append(testsData, TestData{getVersionOut: output120, OCVersion: "4.7.0"})
-	testsData = append(testsData, TestData{getVersionOut: output121, OCVersion: "4.8.0"})
-	testsData = append(testsData, TestData{getVersionOut: output122, OCVersion: "4.9.0"})
+	testsData = append(testsData, TestData{getVersionOut: output120, OCVersion: "4.7"})
+	testsData = append(testsData, TestData{getVersionOut: output121, OCVersion: "4.8"})
+	testsData = append(testsData, TestData{getVersionOut: output122, OCVersion: "4.9"})
 
 	for _, testdata := range testsData {
 		t.Logf("Check for OC %s", testdata.OCVersion)