s/apiextensions/apiextensionsv1/ for all imports in k/k
rename alias import fmt
This commit is contained in:
@@ -22,7 +22,7 @@ import (
|
|||||||
|
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
|
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
crdinformers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
crdinformers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
||||||
crdlisters "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
crdlisters "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@@ -73,24 +73,24 @@ func NewCRDRegistrationController(crdinformer crdinformers.CustomResourceDefinit
|
|||||||
|
|
||||||
crdinformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
|
crdinformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
|
||||||
AddFunc: func(obj interface{}) {
|
AddFunc: func(obj interface{}) {
|
||||||
cast := obj.(*apiextensions.CustomResourceDefinition)
|
cast := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
c.enqueueCRD(cast)
|
c.enqueueCRD(cast)
|
||||||
},
|
},
|
||||||
UpdateFunc: func(oldObj, newObj interface{}) {
|
UpdateFunc: func(oldObj, newObj interface{}) {
|
||||||
// Enqueue both old and new object to make sure we remove and add appropriate API services.
|
// Enqueue both old and new object to make sure we remove and add appropriate API services.
|
||||||
// The working queue will resolve any duplicates and only changes will stay in the queue.
|
// The working queue will resolve any duplicates and only changes will stay in the queue.
|
||||||
c.enqueueCRD(oldObj.(*apiextensions.CustomResourceDefinition))
|
c.enqueueCRD(oldObj.(*apiextensionsv1.CustomResourceDefinition))
|
||||||
c.enqueueCRD(newObj.(*apiextensions.CustomResourceDefinition))
|
c.enqueueCRD(newObj.(*apiextensionsv1.CustomResourceDefinition))
|
||||||
},
|
},
|
||||||
DeleteFunc: func(obj interface{}) {
|
DeleteFunc: func(obj interface{}) {
|
||||||
cast, ok := obj.(*apiextensions.CustomResourceDefinition)
|
cast, ok := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.V(2).Infof("Couldn't get object from tombstone %#v", obj)
|
klog.V(2).Infof("Couldn't get object from tombstone %#v", obj)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cast, ok = tombstone.Obj.(*apiextensions.CustomResourceDefinition)
|
cast, ok = tombstone.Obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.V(2).Infof("Tombstone contained unexpected object: %#v", obj)
|
klog.V(2).Infof("Tombstone contained unexpected object: %#v", obj)
|
||||||
return
|
return
|
||||||
@@ -184,7 +184,7 @@ func (c *crdRegistrationController) processNextWorkItem() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *crdRegistrationController) enqueueCRD(crd *apiextensions.CustomResourceDefinition) {
|
func (c *crdRegistrationController) enqueueCRD(crd *apiextensionsv1.CustomResourceDefinition) {
|
||||||
for _, version := range crd.Spec.Versions {
|
for _, version := range crd.Spec.Versions {
|
||||||
c.queue.Add(schema.GroupVersion{Group: crd.Spec.Group, Version: version.Name})
|
c.queue.Add(schema.GroupVersion{Group: crd.Spec.Group, Version: version.Name})
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
crdlisters "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
crdlisters "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
@@ -31,7 +31,7 @@ import (
|
|||||||
func TestHandleVersionUpdate(t *testing.T) {
|
func TestHandleVersionUpdate(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
startingCRDs []*apiextensions.CustomResourceDefinition
|
startingCRDs []*apiextensionsv1.CustomResourceDefinition
|
||||||
version schema.GroupVersion
|
version schema.GroupVersion
|
||||||
|
|
||||||
expectedAdded []*apiregistration.APIService
|
expectedAdded []*apiregistration.APIService
|
||||||
@@ -39,13 +39,13 @@ func TestHandleVersionUpdate(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "simple add crd",
|
name: "simple add crd",
|
||||||
startingCRDs: []*apiextensions.CustomResourceDefinition{
|
startingCRDs: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
{
|
{
|
||||||
Spec: apiextensions.CustomResourceDefinitionSpec{
|
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
|
||||||
Group: "group.com",
|
Group: "group.com",
|
||||||
// Version field is deprecated and crd registration won't rely on it at all.
|
// Version field is deprecated and crd registration won't rely on it at all.
|
||||||
// defaulting route will fill up Versions field if user only provided version field.
|
// defaulting route will fill up Versions field if user only provided version field.
|
||||||
Versions: []apiextensions.CustomResourceDefinitionVersion{
|
Versions: []apiextensionsv1.CustomResourceDefinitionVersion{
|
||||||
{
|
{
|
||||||
Name: "v1",
|
Name: "v1",
|
||||||
Served: true,
|
Served: true,
|
||||||
@@ -71,11 +71,11 @@ func TestHandleVersionUpdate(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "simple remove crd",
|
name: "simple remove crd",
|
||||||
startingCRDs: []*apiextensions.CustomResourceDefinition{
|
startingCRDs: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
{
|
{
|
||||||
Spec: apiextensions.CustomResourceDefinitionSpec{
|
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
|
||||||
Group: "group.com",
|
Group: "group.com",
|
||||||
Versions: []apiextensions.CustomResourceDefinitionVersion{
|
Versions: []apiextensionsv1.CustomResourceDefinitionVersion{
|
||||||
{
|
{
|
||||||
Name: "v1",
|
Name: "v1",
|
||||||
Served: true,
|
Served: true,
|
||||||
|
@@ -22,7 +22,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -56,24 +56,24 @@ const (
|
|||||||
|
|
||||||
// GetAPIApprovalState returns the state of the API approval and reason for that state
|
// GetAPIApprovalState returns the state of the API approval and reason for that state
|
||||||
func GetAPIApprovalState(annotations map[string]string) (state APIApprovalState, reason string) {
|
func GetAPIApprovalState(annotations map[string]string) (state APIApprovalState, reason string) {
|
||||||
annotation := annotations[apiextensions.KubeAPIApprovedAnnotation]
|
annotation := annotations[apiextensionsv1.KubeAPIApprovedAnnotation]
|
||||||
|
|
||||||
// we use the result of this parsing in the switch/case below
|
// we use the result of this parsing in the switch/case below
|
||||||
url, annotationURLParseErr := url.ParseRequestURI(annotation)
|
url, annotationURLParseErr := url.ParseRequestURI(annotation)
|
||||||
switch {
|
switch {
|
||||||
case len(annotation) == 0:
|
case len(annotation) == 0:
|
||||||
return APIApprovalMissing, fmt.Sprintf("protected groups must have approval annotation %q, see https://github.com/kubernetes/enhancements/pull/1111", apiextensions.KubeAPIApprovedAnnotation)
|
return APIApprovalMissing, fmt.Sprintf("protected groups must have approval annotation %q, see https://github.com/kubernetes/enhancements/pull/1111", apiextensionsv1.KubeAPIApprovedAnnotation)
|
||||||
case strings.HasPrefix(annotation, "unapproved"):
|
case strings.HasPrefix(annotation, "unapproved"):
|
||||||
return APIApprovalBypassed, fmt.Sprintf("not approved: %q", annotation)
|
return APIApprovalBypassed, fmt.Sprintf("not approved: %q", annotation)
|
||||||
case annotationURLParseErr == nil && url != nil && len(url.Host) > 0 && len(url.Scheme) > 0:
|
case annotationURLParseErr == nil && url != nil && len(url.Host) > 0 && len(url.Scheme) > 0:
|
||||||
return APIApproved, fmt.Sprintf("approved in %v", annotation)
|
return APIApproved, fmt.Sprintf("approved in %v", annotation)
|
||||||
default:
|
default:
|
||||||
return APIApprovalInvalid, fmt.Sprintf("protected groups must have approval annotation %q with either a URL or a reason starting with \"unapproved\", see https://github.com/kubernetes/enhancements/pull/1111", apiextensions.KubeAPIApprovedAnnotation)
|
return APIApprovalInvalid, fmt.Sprintf("protected groups must have approval annotation %q with either a URL or a reason starting with \"unapproved\", see https://github.com/kubernetes/enhancements/pull/1111", apiextensionsv1.KubeAPIApprovedAnnotation)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetCRDCondition sets the status condition. It either overwrites the existing one or creates a new one.
|
// SetCRDCondition sets the status condition. It either overwrites the existing one or creates a new one.
|
||||||
func SetCRDCondition(crd *apiextensions.CustomResourceDefinition, newCondition apiextensions.CustomResourceDefinitionCondition) {
|
func SetCRDCondition(crd *apiextensionsv1.CustomResourceDefinition, newCondition apiextensionsv1.CustomResourceDefinitionCondition) {
|
||||||
newCondition.LastTransitionTime = metav1.NewTime(time.Now())
|
newCondition.LastTransitionTime = metav1.NewTime(time.Now())
|
||||||
|
|
||||||
existingCondition := FindCRDCondition(crd, newCondition.Type)
|
existingCondition := FindCRDCondition(crd, newCondition.Type)
|
||||||
@@ -92,8 +92,8 @@ func SetCRDCondition(crd *apiextensions.CustomResourceDefinition, newCondition a
|
|||||||
}
|
}
|
||||||
|
|
||||||
// RemoveCRDCondition removes the status condition.
|
// RemoveCRDCondition removes the status condition.
|
||||||
func RemoveCRDCondition(crd *apiextensions.CustomResourceDefinition, conditionType apiextensions.CustomResourceDefinitionConditionType) {
|
func RemoveCRDCondition(crd *apiextensionsv1.CustomResourceDefinition, conditionType apiextensionsv1.CustomResourceDefinitionConditionType) {
|
||||||
newConditions := []apiextensions.CustomResourceDefinitionCondition{}
|
newConditions := []apiextensionsv1.CustomResourceDefinitionCondition{}
|
||||||
for _, condition := range crd.Status.Conditions {
|
for _, condition := range crd.Status.Conditions {
|
||||||
if condition.Type != conditionType {
|
if condition.Type != conditionType {
|
||||||
newConditions = append(newConditions, condition)
|
newConditions = append(newConditions, condition)
|
||||||
@@ -103,7 +103,7 @@ func RemoveCRDCondition(crd *apiextensions.CustomResourceDefinition, conditionTy
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FindCRDCondition returns the condition you're looking for or nil.
|
// FindCRDCondition returns the condition you're looking for or nil.
|
||||||
func FindCRDCondition(crd *apiextensions.CustomResourceDefinition, conditionType apiextensions.CustomResourceDefinitionConditionType) *apiextensions.CustomResourceDefinitionCondition {
|
func FindCRDCondition(crd *apiextensionsv1.CustomResourceDefinition, conditionType apiextensionsv1.CustomResourceDefinitionConditionType) *apiextensionsv1.CustomResourceDefinitionCondition {
|
||||||
for i := range crd.Status.Conditions {
|
for i := range crd.Status.Conditions {
|
||||||
if crd.Status.Conditions[i].Type == conditionType {
|
if crd.Status.Conditions[i].Type == conditionType {
|
||||||
return &crd.Status.Conditions[i]
|
return &crd.Status.Conditions[i]
|
||||||
@@ -114,17 +114,17 @@ func FindCRDCondition(crd *apiextensions.CustomResourceDefinition, conditionType
|
|||||||
}
|
}
|
||||||
|
|
||||||
// IsCRDConditionTrue indicates if the condition is present and strictly true.
|
// IsCRDConditionTrue indicates if the condition is present and strictly true.
|
||||||
func IsCRDConditionTrue(crd *apiextensions.CustomResourceDefinition, conditionType apiextensions.CustomResourceDefinitionConditionType) bool {
|
func IsCRDConditionTrue(crd *apiextensionsv1.CustomResourceDefinition, conditionType apiextensionsv1.CustomResourceDefinitionConditionType) bool {
|
||||||
return IsCRDConditionPresentAndEqual(crd, conditionType, apiextensions.ConditionTrue)
|
return IsCRDConditionPresentAndEqual(crd, conditionType, apiextensionsv1.ConditionTrue)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsCRDConditionFalse indicates if the condition is present and false.
|
// IsCRDConditionFalse indicates if the condition is present and false.
|
||||||
func IsCRDConditionFalse(crd *apiextensions.CustomResourceDefinition, conditionType apiextensions.CustomResourceDefinitionConditionType) bool {
|
func IsCRDConditionFalse(crd *apiextensionsv1.CustomResourceDefinition, conditionType apiextensionsv1.CustomResourceDefinitionConditionType) bool {
|
||||||
return IsCRDConditionPresentAndEqual(crd, conditionType, apiextensions.ConditionFalse)
|
return IsCRDConditionPresentAndEqual(crd, conditionType, apiextensionsv1.ConditionFalse)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsCRDConditionPresentAndEqual indicates if the condition is present and equal to the given status.
|
// IsCRDConditionPresentAndEqual indicates if the condition is present and equal to the given status.
|
||||||
func IsCRDConditionPresentAndEqual(crd *apiextensions.CustomResourceDefinition, conditionType apiextensions.CustomResourceDefinitionConditionType, status apiextensions.ConditionStatus) bool {
|
func IsCRDConditionPresentAndEqual(crd *apiextensionsv1.CustomResourceDefinition, conditionType apiextensionsv1.CustomResourceDefinitionConditionType, status apiextensionsv1.ConditionStatus) bool {
|
||||||
for _, condition := range crd.Status.Conditions {
|
for _, condition := range crd.Status.Conditions {
|
||||||
if condition.Type == conditionType {
|
if condition.Type == conditionType {
|
||||||
return condition.Status == status
|
return condition.Status == status
|
||||||
@@ -134,7 +134,7 @@ func IsCRDConditionPresentAndEqual(crd *apiextensions.CustomResourceDefinition,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// IsCRDConditionEquivalent returns true if the lhs and rhs are equivalent except for times.
|
// IsCRDConditionEquivalent returns true if the lhs and rhs are equivalent except for times.
|
||||||
func IsCRDConditionEquivalent(lhs, rhs *apiextensions.CustomResourceDefinitionCondition) bool {
|
func IsCRDConditionEquivalent(lhs, rhs *apiextensionsv1.CustomResourceDefinitionCondition) bool {
|
||||||
if lhs == nil && rhs == nil {
|
if lhs == nil && rhs == nil {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -146,7 +146,7 @@ func IsCRDConditionEquivalent(lhs, rhs *apiextensions.CustomResourceDefinitionCo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CRDHasFinalizer returns true if the finalizer is in the list.
|
// CRDHasFinalizer returns true if the finalizer is in the list.
|
||||||
func CRDHasFinalizer(crd *apiextensions.CustomResourceDefinition, needle string) bool {
|
func CRDHasFinalizer(crd *apiextensionsv1.CustomResourceDefinition, needle string) bool {
|
||||||
for _, finalizer := range crd.Finalizers {
|
for _, finalizer := range crd.Finalizers {
|
||||||
if finalizer == needle {
|
if finalizer == needle {
|
||||||
return true
|
return true
|
||||||
@@ -157,7 +157,7 @@ func CRDHasFinalizer(crd *apiextensions.CustomResourceDefinition, needle string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CRDRemoveFinalizer removes the finalizer if present.
|
// CRDRemoveFinalizer removes the finalizer if present.
|
||||||
func CRDRemoveFinalizer(crd *apiextensions.CustomResourceDefinition, needle string) {
|
func CRDRemoveFinalizer(crd *apiextensionsv1.CustomResourceDefinition, needle string) {
|
||||||
newFinalizers := []string{}
|
newFinalizers := []string{}
|
||||||
for _, finalizer := range crd.Finalizers {
|
for _, finalizer := range crd.Finalizers {
|
||||||
if finalizer != needle {
|
if finalizer != needle {
|
||||||
@@ -168,7 +168,7 @@ func CRDRemoveFinalizer(crd *apiextensions.CustomResourceDefinition, needle stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
// HasServedCRDVersion returns true if the given version is in the list of CRD's versions and the Served flag is set.
|
// HasServedCRDVersion returns true if the given version is in the list of CRD's versions and the Served flag is set.
|
||||||
func HasServedCRDVersion(crd *apiextensions.CustomResourceDefinition, version string) bool {
|
func HasServedCRDVersion(crd *apiextensionsv1.CustomResourceDefinition, version string) bool {
|
||||||
for _, v := range crd.Spec.Versions {
|
for _, v := range crd.Spec.Versions {
|
||||||
if v.Name == version {
|
if v.Name == version {
|
||||||
return v.Served
|
return v.Served
|
||||||
@@ -178,18 +178,18 @@ func HasServedCRDVersion(crd *apiextensions.CustomResourceDefinition, version st
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetCRDStorageVersion returns the storage version for given CRD.
|
// GetCRDStorageVersion returns the storage version for given CRD.
|
||||||
func GetCRDStorageVersion(crd *apiextensions.CustomResourceDefinition) (string, error) {
|
func GetCRDStorageVersion(crd *apiextensionsv1.CustomResourceDefinition) (string, error) {
|
||||||
for _, v := range crd.Spec.Versions {
|
for _, v := range crd.Spec.Versions {
|
||||||
if v.Storage {
|
if v.Storage {
|
||||||
return v.Name, nil
|
return v.Name, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// This should not happened if crd is valid
|
// This should not happened if crd is valid
|
||||||
return "", fmt.Errorf("invalid apiextensions.CustomResourceDefinition, no storage version")
|
return "", fmt.Errorf("invalid apiextensionsv1.CustomResourceDefinition, no storage version")
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsStoredVersion returns whether the given version is the storage version of the CRD.
|
// IsStoredVersion returns whether the given version is the storage version of the CRD.
|
||||||
func IsStoredVersion(crd *apiextensions.CustomResourceDefinition, version string) bool {
|
func IsStoredVersion(crd *apiextensionsv1.CustomResourceDefinition, version string) bool {
|
||||||
for _, v := range crd.Status.StoredVersions {
|
for _, v := range crd.Status.StoredVersions {
|
||||||
if version == v {
|
if version == v {
|
||||||
return true
|
return true
|
||||||
@@ -199,27 +199,27 @@ func IsStoredVersion(crd *apiextensions.CustomResourceDefinition, version string
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetSchemaForVersion returns the validation schema for the given version or nil.
|
// GetSchemaForVersion returns the validation schema for the given version or nil.
|
||||||
func GetSchemaForVersion(crd *apiextensions.CustomResourceDefinition, version string) (*apiextensions.CustomResourceValidation, error) {
|
func GetSchemaForVersion(crd *apiextensionsv1.CustomResourceDefinition, version string) (*apiextensionsv1.CustomResourceValidation, error) {
|
||||||
for _, v := range crd.Spec.Versions {
|
for _, v := range crd.Spec.Versions {
|
||||||
if version == v.Name {
|
if version == v.Name {
|
||||||
return v.Schema, nil
|
return v.Schema, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("version %s not found in apiextensions.CustomResourceDefinition: %v", version, crd.Name)
|
return nil, fmt.Errorf("version %s not found in apiextensionsv1.CustomResourceDefinition: %v", version, crd.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSubresourcesForVersion returns the subresources for given version or nil.
|
// GetSubresourcesForVersion returns the subresources for given version or nil.
|
||||||
func GetSubresourcesForVersion(crd *apiextensions.CustomResourceDefinition, version string) (*apiextensions.CustomResourceSubresources, error) {
|
func GetSubresourcesForVersion(crd *apiextensionsv1.CustomResourceDefinition, version string) (*apiextensionsv1.CustomResourceSubresources, error) {
|
||||||
for _, v := range crd.Spec.Versions {
|
for _, v := range crd.Spec.Versions {
|
||||||
if version == v.Name {
|
if version == v.Name {
|
||||||
return v.Subresources, nil
|
return v.Subresources, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("version %s not found in apiextensions.CustomResourceDefinition: %v", version, crd.Name)
|
return nil, fmt.Errorf("version %s not found in apiextensionsv1.CustomResourceDefinition: %v", version, crd.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasPerVersionSchema returns true if a CRD uses per-version schema.
|
// HasPerVersionSchema returns true if a CRD uses per-version schema.
|
||||||
func HasPerVersionSchema(versions []apiextensions.CustomResourceDefinitionVersion) bool {
|
func HasPerVersionSchema(versions []apiextensionsv1.CustomResourceDefinitionVersion) bool {
|
||||||
for _, v := range versions {
|
for _, v := range versions {
|
||||||
if v.Schema != nil {
|
if v.Schema != nil {
|
||||||
return true
|
return true
|
||||||
@@ -229,7 +229,7 @@ func HasPerVersionSchema(versions []apiextensions.CustomResourceDefinitionVersio
|
|||||||
}
|
}
|
||||||
|
|
||||||
// HasPerVersionSubresources returns true if a CRD uses per-version subresources.
|
// HasPerVersionSubresources returns true if a CRD uses per-version subresources.
|
||||||
func HasPerVersionSubresources(versions []apiextensions.CustomResourceDefinitionVersion) bool {
|
func HasPerVersionSubresources(versions []apiextensionsv1.CustomResourceDefinitionVersion) bool {
|
||||||
for _, v := range versions {
|
for _, v := range versions {
|
||||||
if v.Subresources != nil {
|
if v.Subresources != nil {
|
||||||
return true
|
return true
|
||||||
@@ -239,7 +239,7 @@ func HasPerVersionSubresources(versions []apiextensions.CustomResourceDefinition
|
|||||||
}
|
}
|
||||||
|
|
||||||
// HasPerVersionColumns returns true if a CRD uses per-version columns.
|
// HasPerVersionColumns returns true if a CRD uses per-version columns.
|
||||||
func HasPerVersionColumns(versions []apiextensions.CustomResourceDefinitionVersion) bool {
|
func HasPerVersionColumns(versions []apiextensionsv1.CustomResourceDefinitionVersion) bool {
|
||||||
for _, v := range versions {
|
for _, v := range versions {
|
||||||
if len(v.AdditionalPrinterColumns) > 0 {
|
if len(v.AdditionalPrinterColumns) > 0 {
|
||||||
return true
|
return true
|
||||||
@@ -249,7 +249,7 @@ func HasPerVersionColumns(versions []apiextensions.CustomResourceDefinitionVersi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// HasVersionServed returns true if given CRD has given version served.
|
// HasVersionServed returns true if given CRD has given version served.
|
||||||
func HasVersionServed(crd *apiextensions.CustomResourceDefinition, version string) bool {
|
func HasVersionServed(crd *apiextensionsv1.CustomResourceDefinition, version string) bool {
|
||||||
for _, v := range crd.Spec.Versions {
|
for _, v := range crd.Spec.Versions {
|
||||||
if !v.Served || v.Name != version {
|
if !v.Served || v.Name != version {
|
||||||
continue
|
continue
|
||||||
|
@@ -21,7 +21,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -79,22 +79,22 @@ func TestGetAPIApprovalState(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "bare unapproved",
|
name: "bare unapproved",
|
||||||
annotations: map[string]string{apiextensions.KubeAPIApprovedAnnotation: "unapproved"},
|
annotations: map[string]string{apiextensionsv1.KubeAPIApprovedAnnotation: "unapproved"},
|
||||||
expected: APIApprovalBypassed,
|
expected: APIApprovalBypassed,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "unapproved with message",
|
name: "unapproved with message",
|
||||||
annotations: map[string]string{apiextensions.KubeAPIApprovedAnnotation: "unapproved, experimental-only"},
|
annotations: map[string]string{apiextensionsv1.KubeAPIApprovedAnnotation: "unapproved, experimental-only"},
|
||||||
expected: APIApprovalBypassed,
|
expected: APIApprovalBypassed,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "mismatched case",
|
name: "mismatched case",
|
||||||
annotations: map[string]string{apiextensions.KubeAPIApprovedAnnotation: "Unapproved"},
|
annotations: map[string]string{apiextensionsv1.KubeAPIApprovedAnnotation: "Unapproved"},
|
||||||
expected: APIApprovalInvalid,
|
expected: APIApprovalInvalid,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "empty",
|
name: "empty",
|
||||||
annotations: map[string]string{apiextensions.KubeAPIApprovedAnnotation: ""},
|
annotations: map[string]string{apiextensionsv1.KubeAPIApprovedAnnotation: ""},
|
||||||
expected: APIApprovalMissing,
|
expected: APIApprovalMissing,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -104,27 +104,27 @@ func TestGetAPIApprovalState(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "url",
|
name: "url",
|
||||||
annotations: map[string]string{apiextensions.KubeAPIApprovedAnnotation: "https://github.com/kubernetes/kubernetes/pull/78458"},
|
annotations: map[string]string{apiextensionsv1.KubeAPIApprovedAnnotation: "https://github.com/kubernetes/kubernetes/pull/78458"},
|
||||||
expected: APIApproved,
|
expected: APIApproved,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "url - no scheme",
|
name: "url - no scheme",
|
||||||
annotations: map[string]string{apiextensions.KubeAPIApprovedAnnotation: "github.com/kubernetes/kubernetes/pull/78458"},
|
annotations: map[string]string{apiextensionsv1.KubeAPIApprovedAnnotation: "github.com/kubernetes/kubernetes/pull/78458"},
|
||||||
expected: APIApprovalInvalid,
|
expected: APIApprovalInvalid,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "url - no host",
|
name: "url - no host",
|
||||||
annotations: map[string]string{apiextensions.KubeAPIApprovedAnnotation: "http:///kubernetes/kubernetes/pull/78458"},
|
annotations: map[string]string{apiextensionsv1.KubeAPIApprovedAnnotation: "http:///kubernetes/kubernetes/pull/78458"},
|
||||||
expected: APIApprovalInvalid,
|
expected: APIApprovalInvalid,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "url - just path",
|
name: "url - just path",
|
||||||
annotations: map[string]string{apiextensions.KubeAPIApprovedAnnotation: "/"},
|
annotations: map[string]string{apiextensionsv1.KubeAPIApprovedAnnotation: "/"},
|
||||||
expected: APIApprovalInvalid,
|
expected: APIApprovalInvalid,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "missing scheme",
|
name: "missing scheme",
|
||||||
annotations: map[string]string{apiextensions.KubeAPIApprovedAnnotation: "github.com/kubernetes/kubernetes/pull/78458"},
|
annotations: map[string]string{apiextensionsv1.KubeAPIApprovedAnnotation: "github.com/kubernetes/kubernetes/pull/78458"},
|
||||||
expected: APIApprovalInvalid,
|
expected: APIApprovalInvalid,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -143,14 +143,14 @@ func TestGetAPIApprovalState(t *testing.T) {
|
|||||||
func TestCRDHasFinalizer(t *testing.T) {
|
func TestCRDHasFinalizer(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
crd *apiextensions.CustomResourceDefinition
|
crd *apiextensionsv1.CustomResourceDefinition
|
||||||
finalizerToCheck string
|
finalizerToCheck string
|
||||||
|
|
||||||
expected bool
|
expected bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "missing",
|
name: "missing",
|
||||||
crd: &apiextensions.CustomResourceDefinition{
|
crd: &apiextensionsv1.CustomResourceDefinition{
|
||||||
ObjectMeta: metav1.ObjectMeta{Finalizers: []string{"not-it"}},
|
ObjectMeta: metav1.ObjectMeta{Finalizers: []string{"not-it"}},
|
||||||
},
|
},
|
||||||
finalizerToCheck: "it",
|
finalizerToCheck: "it",
|
||||||
@@ -158,7 +158,7 @@ func TestCRDHasFinalizer(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "present",
|
name: "present",
|
||||||
crd: &apiextensions.CustomResourceDefinition{
|
crd: &apiextensionsv1.CustomResourceDefinition{
|
||||||
ObjectMeta: metav1.ObjectMeta{Finalizers: []string{"not-it", "it"}},
|
ObjectMeta: metav1.ObjectMeta{Finalizers: []string{"not-it", "it"}},
|
||||||
},
|
},
|
||||||
finalizerToCheck: "it",
|
finalizerToCheck: "it",
|
||||||
@@ -176,14 +176,14 @@ func TestCRDHasFinalizer(t *testing.T) {
|
|||||||
func TestCRDRemoveFinalizer(t *testing.T) {
|
func TestCRDRemoveFinalizer(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
crd *apiextensions.CustomResourceDefinition
|
crd *apiextensionsv1.CustomResourceDefinition
|
||||||
finalizerToCheck string
|
finalizerToCheck string
|
||||||
|
|
||||||
expected []string
|
expected []string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "missing",
|
name: "missing",
|
||||||
crd: &apiextensions.CustomResourceDefinition{
|
crd: &apiextensionsv1.CustomResourceDefinition{
|
||||||
ObjectMeta: metav1.ObjectMeta{Finalizers: []string{"not-it"}},
|
ObjectMeta: metav1.ObjectMeta{Finalizers: []string{"not-it"}},
|
||||||
},
|
},
|
||||||
finalizerToCheck: "it",
|
finalizerToCheck: "it",
|
||||||
@@ -191,7 +191,7 @@ func TestCRDRemoveFinalizer(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "present",
|
name: "present",
|
||||||
crd: &apiextensions.CustomResourceDefinition{
|
crd: &apiextensionsv1.CustomResourceDefinition{
|
||||||
ObjectMeta: metav1.ObjectMeta{Finalizers: []string{"not-it", "it"}},
|
ObjectMeta: metav1.ObjectMeta{Finalizers: []string{"not-it", "it"}},
|
||||||
},
|
},
|
||||||
finalizerToCheck: "it",
|
finalizerToCheck: "it",
|
||||||
@@ -209,32 +209,32 @@ func TestCRDRemoveFinalizer(t *testing.T) {
|
|||||||
func TestSetCRDCondition(t *testing.T) {
|
func TestSetCRDCondition(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
crdCondition []apiextensions.CustomResourceDefinitionCondition
|
crdCondition []apiextensionsv1.CustomResourceDefinitionCondition
|
||||||
newCondition apiextensions.CustomResourceDefinitionCondition
|
newCondition apiextensionsv1.CustomResourceDefinitionCondition
|
||||||
expectedcrdCondition []apiextensions.CustomResourceDefinitionCondition
|
expectedcrdCondition []apiextensionsv1.CustomResourceDefinitionCondition
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "test setCRDcondition when one condition",
|
name: "test setCRDcondition when one condition",
|
||||||
crdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
crdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
newCondition: apiextensions.CustomResourceDefinitionCondition{
|
newCondition: apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "NotAccepted",
|
Reason: "NotAccepted",
|
||||||
Message: "Not accepted",
|
Message: "Not accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
expectedcrdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
expectedcrdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "NotAccepted",
|
Reason: "NotAccepted",
|
||||||
Message: "Not accepted",
|
Message: "Not accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||||
@@ -243,40 +243,40 @@ func TestSetCRDCondition(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "test setCRDcondition when two condition",
|
name: "test setCRDcondition when two condition",
|
||||||
crdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
crdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "NoConflicts",
|
Reason: "NoConflicts",
|
||||||
Message: "no conflicts found",
|
Message: "no conflicts found",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
newCondition: apiextensions.CustomResourceDefinitionCondition{
|
newCondition: apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "Conflicts",
|
Reason: "Conflicts",
|
||||||
Message: "conflicts found",
|
Message: "conflicts found",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
expectedcrdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
expectedcrdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "Conflicts",
|
Reason: "Conflicts",
|
||||||
Message: "conflicts found",
|
Message: "conflicts found",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||||
@@ -285,60 +285,60 @@ func TestSetCRDCondition(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "test setCRDcondition when condition needs to be appended",
|
name: "test setCRDcondition when condition needs to be appended",
|
||||||
crdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
crdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
newCondition: apiextensions.CustomResourceDefinitionCondition{
|
newCondition: apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "Neverapiextensions.Established",
|
Reason: "Neverapiextensionsv1.Established",
|
||||||
Message: "resource was never apiextensions.Established",
|
Message: "resource was never apiextensionsv1.Established",
|
||||||
LastTransitionTime: metav1.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
expectedcrdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
expectedcrdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "Neverapiextensions.Established",
|
Reason: "Neverapiextensionsv1.Established",
|
||||||
Message: "resource was never apiextensions.Established",
|
Message: "resource was never apiextensionsv1.Established",
|
||||||
LastTransitionTime: metav1.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "set new condition which doesn't have lastTransitionTime set",
|
name: "set new condition which doesn't have lastTransitionTime set",
|
||||||
crdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
crdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
newCondition: apiextensions.CustomResourceDefinitionCondition{
|
newCondition: apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "NotAccepted",
|
Reason: "NotAccepted",
|
||||||
Message: "Not accepted",
|
Message: "Not accepted",
|
||||||
},
|
},
|
||||||
expectedcrdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
expectedcrdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "NotAccepted",
|
Reason: "NotAccepted",
|
||||||
Message: "Not accepted",
|
Message: "Not accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||||
@@ -347,34 +347,34 @@ func TestSetCRDCondition(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "append new condition which doesn't have lastTransitionTime set",
|
name: "append new condition which doesn't have lastTransitionTime set",
|
||||||
crdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
crdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
newCondition: apiextensions.CustomResourceDefinitionCondition{
|
newCondition: apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "Neverapiextensions.Established",
|
Reason: "Neverapiextensionsv1.Established",
|
||||||
Message: "resource was never apiextensions.Established",
|
Message: "resource was never apiextensionsv1.Established",
|
||||||
},
|
},
|
||||||
expectedcrdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
expectedcrdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "Neverapiextensions.Established",
|
Reason: "Neverapiextensionsv1.Established",
|
||||||
Message: "resource was never apiextensions.Established",
|
Message: "resource was never apiextensionsv1.Established",
|
||||||
LastTransitionTime: metav1.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -400,33 +400,33 @@ func TestSetCRDCondition(t *testing.T) {
|
|||||||
func TestRemoveCRDCondition(t *testing.T) {
|
func TestRemoveCRDCondition(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
crdCondition []apiextensions.CustomResourceDefinitionCondition
|
crdCondition []apiextensionsv1.CustomResourceDefinitionCondition
|
||||||
conditionType apiextensions.CustomResourceDefinitionConditionType
|
conditionType apiextensionsv1.CustomResourceDefinitionConditionType
|
||||||
expectedcrdCondition []apiextensions.CustomResourceDefinitionCondition
|
expectedcrdCondition []apiextensionsv1.CustomResourceDefinitionCondition
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "test remove CRDCondition when the conditionType meets",
|
name: "test remove CRDCondition when the conditionType meets",
|
||||||
crdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
crdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "NoConflicts",
|
Reason: "NoConflicts",
|
||||||
Message: "no conflicts found",
|
Message: "no conflicts found",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
conditionType: apiextensions.NamesAccepted,
|
conditionType: apiextensionsv1.NamesAccepted,
|
||||||
expectedcrdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
expectedcrdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2011, 1, 2, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2011, 1, 2, 0, 0, 0, 0, time.UTC),
|
||||||
@@ -435,34 +435,34 @@ func TestRemoveCRDCondition(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "test remove CRDCondition when the conditionType not meets",
|
name: "test remove CRDCondition when the conditionType not meets",
|
||||||
crdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
crdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "NoConflicts",
|
Reason: "NoConflicts",
|
||||||
Message: "no conflicts found",
|
Message: "no conflicts found",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
conditionType: apiextensions.Terminating,
|
conditionType: apiextensionsv1.Terminating,
|
||||||
expectedcrdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
expectedcrdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "NoConflicts",
|
Reason: "NoConflicts",
|
||||||
Message: "no conflicts found",
|
Message: "no conflicts found",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
@@ -487,75 +487,75 @@ func TestRemoveCRDCondition(t *testing.T) {
|
|||||||
func TestIsCRDConditionPresentAndEqual(t *testing.T) {
|
func TestIsCRDConditionPresentAndEqual(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
crdCondition []apiextensions.CustomResourceDefinitionCondition
|
crdCondition []apiextensionsv1.CustomResourceDefinitionCondition
|
||||||
conditionType apiextensions.CustomResourceDefinitionConditionType
|
conditionType apiextensionsv1.CustomResourceDefinitionConditionType
|
||||||
status apiextensions.ConditionStatus
|
status apiextensionsv1.ConditionStatus
|
||||||
expectresult bool
|
expectresult bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "test CRDCondition is not Present",
|
name: "test CRDCondition is not Present",
|
||||||
crdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
crdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "NoConflicts",
|
Reason: "NoConflicts",
|
||||||
Message: "no conflicts found",
|
Message: "no conflicts found",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
conditionType: apiextensions.Terminating,
|
conditionType: apiextensionsv1.Terminating,
|
||||||
status: apiextensions.ConditionTrue,
|
status: apiextensionsv1.ConditionTrue,
|
||||||
expectresult: false,
|
expectresult: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "test CRDCondition is Present but not Equal",
|
name: "test CRDCondition is Present but not Equal",
|
||||||
crdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
crdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "NoConflicts",
|
Reason: "NoConflicts",
|
||||||
Message: "no conflicts found",
|
Message: "no conflicts found",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
conditionType: apiextensions.Established,
|
conditionType: apiextensionsv1.Established,
|
||||||
status: apiextensions.ConditionFalse,
|
status: apiextensionsv1.ConditionFalse,
|
||||||
expectresult: false,
|
expectresult: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "test CRDCondition is Present and Equal",
|
name: "test CRDCondition is Present and Equal",
|
||||||
crdCondition: []apiextensions.CustomResourceDefinitionCondition{
|
crdCondition: []apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
{
|
{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "Accepted",
|
Reason: "Accepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "NoConflicts",
|
Reason: "NoConflicts",
|
||||||
Message: "no conflicts found",
|
Message: "no conflicts found",
|
||||||
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
conditionType: apiextensions.NamesAccepted,
|
conditionType: apiextensionsv1.NamesAccepted,
|
||||||
status: apiextensions.ConditionTrue,
|
status: apiextensionsv1.ConditionTrue,
|
||||||
expectresult: true,
|
expectresult: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -568,30 +568,30 @@ func TestIsCRDConditionPresentAndEqual(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateCRDwithCondition(conditions []apiextensions.CustomResourceDefinitionCondition) *apiextensions.CustomResourceDefinition {
|
func generateCRDwithCondition(conditions []apiextensionsv1.CustomResourceDefinitionCondition) *apiextensionsv1.CustomResourceDefinition {
|
||||||
testCRDObjectMeta := metav1.ObjectMeta{
|
testCRDObjectMeta := metav1.ObjectMeta{
|
||||||
Name: "plural.group.com",
|
Name: "plural.group.com",
|
||||||
ResourceVersion: "12",
|
ResourceVersion: "12",
|
||||||
}
|
}
|
||||||
testCRDSpec := apiextensions.CustomResourceDefinitionSpec{
|
testCRDSpec := apiextensionsv1.CustomResourceDefinitionSpec{
|
||||||
Group: "group.com",
|
Group: "group.com",
|
||||||
Names: apiextensions.CustomResourceDefinitionNames{
|
Names: apiextensionsv1.CustomResourceDefinitionNames{
|
||||||
Plural: "plural",
|
Plural: "plural",
|
||||||
Singular: "singular",
|
Singular: "singular",
|
||||||
Kind: "kind",
|
Kind: "kind",
|
||||||
ListKind: "listkind",
|
ListKind: "listkind",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
testCRDAcceptedNames := apiextensions.CustomResourceDefinitionNames{
|
testCRDAcceptedNames := apiextensionsv1.CustomResourceDefinitionNames{
|
||||||
Plural: "plural",
|
Plural: "plural",
|
||||||
Singular: "singular",
|
Singular: "singular",
|
||||||
Kind: "kind",
|
Kind: "kind",
|
||||||
ListKind: "listkind",
|
ListKind: "listkind",
|
||||||
}
|
}
|
||||||
return &apiextensions.CustomResourceDefinition{
|
return &apiextensionsv1.CustomResourceDefinition{
|
||||||
ObjectMeta: testCRDObjectMeta,
|
ObjectMeta: testCRDObjectMeta,
|
||||||
Spec: testCRDSpec,
|
Spec: testCRDSpec,
|
||||||
Status: apiextensions.CustomResourceDefinitionStatus{
|
Status: apiextensionsv1.CustomResourceDefinitionStatus{
|
||||||
AcceptedNames: testCRDAcceptedNames,
|
AcceptedNames: testCRDAcceptedNames,
|
||||||
Conditions: conditions,
|
Conditions: conditions,
|
||||||
},
|
},
|
||||||
|
@@ -20,7 +20,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
autoscalingv1 "k8s.io/api/autoscaling/v1"
|
autoscalingv1 "k8s.io/api/autoscaling/v1"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features"
|
apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
@@ -55,7 +55,7 @@ func NewCRConverterFactory(serviceResolver webhook.ServiceResolver, authResolver
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewConverter returns a new CR converter based on the conversion settings in crd object.
|
// NewConverter returns a new CR converter based on the conversion settings in crd object.
|
||||||
func (m *CRConverterFactory) NewConverter(crd *apiextensions.CustomResourceDefinition) (safe, unsafe runtime.ObjectConvertor, err error) {
|
func (m *CRConverterFactory) NewConverter(crd *apiextensionsv1.CustomResourceDefinition) (safe, unsafe runtime.ObjectConvertor, err error) {
|
||||||
validVersions := map[schema.GroupVersion]bool{}
|
validVersions := map[schema.GroupVersion]bool{}
|
||||||
for _, version := range crd.Spec.Versions {
|
for _, version := range crd.Spec.Versions {
|
||||||
validVersions[schema.GroupVersion{Group: crd.Spec.Group, Version: version.Name}] = true
|
validVersions[schema.GroupVersion{Group: crd.Spec.Group, Version: version.Name}] = true
|
||||||
@@ -63,9 +63,9 @@ func (m *CRConverterFactory) NewConverter(crd *apiextensions.CustomResourceDefin
|
|||||||
|
|
||||||
var converter crConverterInterface
|
var converter crConverterInterface
|
||||||
switch crd.Spec.Conversion.Strategy {
|
switch crd.Spec.Conversion.Strategy {
|
||||||
case apiextensions.NoneConverter:
|
case apiextensionsv1.NoneConverter:
|
||||||
converter = &nopConverter{}
|
converter = &nopConverter{}
|
||||||
case apiextensions.WebhookConverter:
|
case apiextensionsv1.WebhookConverter:
|
||||||
if !utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceWebhookConversion) {
|
if !utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceWebhookConversion) {
|
||||||
return nil, nil, fmt.Errorf("webhook conversion is disabled on this cluster")
|
return nil, nil, fmt.Errorf("webhook conversion is disabled on this cluster")
|
||||||
}
|
}
|
||||||
@@ -94,7 +94,7 @@ func (m *CRConverterFactory) NewConverter(crd *apiextensions.CustomResourceDefin
|
|||||||
unsafe = &crConverter{
|
unsafe = &crConverter{
|
||||||
convertScale: convertScale,
|
convertScale: convertScale,
|
||||||
validVersions: validVersions,
|
validVersions: validVersions,
|
||||||
clusterScoped: crd.Spec.Scope == apiextensions.ClusterScoped,
|
clusterScoped: crd.Spec.Scope == apiextensionsv1.ClusterScoped,
|
||||||
converter: converter,
|
converter: converter,
|
||||||
}
|
}
|
||||||
return &safeConverterWrapper{unsafe}, unsafe, nil
|
return &safeConverterWrapper{unsafe}, unsafe, nil
|
||||||
|
@@ -21,7 +21,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
@@ -159,16 +159,16 @@ func TestConversion(t *testing.T) {
|
|||||||
t.Fatalf("Cannot create conversion factory: %v", err)
|
t.Fatalf("Cannot create conversion factory: %v", err)
|
||||||
}
|
}
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
testCRD := apiextensions.CustomResourceDefinition{
|
testCRD := apiextensionsv1.CustomResourceDefinition{
|
||||||
Spec: apiextensions.CustomResourceDefinitionSpec{
|
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
|
||||||
Conversion: &apiextensions.CustomResourceConversion{
|
Conversion: &apiextensionsv1.CustomResourceConversion{
|
||||||
Strategy: apiextensions.NoneConverter,
|
Strategy: apiextensionsv1.NoneConverter,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, v := range test.ValidVersions {
|
for _, v := range test.ValidVersions {
|
||||||
gv, _ := schema.ParseGroupVersion(v)
|
gv, _ := schema.ParseGroupVersion(v)
|
||||||
testCRD.Spec.Versions = append(testCRD.Spec.Versions, apiextensions.CustomResourceDefinitionVersion{Name: gv.Version, Served: true})
|
testCRD.Spec.Versions = append(testCRD.Spec.Versions, apiextensionsv1.CustomResourceDefinitionVersion{Name: gv.Version, Served: true})
|
||||||
testCRD.Spec.Group = gv.Group
|
testCRD.Spec.Group = gv.Group
|
||||||
}
|
}
|
||||||
safeConverter, _, err := CRConverterFactory.NewConverter(&testCRD)
|
safeConverter, _, err := CRConverterFactory.NewConverter(&testCRD)
|
||||||
|
@@ -22,7 +22,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
apivalidation "k8s.io/apimachinery/pkg/api/validation"
|
apivalidation "k8s.io/apimachinery/pkg/api/validation"
|
||||||
@@ -73,7 +73,7 @@ type webhookConverter struct {
|
|||||||
conversionReviewVersions []string
|
conversionReviewVersions []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func webhookClientConfigForCRD(crd *apiextensions.CustomResourceDefinition) *webhook.ClientConfig {
|
func webhookClientConfigForCRD(crd *apiextensionsv1.CustomResourceDefinition) *webhook.ClientConfig {
|
||||||
apiConfig := crd.Spec.Conversion.Webhook.ClientConfig
|
apiConfig := crd.Spec.Conversion.Webhook.ClientConfig
|
||||||
ret := webhook.ClientConfig{
|
ret := webhook.ClientConfig{
|
||||||
Name: fmt.Sprintf("conversion_webhook_for_%s", crd.Name),
|
Name: fmt.Sprintf("conversion_webhook_for_%s", crd.Name),
|
||||||
@@ -97,7 +97,7 @@ func webhookClientConfigForCRD(crd *apiextensions.CustomResourceDefinition) *web
|
|||||||
|
|
||||||
var _ crConverterInterface = &webhookConverter{}
|
var _ crConverterInterface = &webhookConverter{}
|
||||||
|
|
||||||
func (f *webhookConverterFactory) NewWebhookConverter(crd *apiextensions.CustomResourceDefinition) (*webhookConverter, error) {
|
func (f *webhookConverterFactory) NewWebhookConverter(crd *apiextensionsv1.CustomResourceDefinition) (*webhookConverter, error) {
|
||||||
restClient, err := f.clientManager.HookClient(*webhookClientConfigForCRD(crd))
|
restClient, err := f.clientManager.HookClient(*webhookClientConfigForCRD(crd))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@@ -35,7 +35,7 @@ import (
|
|||||||
"k8s.io/client-go/util/workqueue"
|
"k8s.io/client-go/util/workqueue"
|
||||||
|
|
||||||
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
||||||
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
||||||
)
|
)
|
||||||
@@ -87,7 +87,7 @@ func (c *DiscoveryController) sync(version schema.GroupVersion) error {
|
|||||||
foundVersion := false
|
foundVersion := false
|
||||||
foundGroup := false
|
foundGroup := false
|
||||||
for _, crd := range crds {
|
for _, crd := range crds {
|
||||||
if !apiextensionshelpers.IsCRDConditionTrue(crd, apiextensions.Established) {
|
if !apiextensionshelpers.IsCRDConditionTrue(crd, apiextensionsv1.Established) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,14 +127,14 @@ func (c *DiscoveryController) sync(version schema.GroupVersion) error {
|
|||||||
|
|
||||||
verbs := metav1.Verbs([]string{"delete", "deletecollection", "get", "list", "patch", "create", "update", "watch"})
|
verbs := metav1.Verbs([]string{"delete", "deletecollection", "get", "list", "patch", "create", "update", "watch"})
|
||||||
// if we're terminating we don't allow some verbs
|
// if we're terminating we don't allow some verbs
|
||||||
if apiextensionshelpers.IsCRDConditionTrue(crd, apiextensions.Terminating) {
|
if apiextensionshelpers.IsCRDConditionTrue(crd, apiextensionsv1.Terminating) {
|
||||||
verbs = metav1.Verbs([]string{"delete", "deletecollection", "get", "list", "watch"})
|
verbs = metav1.Verbs([]string{"delete", "deletecollection", "get", "list", "watch"})
|
||||||
}
|
}
|
||||||
|
|
||||||
apiResourcesForDiscovery = append(apiResourcesForDiscovery, metav1.APIResource{
|
apiResourcesForDiscovery = append(apiResourcesForDiscovery, metav1.APIResource{
|
||||||
Name: crd.Status.AcceptedNames.Plural,
|
Name: crd.Status.AcceptedNames.Plural,
|
||||||
SingularName: crd.Status.AcceptedNames.Singular,
|
SingularName: crd.Status.AcceptedNames.Singular,
|
||||||
Namespaced: crd.Spec.Scope == apiextensions.NamespaceScoped,
|
Namespaced: crd.Spec.Scope == apiextensionsv1.NamespaceScoped,
|
||||||
Kind: crd.Status.AcceptedNames.Kind,
|
Kind: crd.Status.AcceptedNames.Kind,
|
||||||
Verbs: verbs,
|
Verbs: verbs,
|
||||||
ShortNames: crd.Status.AcceptedNames.ShortNames,
|
ShortNames: crd.Status.AcceptedNames.ShortNames,
|
||||||
@@ -149,7 +149,7 @@ func (c *DiscoveryController) sync(version schema.GroupVersion) error {
|
|||||||
if subresources != nil && subresources.Status != nil {
|
if subresources != nil && subresources.Status != nil {
|
||||||
apiResourcesForDiscovery = append(apiResourcesForDiscovery, metav1.APIResource{
|
apiResourcesForDiscovery = append(apiResourcesForDiscovery, metav1.APIResource{
|
||||||
Name: crd.Status.AcceptedNames.Plural + "/status",
|
Name: crd.Status.AcceptedNames.Plural + "/status",
|
||||||
Namespaced: crd.Spec.Scope == apiextensions.NamespaceScoped,
|
Namespaced: crd.Spec.Scope == apiextensionsv1.NamespaceScoped,
|
||||||
Kind: crd.Status.AcceptedNames.Kind,
|
Kind: crd.Status.AcceptedNames.Kind,
|
||||||
Verbs: metav1.Verbs([]string{"get", "patch", "update"}),
|
Verbs: metav1.Verbs([]string{"get", "patch", "update"}),
|
||||||
})
|
})
|
||||||
@@ -161,7 +161,7 @@ func (c *DiscoveryController) sync(version schema.GroupVersion) error {
|
|||||||
Version: "v1",
|
Version: "v1",
|
||||||
Kind: "Scale",
|
Kind: "Scale",
|
||||||
Name: crd.Status.AcceptedNames.Plural + "/scale",
|
Name: crd.Status.AcceptedNames.Plural + "/scale",
|
||||||
Namespaced: crd.Spec.Scope == apiextensions.NamespaceScoped,
|
Namespaced: crd.Spec.Scope == apiextensionsv1.NamespaceScoped,
|
||||||
Verbs: metav1.Verbs([]string{"get", "patch", "update"}),
|
Verbs: metav1.Verbs([]string{"get", "patch", "update"}),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -244,21 +244,21 @@ func (c *DiscoveryController) processNextWorkItem() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *DiscoveryController) enqueue(obj *apiextensions.CustomResourceDefinition) {
|
func (c *DiscoveryController) enqueue(obj *apiextensionsv1.CustomResourceDefinition) {
|
||||||
for _, v := range obj.Spec.Versions {
|
for _, v := range obj.Spec.Versions {
|
||||||
c.queue.Add(schema.GroupVersion{Group: obj.Spec.Group, Version: v.Name})
|
c.queue.Add(schema.GroupVersion{Group: obj.Spec.Group, Version: v.Name})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *DiscoveryController) addCustomResourceDefinition(obj interface{}) {
|
func (c *DiscoveryController) addCustomResourceDefinition(obj interface{}) {
|
||||||
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
castObj := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
klog.V(4).Infof("Adding customresourcedefinition %s", castObj.Name)
|
klog.V(4).Infof("Adding customresourcedefinition %s", castObj.Name)
|
||||||
c.enqueue(castObj)
|
c.enqueue(castObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *DiscoveryController) updateCustomResourceDefinition(oldObj, newObj interface{}) {
|
func (c *DiscoveryController) updateCustomResourceDefinition(oldObj, newObj interface{}) {
|
||||||
castNewObj := newObj.(*apiextensions.CustomResourceDefinition)
|
castNewObj := newObj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
castOldObj := oldObj.(*apiextensions.CustomResourceDefinition)
|
castOldObj := oldObj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
klog.V(4).Infof("Updating customresourcedefinition %s", castOldObj.Name)
|
klog.V(4).Infof("Updating customresourcedefinition %s", castOldObj.Name)
|
||||||
// Enqueue both old and new object to make sure we remove and add appropriate Versions.
|
// Enqueue both old and new object to make sure we remove and add appropriate Versions.
|
||||||
// The working queue will resolve any duplicates and only changes will stay in the queue.
|
// The working queue will resolve any duplicates and only changes will stay in the queue.
|
||||||
@@ -267,14 +267,14 @@ func (c *DiscoveryController) updateCustomResourceDefinition(oldObj, newObj inte
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *DiscoveryController) deleteCustomResourceDefinition(obj interface{}) {
|
func (c *DiscoveryController) deleteCustomResourceDefinition(obj interface{}) {
|
||||||
castObj, ok := obj.(*apiextensions.CustomResourceDefinition)
|
castObj, ok := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.Errorf("Couldn't get object from tombstone %#v", obj)
|
klog.Errorf("Couldn't get object from tombstone %#v", obj)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
castObj, ok = tombstone.Obj.(*apiextensions.CustomResourceDefinition)
|
castObj, ok = tombstone.Obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
klog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
||||||
return
|
return
|
||||||
|
@@ -31,7 +31,7 @@ import (
|
|||||||
|
|
||||||
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
||||||
apiextensionsinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
apiextensionsinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apiserver/conversion"
|
"k8s.io/apiextensions-apiserver/pkg/apiserver/conversion"
|
||||||
structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
||||||
structuraldefaulting "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting"
|
structuraldefaulting "k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting"
|
||||||
@@ -137,8 +137,8 @@ type crdHandler struct {
|
|||||||
type crdInfo struct {
|
type crdInfo struct {
|
||||||
// spec and acceptedNames are used to compare against if a change is made on a CRD. We only update
|
// spec and acceptedNames are used to compare against if a change is made on a CRD. We only update
|
||||||
// the storage if one of these changes.
|
// the storage if one of these changes.
|
||||||
spec *apiextensions.CustomResourceDefinitionSpec
|
spec *apiextensionsv1.CustomResourceDefinitionSpec
|
||||||
acceptedNames *apiextensions.CustomResourceDefinitionNames
|
acceptedNames *apiextensionsv1.CustomResourceDefinitionNames
|
||||||
|
|
||||||
// Storage per version
|
// Storage per version
|
||||||
storages map[string]customresource.CustomResourceStorage
|
storages map[string]customresource.CustomResourceStorage
|
||||||
@@ -279,7 +279,7 @@ func (r *crdHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||||||
|
|
||||||
// if the scope in the CRD and the scope in request differ (with exception of the verbs in possiblyAcrossAllNamespacesVerbs
|
// if the scope in the CRD and the scope in request differ (with exception of the verbs in possiblyAcrossAllNamespacesVerbs
|
||||||
// for namespaced resources), pass request to the delegate, which is supposed to lead to a 404.
|
// for namespaced resources), pass request to the delegate, which is supposed to lead to a 404.
|
||||||
namespacedCRD, namespacedReq := crd.Spec.Scope == apiextensions.NamespaceScoped, len(requestInfo.Namespace) > 0
|
namespacedCRD, namespacedReq := crd.Spec.Scope == apiextensionsv1.NamespaceScoped, len(requestInfo.Namespace) > 0
|
||||||
if !namespacedCRD && namespacedReq {
|
if !namespacedCRD && namespacedReq {
|
||||||
r.delegate.ServeHTTP(w, req)
|
r.delegate.ServeHTTP(w, req)
|
||||||
return
|
return
|
||||||
@@ -298,13 +298,13 @@ func (r *crdHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||||||
// but it becomes "unserved" because another names update leads to a conflict
|
// but it becomes "unserved" because another names update leads to a conflict
|
||||||
// and EstablishingController wasn't fast enough to put the CRD into the Established condition.
|
// and EstablishingController wasn't fast enough to put the CRD into the Established condition.
|
||||||
// We accept this as the problem is small and self-healing.
|
// We accept this as the problem is small and self-healing.
|
||||||
if !apiextensionshelpers.IsCRDConditionTrue(crd, apiextensions.NamesAccepted) &&
|
if !apiextensionshelpers.IsCRDConditionTrue(crd, apiextensionsv1.NamesAccepted) &&
|
||||||
!apiextensionshelpers.IsCRDConditionTrue(crd, apiextensions.Established) {
|
!apiextensionshelpers.IsCRDConditionTrue(crd, apiextensionsv1.Established) {
|
||||||
r.delegate.ServeHTTP(w, req)
|
r.delegate.ServeHTTP(w, req)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
terminating := apiextensionshelpers.IsCRDConditionTrue(crd, apiextensions.Terminating)
|
terminating := apiextensionshelpers.IsCRDConditionTrue(crd, apiextensionsv1.Terminating)
|
||||||
|
|
||||||
crdInfo, err := r.getOrCreateServingInfoFor(crd.UID, crd.Name)
|
crdInfo, err := r.getOrCreateServingInfoFor(crd.UID, crd.Name)
|
||||||
if apierrors.IsNotFound(err) {
|
if apierrors.IsNotFound(err) {
|
||||||
@@ -450,7 +450,7 @@ func (r *crdHandler) serveScale(w http.ResponseWriter, req *http.Request, reques
|
|||||||
|
|
||||||
// createCustomResourceDefinition removes potentially stale storage so it gets re-created
|
// createCustomResourceDefinition removes potentially stale storage so it gets re-created
|
||||||
func (r *crdHandler) createCustomResourceDefinition(obj interface{}) {
|
func (r *crdHandler) createCustomResourceDefinition(obj interface{}) {
|
||||||
crd := obj.(*apiextensions.CustomResourceDefinition)
|
crd := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
r.customStorageLock.Lock()
|
r.customStorageLock.Lock()
|
||||||
defer r.customStorageLock.Unlock()
|
defer r.customStorageLock.Unlock()
|
||||||
// this could happen if the create event is merged from create-update events
|
// this could happen if the create event is merged from create-update events
|
||||||
@@ -459,8 +459,8 @@ func (r *crdHandler) createCustomResourceDefinition(obj interface{}) {
|
|||||||
|
|
||||||
// updateCustomResourceDefinition removes potentially stale storage so it gets re-created
|
// updateCustomResourceDefinition removes potentially stale storage so it gets re-created
|
||||||
func (r *crdHandler) updateCustomResourceDefinition(oldObj, newObj interface{}) {
|
func (r *crdHandler) updateCustomResourceDefinition(oldObj, newObj interface{}) {
|
||||||
oldCRD := oldObj.(*apiextensions.CustomResourceDefinition)
|
oldCRD := oldObj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
newCRD := newObj.(*apiextensions.CustomResourceDefinition)
|
newCRD := newObj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
|
|
||||||
r.customStorageLock.Lock()
|
r.customStorageLock.Lock()
|
||||||
defer r.customStorageLock.Unlock()
|
defer r.customStorageLock.Unlock()
|
||||||
@@ -469,8 +469,8 @@ func (r *crdHandler) updateCustomResourceDefinition(oldObj, newObj interface{})
|
|||||||
// For HA clusters, we want to prevent race conditions when changing status to Established,
|
// For HA clusters, we want to prevent race conditions when changing status to Established,
|
||||||
// so we want to be sure that CRD is Installing at least for 5 seconds before Establishing it.
|
// so we want to be sure that CRD is Installing at least for 5 seconds before Establishing it.
|
||||||
// TODO: find a real HA safe checkpointing mechanism instead of an arbitrary wait.
|
// TODO: find a real HA safe checkpointing mechanism instead of an arbitrary wait.
|
||||||
if !apiextensionshelpers.IsCRDConditionTrue(newCRD, apiextensions.Established) &&
|
if !apiextensionshelpers.IsCRDConditionTrue(newCRD, apiextensionsv1.Established) &&
|
||||||
apiextensionshelpers.IsCRDConditionTrue(newCRD, apiextensions.NamesAccepted) {
|
apiextensionshelpers.IsCRDConditionTrue(newCRD, apiextensionsv1.NamesAccepted) {
|
||||||
if r.masterCount > 1 {
|
if r.masterCount > 1 {
|
||||||
r.establishingController.QueueCRD(newCRD.Name, 5*time.Second)
|
r.establishingController.QueueCRD(newCRD.Name, 5*time.Second)
|
||||||
} else {
|
} else {
|
||||||
@@ -577,7 +577,7 @@ func (r *crdHandler) tearDown(oldInfo *crdInfo) {
|
|||||||
|
|
||||||
// GetCustomResourceListerCollectionDeleter returns the ListerCollectionDeleter of
|
// GetCustomResourceListerCollectionDeleter returns the ListerCollectionDeleter of
|
||||||
// the given crd.
|
// the given crd.
|
||||||
func (r *crdHandler) GetCustomResourceListerCollectionDeleter(crd *apiextensions.CustomResourceDefinition) (finalizer.ListerCollectionDeleter, error) {
|
func (r *crdHandler) GetCustomResourceListerCollectionDeleter(crd *apiextensionsv1.CustomResourceDefinition) (finalizer.ListerCollectionDeleter, error) {
|
||||||
info, err := r.getOrCreateServingInfoFor(crd.UID, crd.Name)
|
info, err := r.getOrCreateServingInfoFor(crd.UID, crd.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -633,7 +633,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
internalValidation := &apiextensionsinternal.CustomResourceValidation{}
|
internalValidation := &apiextensionsinternal.CustomResourceValidation{}
|
||||||
if err := apiextensions.Convert_v1_CustomResourceValidation_To_apiextensions_CustomResourceValidation(val, internalValidation, nil); err != nil {
|
if err := apiextensionsv1.Convert_v1_CustomResourceValidation_To_apiextensions_CustomResourceValidation(val, internalValidation, nil); err != nil {
|
||||||
return nil, fmt.Errorf("failed converting CRD validation to internal version: %v", err)
|
return nil, fmt.Errorf("failed converting CRD validation to internal version: %v", err)
|
||||||
}
|
}
|
||||||
s, err := structuralschema.NewStructural(internalValidation.OpenAPIV3Schema)
|
s, err := structuralschema.NewStructural(internalValidation.OpenAPIV3Schema)
|
||||||
@@ -693,7 +693,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd
|
|||||||
var internalValidationSchema *apiextensionsinternal.CustomResourceValidation
|
var internalValidationSchema *apiextensionsinternal.CustomResourceValidation
|
||||||
if validationSchema != nil {
|
if validationSchema != nil {
|
||||||
internalValidationSchema = &apiextensionsinternal.CustomResourceValidation{}
|
internalValidationSchema = &apiextensionsinternal.CustomResourceValidation{}
|
||||||
if err := apiextensions.Convert_v1_CustomResourceValidation_To_apiextensions_CustomResourceValidation(validationSchema, internalValidationSchema, nil); err != nil {
|
if err := apiextensionsv1.Convert_v1_CustomResourceValidation_To_apiextensions_CustomResourceValidation(validationSchema, internalValidationSchema, nil); err != nil {
|
||||||
return nil, fmt.Errorf("failed to convert CRD validation to internal version: %v", err)
|
return nil, fmt.Errorf("failed to convert CRD validation to internal version: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -712,7 +712,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd
|
|||||||
if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && subresources != nil && subresources.Status != nil {
|
if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && subresources != nil && subresources.Status != nil {
|
||||||
equivalentResourceRegistry.RegisterKindFor(resource, "status", kind)
|
equivalentResourceRegistry.RegisterKindFor(resource, "status", kind)
|
||||||
statusSpec = &apiextensionsinternal.CustomResourceSubresourceStatus{}
|
statusSpec = &apiextensionsinternal.CustomResourceSubresourceStatus{}
|
||||||
if err := apiextensions.Convert_v1_CustomResourceSubresourceStatus_To_apiextensions_CustomResourceSubresourceStatus(subresources.Status, statusSpec, nil); err != nil {
|
if err := apiextensionsv1.Convert_v1_CustomResourceSubresourceStatus_To_apiextensions_CustomResourceSubresourceStatus(subresources.Status, statusSpec, nil); err != nil {
|
||||||
return nil, fmt.Errorf("failed converting CRD status subresource to internal version: %v", err)
|
return nil, fmt.Errorf("failed converting CRD status subresource to internal version: %v", err)
|
||||||
}
|
}
|
||||||
// for the status subresource, validate only against the status schema
|
// for the status subresource, validate only against the status schema
|
||||||
@@ -731,7 +731,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd
|
|||||||
if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && subresources != nil && subresources.Scale != nil {
|
if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && subresources != nil && subresources.Scale != nil {
|
||||||
equivalentResourceRegistry.RegisterKindFor(resource, "scale", autoscalingv1.SchemeGroupVersion.WithKind("Scale"))
|
equivalentResourceRegistry.RegisterKindFor(resource, "scale", autoscalingv1.SchemeGroupVersion.WithKind("Scale"))
|
||||||
scaleSpec = &apiextensionsinternal.CustomResourceSubresourceScale{}
|
scaleSpec = &apiextensionsinternal.CustomResourceSubresourceScale{}
|
||||||
if err := apiextensions.Convert_v1_CustomResourceSubresourceScale_To_apiextensions_CustomResourceSubresourceScale(subresources.Scale, scaleSpec, nil); err != nil {
|
if err := apiextensionsv1.Convert_v1_CustomResourceSubresourceScale_To_apiextensions_CustomResourceSubresourceScale(subresources.Scale, scaleSpec, nil); err != nil {
|
||||||
return nil, fmt.Errorf("failed converting CRD status subresource to internal version: %v", err)
|
return nil, fmt.Errorf("failed converting CRD status subresource to internal version: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -752,7 +752,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd
|
|||||||
schema.GroupVersionKind{Group: crd.Spec.Group, Version: v.Name, Kind: crd.Status.AcceptedNames.ListKind},
|
schema.GroupVersionKind{Group: crd.Spec.Group, Version: v.Name, Kind: crd.Status.AcceptedNames.ListKind},
|
||||||
customresource.NewStrategy(
|
customresource.NewStrategy(
|
||||||
typer,
|
typer,
|
||||||
crd.Spec.Scope == apiextensions.NamespaceScoped,
|
crd.Spec.Scope == apiextensionsv1.NamespaceScoped,
|
||||||
kind,
|
kind,
|
||||||
validator,
|
validator,
|
||||||
statusValidator,
|
statusValidator,
|
||||||
@@ -775,13 +775,13 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd
|
|||||||
|
|
||||||
selfLinkPrefix := ""
|
selfLinkPrefix := ""
|
||||||
switch crd.Spec.Scope {
|
switch crd.Spec.Scope {
|
||||||
case apiextensions.ClusterScoped:
|
case apiextensionsv1.ClusterScoped:
|
||||||
selfLinkPrefix = "/" + path.Join("apis", crd.Spec.Group, v.Name) + "/" + crd.Status.AcceptedNames.Plural + "/"
|
selfLinkPrefix = "/" + path.Join("apis", crd.Spec.Group, v.Name) + "/" + crd.Status.AcceptedNames.Plural + "/"
|
||||||
case apiextensions.NamespaceScoped:
|
case apiextensionsv1.NamespaceScoped:
|
||||||
selfLinkPrefix = "/" + path.Join("apis", crd.Spec.Group, v.Name, "namespaces") + "/"
|
selfLinkPrefix = "/" + path.Join("apis", crd.Spec.Group, v.Name, "namespaces") + "/"
|
||||||
}
|
}
|
||||||
|
|
||||||
clusterScoped := crd.Spec.Scope == apiextensions.ClusterScoped
|
clusterScoped := crd.Spec.Scope == apiextensionsv1.ClusterScoped
|
||||||
|
|
||||||
// CRDs explicitly do not support protobuf, but some objects returned by the API server do
|
// CRDs explicitly do not support protobuf, but some objects returned by the API server do
|
||||||
negotiatedSerializer := unstructuredNegotiatedSerializer{
|
negotiatedSerializer := unstructuredNegotiatedSerializer{
|
||||||
@@ -1222,7 +1222,7 @@ func (v *unstructuredSchemaCoercer) apply(u *unstructured.Unstructured) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// hasServedCRDVersion returns true if the given version is in the list of CRD's versions and the Served flag is set.
|
// hasServedCRDVersion returns true if the given version is in the list of CRD's versions and the Served flag is set.
|
||||||
func hasServedCRDVersion(spec *apiextensions.CustomResourceDefinitionSpec, version string) bool {
|
func hasServedCRDVersion(spec *apiextensionsv1.CustomResourceDefinitionSpec, version string) bool {
|
||||||
for _, v := range spec.Versions {
|
for _, v := range spec.Versions {
|
||||||
if v.Name == version {
|
if v.Name == version {
|
||||||
return v.Served
|
return v.Served
|
||||||
@@ -1246,7 +1246,7 @@ func serverStartingError() error {
|
|||||||
// buildOpenAPIModelsForApply constructs openapi models from any validation schemas specified in the custom resource,
|
// buildOpenAPIModelsForApply constructs openapi models from any validation schemas specified in the custom resource,
|
||||||
// and merges it with the models defined in the static OpenAPI spec.
|
// and merges it with the models defined in the static OpenAPI spec.
|
||||||
// Returns nil models if the ServerSideApply feature is disabled, or the static spec is nil, or an error is encountered.
|
// Returns nil models if the ServerSideApply feature is disabled, or the static spec is nil, or an error is encountered.
|
||||||
func buildOpenAPIModelsForApply(staticOpenAPISpec *spec.Swagger, crd *apiextensions.CustomResourceDefinition) (proto.Models, error) {
|
func buildOpenAPIModelsForApply(staticOpenAPISpec *spec.Swagger, crd *apiextensionsv1.CustomResourceDefinition) (proto.Models, error) {
|
||||||
if !utilfeature.DefaultFeatureGate.Enabled(features.ServerSideApply) {
|
if !utilfeature.DefaultFeatureGate.Enabled(features.ServerSideApply) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
@@ -25,7 +25,7 @@ import (
|
|||||||
"sigs.k8s.io/yaml"
|
"sigs.k8s.io/yaml"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apiserver/conversion"
|
"k8s.io/apiextensions-apiserver/pkg/apiserver/conversion"
|
||||||
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@@ -78,18 +78,18 @@ func TestConvertFieldLabel(t *testing.T) {
|
|||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
t.Run(test.name, func(t *testing.T) {
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
|
||||||
crd := apiextensions.CustomResourceDefinition{
|
crd := apiextensionsv1.CustomResourceDefinition{
|
||||||
Spec: apiextensions.CustomResourceDefinitionSpec{
|
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
|
||||||
Conversion: &apiextensions.CustomResourceConversion{
|
Conversion: &apiextensionsv1.CustomResourceConversion{
|
||||||
Strategy: "None",
|
Strategy: "None",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if test.clusterScoped {
|
if test.clusterScoped {
|
||||||
crd.Spec.Scope = apiextensions.ClusterScoped
|
crd.Spec.Scope = apiextensionsv1.ClusterScoped
|
||||||
} else {
|
} else {
|
||||||
crd.Spec.Scope = apiextensions.NamespaceScoped
|
crd.Spec.Scope = apiextensionsv1.NamespaceScoped
|
||||||
}
|
}
|
||||||
f, err := conversion.NewCRConverterFactory(nil, nil)
|
f, err := conversion.NewCRConverterFactory(nil, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -22,7 +22,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
"k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
|
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
|
||||||
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
||||||
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
||||||
@@ -77,7 +77,7 @@ func NewKubernetesAPIApprovalPolicyConformantConditionController(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// calculateCondition determines the new KubernetesAPIApprovalPolicyConformant condition
|
// calculateCondition determines the new KubernetesAPIApprovalPolicyConformant condition
|
||||||
func calculateCondition(crd *apiextensions.CustomResourceDefinition) *apiextensions.CustomResourceDefinitionCondition {
|
func calculateCondition(crd *apiextensionsv1.CustomResourceDefinition) *apiextensionsv1.CustomResourceDefinitionCondition {
|
||||||
if !apihelpers.IsProtectedCommunityGroup(crd.Spec.Group) {
|
if !apihelpers.IsProtectedCommunityGroup(crd.Spec.Group) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -85,37 +85,37 @@ func calculateCondition(crd *apiextensions.CustomResourceDefinition) *apiextensi
|
|||||||
approvalState, reason := apihelpers.GetAPIApprovalState(crd.Annotations)
|
approvalState, reason := apihelpers.GetAPIApprovalState(crd.Annotations)
|
||||||
switch approvalState {
|
switch approvalState {
|
||||||
case apihelpers.APIApprovalInvalid:
|
case apihelpers.APIApprovalInvalid:
|
||||||
return &apiextensions.CustomResourceDefinitionCondition{
|
return &apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.KubernetesAPIApprovalPolicyConformant,
|
Type: apiextensionsv1.KubernetesAPIApprovalPolicyConformant,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "InvalidAnnotation",
|
Reason: "InvalidAnnotation",
|
||||||
Message: reason,
|
Message: reason,
|
||||||
}
|
}
|
||||||
case apihelpers.APIApprovalMissing:
|
case apihelpers.APIApprovalMissing:
|
||||||
return &apiextensions.CustomResourceDefinitionCondition{
|
return &apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.KubernetesAPIApprovalPolicyConformant,
|
Type: apiextensionsv1.KubernetesAPIApprovalPolicyConformant,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "MissingAnnotation",
|
Reason: "MissingAnnotation",
|
||||||
Message: reason,
|
Message: reason,
|
||||||
}
|
}
|
||||||
case apihelpers.APIApproved:
|
case apihelpers.APIApproved:
|
||||||
return &apiextensions.CustomResourceDefinitionCondition{
|
return &apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.KubernetesAPIApprovalPolicyConformant,
|
Type: apiextensionsv1.KubernetesAPIApprovalPolicyConformant,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "ApprovedAnnotation",
|
Reason: "ApprovedAnnotation",
|
||||||
Message: reason,
|
Message: reason,
|
||||||
}
|
}
|
||||||
case apihelpers.APIApprovalBypassed:
|
case apihelpers.APIApprovalBypassed:
|
||||||
return &apiextensions.CustomResourceDefinitionCondition{
|
return &apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.KubernetesAPIApprovalPolicyConformant,
|
Type: apiextensionsv1.KubernetesAPIApprovalPolicyConformant,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "UnapprovedAnnotation",
|
Reason: "UnapprovedAnnotation",
|
||||||
Message: reason,
|
Message: reason,
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return &apiextensions.CustomResourceDefinitionCondition{
|
return &apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.KubernetesAPIApprovalPolicyConformant,
|
Type: apiextensionsv1.KubernetesAPIApprovalPolicyConformant,
|
||||||
Status: apiextensions.ConditionUnknown,
|
Status: apiextensionsv1.ConditionUnknown,
|
||||||
Reason: "UnknownAnnotation",
|
Reason: "UnknownAnnotation",
|
||||||
Message: reason,
|
Message: reason,
|
||||||
}
|
}
|
||||||
@@ -132,7 +132,7 @@ func (c *KubernetesAPIApprovalPolicyConformantConditionController) sync(key stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
// avoid repeated calculation for the same annotation
|
// avoid repeated calculation for the same annotation
|
||||||
protectionAnnotationValue := inCustomResourceDefinition.Annotations[apiextensions.KubeAPIApprovedAnnotation]
|
protectionAnnotationValue := inCustomResourceDefinition.Annotations[apiextensionsv1.KubeAPIApprovedAnnotation]
|
||||||
c.lastSeenProtectedAnnotationLock.Lock()
|
c.lastSeenProtectedAnnotationLock.Lock()
|
||||||
lastSeen, seenBefore := c.lastSeenProtectedAnnotation[inCustomResourceDefinition.Name]
|
lastSeen, seenBefore := c.lastSeenProtectedAnnotation[inCustomResourceDefinition.Name]
|
||||||
c.lastSeenProtectedAnnotationLock.Unlock()
|
c.lastSeenProtectedAnnotationLock.Unlock()
|
||||||
@@ -146,7 +146,7 @@ func (c *KubernetesAPIApprovalPolicyConformantConditionController) sync(key stri
|
|||||||
// because group is immutable, if we have no condition now, we have no need to remove a condition.
|
// because group is immutable, if we have no condition now, we have no need to remove a condition.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
old := apihelpers.FindCRDCondition(inCustomResourceDefinition, apiextensions.KubernetesAPIApprovalPolicyConformant)
|
old := apihelpers.FindCRDCondition(inCustomResourceDefinition, apiextensionsv1.KubernetesAPIApprovalPolicyConformant)
|
||||||
|
|
||||||
// don't attempt a write if all the condition details are the same
|
// don't attempt a write if all the condition details are the same
|
||||||
if old != nil && old.Status == cond.Status && old.Reason == cond.Reason && old.Message == cond.Message {
|
if old != nil && old.Status == cond.Status && old.Reason == cond.Reason && old.Message == cond.Message {
|
||||||
@@ -220,7 +220,7 @@ func (c *KubernetesAPIApprovalPolicyConformantConditionController) processNextWo
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *KubernetesAPIApprovalPolicyConformantConditionController) enqueue(obj *apiextensions.CustomResourceDefinition) {
|
func (c *KubernetesAPIApprovalPolicyConformantConditionController) enqueue(obj *apiextensionsv1.CustomResourceDefinition) {
|
||||||
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
|
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utilruntime.HandleError(fmt.Errorf("Couldn't get key for object %#v: %v", obj, err))
|
utilruntime.HandleError(fmt.Errorf("Couldn't get key for object %#v: %v", obj, err))
|
||||||
@@ -231,26 +231,26 @@ func (c *KubernetesAPIApprovalPolicyConformantConditionController) enqueue(obj *
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *KubernetesAPIApprovalPolicyConformantConditionController) addCustomResourceDefinition(obj interface{}) {
|
func (c *KubernetesAPIApprovalPolicyConformantConditionController) addCustomResourceDefinition(obj interface{}) {
|
||||||
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
castObj := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
klog.V(4).Infof("Adding %s", castObj.Name)
|
klog.V(4).Infof("Adding %s", castObj.Name)
|
||||||
c.enqueue(castObj)
|
c.enqueue(castObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *KubernetesAPIApprovalPolicyConformantConditionController) updateCustomResourceDefinition(obj, _ interface{}) {
|
func (c *KubernetesAPIApprovalPolicyConformantConditionController) updateCustomResourceDefinition(obj, _ interface{}) {
|
||||||
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
castObj := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
klog.V(4).Infof("Updating %s", castObj.Name)
|
klog.V(4).Infof("Updating %s", castObj.Name)
|
||||||
c.enqueue(castObj)
|
c.enqueue(castObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *KubernetesAPIApprovalPolicyConformantConditionController) deleteCustomResourceDefinition(obj interface{}) {
|
func (c *KubernetesAPIApprovalPolicyConformantConditionController) deleteCustomResourceDefinition(obj interface{}) {
|
||||||
castObj, ok := obj.(*apiextensions.CustomResourceDefinition)
|
castObj, ok := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.Errorf("Couldn't get object from tombstone %#v", obj)
|
klog.Errorf("Couldn't get object from tombstone %#v", obj)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
castObj, ok = tombstone.Obj.(*apiextensions.CustomResourceDefinition)
|
castObj, ok = tombstone.Obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
klog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
||||||
return
|
return
|
||||||
|
@@ -19,20 +19,20 @@ package apiapproval
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCalculateCondition(t *testing.T) {
|
func TestCalculateCondition(t *testing.T) {
|
||||||
noConditionFn := func(t *testing.T, condition *apiextensions.CustomResourceDefinitionCondition) {
|
noConditionFn := func(t *testing.T, condition *apiextensionsv1.CustomResourceDefinitionCondition) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
if condition != nil {
|
if condition != nil {
|
||||||
t.Fatal(condition)
|
t.Fatal(condition)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
verifyCondition := func(status apiextensions.ConditionStatus, message string) func(t *testing.T, condition *apiextensions.CustomResourceDefinitionCondition) {
|
verifyCondition := func(status apiextensionsv1.ConditionStatus, message string) func(t *testing.T, condition *apiextensionsv1.CustomResourceDefinitionCondition) {
|
||||||
return func(t *testing.T, condition *apiextensions.CustomResourceDefinitionCondition) {
|
return func(t *testing.T, condition *apiextensionsv1.CustomResourceDefinitionCondition) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
if condition == nil {
|
if condition == nil {
|
||||||
t.Fatal("missing condition")
|
t.Fatal("missing condition")
|
||||||
@@ -51,7 +51,7 @@ func TestCalculateCondition(t *testing.T) {
|
|||||||
|
|
||||||
group string
|
group string
|
||||||
annotationValue string
|
annotationValue string
|
||||||
validateCondition func(t *testing.T, condition *apiextensions.CustomResourceDefinitionCondition)
|
validateCondition func(t *testing.T, condition *apiextensionsv1.CustomResourceDefinitionCondition)
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "for other group",
|
name: "for other group",
|
||||||
@@ -63,33 +63,33 @@ func TestCalculateCondition(t *testing.T) {
|
|||||||
name: "missing annotation",
|
name: "missing annotation",
|
||||||
group: "sigs.k8s.io",
|
group: "sigs.k8s.io",
|
||||||
annotationValue: "",
|
annotationValue: "",
|
||||||
validateCondition: verifyCondition(apiextensions.ConditionFalse, `protected groups must have approval annotation "api-approved.kubernetes.io", see https://github.com/kubernetes/enhancements/pull/1111`),
|
validateCondition: verifyCondition(apiextensionsv1.ConditionFalse, `protected groups must have approval annotation "api-approved.kubernetes.io", see https://github.com/kubernetes/enhancements/pull/1111`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "invalid annotation",
|
name: "invalid annotation",
|
||||||
group: "sigs.k8s.io",
|
group: "sigs.k8s.io",
|
||||||
annotationValue: "bad value",
|
annotationValue: "bad value",
|
||||||
validateCondition: verifyCondition(apiextensions.ConditionFalse, `protected groups must have approval annotation "api-approved.kubernetes.io" with either a URL or a reason starting with "unapproved", see https://github.com/kubernetes/enhancements/pull/1111`),
|
validateCondition: verifyCondition(apiextensionsv1.ConditionFalse, `protected groups must have approval annotation "api-approved.kubernetes.io" with either a URL or a reason starting with "unapproved", see https://github.com/kubernetes/enhancements/pull/1111`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "approved",
|
name: "approved",
|
||||||
group: "sigs.k8s.io",
|
group: "sigs.k8s.io",
|
||||||
annotationValue: "https://github.com/kubernetes/kubernetes/pull/79724",
|
annotationValue: "https://github.com/kubernetes/kubernetes/pull/79724",
|
||||||
validateCondition: verifyCondition(apiextensions.ConditionTrue, `approved in https://github.com/kubernetes/kubernetes/pull/79724`),
|
validateCondition: verifyCondition(apiextensionsv1.ConditionTrue, `approved in https://github.com/kubernetes/kubernetes/pull/79724`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "unapproved",
|
name: "unapproved",
|
||||||
group: "sigs.k8s.io",
|
group: "sigs.k8s.io",
|
||||||
annotationValue: "unapproved for reasons",
|
annotationValue: "unapproved for reasons",
|
||||||
validateCondition: verifyCondition(apiextensions.ConditionFalse, `not approved: "unapproved for reasons"`),
|
validateCondition: verifyCondition(apiextensionsv1.ConditionFalse, `not approved: "unapproved for reasons"`),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
t.Run(test.name, func(t *testing.T) {
|
t.Run(test.name, func(t *testing.T) {
|
||||||
crd := &apiextensions.CustomResourceDefinition{
|
crd := &apiextensionsv1.CustomResourceDefinition{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "foo", Annotations: map[string]string{apiextensions.KubeAPIApprovedAnnotation: test.annotationValue}},
|
ObjectMeta: metav1.ObjectMeta{Name: "foo", Annotations: map[string]string{apiextensionsv1.KubeAPIApprovedAnnotation: test.annotationValue}},
|
||||||
Spec: apiextensions.CustomResourceDefinitionSpec{
|
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
|
||||||
Group: test.group,
|
Group: test.group,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@@ -28,7 +28,7 @@ import (
|
|||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
|
|
||||||
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
|
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
|
||||||
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
||||||
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
||||||
@@ -120,15 +120,15 @@ func (ec *EstablishingController) sync(key string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !apiextensionshelpers.IsCRDConditionTrue(cachedCRD, apiextensions.NamesAccepted) ||
|
if !apiextensionshelpers.IsCRDConditionTrue(cachedCRD, apiextensionsv1.NamesAccepted) ||
|
||||||
apiextensionshelpers.IsCRDConditionTrue(cachedCRD, apiextensions.Established) {
|
apiextensionshelpers.IsCRDConditionTrue(cachedCRD, apiextensionsv1.Established) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
crd := cachedCRD.DeepCopy()
|
crd := cachedCRD.DeepCopy()
|
||||||
establishedCondition := apiextensions.CustomResourceDefinitionCondition{
|
establishedCondition := apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "InitialNamesAccepted",
|
Reason: "InitialNamesAccepted",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
}
|
}
|
||||||
|
@@ -37,7 +37,7 @@ import (
|
|||||||
"k8s.io/client-go/util/workqueue"
|
"k8s.io/client-go/util/workqueue"
|
||||||
|
|
||||||
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
|
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
|
||||||
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
||||||
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
||||||
@@ -77,7 +77,7 @@ type ListerCollectionDeleter interface {
|
|||||||
type CRClientGetter interface {
|
type CRClientGetter interface {
|
||||||
// GetCustomResourceListerCollectionDeleter gets the ListerCollectionDeleter for the given CRD
|
// GetCustomResourceListerCollectionDeleter gets the ListerCollectionDeleter for the given CRD
|
||||||
// UID.
|
// UID.
|
||||||
GetCustomResourceListerCollectionDeleter(crd *apiextensions.CustomResourceDefinition) (ListerCollectionDeleter, error)
|
GetCustomResourceListerCollectionDeleter(crd *apiextensionsv1.CustomResourceDefinition) (ListerCollectionDeleter, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCRDFinalizer creates a new CRDFinalizer.
|
// NewCRDFinalizer creates a new CRDFinalizer.
|
||||||
@@ -114,16 +114,16 @@ func (c *CRDFinalizer) sync(key string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// no work to do
|
// no work to do
|
||||||
if cachedCRD.DeletionTimestamp.IsZero() || !apiextensionshelpers.CRDHasFinalizer(cachedCRD, apiextensions.CustomResourceCleanupFinalizer) {
|
if cachedCRD.DeletionTimestamp.IsZero() || !apiextensionshelpers.CRDHasFinalizer(cachedCRD, apiextensionsv1.CustomResourceCleanupFinalizer) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
crd := cachedCRD.DeepCopy()
|
crd := cachedCRD.DeepCopy()
|
||||||
|
|
||||||
// update the status condition. This cleanup could take a while.
|
// update the status condition. This cleanup could take a while.
|
||||||
apiextensionshelpers.SetCRDCondition(crd, apiextensions.CustomResourceDefinitionCondition{
|
apiextensionshelpers.SetCRDCondition(crd, apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "InstanceDeletionInProgress",
|
Reason: "InstanceDeletionInProgress",
|
||||||
Message: "CustomResource deletion is in progress",
|
Message: "CustomResource deletion is in progress",
|
||||||
})
|
})
|
||||||
@@ -140,13 +140,13 @@ func (c *CRDFinalizer) sync(key string) error {
|
|||||||
// Since we control the endpoints, we know that delete collection works. No need to delete if not established.
|
// Since we control the endpoints, we know that delete collection works. No need to delete if not established.
|
||||||
if OverlappingBuiltInResources()[schema.GroupResource{Group: crd.Spec.Group, Resource: crd.Spec.Names.Plural}] {
|
if OverlappingBuiltInResources()[schema.GroupResource{Group: crd.Spec.Group, Resource: crd.Spec.Names.Plural}] {
|
||||||
// Skip deletion, explain why, and proceed to remove the finalizer and delete the CRD
|
// Skip deletion, explain why, and proceed to remove the finalizer and delete the CRD
|
||||||
apiextensionshelpers.SetCRDCondition(crd, apiextensions.CustomResourceDefinitionCondition{
|
apiextensionshelpers.SetCRDCondition(crd, apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "OverlappingBuiltInResource",
|
Reason: "OverlappingBuiltInResource",
|
||||||
Message: "instances overlap with built-in resources in storage",
|
Message: "instances overlap with built-in resources in storage",
|
||||||
})
|
})
|
||||||
} else if apiextensionshelpers.IsCRDConditionTrue(crd, apiextensions.Established) {
|
} else if apiextensionshelpers.IsCRDConditionTrue(crd, apiextensionsv1.Established) {
|
||||||
cond, deleteErr := c.deleteInstances(crd)
|
cond, deleteErr := c.deleteInstances(crd)
|
||||||
apiextensionshelpers.SetCRDCondition(crd, cond)
|
apiextensionshelpers.SetCRDCondition(crd, cond)
|
||||||
if deleteErr != nil {
|
if deleteErr != nil {
|
||||||
@@ -156,15 +156,15 @@ func (c *CRDFinalizer) sync(key string) error {
|
|||||||
return deleteErr
|
return deleteErr
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
apiextensionshelpers.SetCRDCondition(crd, apiextensions.CustomResourceDefinitionCondition{
|
apiextensionshelpers.SetCRDCondition(crd, apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "NeverEstablished",
|
Reason: "NeverEstablished",
|
||||||
Message: "resource was never established",
|
Message: "resource was never established",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
apiextensionshelpers.CRDRemoveFinalizer(crd, apiextensions.CustomResourceCleanupFinalizer)
|
apiextensionshelpers.CRDRemoveFinalizer(crd, apiextensionsv1.CustomResourceCleanupFinalizer)
|
||||||
_, err = c.crdClient.CustomResourceDefinitions().UpdateStatus(crd)
|
_, err = c.crdClient.CustomResourceDefinitions().UpdateStatus(crd)
|
||||||
if apierrors.IsNotFound(err) || apierrors.IsConflict(err) {
|
if apierrors.IsNotFound(err) || apierrors.IsConflict(err) {
|
||||||
// deleted or changed in the meantime, we'll get called again
|
// deleted or changed in the meantime, we'll get called again
|
||||||
@@ -173,16 +173,16 @@ func (c *CRDFinalizer) sync(key string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CRDFinalizer) deleteInstances(crd *apiextensions.CustomResourceDefinition) (apiextensions.CustomResourceDefinitionCondition, error) {
|
func (c *CRDFinalizer) deleteInstances(crd *apiextensionsv1.CustomResourceDefinition) (apiextensionsv1.CustomResourceDefinitionCondition, error) {
|
||||||
// Now we can start deleting items. While it would be ideal to use a REST API client, doing so
|
// Now we can start deleting items. While it would be ideal to use a REST API client, doing so
|
||||||
// could incorrectly delete a ThirdPartyResource with the same URL as the CustomResource, so we go
|
// could incorrectly delete a ThirdPartyResource with the same URL as the CustomResource, so we go
|
||||||
// directly to the storage instead. Since we control the storage, we know that delete collection works.
|
// directly to the storage instead. Since we control the storage, we know that delete collection works.
|
||||||
crClient, err := c.crClientGetter.GetCustomResourceListerCollectionDeleter(crd)
|
crClient, err := c.crClientGetter.GetCustomResourceListerCollectionDeleter(crd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("unable to find a custom resource client for %s.%s: %v", crd.Status.AcceptedNames.Plural, crd.Spec.Group, err)
|
err = fmt.Errorf("unable to find a custom resource client for %s.%s: %v", crd.Status.AcceptedNames.Plural, crd.Spec.Group, err)
|
||||||
return apiextensions.CustomResourceDefinitionCondition{
|
return apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "InstanceDeletionFailed",
|
Reason: "InstanceDeletionFailed",
|
||||||
Message: fmt.Sprintf("could not list instances: %v", err),
|
Message: fmt.Sprintf("could not list instances: %v", err),
|
||||||
}, err
|
}, err
|
||||||
@@ -191,9 +191,9 @@ func (c *CRDFinalizer) deleteInstances(crd *apiextensions.CustomResourceDefiniti
|
|||||||
ctx := genericapirequest.NewContext()
|
ctx := genericapirequest.NewContext()
|
||||||
allResources, err := crClient.List(ctx, nil)
|
allResources, err := crClient.List(ctx, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return apiextensions.CustomResourceDefinitionCondition{
|
return apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "InstanceDeletionFailed",
|
Reason: "InstanceDeletionFailed",
|
||||||
Message: fmt.Sprintf("could not list instances: %v", err),
|
Message: fmt.Sprintf("could not list instances: %v", err),
|
||||||
}, err
|
}, err
|
||||||
@@ -219,9 +219,9 @@ func (c *CRDFinalizer) deleteInstances(crd *apiextensions.CustomResourceDefiniti
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if deleteError := utilerrors.NewAggregate(deleteErrors); deleteError != nil {
|
if deleteError := utilerrors.NewAggregate(deleteErrors); deleteError != nil {
|
||||||
return apiextensions.CustomResourceDefinitionCondition{
|
return apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "InstanceDeletionFailed",
|
Reason: "InstanceDeletionFailed",
|
||||||
Message: fmt.Sprintf("could not issue all deletes: %v", deleteError),
|
Message: fmt.Sprintf("could not issue all deletes: %v", deleteError),
|
||||||
}, deleteError
|
}, deleteError
|
||||||
@@ -242,16 +242,16 @@ func (c *CRDFinalizer) deleteInstances(crd *apiextensions.CustomResourceDefiniti
|
|||||||
return false, nil
|
return false, nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return apiextensions.CustomResourceDefinitionCondition{
|
return apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "InstanceDeletionCheck",
|
Reason: "InstanceDeletionCheck",
|
||||||
Message: fmt.Sprintf("could not confirm zero CustomResources remaining: %v", err),
|
Message: fmt.Sprintf("could not confirm zero CustomResources remaining: %v", err),
|
||||||
}, err
|
}, err
|
||||||
}
|
}
|
||||||
return apiextensions.CustomResourceDefinitionCondition{
|
return apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Terminating,
|
Type: apiextensionsv1.Terminating,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "InstanceDeletionCompleted",
|
Reason: "InstanceDeletionCompleted",
|
||||||
Message: "removed all instances",
|
Message: "removed all instances",
|
||||||
}, nil
|
}, nil
|
||||||
@@ -300,7 +300,7 @@ func (c *CRDFinalizer) processNextWorkItem() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CRDFinalizer) enqueue(obj *apiextensions.CustomResourceDefinition) {
|
func (c *CRDFinalizer) enqueue(obj *apiextensionsv1.CustomResourceDefinition) {
|
||||||
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
|
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utilruntime.HandleError(fmt.Errorf("couldn't get key for object %#v: %v", obj, err))
|
utilruntime.HandleError(fmt.Errorf("couldn't get key for object %#v: %v", obj, err))
|
||||||
@@ -311,18 +311,18 @@ func (c *CRDFinalizer) enqueue(obj *apiextensions.CustomResourceDefinition) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *CRDFinalizer) addCustomResourceDefinition(obj interface{}) {
|
func (c *CRDFinalizer) addCustomResourceDefinition(obj interface{}) {
|
||||||
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
castObj := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
// only queue deleted things
|
// only queue deleted things
|
||||||
if !castObj.DeletionTimestamp.IsZero() && apiextensionshelpers.CRDHasFinalizer(castObj, apiextensions.CustomResourceCleanupFinalizer) {
|
if !castObj.DeletionTimestamp.IsZero() && apiextensionshelpers.CRDHasFinalizer(castObj, apiextensionsv1.CustomResourceCleanupFinalizer) {
|
||||||
c.enqueue(castObj)
|
c.enqueue(castObj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CRDFinalizer) updateCustomResourceDefinition(oldObj, newObj interface{}) {
|
func (c *CRDFinalizer) updateCustomResourceDefinition(oldObj, newObj interface{}) {
|
||||||
oldCRD := oldObj.(*apiextensions.CustomResourceDefinition)
|
oldCRD := oldObj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
newCRD := newObj.(*apiextensions.CustomResourceDefinition)
|
newCRD := newObj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
// only queue deleted things that haven't been finalized by us
|
// only queue deleted things that haven't been finalized by us
|
||||||
if newCRD.DeletionTimestamp.IsZero() || !apiextensionshelpers.CRDHasFinalizer(newCRD, apiextensions.CustomResourceCleanupFinalizer) {
|
if newCRD.DeletionTimestamp.IsZero() || !apiextensionshelpers.CRDHasFinalizer(newCRD, apiextensionsv1.CustomResourceCleanupFinalizer) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,8 +340,8 @@ func (c *CRDFinalizer) updateCustomResourceDefinition(oldObj, newObj interface{}
|
|||||||
newCopy := newCRD.DeepCopy()
|
newCopy := newCRD.DeepCopy()
|
||||||
oldCopy.ResourceVersion = ""
|
oldCopy.ResourceVersion = ""
|
||||||
newCopy.ResourceVersion = ""
|
newCopy.ResourceVersion = ""
|
||||||
apiextensionshelpers.RemoveCRDCondition(oldCopy, apiextensions.Terminating)
|
apiextensionshelpers.RemoveCRDCondition(oldCopy, apiextensionsv1.Terminating)
|
||||||
apiextensionshelpers.RemoveCRDCondition(newCopy, apiextensions.Terminating)
|
apiextensionshelpers.RemoveCRDCondition(newCopy, apiextensionsv1.Terminating)
|
||||||
|
|
||||||
if !reflect.DeepEqual(oldCopy, newCopy) {
|
if !reflect.DeepEqual(oldCopy, newCopy) {
|
||||||
c.enqueue(newCRD)
|
c.enqueue(newCRD)
|
||||||
|
@@ -32,7 +32,7 @@ import (
|
|||||||
|
|
||||||
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
||||||
apiextensionsinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
apiextensionsinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
"k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
||||||
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
|
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
|
||||||
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
||||||
@@ -81,10 +81,10 @@ func NewConditionController(
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
func calculateCondition(in *apiextensions.CustomResourceDefinition) *apiextensions.CustomResourceDefinitionCondition {
|
func calculateCondition(in *apiextensionsv1.CustomResourceDefinition) *apiextensionsv1.CustomResourceDefinitionCondition {
|
||||||
cond := &apiextensions.CustomResourceDefinitionCondition{
|
cond := &apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.NonStructuralSchema,
|
Type: apiextensionsv1.NonStructuralSchema,
|
||||||
Status: apiextensions.ConditionUnknown,
|
Status: apiextensionsv1.ConditionUnknown,
|
||||||
}
|
}
|
||||||
|
|
||||||
allErrs := field.ErrorList{}
|
allErrs := field.ErrorList{}
|
||||||
@@ -95,7 +95,7 @@ func calculateCondition(in *apiextensions.CustomResourceDefinition) *apiextensio
|
|||||||
}
|
}
|
||||||
|
|
||||||
internalSchema := &apiextensionsinternal.CustomResourceValidation{}
|
internalSchema := &apiextensionsinternal.CustomResourceValidation{}
|
||||||
if err := apiextensions.Convert_v1_CustomResourceValidation_To_apiextensions_CustomResourceValidation(v.Schema, internalSchema, nil); err != nil {
|
if err := apiextensionsv1.Convert_v1_CustomResourceValidation_To_apiextensions_CustomResourceValidation(v.Schema, internalSchema, nil); err != nil {
|
||||||
klog.Errorf("failed to convert CRD validation to internal version: %v", err)
|
klog.Errorf("failed to convert CRD validation to internal version: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -115,7 +115,7 @@ func calculateCondition(in *apiextensions.CustomResourceDefinition) *apiextensio
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
cond.Status = apiextensions.ConditionTrue
|
cond.Status = apiextensionsv1.ConditionTrue
|
||||||
cond.Reason = "Violations"
|
cond.Reason = "Violations"
|
||||||
cond.Message = allErrs.ToAggregate().Error()
|
cond.Message = allErrs.ToAggregate().Error()
|
||||||
|
|
||||||
@@ -141,7 +141,7 @@ func (c *ConditionController) sync(key string) error {
|
|||||||
|
|
||||||
// check old condition
|
// check old condition
|
||||||
cond := calculateCondition(inCustomResourceDefinition)
|
cond := calculateCondition(inCustomResourceDefinition)
|
||||||
old := apiextensionshelpers.FindCRDCondition(inCustomResourceDefinition, apiextensions.NonStructuralSchema)
|
old := apiextensionshelpers.FindCRDCondition(inCustomResourceDefinition, apiextensionsv1.NonStructuralSchema)
|
||||||
|
|
||||||
if cond == nil && old == nil {
|
if cond == nil && old == nil {
|
||||||
return nil
|
return nil
|
||||||
@@ -153,7 +153,7 @@ func (c *ConditionController) sync(key string) error {
|
|||||||
// update condition
|
// update condition
|
||||||
crd := inCustomResourceDefinition.DeepCopy()
|
crd := inCustomResourceDefinition.DeepCopy()
|
||||||
if cond == nil {
|
if cond == nil {
|
||||||
apiextensionshelpers.RemoveCRDCondition(crd, apiextensions.NonStructuralSchema)
|
apiextensionshelpers.RemoveCRDCondition(crd, apiextensionsv1.NonStructuralSchema)
|
||||||
} else {
|
} else {
|
||||||
cond.LastTransitionTime = metav1.NewTime(time.Now())
|
cond.LastTransitionTime = metav1.NewTime(time.Now())
|
||||||
apiextensionshelpers.SetCRDCondition(crd, *cond)
|
apiextensionshelpers.SetCRDCondition(crd, *cond)
|
||||||
@@ -221,7 +221,7 @@ func (c *ConditionController) processNextWorkItem() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ConditionController) enqueue(obj *apiextensions.CustomResourceDefinition) {
|
func (c *ConditionController) enqueue(obj *apiextensionsv1.CustomResourceDefinition) {
|
||||||
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
|
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utilruntime.HandleError(fmt.Errorf("couldn't get key for object %#v: %v", obj, err))
|
utilruntime.HandleError(fmt.Errorf("couldn't get key for object %#v: %v", obj, err))
|
||||||
@@ -232,26 +232,26 @@ func (c *ConditionController) enqueue(obj *apiextensions.CustomResourceDefinitio
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *ConditionController) addCustomResourceDefinition(obj interface{}) {
|
func (c *ConditionController) addCustomResourceDefinition(obj interface{}) {
|
||||||
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
castObj := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
klog.V(4).Infof("Adding %s", castObj.Name)
|
klog.V(4).Infof("Adding %s", castObj.Name)
|
||||||
c.enqueue(castObj)
|
c.enqueue(castObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ConditionController) updateCustomResourceDefinition(obj, _ interface{}) {
|
func (c *ConditionController) updateCustomResourceDefinition(obj, _ interface{}) {
|
||||||
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
castObj := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
klog.V(4).Infof("Updating %s", castObj.Name)
|
klog.V(4).Infof("Updating %s", castObj.Name)
|
||||||
c.enqueue(castObj)
|
c.enqueue(castObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ConditionController) deleteCustomResourceDefinition(obj interface{}) {
|
func (c *ConditionController) deleteCustomResourceDefinition(obj interface{}) {
|
||||||
castObj, ok := obj.(*apiextensions.CustomResourceDefinition)
|
castObj, ok := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.Errorf("Couldn't get object from tombstone %#v", obj)
|
klog.Errorf("Couldn't get object from tombstone %#v", obj)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
castObj, ok = tombstone.Obj.(*apiextensions.CustomResourceDefinition)
|
castObj, ok = tombstone.Obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
klog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
||||||
return
|
return
|
||||||
|
@@ -28,7 +28,7 @@ import (
|
|||||||
v1 "k8s.io/api/autoscaling/v1"
|
v1 "k8s.io/api/autoscaling/v1"
|
||||||
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
||||||
apiextensionsinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
apiextensionsinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation"
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation"
|
||||||
structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
||||||
openapiv2 "k8s.io/apiextensions-apiserver/pkg/controller/openapi/v2"
|
openapiv2 "k8s.io/apiextensions-apiserver/pkg/controller/openapi/v2"
|
||||||
@@ -86,7 +86,7 @@ type Options struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BuildSwagger builds swagger for the given crd in the given version
|
// BuildSwagger builds swagger for the given crd in the given version
|
||||||
func BuildSwagger(crd *apiextensions.CustomResourceDefinition, version string, opts Options) (*spec.Swagger, error) {
|
func BuildSwagger(crd *apiextensionsv1.CustomResourceDefinition, version string, opts Options) (*spec.Swagger, error) {
|
||||||
var schema *structuralschema.Structural
|
var schema *structuralschema.Structural
|
||||||
s, err := apiextensionshelpers.GetSchemaForVersion(crd, version)
|
s, err := apiextensionshelpers.GetSchemaForVersion(crd, version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -95,7 +95,7 @@ func BuildSwagger(crd *apiextensions.CustomResourceDefinition, version string, o
|
|||||||
|
|
||||||
if s != nil && s.OpenAPIV3Schema != nil {
|
if s != nil && s.OpenAPIV3Schema != nil {
|
||||||
internalCRDSchema := &apiextensionsinternal.CustomResourceValidation{}
|
internalCRDSchema := &apiextensionsinternal.CustomResourceValidation{}
|
||||||
if err := apiextensions.Convert_v1_CustomResourceValidation_To_apiextensions_CustomResourceValidation(s, internalCRDSchema, nil); err != nil {
|
if err := apiextensionsv1.Convert_v1_CustomResourceValidation_To_apiextensions_CustomResourceValidation(s, internalCRDSchema, nil); err != nil {
|
||||||
return nil, fmt.Errorf("failed converting CRD validation to internal version: %v", err)
|
return nil, fmt.Errorf("failed converting CRD validation to internal version: %v", err)
|
||||||
}
|
}
|
||||||
if !validation.SchemaHasInvalidTypes(internalCRDSchema.OpenAPIV3Schema) {
|
if !validation.SchemaHasInvalidTypes(internalCRDSchema.OpenAPIV3Schema) {
|
||||||
@@ -504,7 +504,7 @@ func (b *builder) getOpenAPIConfig() *common.Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBuilder(crd *apiextensions.CustomResourceDefinition, version string, schema *structuralschema.Structural, v2 bool) *builder {
|
func newBuilder(crd *apiextensionsv1.CustomResourceDefinition, version string, schema *structuralschema.Structural, v2 bool) *builder {
|
||||||
b := &builder{
|
b := &builder{
|
||||||
schema: &spec.Schema{
|
schema: &spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{Type: []string{"object"}},
|
SchemaProps: spec.SchemaProps{Type: []string{"object"}},
|
||||||
@@ -518,7 +518,7 @@ func newBuilder(crd *apiextensions.CustomResourceDefinition, version string, sch
|
|||||||
listKind: crd.Spec.Names.ListKind,
|
listKind: crd.Spec.Names.ListKind,
|
||||||
plural: crd.Spec.Names.Plural,
|
plural: crd.Spec.Names.Plural,
|
||||||
}
|
}
|
||||||
if crd.Spec.Scope == apiextensions.NamespaceScoped {
|
if crd.Spec.Scope == apiextensionsv1.NamespaceScoped {
|
||||||
b.namespaced = true
|
b.namespaced = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -25,7 +25,7 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
apiextensionsinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
apiextensionsinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/diff"
|
"k8s.io/apimachinery/pkg/util/diff"
|
||||||
"k8s.io/apimachinery/pkg/util/json"
|
"k8s.io/apimachinery/pkg/util/json"
|
||||||
@@ -352,12 +352,12 @@ func TestNewBuilder(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
var schema *structuralschema.Structural
|
var schema *structuralschema.Structural
|
||||||
if len(tt.schema) > 0 {
|
if len(tt.schema) > 0 {
|
||||||
v1beta1Schema := &apiextensions.JSONSchemaProps{}
|
v1beta1Schema := &apiextensionsv1.JSONSchemaProps{}
|
||||||
if err := json.Unmarshal([]byte(tt.schema), &v1beta1Schema); err != nil {
|
if err := json.Unmarshal([]byte(tt.schema), &v1beta1Schema); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
internalSchema := &apiextensionsinternal.JSONSchemaProps{}
|
internalSchema := &apiextensionsinternal.JSONSchemaProps{}
|
||||||
apiextensions.Convert_v1_JSONSchemaProps_To_apiextensions_JSONSchemaProps(v1beta1Schema, internalSchema, nil)
|
apiextensionsv1.Convert_v1_JSONSchemaProps_To_apiextensions_JSONSchemaProps(v1beta1Schema, internalSchema, nil)
|
||||||
var err error
|
var err error
|
||||||
schema, err = structuralschema.NewStructural(internalSchema)
|
schema, err = structuralschema.NewStructural(internalSchema)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -369,21 +369,21 @@ func TestNewBuilder(t *testing.T) {
|
|||||||
schema = schema.Unfold()
|
schema = schema.Unfold()
|
||||||
}
|
}
|
||||||
|
|
||||||
got := newBuilder(&apiextensions.CustomResourceDefinition{
|
got := newBuilder(&apiextensionsv1.CustomResourceDefinition{
|
||||||
Spec: apiextensions.CustomResourceDefinitionSpec{
|
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
|
||||||
Group: "bar.k8s.io",
|
Group: "bar.k8s.io",
|
||||||
Versions: []apiextensions.CustomResourceDefinitionVersion{
|
Versions: []apiextensionsv1.CustomResourceDefinitionVersion{
|
||||||
{
|
{
|
||||||
Name: "v1",
|
Name: "v1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Names: apiextensions.CustomResourceDefinitionNames{
|
Names: apiextensionsv1.CustomResourceDefinitionNames{
|
||||||
Plural: "foos",
|
Plural: "foos",
|
||||||
Singular: "foo",
|
Singular: "foo",
|
||||||
Kind: "Foo",
|
Kind: "Foo",
|
||||||
ListKind: "FooList",
|
ListKind: "FooList",
|
||||||
},
|
},
|
||||||
Scope: apiextensions.NamespaceScoped,
|
Scope: apiextensionsv1.NamespaceScoped,
|
||||||
},
|
},
|
||||||
}, "v1", schema, tt.v2)
|
}, "v1", schema, tt.v2)
|
||||||
|
|
||||||
@@ -434,7 +434,7 @@ func TestCRDRouteParameterBuilder(t *testing.T) {
|
|||||||
testCRDResourceName := "foos"
|
testCRDResourceName := "foos"
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
scope apiextensions.ResourceScope
|
scope apiextensionsv1.ResourceScope
|
||||||
paths map[string]struct {
|
paths map[string]struct {
|
||||||
expectNamespaceParam bool
|
expectNamespaceParam bool
|
||||||
expectNameParam bool
|
expectNameParam bool
|
||||||
@@ -442,7 +442,7 @@ func TestCRDRouteParameterBuilder(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
scope: apiextensions.NamespaceScoped,
|
scope: apiextensionsv1.NamespaceScoped,
|
||||||
paths: map[string]struct {
|
paths: map[string]struct {
|
||||||
expectNamespaceParam bool
|
expectNamespaceParam bool
|
||||||
expectNameParam bool
|
expectNameParam bool
|
||||||
@@ -456,7 +456,7 @@ func TestCRDRouteParameterBuilder(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
scope: apiextensions.ClusterScoped,
|
scope: apiextensionsv1.ClusterScoped,
|
||||||
paths: map[string]struct {
|
paths: map[string]struct {
|
||||||
expectNamespaceParam bool
|
expectNamespaceParam bool
|
||||||
expectNameParam bool
|
expectNameParam bool
|
||||||
@@ -471,20 +471,20 @@ func TestCRDRouteParameterBuilder(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
testNamespacedCRD := &apiextensions.CustomResourceDefinition{
|
testNamespacedCRD := &apiextensionsv1.CustomResourceDefinition{
|
||||||
Spec: apiextensions.CustomResourceDefinitionSpec{
|
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
|
||||||
Scope: testCase.scope,
|
Scope: testCase.scope,
|
||||||
Group: testCRDGroup,
|
Group: testCRDGroup,
|
||||||
Names: apiextensions.CustomResourceDefinitionNames{
|
Names: apiextensionsv1.CustomResourceDefinitionNames{
|
||||||
Kind: testCRDKind,
|
Kind: testCRDKind,
|
||||||
Plural: testCRDResourceName,
|
Plural: testCRDResourceName,
|
||||||
},
|
},
|
||||||
Versions: []apiextensions.CustomResourceDefinitionVersion{
|
Versions: []apiextensionsv1.CustomResourceDefinitionVersion{
|
||||||
{
|
{
|
||||||
Name: testCRDVersion,
|
Name: testCRDVersion,
|
||||||
Subresources: &apiextensions.CustomResourceSubresources{
|
Subresources: &apiextensionsv1.CustomResourceSubresources{
|
||||||
Status: &apiextensions.CustomResourceSubresourceStatus{},
|
Status: &apiextensionsv1.CustomResourceSubresourceStatus{},
|
||||||
Scale: &apiextensions.CustomResourceSubresourceScale{},
|
Scale: &apiextensionsv1.CustomResourceSubresourceScale{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -631,13 +631,13 @@ func TestBuildSwagger(t *testing.T) {
|
|||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
var validation *apiextensions.CustomResourceValidation
|
var validation *apiextensionsv1.CustomResourceValidation
|
||||||
if len(tt.schema) > 0 {
|
if len(tt.schema) > 0 {
|
||||||
v1Schema := &apiextensions.JSONSchemaProps{}
|
v1Schema := &apiextensionsv1.JSONSchemaProps{}
|
||||||
if err := json.Unmarshal([]byte(tt.schema), &v1Schema); err != nil {
|
if err := json.Unmarshal([]byte(tt.schema), &v1Schema); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
validation = &apiextensions.CustomResourceValidation{
|
validation = &apiextensionsv1.CustomResourceValidation{
|
||||||
OpenAPIV3Schema: v1Schema,
|
OpenAPIV3Schema: v1Schema,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -646,22 +646,22 @@ func TestBuildSwagger(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: mostly copied from the test above. reuse code to cleanup
|
// TODO: mostly copied from the test above. reuse code to cleanup
|
||||||
got, err := BuildSwagger(&apiextensions.CustomResourceDefinition{
|
got, err := BuildSwagger(&apiextensionsv1.CustomResourceDefinition{
|
||||||
Spec: apiextensions.CustomResourceDefinitionSpec{
|
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
|
||||||
Group: "bar.k8s.io",
|
Group: "bar.k8s.io",
|
||||||
Versions: []apiextensions.CustomResourceDefinitionVersion{
|
Versions: []apiextensionsv1.CustomResourceDefinitionVersion{
|
||||||
{
|
{
|
||||||
Name: "v1",
|
Name: "v1",
|
||||||
Schema: validation,
|
Schema: validation,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Names: apiextensions.CustomResourceDefinitionNames{
|
Names: apiextensionsv1.CustomResourceDefinitionNames{
|
||||||
Plural: "foos",
|
Plural: "foos",
|
||||||
Singular: "foo",
|
Singular: "foo",
|
||||||
Kind: "Foo",
|
Kind: "Foo",
|
||||||
ListKind: "FooList",
|
ListKind: "FooList",
|
||||||
},
|
},
|
||||||
Scope: apiextensions.NamespaceScoped,
|
Scope: apiextensionsv1.NamespaceScoped,
|
||||||
},
|
},
|
||||||
}, "v1", tt.opts)
|
}, "v1", tt.opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -34,7 +34,7 @@ import (
|
|||||||
"k8s.io/kube-openapi/pkg/handler"
|
"k8s.io/kube-openapi/pkg/handler"
|
||||||
|
|
||||||
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
||||||
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder"
|
"k8s.io/apiextensions-apiserver/pkg/controller/openapi/builder"
|
||||||
@@ -100,7 +100,7 @@ func (c *Controller) Run(staticSpec *spec.Swagger, openAPIService *handler.OpenA
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
for _, crd := range crds {
|
for _, crd := range crds {
|
||||||
if !apiextensionshelpers.IsCRDConditionTrue(crd, apiextensions.Established) {
|
if !apiextensionshelpers.IsCRDConditionTrue(crd, apiextensionsv1.Established) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
newSpecs, changed, err := buildVersionSpecs(crd, nil)
|
newSpecs, changed, err := buildVersionSpecs(crd, nil)
|
||||||
@@ -164,7 +164,7 @@ func (c *Controller) sync(name string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// do we have to remove all specs of this CRD?
|
// do we have to remove all specs of this CRD?
|
||||||
if errors.IsNotFound(err) || !apiextensionshelpers.IsCRDConditionTrue(crd, apiextensions.Established) {
|
if errors.IsNotFound(err) || !apiextensionshelpers.IsCRDConditionTrue(crd, apiextensionsv1.Established) {
|
||||||
if _, found := c.crdSpecs[name]; !found {
|
if _, found := c.crdSpecs[name]; !found {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -195,7 +195,7 @@ func (c *Controller) sync(name string) error {
|
|||||||
return c.updateSpecLocked()
|
return c.updateSpecLocked()
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildVersionSpecs(crd *apiextensions.CustomResourceDefinition, oldSpecs map[string]*spec.Swagger) (map[string]*spec.Swagger, bool, error) {
|
func buildVersionSpecs(crd *apiextensionsv1.CustomResourceDefinition, oldSpecs map[string]*spec.Swagger) (map[string]*spec.Swagger, bool, error) {
|
||||||
newSpecs := map[string]*spec.Swagger{}
|
newSpecs := map[string]*spec.Swagger{}
|
||||||
anyChanged := false
|
anyChanged := false
|
||||||
for _, v := range crd.Spec.Versions {
|
for _, v := range crd.Spec.Versions {
|
||||||
@@ -235,26 +235,26 @@ func (c *Controller) updateSpecLocked() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Controller) addCustomResourceDefinition(obj interface{}) {
|
func (c *Controller) addCustomResourceDefinition(obj interface{}) {
|
||||||
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
castObj := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
klog.V(4).Infof("Adding customresourcedefinition %s", castObj.Name)
|
klog.V(4).Infof("Adding customresourcedefinition %s", castObj.Name)
|
||||||
c.enqueue(castObj)
|
c.enqueue(castObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Controller) updateCustomResourceDefinition(oldObj, newObj interface{}) {
|
func (c *Controller) updateCustomResourceDefinition(oldObj, newObj interface{}) {
|
||||||
castNewObj := newObj.(*apiextensions.CustomResourceDefinition)
|
castNewObj := newObj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
klog.V(4).Infof("Updating customresourcedefinition %s", castNewObj.Name)
|
klog.V(4).Infof("Updating customresourcedefinition %s", castNewObj.Name)
|
||||||
c.enqueue(castNewObj)
|
c.enqueue(castNewObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Controller) deleteCustomResourceDefinition(obj interface{}) {
|
func (c *Controller) deleteCustomResourceDefinition(obj interface{}) {
|
||||||
castObj, ok := obj.(*apiextensions.CustomResourceDefinition)
|
castObj, ok := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.Errorf("Couldn't get object from tombstone %#v", obj)
|
klog.Errorf("Couldn't get object from tombstone %#v", obj)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
castObj, ok = tombstone.Obj.(*apiextensions.CustomResourceDefinition)
|
castObj, ok = tombstone.Obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
klog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
||||||
return
|
return
|
||||||
@@ -264,6 +264,6 @@ func (c *Controller) deleteCustomResourceDefinition(obj interface{}) {
|
|||||||
c.enqueue(castObj)
|
c.enqueue(castObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Controller) enqueue(obj *apiextensions.CustomResourceDefinition) {
|
func (c *Controller) enqueue(obj *apiextensionsv1.CustomResourceDefinition) {
|
||||||
c.queue.Add(obj.Name)
|
c.queue.Add(obj.Name)
|
||||||
}
|
}
|
||||||
|
@@ -35,7 +35,7 @@ import (
|
|||||||
"k8s.io/client-go/util/workqueue"
|
"k8s.io/client-go/util/workqueue"
|
||||||
|
|
||||||
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
|
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
|
||||||
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1"
|
||||||
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
||||||
@@ -104,7 +104,7 @@ func (c *NamingConditionController) getAcceptedNamesForGroup(group string) (allR
|
|||||||
item := curr
|
item := curr
|
||||||
obj, exists, err := c.crdMutationCache.GetByKey(curr.Name)
|
obj, exists, err := c.crdMutationCache.GetByKey(curr.Name)
|
||||||
if exists && err == nil {
|
if exists && err == nil {
|
||||||
item = obj.(*apiextensions.CustomResourceDefinition)
|
item = obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
}
|
}
|
||||||
|
|
||||||
allResources.Insert(item.Status.AcceptedNames.Plural)
|
allResources.Insert(item.Status.AcceptedNames.Plural)
|
||||||
@@ -118,13 +118,13 @@ func (c *NamingConditionController) getAcceptedNamesForGroup(group string) (allR
|
|||||||
return allResources, allKinds
|
return allResources, allKinds
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *NamingConditionController) calculateNamesAndConditions(in *apiextensions.CustomResourceDefinition) (apiextensions.CustomResourceDefinitionNames, apiextensions.CustomResourceDefinitionCondition, apiextensions.CustomResourceDefinitionCondition) {
|
func (c *NamingConditionController) calculateNamesAndConditions(in *apiextensionsv1.CustomResourceDefinition) (apiextensionsv1.CustomResourceDefinitionNames, apiextensionsv1.CustomResourceDefinitionCondition, apiextensionsv1.CustomResourceDefinitionCondition) {
|
||||||
// Get the names that have already been claimed
|
// Get the names that have already been claimed
|
||||||
allResources, allKinds := c.getAcceptedNamesForGroup(in.Spec.Group)
|
allResources, allKinds := c.getAcceptedNamesForGroup(in.Spec.Group)
|
||||||
|
|
||||||
namesAcceptedCondition := apiextensions.CustomResourceDefinitionCondition{
|
namesAcceptedCondition := apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionUnknown,
|
Status: apiextensionsv1.ConditionUnknown,
|
||||||
}
|
}
|
||||||
|
|
||||||
requestedNames := in.Spec.Names
|
requestedNames := in.Spec.Names
|
||||||
@@ -134,14 +134,14 @@ func (c *NamingConditionController) calculateNamesAndConditions(in *apiextension
|
|||||||
// Check each name for mismatches. If there's a mismatch between spec and status, then try to deconflict.
|
// Check each name for mismatches. If there's a mismatch between spec and status, then try to deconflict.
|
||||||
// Continue on errors so that the status is the best match possible
|
// Continue on errors so that the status is the best match possible
|
||||||
if err := equalToAcceptedOrFresh(requestedNames.Plural, acceptedNames.Plural, allResources); err != nil {
|
if err := equalToAcceptedOrFresh(requestedNames.Plural, acceptedNames.Plural, allResources); err != nil {
|
||||||
namesAcceptedCondition.Status = apiextensions.ConditionFalse
|
namesAcceptedCondition.Status = apiextensionsv1.ConditionFalse
|
||||||
namesAcceptedCondition.Reason = "PluralConflict"
|
namesAcceptedCondition.Reason = "PluralConflict"
|
||||||
namesAcceptedCondition.Message = err.Error()
|
namesAcceptedCondition.Message = err.Error()
|
||||||
} else {
|
} else {
|
||||||
newNames.Plural = requestedNames.Plural
|
newNames.Plural = requestedNames.Plural
|
||||||
}
|
}
|
||||||
if err := equalToAcceptedOrFresh(requestedNames.Singular, acceptedNames.Singular, allResources); err != nil {
|
if err := equalToAcceptedOrFresh(requestedNames.Singular, acceptedNames.Singular, allResources); err != nil {
|
||||||
namesAcceptedCondition.Status = apiextensions.ConditionFalse
|
namesAcceptedCondition.Status = apiextensionsv1.ConditionFalse
|
||||||
namesAcceptedCondition.Reason = "SingularConflict"
|
namesAcceptedCondition.Reason = "SingularConflict"
|
||||||
namesAcceptedCondition.Message = err.Error()
|
namesAcceptedCondition.Message = err.Error()
|
||||||
} else {
|
} else {
|
||||||
@@ -161,7 +161,7 @@ func (c *NamingConditionController) calculateNamesAndConditions(in *apiextension
|
|||||||
|
|
||||||
}
|
}
|
||||||
if err := utilerrors.NewAggregate(errs); err != nil {
|
if err := utilerrors.NewAggregate(errs); err != nil {
|
||||||
namesAcceptedCondition.Status = apiextensions.ConditionFalse
|
namesAcceptedCondition.Status = apiextensionsv1.ConditionFalse
|
||||||
namesAcceptedCondition.Reason = "ShortNamesConflict"
|
namesAcceptedCondition.Reason = "ShortNamesConflict"
|
||||||
namesAcceptedCondition.Message = err.Error()
|
namesAcceptedCondition.Message = err.Error()
|
||||||
} else {
|
} else {
|
||||||
@@ -170,14 +170,14 @@ func (c *NamingConditionController) calculateNamesAndConditions(in *apiextension
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := equalToAcceptedOrFresh(requestedNames.Kind, acceptedNames.Kind, allKinds); err != nil {
|
if err := equalToAcceptedOrFresh(requestedNames.Kind, acceptedNames.Kind, allKinds); err != nil {
|
||||||
namesAcceptedCondition.Status = apiextensions.ConditionFalse
|
namesAcceptedCondition.Status = apiextensionsv1.ConditionFalse
|
||||||
namesAcceptedCondition.Reason = "KindConflict"
|
namesAcceptedCondition.Reason = "KindConflict"
|
||||||
namesAcceptedCondition.Message = err.Error()
|
namesAcceptedCondition.Message = err.Error()
|
||||||
} else {
|
} else {
|
||||||
newNames.Kind = requestedNames.Kind
|
newNames.Kind = requestedNames.Kind
|
||||||
}
|
}
|
||||||
if err := equalToAcceptedOrFresh(requestedNames.ListKind, acceptedNames.ListKind, allKinds); err != nil {
|
if err := equalToAcceptedOrFresh(requestedNames.ListKind, acceptedNames.ListKind, allKinds); err != nil {
|
||||||
namesAcceptedCondition.Status = apiextensions.ConditionFalse
|
namesAcceptedCondition.Status = apiextensionsv1.ConditionFalse
|
||||||
namesAcceptedCondition.Reason = "ListKindConflict"
|
namesAcceptedCondition.Reason = "ListKindConflict"
|
||||||
namesAcceptedCondition.Message = err.Error()
|
namesAcceptedCondition.Message = err.Error()
|
||||||
} else {
|
} else {
|
||||||
@@ -187,8 +187,8 @@ func (c *NamingConditionController) calculateNamesAndConditions(in *apiextension
|
|||||||
newNames.Categories = requestedNames.Categories
|
newNames.Categories = requestedNames.Categories
|
||||||
|
|
||||||
// if we haven't changed the condition, then our names must be good.
|
// if we haven't changed the condition, then our names must be good.
|
||||||
if namesAcceptedCondition.Status == apiextensions.ConditionUnknown {
|
if namesAcceptedCondition.Status == apiextensionsv1.ConditionUnknown {
|
||||||
namesAcceptedCondition.Status = apiextensions.ConditionTrue
|
namesAcceptedCondition.Status = apiextensionsv1.ConditionTrue
|
||||||
namesAcceptedCondition.Reason = "NoConflicts"
|
namesAcceptedCondition.Reason = "NoConflicts"
|
||||||
namesAcceptedCondition.Message = "no conflicts found"
|
namesAcceptedCondition.Message = "no conflicts found"
|
||||||
}
|
}
|
||||||
@@ -197,19 +197,19 @@ func (c *NamingConditionController) calculateNamesAndConditions(in *apiextension
|
|||||||
// The Establishing Controller will see the NamesAccepted condition when it arrives through the shared informer.
|
// The Establishing Controller will see the NamesAccepted condition when it arrives through the shared informer.
|
||||||
// At that time the API endpoint handler will serve the endpoint, avoiding a race
|
// At that time the API endpoint handler will serve the endpoint, avoiding a race
|
||||||
// which we had if we set Established to true here.
|
// which we had if we set Established to true here.
|
||||||
establishedCondition := apiextensions.CustomResourceDefinitionCondition{
|
establishedCondition := apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "NotAccepted",
|
Reason: "NotAccepted",
|
||||||
Message: "not all names are accepted",
|
Message: "not all names are accepted",
|
||||||
}
|
}
|
||||||
if old := apiextensionshelpers.FindCRDCondition(in, apiextensions.Established); old != nil {
|
if old := apiextensionshelpers.FindCRDCondition(in, apiextensionsv1.Established); old != nil {
|
||||||
establishedCondition = *old
|
establishedCondition = *old
|
||||||
}
|
}
|
||||||
if establishedCondition.Status != apiextensions.ConditionTrue && namesAcceptedCondition.Status == apiextensions.ConditionTrue {
|
if establishedCondition.Status != apiextensionsv1.ConditionTrue && namesAcceptedCondition.Status == apiextensionsv1.ConditionTrue {
|
||||||
establishedCondition = apiextensions.CustomResourceDefinitionCondition{
|
establishedCondition = apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "Installing",
|
Reason: "Installing",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
}
|
}
|
||||||
@@ -252,7 +252,7 @@ func (c *NamingConditionController) sync(key string) error {
|
|||||||
|
|
||||||
// nothing to do if accepted names and NamesAccepted condition didn't change
|
// nothing to do if accepted names and NamesAccepted condition didn't change
|
||||||
if reflect.DeepEqual(inCustomResourceDefinition.Status.AcceptedNames, acceptedNames) &&
|
if reflect.DeepEqual(inCustomResourceDefinition.Status.AcceptedNames, acceptedNames) &&
|
||||||
apiextensionshelpers.IsCRDConditionEquivalent(&namingCondition, apiextensionshelpers.FindCRDCondition(inCustomResourceDefinition, apiextensions.NamesAccepted)) {
|
apiextensionshelpers.IsCRDConditionEquivalent(&namingCondition, apiextensionshelpers.FindCRDCondition(inCustomResourceDefinition, apiextensionsv1.NamesAccepted)) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -324,7 +324,7 @@ func (c *NamingConditionController) processNextWorkItem() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *NamingConditionController) enqueue(obj *apiextensions.CustomResourceDefinition) {
|
func (c *NamingConditionController) enqueue(obj *apiextensionsv1.CustomResourceDefinition) {
|
||||||
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
|
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utilruntime.HandleError(fmt.Errorf("couldn't get key for object %#v: %v", obj, err))
|
utilruntime.HandleError(fmt.Errorf("couldn't get key for object %#v: %v", obj, err))
|
||||||
@@ -335,26 +335,26 @@ func (c *NamingConditionController) enqueue(obj *apiextensions.CustomResourceDef
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *NamingConditionController) addCustomResourceDefinition(obj interface{}) {
|
func (c *NamingConditionController) addCustomResourceDefinition(obj interface{}) {
|
||||||
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
castObj := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
klog.V(4).Infof("Adding %s", castObj.Name)
|
klog.V(4).Infof("Adding %s", castObj.Name)
|
||||||
c.enqueue(castObj)
|
c.enqueue(castObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *NamingConditionController) updateCustomResourceDefinition(obj, _ interface{}) {
|
func (c *NamingConditionController) updateCustomResourceDefinition(obj, _ interface{}) {
|
||||||
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
castObj := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
klog.V(4).Infof("Updating %s", castObj.Name)
|
klog.V(4).Infof("Updating %s", castObj.Name)
|
||||||
c.enqueue(castObj)
|
c.enqueue(castObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *NamingConditionController) deleteCustomResourceDefinition(obj interface{}) {
|
func (c *NamingConditionController) deleteCustomResourceDefinition(obj interface{}) {
|
||||||
castObj, ok := obj.(*apiextensions.CustomResourceDefinition)
|
castObj, ok := obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.Errorf("Couldn't get object from tombstone %#v", obj)
|
klog.Errorf("Couldn't get object from tombstone %#v", obj)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
castObj, ok = tombstone.Obj.(*apiextensions.CustomResourceDefinition)
|
castObj, ok = tombstone.Obj.(*apiextensionsv1.CustomResourceDefinition)
|
||||||
if !ok {
|
if !ok {
|
||||||
klog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
klog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
||||||
return
|
return
|
||||||
|
@@ -23,24 +23,24 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
apiextensionshelpers "k8s.io/apiextensions-apiserver/pkg/apihelpers"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
)
|
)
|
||||||
|
|
||||||
type crdBuilder struct {
|
type crdBuilder struct {
|
||||||
curr apiextensions.CustomResourceDefinition
|
curr apiextensionsv1.CustomResourceDefinition
|
||||||
}
|
}
|
||||||
|
|
||||||
func newCRD(name string) *crdBuilder {
|
func newCRD(name string) *crdBuilder {
|
||||||
tokens := strings.SplitN(name, ".", 2)
|
tokens := strings.SplitN(name, ".", 2)
|
||||||
return &crdBuilder{
|
return &crdBuilder{
|
||||||
curr: apiextensions.CustomResourceDefinition{
|
curr: apiextensionsv1.CustomResourceDefinition{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: name},
|
ObjectMeta: metav1.ObjectMeta{Name: name},
|
||||||
Spec: apiextensions.CustomResourceDefinitionSpec{
|
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
|
||||||
Group: tokens[1],
|
Group: tokens[1],
|
||||||
Names: apiextensions.CustomResourceDefinitionNames{
|
Names: apiextensionsv1.CustomResourceDefinitionNames{
|
||||||
Plural: tokens[0],
|
Plural: tokens[0],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -68,14 +68,14 @@ func (b *crdBuilder) StatusNames(plural, singular, kind, listKind string, shortN
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *crdBuilder) Condition(c apiextensions.CustomResourceDefinitionCondition) *crdBuilder {
|
func (b *crdBuilder) Condition(c apiextensionsv1.CustomResourceDefinitionCondition) *crdBuilder {
|
||||||
b.curr.Status.Conditions = append(b.curr.Status.Conditions, c)
|
b.curr.Status.Conditions = append(b.curr.Status.Conditions, c)
|
||||||
|
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func names(plural, singular, kind, listKind string, shortNames ...string) apiextensions.CustomResourceDefinitionNames {
|
func names(plural, singular, kind, listKind string, shortNames ...string) apiextensionsv1.CustomResourceDefinitionNames {
|
||||||
ret := apiextensions.CustomResourceDefinitionNames{
|
ret := apiextensionsv1.CustomResourceDefinitionNames{
|
||||||
Plural: plural,
|
Plural: plural,
|
||||||
Singular: singular,
|
Singular: singular,
|
||||||
Kind: kind,
|
Kind: kind,
|
||||||
@@ -85,42 +85,42 @@ func names(plural, singular, kind, listKind string, shortNames ...string) apiext
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *crdBuilder) NewOrDie() *apiextensions.CustomResourceDefinition {
|
func (b *crdBuilder) NewOrDie() *apiextensionsv1.CustomResourceDefinition {
|
||||||
return &b.curr
|
return &b.curr
|
||||||
}
|
}
|
||||||
|
|
||||||
var acceptedCondition = apiextensions.CustomResourceDefinitionCondition{
|
var acceptedCondition = apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionTrue,
|
Status: apiextensionsv1.ConditionTrue,
|
||||||
Reason: "NoConflicts",
|
Reason: "NoConflicts",
|
||||||
Message: "no conflicts found",
|
Message: "no conflicts found",
|
||||||
}
|
}
|
||||||
|
|
||||||
var notAcceptedCondition = apiextensions.CustomResourceDefinitionCondition{
|
var notAcceptedCondition = apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "NotAccepted",
|
Reason: "NotAccepted",
|
||||||
Message: "not all names are accepted",
|
Message: "not all names are accepted",
|
||||||
}
|
}
|
||||||
|
|
||||||
var installingCondition = apiextensions.CustomResourceDefinitionCondition{
|
var installingCondition = apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "Installing",
|
Reason: "Installing",
|
||||||
Message: "the initial names have been accepted",
|
Message: "the initial names have been accepted",
|
||||||
}
|
}
|
||||||
|
|
||||||
var notEstablishedCondition = apiextensions.CustomResourceDefinitionCondition{
|
var notEstablishedCondition = apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.Established,
|
Type: apiextensionsv1.Established,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: "NotAccepted",
|
Reason: "NotAccepted",
|
||||||
Message: "not all names are accepted",
|
Message: "not all names are accepted",
|
||||||
}
|
}
|
||||||
|
|
||||||
func nameConflictCondition(reason, message string) apiextensions.CustomResourceDefinitionCondition {
|
func nameConflictCondition(reason, message string) apiextensionsv1.CustomResourceDefinitionCondition {
|
||||||
return apiextensions.CustomResourceDefinitionCondition{
|
return apiextensionsv1.CustomResourceDefinitionCondition{
|
||||||
Type: apiextensions.NamesAccepted,
|
Type: apiextensionsv1.NamesAccepted,
|
||||||
Status: apiextensions.ConditionFalse,
|
Status: apiextensionsv1.ConditionFalse,
|
||||||
Reason: reason,
|
Reason: reason,
|
||||||
Message: message,
|
Message: message,
|
||||||
}
|
}
|
||||||
@@ -130,17 +130,17 @@ func TestSync(t *testing.T) {
|
|||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
|
||||||
in *apiextensions.CustomResourceDefinition
|
in *apiextensionsv1.CustomResourceDefinition
|
||||||
existing []*apiextensions.CustomResourceDefinition
|
existing []*apiextensionsv1.CustomResourceDefinition
|
||||||
expectedNames apiextensions.CustomResourceDefinitionNames
|
expectedNames apiextensionsv1.CustomResourceDefinitionNames
|
||||||
expectedNameConflictCondition apiextensions.CustomResourceDefinitionCondition
|
expectedNameConflictCondition apiextensionsv1.CustomResourceDefinitionCondition
|
||||||
expectedEstablishedCondition apiextensions.CustomResourceDefinitionCondition
|
expectedEstablishedCondition apiextensionsv1.CustomResourceDefinitionCondition
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "first resource",
|
name: "first resource",
|
||||||
in: newCRD("alfa.bravo.com").NewOrDie(),
|
in: newCRD("alfa.bravo.com").NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{},
|
existing: []*apiextensionsv1.CustomResourceDefinition{},
|
||||||
expectedNames: apiextensions.CustomResourceDefinitionNames{
|
expectedNames: apiextensionsv1.CustomResourceDefinitionNames{
|
||||||
Plural: "alfa",
|
Plural: "alfa",
|
||||||
},
|
},
|
||||||
expectedNameConflictCondition: acceptedCondition,
|
expectedNameConflictCondition: acceptedCondition,
|
||||||
@@ -149,7 +149,7 @@ func TestSync(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "different groups",
|
name: "different groups",
|
||||||
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("alfa.charlie.com").StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
newCRD("alfa.charlie.com").StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
},
|
},
|
||||||
expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
@@ -159,7 +159,7 @@ func TestSync(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "conflict plural to singular",
|
name: "conflict plural to singular",
|
||||||
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("india.bravo.com").StatusNames("india", "alfa", "", "").NewOrDie(),
|
newCRD("india.bravo.com").StatusNames("india", "alfa", "", "").NewOrDie(),
|
||||||
},
|
},
|
||||||
expectedNames: names("", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
expectedNames: names("", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
@@ -169,7 +169,7 @@ func TestSync(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "conflict singular to shortName",
|
name: "conflict singular to shortName",
|
||||||
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("india.bravo.com").StatusNames("india", "indias", "", "", "delta-singular").NewOrDie(),
|
newCRD("india.bravo.com").StatusNames("india", "indias", "", "", "delta-singular").NewOrDie(),
|
||||||
},
|
},
|
||||||
expectedNames: names("alfa", "", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
expectedNames: names("alfa", "", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
@@ -179,7 +179,7 @@ func TestSync(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "conflict on shortName to shortName",
|
name: "conflict on shortName to shortName",
|
||||||
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("india.bravo.com").StatusNames("india", "indias", "", "", "hotel-shortname-2").NewOrDie(),
|
newCRD("india.bravo.com").StatusNames("india", "indias", "", "", "hotel-shortname-2").NewOrDie(),
|
||||||
},
|
},
|
||||||
expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind"),
|
expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind"),
|
||||||
@@ -189,7 +189,7 @@ func TestSync(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "conflict on kind to listkind",
|
name: "conflict on kind to listkind",
|
||||||
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("india.bravo.com").StatusNames("india", "indias", "", "echo-kind").NewOrDie(),
|
newCRD("india.bravo.com").StatusNames("india", "indias", "", "echo-kind").NewOrDie(),
|
||||||
},
|
},
|
||||||
expectedNames: names("alfa", "delta-singular", "", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
expectedNames: names("alfa", "delta-singular", "", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
@@ -199,7 +199,7 @@ func TestSync(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "conflict on listkind to kind",
|
name: "conflict on listkind to kind",
|
||||||
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("india.bravo.com").StatusNames("india", "indias", "foxtrot-listkind", "").NewOrDie(),
|
newCRD("india.bravo.com").StatusNames("india", "indias", "foxtrot-listkind", "").NewOrDie(),
|
||||||
},
|
},
|
||||||
expectedNames: names("alfa", "delta-singular", "echo-kind", "", "golf-shortname-1", "hotel-shortname-2"),
|
expectedNames: names("alfa", "delta-singular", "echo-kind", "", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
@@ -209,7 +209,7 @@ func TestSync(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "no conflict on resource and kind",
|
name: "no conflict on resource and kind",
|
||||||
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("india.bravo.com").StatusNames("india", "echo-kind", "", "").NewOrDie(),
|
newCRD("india.bravo.com").StatusNames("india", "echo-kind", "", "").NewOrDie(),
|
||||||
},
|
},
|
||||||
expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
@@ -222,7 +222,7 @@ func TestSync(t *testing.T) {
|
|||||||
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
StatusNames("zulu", "yankee-singular", "xray-kind", "whiskey-listkind", "victor-shortname-1", "uniform-shortname-2").
|
StatusNames("zulu", "yankee-singular", "xray-kind", "whiskey-listkind", "victor-shortname-1", "uniform-shortname-2").
|
||||||
NewOrDie(),
|
NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("india.bravo.com").StatusNames("india", "indias", "foxtrot-listkind", "", "delta-singular").NewOrDie(),
|
newCRD("india.bravo.com").StatusNames("india", "indias", "foxtrot-listkind", "", "delta-singular").NewOrDie(),
|
||||||
},
|
},
|
||||||
expectedNames: names("alfa", "yankee-singular", "echo-kind", "whiskey-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
expectedNames: names("alfa", "yankee-singular", "echo-kind", "whiskey-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
@@ -235,7 +235,7 @@ func TestSync(t *testing.T) {
|
|||||||
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
StatusNames("zulu", "yankee-singular", "xray-kind", "whiskey-listkind", "victor-shortname-1", "uniform-shortname-2").
|
StatusNames("zulu", "yankee-singular", "xray-kind", "whiskey-listkind", "victor-shortname-1", "uniform-shortname-2").
|
||||||
NewOrDie(),
|
NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("india.bravo.com").StatusNames("india", "indias", "foxtrot-listkind", "", "delta-singular", "golf-shortname-1").NewOrDie(),
|
newCRD("india.bravo.com").StatusNames("india", "indias", "foxtrot-listkind", "", "delta-singular", "golf-shortname-1").NewOrDie(),
|
||||||
},
|
},
|
||||||
expectedNames: names("alfa", "yankee-singular", "echo-kind", "whiskey-listkind", "victor-shortname-1", "uniform-shortname-2"),
|
expectedNames: names("alfa", "yankee-singular", "echo-kind", "whiskey-listkind", "victor-shortname-1", "uniform-shortname-2"),
|
||||||
@@ -248,7 +248,7 @@ func TestSync(t *testing.T) {
|
|||||||
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
NewOrDie(),
|
NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("alfa.bravo.com").
|
newCRD("alfa.bravo.com").
|
||||||
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
@@ -264,7 +264,7 @@ func TestSync(t *testing.T) {
|
|||||||
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1").
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1").
|
||||||
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
NewOrDie(),
|
NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("alfa.bravo.com").
|
newCRD("alfa.bravo.com").
|
||||||
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
@@ -277,8 +277,8 @@ func TestSync(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "installing before with true condition",
|
name: "installing before with true condition",
|
||||||
in: newCRD("alfa.bravo.com").Condition(acceptedCondition).NewOrDie(),
|
in: newCRD("alfa.bravo.com").Condition(acceptedCondition).NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{},
|
existing: []*apiextensionsv1.CustomResourceDefinition{},
|
||||||
expectedNames: apiextensions.CustomResourceDefinitionNames{
|
expectedNames: apiextensionsv1.CustomResourceDefinitionNames{
|
||||||
Plural: "alfa",
|
Plural: "alfa",
|
||||||
},
|
},
|
||||||
expectedNameConflictCondition: acceptedCondition,
|
expectedNameConflictCondition: acceptedCondition,
|
||||||
@@ -287,8 +287,8 @@ func TestSync(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "not installing before with false condition",
|
name: "not installing before with false condition",
|
||||||
in: newCRD("alfa.bravo.com").Condition(notAcceptedCondition).NewOrDie(),
|
in: newCRD("alfa.bravo.com").Condition(notAcceptedCondition).NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{},
|
existing: []*apiextensionsv1.CustomResourceDefinition{},
|
||||||
expectedNames: apiextensions.CustomResourceDefinitionNames{
|
expectedNames: apiextensionsv1.CustomResourceDefinitionNames{
|
||||||
Plural: "alfa",
|
Plural: "alfa",
|
||||||
},
|
},
|
||||||
expectedNameConflictCondition: acceptedCondition,
|
expectedNameConflictCondition: acceptedCondition,
|
||||||
@@ -299,7 +299,7 @@ func TestSync(t *testing.T) {
|
|||||||
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
Condition(acceptedCondition).
|
Condition(acceptedCondition).
|
||||||
NewOrDie(),
|
NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("india.bravo.com").StatusNames("india", "alfa", "", "").NewOrDie(),
|
newCRD("india.bravo.com").StatusNames("india", "alfa", "", "").NewOrDie(),
|
||||||
},
|
},
|
||||||
expectedNames: names("", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
expectedNames: names("", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
@@ -311,7 +311,7 @@ func TestSync(t *testing.T) {
|
|||||||
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
Condition(notAcceptedCondition).
|
Condition(notAcceptedCondition).
|
||||||
NewOrDie(),
|
NewOrDie(),
|
||||||
existing: []*apiextensions.CustomResourceDefinition{
|
existing: []*apiextensionsv1.CustomResourceDefinition{
|
||||||
newCRD("india.bravo.com").StatusNames("india", "alfa", "", "").NewOrDie(),
|
newCRD("india.bravo.com").StatusNames("india", "alfa", "", "").NewOrDie(),
|
||||||
},
|
},
|
||||||
expectedNames: names("", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
expectedNames: names("", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
|
@@ -40,7 +40,7 @@ import (
|
|||||||
etcd3testing "k8s.io/apiserver/pkg/storage/etcd3/testing"
|
etcd3testing "k8s.io/apiserver/pkg/storage/etcd3/testing"
|
||||||
|
|
||||||
apiextensionsinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
apiextensionsinternal "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/apiserver"
|
"k8s.io/apiextensions-apiserver/pkg/apiserver"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/crdserverscheme"
|
"k8s.io/apiextensions-apiserver/pkg/crdserverscheme"
|
||||||
"k8s.io/apiextensions-apiserver/pkg/registry/customresource"
|
"k8s.io/apiextensions-apiserver/pkg/registry/customresource"
|
||||||
@@ -76,7 +76,7 @@ func newStorage(t *testing.T) (customresource.CustomResourceStorage, *etcd3testi
|
|||||||
|
|
||||||
status := &apiextensionsinternal.CustomResourceSubresourceStatus{}
|
status := &apiextensionsinternal.CustomResourceSubresourceStatus{}
|
||||||
|
|
||||||
headers := []apiextensions.CustomResourceColumnDefinition{
|
headers := []apiextensionsv1.CustomResourceColumnDefinition{
|
||||||
{Name: "Age", Type: "date", JSONPath: ".metadata.creationTimestamp"},
|
{Name: "Age", Type: "date", JSONPath: ".metadata.creationTimestamp"},
|
||||||
{Name: "Replicas", Type: "integer", JSONPath: ".spec.replicas"},
|
{Name: "Replicas", Type: "integer", JSONPath: ".spec.replicas"},
|
||||||
{Name: "Missing", Type: "string", JSONPath: ".spec.missing"},
|
{Name: "Missing", Type: "string", JSONPath: ".spec.missing"},
|
||||||
|
@@ -23,7 +23,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
metatable "k8s.io/apimachinery/pkg/api/meta/table"
|
metatable "k8s.io/apimachinery/pkg/api/meta/table"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@@ -36,7 +36,7 @@ var swaggerMetadataDescriptions = metav1.ObjectMeta{}.SwaggerDoc()
|
|||||||
|
|
||||||
// New creates a new table convertor for the provided CRD column definition. If the printer definition cannot be parsed,
|
// New creates a new table convertor for the provided CRD column definition. If the printer definition cannot be parsed,
|
||||||
// error will be returned along with a default table convertor.
|
// error will be returned along with a default table convertor.
|
||||||
func New(crdColumns []apiextensions.CustomResourceColumnDefinition) (rest.TableConvertor, error) {
|
func New(crdColumns []apiextensionsv1.CustomResourceColumnDefinition) (rest.TableConvertor, error) {
|
||||||
headers := []metav1.TableColumnDefinition{
|
headers := []metav1.TableColumnDefinition{
|
||||||
{Name: "Name", Type: "string", Format: "name", Description: swaggerMetadataDescriptions["name"]},
|
{Name: "Name", Type: "string", Format: "name", Description: swaggerMetadataDescriptions["name"]},
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user