Repository: operator-framework/operator-sdk
Pull request #3622 (2020-07-31 16:51:01)

scorecard: use api repo v1alpha3 API, remove existing
**Description of the change:** This PR removes the scorecard API from this repo, and changes import paths to the API's new location in the api repo.
* *: update import paths
* pkg/: remove
* go.mod,go.sum: update api repo version to commit containing scorecard API


**Motivation for the change:** The scorecard API was recently moved to the api repo (https://github.com/operator-framework/api/pull/55).

/cc @joelanford @jmccormick2001 @jmrodri 

/area dependency


**Checklist**

If the pull request includes user-facing changes, extra documentation is required:
- [x] Add a new changelog fragment in `changelog/fragments` (see [`changelog/fragments/00-template.yaml`](https://github.com/operator-framework/operator-sdk/tree/master/changelog/fragments/00-template.yaml))
- [x] Add or update relevant sections of the docs website in [`website/content/en/docs`](https://github.com/operator-framework/operator-sdk/tree/master/website/content/en/docs)



Patch:
diff --git a/changelog/fragments/move-scorecard-apis.yaml b/changelog/fragments/move-scorecard-apis.yaml
new file mode 100644
index 00000000..e8a58dbc
--- /dev/null
+++ b/changelog/fragments/move-scorecard-apis.yaml
@@ -0,0 +1,12 @@
+entries:
+  - description: >
+      Moved scorecard API v1alpha3 to the [api repo](https://github.com/operator-framework/api)
+      under `pkg/apis/scorecard/v1alpha3`. All future scorecard APIs will be released in this repo.
+    kind: removal
+    breaking: true
+    migration:
+      header: Update scorecard API Go import paths
+      body: >
+        The scorecard v1alpha3 API has been moved to a separate repo. Update your Go import paths:
+        From: `github.com/operator-framework/operator-framework/pkg/apis/scorecard/v1alpha3`
+        To:   `github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3`
diff --git a/go.mod b/go.mod
index 2bcd3c65..184ceff0 100644
--- a/go.mod
+++ b/go.mod
@@ -9,10 +9,9 @@ require (
 	github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334
 	github.com/kr/text v0.1.0
 	github.com/markbates/inflect v1.0.4
-	github.com/mattn/go-isatty v0.0.12
 	github.com/onsi/ginkgo v1.12.1
 	github.com/onsi/gomega v1.10.1
-	github.com/operator-framework/api v0.3.8
+	github.com/operator-framework/api v0.3.12-0.20200731162302-333d0644352a
 	github.com/operator-framework/operator-lib v0.1.0
 	github.com/operator-framework/operator-registry v1.13.4
 	github.com/prometheus/client_golang v1.5.1
diff --git a/go.sum b/go.sum
index d5d67694..b664eef4 100644
--- a/go.sum
+++ b/go.sum
@@ -492,9 +492,8 @@ github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx
 github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
 github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
-github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
 github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
@@ -573,12 +572,12 @@ github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.m
 github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
 github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
 github.com/operator-framework/api v0.3.7-0.20200602203552-431198de9fc2/go.mod h1:Xbje9x0SHmh0nihE21kpesB38vk3cyxnE6JdDS8Jo1Q=
-github.com/operator-framework/api v0.3.8 h1:tJykTCmwGKZBsPVTCfxbwz6nTF6dzmKydWJtC40erc8=
-github.com/operator-framework/api v0.3.8/go.mod h1:Xbje9x0SHmh0nihE21kpesB38vk3cyxnE6JdDS8Jo1Q=
-github.com/operator-framework/operator-registry v1.13.4 h1:GH7essHnVRP4kYgAWYV9obsS0Cnaj/KjT3BmQXmKAOE=
-github.com/operator-framework/operator-registry v1.13.4/go.mod h1:YhnIzOVjRU2ZwZtzt+fjcjW8ujJaSFynBEu7QVKaSdU=
+github.com/operator-framework/api v0.3.12-0.20200731162302-333d0644352a h1:x/oRKFmHiAAkNUNEeVcmlCfSFcJBtWSuWT7UcrnqQ7U=
+github.com/operator-framework/api v0.3.12-0.20200731162302-333d0644352a/go.mod h1:Xbje9x0SHmh0nihE21kpesB38vk3cyxnE6JdDS8Jo1Q=
 github.com/operator-framework/operator-lib v0.1.0 h1:7Qy6v2ZccvCeFLWEkrGnN+U+DkaeIWp0gAZaBM9T3DI=
 github.com/operator-framework/operator-lib v0.1.0/go.mod h1:HLw61JTIEeq0YLeVf4dwYx/zt4DmLGZUVWI1y3Lf5Hg=
+github.com/operator-framework/operator-registry v1.13.4 h1:GH7essHnVRP4kYgAWYV9obsS0Cnaj/KjT3BmQXmKAOE=
+github.com/operator-framework/operator-registry v1.13.4/go.mod h1:YhnIzOVjRU2ZwZtzt+fjcjW8ujJaSFynBEu7QVKaSdU=
 github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k=
 github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
 github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
@@ -860,7 +859,6 @@ golang.org/x/sys v0.0.0-20191020212454-3e7259c5e7c2/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
diff --git a/internal/cmd/operator-sdk/generate/bundle/bundle.go b/internal/cmd/operator-sdk/generate/bundle/bundle.go
index 32d1422e..488cce7d 100644
--- a/internal/cmd/operator-sdk/generate/bundle/bundle.go
+++ b/internal/cmd/operator-sdk/generate/bundle/bundle.go
@@ -23,6 +23,7 @@ import (
 	"sort"
 	"strings"
 
+	"github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	"github.com/operator-framework/operator-registry/pkg/lib/bundle"
 	"sigs.k8s.io/kubebuilder/pkg/model/config"
 	"sigs.k8s.io/yaml"
@@ -35,7 +36,6 @@ import (
 	"github.com/operator-framework/operator-sdk/internal/registry"
 	"github.com/operator-framework/operator-sdk/internal/scorecard"
 	"github.com/operator-framework/operator-sdk/internal/util/projutil"
-	"github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 const (
diff --git a/internal/cmd/operator-sdk/scorecard/cmd.go b/internal/cmd/operator-sdk/scorecard/cmd.go
index 7ec09ba3..7f3559ef 100644
--- a/internal/cmd/operator-sdk/scorecard/cmd.go
+++ b/internal/cmd/operator-sdk/scorecard/cmd.go
@@ -24,6 +24,7 @@ import (
 	"path/filepath"
 	"time"
 
+	"github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 	"github.com/spf13/viper"
@@ -33,7 +34,6 @@ import (
 	"github.com/operator-framework/operator-sdk/internal/flags"
 	registryutil "github.com/operator-framework/operator-sdk/internal/registry"
 	"github.com/operator-framework/operator-sdk/internal/scorecard"
-	"github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 type scorecardCmd struct {
diff --git a/internal/generate/collector/collect.go b/internal/generate/collector/collect.go
index 642dd320..097de8ae 100644
--- a/internal/generate/collector/collect.go
+++ b/internal/generate/collector/collect.go
@@ -23,6 +23,7 @@ import (
 	"os"
 	"path/filepath"
 
+	scorecardv1alpha3 "github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	log "github.com/sirupsen/logrus"
 	admissionregv1 "k8s.io/api/admissionregistration/v1"
 	appsv1 "k8s.io/api/apps/v1"
@@ -33,7 +34,6 @@ import (
 	"sigs.k8s.io/yaml"
 
 	"github.com/operator-framework/operator-sdk/internal/util/k8sutil"
-	scorecardv1alpha3 "github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 // Manifests holds a collector of all manifests relevant to CSV updates.
@@ -59,7 +59,7 @@ var (
 	v1beta1crdGK           = apiextv1beta1.SchemeGroupVersion.WithKind("CustomResourceDefinition").GroupKind()
 	validatingWebhookCfgGK = admissionregv1.SchemeGroupVersion.WithKind("ValidatingWebhookConfiguration").GroupKind()
 	mutatingWebhookCfgGK   = admissionregv1.SchemeGroupVersion.WithKind("MutatingWebhookConfiguration").GroupKind()
-	v1alpha3ScorecardCfgGK = scorecardv1alpha3.SchemeGroupVersion.WithKind("Configuration").GroupKind()
+	v1alpha3ScorecardCfgGK = scorecardv1alpha3.GroupVersion.WithKind("Configuration").GroupKind()
 )
 
 // UpdateFromDirs adds Roles, ClusterRoles, Deployments, and Custom Resource examples
diff --git a/internal/plugins/scorecard/init.go b/internal/plugins/scorecard/init.go
index 8a70d0b8..3b055869 100644
--- a/internal/plugins/scorecard/init.go
+++ b/internal/plugins/scorecard/init.go
@@ -22,13 +22,13 @@ import (
 	"path/filepath"
 	"text/template"
 
+	"github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"sigs.k8s.io/kubebuilder/pkg/model/config"
 	"sigs.k8s.io/yaml"
 
 	"github.com/operator-framework/operator-sdk/internal/plugins/util/kustomize"
 	"github.com/operator-framework/operator-sdk/internal/scorecard"
-	"github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 const (
@@ -115,7 +115,7 @@ func generate(testImageTag, outputDir string) error {
 	}
 	kustomizationValues.ResourcePaths = append(kustomizationValues.ResourcePaths, relBasePath)
 	scorecardConfigTarget := patchTarget{
-		GroupVersionKind: v1alpha3.SchemeGroupVersion.WithKind(v1alpha3.ConfigurationKind),
+		GroupVersionKind: v1alpha3.GroupVersion.WithKind(v1alpha3.ConfigurationKind),
 		Name:             defaultConfigName,
 	}
 
@@ -187,7 +187,7 @@ type jsonPatchObject struct {
 // newConfigurationBase returns a scorecard componentconfig object with one parallel stage.
 // The returned object is intended to be marshaled and written to disk as a kustomize base.
 func newConfigurationBase(configName string) (cfg v1alpha3.Configuration) {
-	cfg.SetGroupVersionKind(v1alpha3.SchemeGroupVersion.WithKind(v1alpha3.ConfigurationKind))
+	cfg.SetGroupVersionKind(v1alpha3.GroupVersion.WithKind(v1alpha3.ConfigurationKind))
 	cfg.Metadata.Name = configName
 	cfg.Stages = []v1alpha3.StageConfiguration{
 		{
diff --git a/internal/scorecard/config.go b/internal/scorecard/config.go
index cf1a74fa..54471a67 100644
--- a/internal/scorecard/config.go
+++ b/internal/scorecard/config.go
@@ -17,9 +17,8 @@ package scorecard
 import (
 	"io/ioutil"
 
+	"github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	"sigs.k8s.io/yaml"
-
-	"github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 const (
diff --git a/internal/scorecard/formatting.go b/internal/scorecard/formatting.go
index 96a7b79a..e20d2853 100644
--- a/internal/scorecard/formatting.go
+++ b/internal/scorecard/formatting.go
@@ -18,9 +18,8 @@ import (
 	"context"
 	"encoding/json"
 
+	"github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	v1 "k8s.io/api/core/v1"
-
-	"github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 // getTestResult fetches the test pod log and converts it into
diff --git a/internal/scorecard/scorecard.go b/internal/scorecard/scorecard.go
index 38a3243c..fdfa3364 100644
--- a/internal/scorecard/scorecard.go
+++ b/internal/scorecard/scorecard.go
@@ -20,6 +20,7 @@ import (
 	"sync"
 	"time"
 
+	"github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
@@ -27,7 +28,6 @@ import (
 	"k8s.io/client-go/kubernetes"
 
 	registryutil "github.com/operator-framework/operator-sdk/internal/registry"
-	"github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 type TestRunner interface {
diff --git a/pkg/apis/scorecard/v1alpha2/doc.go b/pkg/apis/scorecard/v1alpha2/doc.go
deleted file mode 100644
index 028c6bf0..00000000
--- a/pkg/apis/scorecard/v1alpha2/doc.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2019 The Operator-SDK Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// +k8s:deepcopy-gen=package,register
-// +groupName=osdk.openshift.io
-
-package v1alpha2
diff --git a/pkg/apis/scorecard/v1alpha2/formatter.go b/pkg/apis/scorecard/v1alpha2/formatter.go
deleted file mode 100644
index d121ee8e..00000000
--- a/pkg/apis/scorecard/v1alpha2/formatter.go
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2019 The Operator-SDK Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package v1alpha2
-
-import (
-	"bufio"
-	"fmt"
-	"os"
-	"strings"
-
-	"github.com/mattn/go-isatty"
-)
-
-const (
-	redColor   = "31"
-	greenColor = "32"
-	noColor    = "%s\n"
-)
-
-func (s ScorecardOutput) MarshalText() (string, error) {
-	var sb strings.Builder
-
-	failColor := ": \033[1;" + redColor + "m%s\033[0m\n"
-	passColor := ": \033[1;" + greenColor + "m%s\033[0m\n"
-
-	// turn off colorization if not in a terminal
-	if !isatty.IsTerminal(os.Stdout.Fd()) &&
-		!isatty.IsCygwinTerminal(os.Stdout.Fd()) {
-		passColor = noColor
-		failColor = noColor
-	}
-
-	var currentSuite string
-	for _, result := range s.Results {
-		if currentSuite != result.Labels["suite"] {
-			sb.WriteString(fmt.Sprintf("%s:\n", result.Labels["suite"]))
-			currentSuite = result.Labels["suite"]
-		}
-		sb.WriteString(fmt.Sprintf("\t%-35s ", result.Name))
-
-		if result.State == PassState {
-			sb.WriteString(fmt.Sprintf(passColor, PassState))
-		} else if result.State == FailState {
-			sb.WriteString(fmt.Sprintf(failColor, FailState))
-		} else {
-			sb.WriteString("\n")
-		}
-
-		sb.WriteString(fmt.Sprintf("\tCR: %s\n", result.CRName))
-
-		sb.WriteString("\tLabels: \n")
-		for labelKey, labelValue := range result.Labels {
-			sb.WriteString(fmt.Sprintf("\t\t%q:%q\n", labelKey, labelValue))
-		}
-
-		if len(result.Suggestions) > 0 {
-			// 33 is yellow (specifically, the same shade of yellow that logrus uses for warnings)
-			sb.WriteString(fmt.Sprintf("\t\x1b[%dmSuggestions:\x1b[0m \n", 33))
-		}
-		for _, suggestion := range result.Suggestions {
-			sb.WriteString(fmt.Sprintf("\t\t%s\n", suggestion))
-		}
-
-		if len(result.Errors) > 0 {
-			// 31 is red (specifically, the same shade of red that logrus uses for errors)
-			sb.WriteString(fmt.Sprintf("\t\x1b[%dmErrors:\x1b[0m \n", 31))
-		}
-		for _, err := range result.Errors {
-			sb.WriteString(fmt.Sprintf("\t\t%s\n", err))
-		}
-
-		if result.Log != "" {
-			sb.WriteString("\tLog:\n")
-			scanner := bufio.NewScanner(strings.NewReader(result.Log))
-			for scanner.Scan() {
-				sb.WriteString(fmt.Sprintf("\t\t%s\n", scanner.Text()))
-			}
-		}
-
-		sb.WriteString("\n")
-	}
-
-	return sb.String(), nil
-}
diff --git a/pkg/apis/scorecard/v1alpha2/register.go b/pkg/apis/scorecard/v1alpha2/register.go
deleted file mode 100644
index f99e0a02..00000000
--- a/pkg/apis/scorecard/v1alpha2/register.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2019 The Operator-SDK Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Package v1alpha2 contains API Schema definitions for the cache v1alpha2 API group
-// +k8s:deepcopy-gen=package,register
-// +groupName=osdk.openshift.io
-package v1alpha2
-
-import (
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"sigs.k8s.io/controller-runtime/pkg/scheme"
-)
-
-var (
-	// SchemeGroupVersion is group version used to register these objects
-	SchemeGroupVersion = schema.GroupVersion{Group: "osdk.openshift.io", Version: "v1alpha2"}
-
-	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
-	SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
-)
diff --git a/pkg/apis/scorecard/v1alpha2/types.go b/pkg/apis/scorecard/v1alpha2/types.go
deleted file mode 100644
index 5ad4b37e..00000000
--- a/pkg/apis/scorecard/v1alpha2/types.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2019 The Operator-SDK Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package v1alpha2
-
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-// State is a type used to indicate the result state of a Test.
-type State string
-
-const (
-	// NotRun occurs when a user specifies the --list flag
-	NotRunState State = ""
-	// PassState occurs when a Test's ExpectedPoints == MaximumPoints.
-	PassState State = "pass"
-	// FailState occurs when a Test's ExpectedPoints == 0.
-	FailState State = "fail"
-	// ErrorState occurs when a Test encounters a fatal error and the reported points should not be considered.
-	ErrorState State = "error"
-)
-
-// ScorecardTestResult contains the results of an individual scorecard test.
-type ScorecardTestResult struct {
-	// Name is the name of the test
-	Name string `json:"name"`
-	// Description describes what the test does
-	Description string `json:"description"`
-	// Labels that further describe the test and enable selection
-	Labels map[string]string `json:"labels,omitempty"`
-	// State is the final state of the test
-	State State `json:"state,omitempty"`
-	// Errors is a list of the errors that occurred during the test (this can include both fatal and non-fatal errors)
-	Errors []string `json:"errors,omitempty"`
-	// Suggestions is a list of suggestions for the user to improve their score (if applicable)
-	Suggestions []string `json:"suggestions,omitempty"`
-	// Log holds a log produced from the test (if applicable)
-	Log string `json:"log,omitempty"`
-	// CRName holds the CR name this test was run with (if applicable)
-	CRName string `json:"crname,omitempty"`
-}
-
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-
-// ScorecardOutput is the schema for the scorecard API
-type ScorecardOutput struct {
-	metav1.TypeMeta `json:",inline"`
-	// +optional
-	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
-
-	// Log contains the scorecard's log.
-	Log string `json:"log"`
-	// Results is an array of ScorecardTestResult for the current scorecard run.
-	Results []ScorecardTestResult `json:"results"`
-}
-
-func NewScorecardOutput() *ScorecardOutput {
-	return &ScorecardOutput{
-		// The TypeMeta is mandatory because it is used to distinguish the versions (v1alpha1 and v1alpha2)
-		TypeMeta: metav1.TypeMeta{
-			Kind:       "ScorecardOutput",
-			APIVersion: "osdk.openshift.io/v1alpha2",
-		},
-	}
-}
-
-func init() {
-	SchemeBuilder.Register(&ScorecardOutput{})
-}
diff --git a/pkg/apis/scorecard/v1alpha2/zz_generated.deepcopy.go b/pkg/apis/scorecard/v1alpha2/zz_generated.deepcopy.go
deleted file mode 100644
index a181df4e..00000000
--- a/pkg/apis/scorecard/v1alpha2/zz_generated.deepcopy.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// +build !ignore_autogenerated
-
-// Copyright 2020 The Operator-SDK Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Code generated by controller-gen. DO NOT EDIT.
-
-package v1alpha2
-
-import (
-	runtime "k8s.io/apimachinery/pkg/runtime"
-)
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ScorecardOutput) DeepCopyInto(out *ScorecardOutput) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	if in.Results != nil {
-		in, out := &in.Results, &out.Results
-		*out = make([]ScorecardTestResult, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScorecardOutput.
-func (in *ScorecardOutput) DeepCopy() *ScorecardOutput {
-	if in == nil {
-		return nil
-	}
-	out := new(ScorecardOutput)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *ScorecardOutput) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ScorecardTestResult) DeepCopyInto(out *ScorecardTestResult) {
-	*out = *in
-	if in.Labels != nil {
-		in, out := &in.Labels, &out.Labels
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-	if in.Errors != nil {
-		in, out := &in.Errors, &out.Errors
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-	if in.Suggestions != nil {
-		in, out := &in.Suggestions, &out.Suggestions
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScorecardTestResult.
-func (in *ScorecardTestResult) DeepCopy() *ScorecardTestResult {
-	if in == nil {
-		return nil
-	}
-	out := new(ScorecardTestResult)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/pkg/apis/scorecard/v1alpha3/configuration_types.go b/pkg/apis/scorecard/v1alpha3/configuration_types.go
deleted file mode 100644
index 631f46c8..00000000
--- a/pkg/apis/scorecard/v1alpha3/configuration_types.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2020 The Operator-SDK Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package v1alpha3
-
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-// ConfigurationKind is the default scorecard componentconfig kind.
-const ConfigurationKind = "Configuration"
-
-// Configuration represents the set of test configurations which scorecard would run.
-type Configuration struct {
-	metav1.TypeMeta `json:",inline" yaml:",inline"`
-
-	// Do not use metav1.ObjectMeta because this "object" should not be treated as an actual object.
-	Metadata struct {
-		// Name is a required field for kustomize-able manifests, and is not used on-cluster (nor is the config itself).
-		Name string `json:"name,omitempty" yaml:"name,omitempty"`
-	} `json:"metadata,omitempty" yaml:"metadata,omitempty"`
-
-	// Stages is a set of test stages to run. Once a stage is finished, the next stage in the slice will be run.
-	Stages []StageConfiguration `json:"stages" yaml:"stages"`
-}
-
-// StageConfiguration configures a set of tests to be run.
-type StageConfiguration struct {
-	// Parallel, if true, will run each test in tests in parallel.
-	// The default is to wait until a test finishes to run the next.
-	Parallel bool `json:"parallel,omitempty" yaml:"parallel,omitempty"`
-	// Tests are a list of tests to run.
-	Tests []TestConfiguration `json:"tests" yaml:"tests"`
-}
-
-// TestConfiguration configures a specific scorecard test, identified by entrypoint.
-type TestConfiguration struct {
-	// Image is the name of the test image.
-	Image string `json:"image" yaml:"image"`
-	// Entrypoint is a list of commands and arguments passed to the test image.
-	Entrypoint []string `json:"entrypoint,omitempty" yaml:"entrypoint,omitempty"`
-	// Labels further describe the test and enable selection.
-	Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"`
-}
diff --git a/pkg/apis/scorecard/v1alpha3/doc.go b/pkg/apis/scorecard/v1alpha3/doc.go
deleted file mode 100644
index 6dee0efc..00000000
--- a/pkg/apis/scorecard/v1alpha3/doc.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2020 The Operator-SDK Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// +k8s:deepcopy-gen=package,register
-// +groupName=scorecard.operatorframework.io
-
-package v1alpha3
diff --git a/pkg/apis/scorecard/v1alpha3/formatter.go b/pkg/apis/scorecard/v1alpha3/formatter.go
deleted file mode 100644
index db6d4307..00000000
--- a/pkg/apis/scorecard/v1alpha3/formatter.go
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2020 The Operator-SDK Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package v1alpha3
-
-import (
-	"bufio"
-	"fmt"
-	"os"
-	"strings"
-
-	"github.com/mattn/go-isatty"
-)
-
-const (
-	redColor    = "31"
-	greenColor  = "32"
-	yellowColor = "33"
-	noColor     = "%s\n"
-)
-
-func (s Test) MarshalText() string {
-	var sb strings.Builder
-
-	failColor := "\033[1;" + redColor + "m%s\033[0m"
-	passColor := "\033[1;" + greenColor + "m%s\033[0m"
-	warnColor := "\033[1;" + yellowColor + "m%s\033[0m"
-
-	// turn off colorization if not in a terminal
-	if !isatty.IsTerminal(os.Stdout.Fd()) &&
-		!isatty.IsCygwinTerminal(os.Stdout.Fd()) {
-		passColor = noColor
-		failColor = noColor
-		warnColor = noColor
-	}
-
-	sb.WriteString(fmt.Sprintf("%s\n", strings.Repeat("-", 80)))
-	sb.WriteString(fmt.Sprintf("Image:      %s\n", s.Spec.Image))
-
-	if len(s.Spec.Entrypoint) > 0 {
-		sb.WriteString(fmt.Sprintf("Entrypoint: %s\n", s.Spec.Entrypoint))
-	}
-
-	if len(s.Spec.Labels) > 0 {
-		sb.WriteString("Labels:\n")
-		for labelKey, labelValue := range s.Spec.Labels {
-			sb.WriteString(fmt.Sprintf("\t%q:%q\n", labelKey, labelValue))
-		}
-	}
-	if len(s.Status.Results) > 0 {
-		sb.WriteString("Results:\n")
-		for _, result := range s.Status.Results {
-			if len(result.Name) > 0 {
-				sb.WriteString(fmt.Sprintf("\tName: %s\n", result.Name))
-			}
-			sb.WriteString("\tState: ")
-			if result.State == PassState {
-				sb.WriteString(fmt.Sprintf(passColor, PassState))
-			} else if result.State == FailState {
-				sb.WriteString(fmt.Sprintf(failColor, FailState))
-			} else if result.State == ErrorState {
-				sb.WriteString(fmt.Sprintf(failColor, ErrorState))
-			} else {
-				sb.WriteString("unknown")
-			}
-			sb.WriteString("\n")
-
-			if len(result.Suggestions) > 0 {
-				sb.WriteString(fmt.Sprintf(warnColor, "\tSuggestions:\n"))
-				for _, suggestion := range result.Suggestions {
-					sb.WriteString(fmt.Sprintf("\t\t%s\n", suggestion))
-				}
-			}
-
-			if len(result.Errors) > 0 {
-				sb.WriteString(fmt.Sprintf(failColor, "\tErrors:\n"))
-				for _, err := range result.Errors {
-					sb.WriteString(fmt.Sprintf("\t\t%s\n", err))
-				}
-			}
-
-			if result.Log != "" {
-				sb.WriteString("\tLog:\n")
-				scanner := bufio.NewScanner(strings.NewReader(result.Log))
-				for scanner.Scan() {
-					sb.WriteString(fmt.Sprintf("\t\t%s\n", scanner.Text()))
-				}
-			}
-			sb.WriteString("\n")
-		}
-	}
-	return sb.String()
-}
diff --git a/pkg/apis/scorecard/v1alpha3/register.go b/pkg/apis/scorecard/v1alpha3/register.go
deleted file mode 100644
index 9020c5bd..00000000
--- a/pkg/apis/scorecard/v1alpha3/register.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2019 The Operator-SDK Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Package v1alpha3 contains API Schema definitions for the cache v1alpha3 API group
-package v1alpha3
-
-import (
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"sigs.k8s.io/controller-runtime/pkg/scheme"
-)
-
-var (
-	// SchemeGroupVersion is group version used to register these objects
-	SchemeGroupVersion = schema.GroupVersion{Group: "scorecard.operatorframework.io", Version: "v1alpha3"}
-
-	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
-	SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
-)
diff --git a/pkg/apis/scorecard/v1alpha3/zz_generated.deepcopy.go b/pkg/apis/scorecard/v1alpha3/zz_generated.deepcopy.go
deleted file mode 100644
index 38350de8..00000000
--- a/pkg/apis/scorecard/v1alpha3/zz_generated.deepcopy.go
+++ /dev/null
@@ -1,199 +0,0 @@
-// +build !ignore_autogenerated
-
-// Copyright 2020 The Operator-SDK Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Code generated by controller-gen. DO NOT EDIT.
-
-package v1alpha3
-
-import (
-	runtime "k8s.io/apimachinery/pkg/runtime"
-)
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Configuration) DeepCopyInto(out *Configuration) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	out.Metadata = in.Metadata
-	if in.Stages != nil {
-		in, out := &in.Stages, &out.Stages
-		*out = make([]StageConfiguration, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Configuration.
-func (in *Configuration) DeepCopy() *Configuration {
-	if in == nil {
-		return nil
-	}
-	out := new(Configuration)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *StageConfiguration) DeepCopyInto(out *StageConfiguration) {
-	*out = *in
-	if in.Tests != nil {
-		in, out := &in.Tests, &out.Tests
-		*out = make([]TestConfiguration, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StageConfiguration.
-func (in *StageConfiguration) DeepCopy() *StageConfiguration {
-	if in == nil {
-		return nil
-	}
-	out := new(StageConfiguration)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Test) DeepCopyInto(out *Test) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.Spec.DeepCopyInto(&out.Spec)
-	in.Status.DeepCopyInto(&out.Status)
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Test.
-func (in *Test) DeepCopy() *Test {
-	if in == nil {
-		return nil
-	}
-	out := new(Test)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Test) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TestConfiguration) DeepCopyInto(out *TestConfiguration) {
-	*out = *in
-	if in.Entrypoint != nil {
-		in, out := &in.Entrypoint, &out.Entrypoint
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-	if in.Labels != nil {
-		in, out := &in.Labels, &out.Labels
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestConfiguration.
-func (in *TestConfiguration) DeepCopy() *TestConfiguration {
-	if in == nil {
-		return nil
-	}
-	out := new(TestConfiguration)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TestList) DeepCopyInto(out *TestList) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]Test, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestList.
-func (in *TestList) DeepCopy() *TestList {
-	if in == nil {
-		return nil
-	}
-	out := new(TestList)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TestResult) DeepCopyInto(out *TestResult) {
-	*out = *in
-	if in.Errors != nil {
-		in, out := &in.Errors, &out.Errors
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-	if in.Suggestions != nil {
-		in, out := &in.Suggestions, &out.Suggestions
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestResult.
-func (in *TestResult) DeepCopy() *TestResult {
-	if in == nil {
-		return nil
-	}
-	out := new(TestResult)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TestStatus) DeepCopyInto(out *TestStatus) {
-	*out = *in
-	if in.Results != nil {
-		in, out := &in.Results, &out.Results
-		*out = make([]TestResult, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestStatus.
-func (in *TestStatus) DeepCopy() *TestStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(TestStatus)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/website/content/en/docs/advanced-topics/scorecard/scorecard.md b/website/content/en/docs/advanced-topics/scorecard/scorecard.md
index 0c3a26a4..f2a3b2ec 100644
--- a/website/content/en/docs/advanced-topics/scorecard/scorecard.md
+++ b/website/content/en/docs/advanced-topics/scorecard/scorecard.md
@@ -241,7 +241,7 @@ Results:
 		time="2020-07-15T03:19:02Z" level=info msg="Could not find optional dependencies file" name=bundle-test
 ```
 
-**NOTE** The output format spec for each test matches the [`Test`](https://godoc.org/github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3#Test) type layout.
+**NOTE** The output format spec for each test matches the [`Test`](https://godoc.org/github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3#Test) type layout.
 
 
 ## Exit Status


Test patch:
diff --git a/images/scorecard-test-kuttl/cmd/test-kuttl/main.go b/images/scorecard-test-kuttl/cmd/test-kuttl/main.go
index 332eea78..3774ad4f 100644
--- a/images/scorecard-test-kuttl/cmd/test-kuttl/main.go
+++ b/images/scorecard-test-kuttl/cmd/test-kuttl/main.go
@@ -23,7 +23,7 @@ import (
 	"log"
 	"os"
 
-	"github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
+	"github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 )
 
 // The scorecard test kuttl binary processes the
diff --git a/images/scorecard-test/cmd/test/main.go b/images/scorecard-test/cmd/test/main.go
index 62d14eed..3005934a 100644
--- a/images/scorecard-test/cmd/test/main.go
+++ b/images/scorecard-test/cmd/test/main.go
@@ -20,12 +20,12 @@ import (
 	"log"
 	"os"
 
+	scapiv1alpha3 "github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	apimanifests "github.com/operator-framework/api/pkg/manifests"
 
 	registryutil "github.com/operator-framework/operator-sdk/internal/registry"
 	"github.com/operator-framework/operator-sdk/internal/scorecard"
 	"github.com/operator-framework/operator-sdk/internal/scorecard/tests"
-	scapiv1alpha3 "github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 // this is the scorecard test binary that ultimately executes the
diff --git a/internal/scorecard/examples/custom-scorecard-tests/images/custom-scorecard-tests/cmd/test/main.go b/internal/scorecard/examples/custom-scorecard-tests/images/custom-scorecard-tests/cmd/test/main.go
index 01f3ef4d..64de48e1 100644
--- a/internal/scorecard/examples/custom-scorecard-tests/images/custom-scorecard-tests/cmd/test/main.go
+++ b/internal/scorecard/examples/custom-scorecard-tests/images/custom-scorecard-tests/cmd/test/main.go
@@ -20,11 +20,11 @@ import (
 	"log"
 	"os"
 
+	scapiv1alpha3 "github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
+	apimanifests "github.com/operator-framework/api/pkg/manifests"
+
 	"github.com/operator-framework/operator-sdk/internal/scorecard"
 	"github.com/operator-framework/operator-sdk/internal/scorecard/examples/custom-scorecard-tests/internal/tests"
-
-	apimanifests "github.com/operator-framework/api/pkg/manifests"
-	scapiv1alpha3 "github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 // This is the custom scorecard test example binary
diff --git a/internal/scorecard/examples/custom-scorecard-tests/internal/tests/tests.go b/internal/scorecard/examples/custom-scorecard-tests/internal/tests/tests.go
index 5b200dd8..84e32e0c 100644
--- a/internal/scorecard/examples/custom-scorecard-tests/internal/tests/tests.go
+++ b/internal/scorecard/examples/custom-scorecard-tests/internal/tests/tests.go
@@ -16,7 +16,7 @@ package tests
 
 import (
 	apimanifests "github.com/operator-framework/api/pkg/manifests"
-	scapiv1alpha3 "github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
+	scapiv1alpha3 "github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 )
 
 const (
diff --git a/internal/scorecard/labels_test.go b/internal/scorecard/labels_test.go
index 6c6e3103..284999cd 100644
--- a/internal/scorecard/labels_test.go
+++ b/internal/scorecard/labels_test.go
@@ -17,9 +17,8 @@ package scorecard
 import (
 	"testing"
 
+	"github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	"k8s.io/apimachinery/pkg/labels"
-
-	"github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 func TestEmptySelector(t *testing.T) {
diff --git a/internal/scorecard/run_test.go b/internal/scorecard/run_test.go
index 8d9af799..6e17f0bd 100644
--- a/internal/scorecard/run_test.go
+++ b/internal/scorecard/run_test.go
@@ -21,9 +21,8 @@ import (
 	"testing"
 	"time"
 
+	"github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	"k8s.io/apimachinery/pkg/labels"
-
-	"github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 // TODO(joelanford): rewrite to use ginkgo/gomega
diff --git a/internal/scorecard/testpod.go b/internal/scorecard/testpod.go
index 9849e81b..d4661e37 100644
--- a/internal/scorecard/testpod.go
+++ b/internal/scorecard/testpod.go
@@ -20,12 +20,11 @@ import (
 	"fmt"
 	"io"
 
+	"github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/rand"
 	"k8s.io/client-go/kubernetes"
-
-	"github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 const (
diff --git a/internal/scorecard/tests/basic.go b/internal/scorecard/tests/basic.go
index 6e62c60b..d5e9bf12 100644
--- a/internal/scorecard/tests/basic.go
+++ b/internal/scorecard/tests/basic.go
@@ -15,8 +15,8 @@
 package tests
 
 import (
+	scapiv1alpha3 "github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	apimanifests "github.com/operator-framework/api/pkg/manifests"
-	scapiv1alpha3 "github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 )
 
diff --git a/internal/scorecard/tests/bundle_test.go b/internal/scorecard/tests/bundle_test.go
index fd1b5c9c..d6c3ebfe 100644
--- a/internal/scorecard/tests/bundle_test.go
+++ b/internal/scorecard/tests/bundle_test.go
@@ -20,6 +20,7 @@ import (
 
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
+	scapiv1alpha3 "github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	apimanifests "github.com/operator-framework/api/pkg/manifests"
 	operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
 	apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
@@ -27,7 +28,6 @@ import (
 	"k8s.io/apimachinery/pkg/runtime/schema"
 
 	registryutil "github.com/operator-framework/operator-sdk/internal/registry"
-	scapiv1alpha3 "github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 var _ = Describe("Basic and OLM tests", func() {
diff --git a/internal/scorecard/tests/olm.go b/internal/scorecard/tests/olm.go
index 4b65ff23..566c6082 100644
--- a/internal/scorecard/tests/olm.go
+++ b/internal/scorecard/tests/olm.go
@@ -20,6 +20,7 @@ import (
 	"path/filepath"
 	"strings"
 
+	scapiv1alpha3 "github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	apimanifests "github.com/operator-framework/api/pkg/manifests"
 	operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
 	apivalidation "github.com/operator-framework/api/pkg/validation"
@@ -33,7 +34,6 @@ import (
 
 	registryutil "github.com/operator-framework/operator-sdk/internal/registry"
 	"github.com/operator-framework/operator-sdk/internal/util/k8sutil"
-	scapiv1alpha3 "github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 )
 
 const (
diff --git a/pkg/apis/scorecard/v1alpha3/test_types.go b/pkg/apis/scorecard/v1alpha3/test_types.go
deleted file mode 100644
index 4480462a..00000000
--- a/pkg/apis/scorecard/v1alpha3/test_types.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2020 The Operator-SDK Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package v1alpha3
-
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-// State is a type used to indicate the result state of a Test.
-type State string
-
-const (
-	// PassState occurs when a Test's ExpectedPoints == MaximumPoints.
-	PassState State = "pass"
-	// FailState occurs when a Test's ExpectedPoints == 0.
-	FailState State = "fail"
-	// ErrorState occurs when a Test encounters a fatal error and the reported points should not be considered.
-	ErrorState State = "error"
-)
-
-// TestResult contains the results of an individual scorecard test
-type TestResult struct {
-	// Name is the name of the test
-	Name string `json:"name,omitempty"`
-	// Log holds a log produced from the test (if applicable)
-	Log string `json:"log,omitempty"`
-	// State is the final state of the test
-	State State `json:"state"`
-	// Errors is a list of the errors that occurred during the test (this can include both fatal and non-fatal errors)
-	Errors []string `json:"errors,omitempty"`
-	// Suggestions is a list of suggestions for the user to improve their score (if applicable)
-	Suggestions []string `json:"suggestions,omitempty"`
-}
-
-// TestStatus contains collection of testResults.
-type TestStatus struct {
-	Results []TestResult `json:"results,omitempty"`
-}
-
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-
-// Test specifies a single test run.
-type Test struct {
-	metav1.TypeMeta `json:",inline"`
-	Spec            TestConfiguration `json:"spec,omitempty"`
-	Status          TestStatus        `json:"status,omitempty"`
-}
-
-// TestList is a list of tests.
-type TestList struct {
-	metav1.TypeMeta `json:",inline"`
-	Items           []Test `json:"items"`
-}
-
-func NewTest() Test {
-	return Test{
-		TypeMeta: metav1.TypeMeta{
-			APIVersion: SchemeGroupVersion.String(),
-			Kind:       "Test",
-		},
-	}
-}
-
-func NewTestList() TestList {
-	return TestList{
-		TypeMeta: metav1.TypeMeta{
-			APIVersion: SchemeGroupVersion.String(),
-			Kind:       "TestList",
-		},
-	}
-}
-
-func init() {
-	SchemeBuilder.Register(&Test{})
-}
diff --git a/test/e2e/e2e_suite.go b/test/e2e/e2e_suite.go
index 435375cb..c4657e30 100644
--- a/test/e2e/e2e_suite.go
+++ b/test/e2e/e2e_suite.go
@@ -28,9 +28,9 @@ import (
 
 	. "github.com/onsi/ginkgo" //nolint:golint
 	. "github.com/onsi/gomega" //nolint:golint
+	"github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 	kbtestutils "sigs.k8s.io/kubebuilder/test/e2e/utils"
 
-	"github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
 	testutils "github.com/operator-framework/operator-sdk/test/internal"
 )
 
diff --git a/website/content/en/docs/advanced-topics/scorecard/custom-tests.md b/website/content/en/docs/advanced-topics/scorecard/custom-tests.md
index 9d36a200..a1a0d719 100644
--- a/website/content/en/docs/advanced-topics/scorecard/custom-tests.md
+++ b/website/content/en/docs/advanced-topics/scorecard/custom-tests.md
@@ -70,7 +70,7 @@ package tests
 
 import (
   "github.com/operator-framework/operator-registry/pkg/registry"
-  scapiv1alpha3 "github.com/operator-framework/operator-sdk/pkg/apis/scorecard/v1alpha3"
+  scapiv1alpha3 "github.com/operator-framework/api/pkg/apis/scorecard/v1alpha3"
 )
 
 const (
@@ -300,4 +300,4 @@ connection to invoke the Kube API.
 [scorecard_binary]: https://github.com/operator-framework/operator-sdk/blob/master/internal/scorecard/examples/custom-scorecard-tests/images/custom-scorecard-tests/cmd/test/main.go
 [sample_makefile]: https://github.com/operator-framework/operator-sdk/blob/master/internal/scorecard/examples/custom-scorecard-tests/Makefile
 [kustomize-patchJson6902]: https://kubernetes-sigs.github.io/kustomize/api-reference/kustomization/patchesjson6902/
-[testresults]:https://github.com/operator-framework/operator-sdk/blob/ff73712/pkg/apis/scorecard/v1alpha3/test_types.go#L49
+[testresults]:https://github.com/operator-framework/api/blob/333d064/pkg/apis/scorecard/v1alpha3/test_types.go#L35