mirror of https://github.com/knative/pkg.git
				
				
				
			Create an interface for retrieving duck-type fields (#1275)
* Split KResource into a file. Include an interface. * Update apis/duck/v1/kresource_type.go Co-authored-by: Matt Moore <mattmoor@vmware.com> * type * rename to KRShaped Co-authored-by: Matt Moore <mattmoor@vmware.com>
This commit is contained in:
		
							parent
							
								
									10ba977860
								
							
						
					
					
						commit
						4a2ba059b0
					
				|  | @ -0,0 +1,95 @@ | ||||||
|  | /* | ||||||
|  | Copyright 2020 The Knative Authors | ||||||
|  | 
 | ||||||
|  | Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | you may not use this file except in compliance with the License. | ||||||
|  | You may obtain a copy of the License at | ||||||
|  | 
 | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | 
 | ||||||
|  | Unless required by applicable law or agreed to in writing, software | ||||||
|  | distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | See the License for the specific language governing permissions and | ||||||
|  | limitations under the License. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | package v1 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"time" | ||||||
|  | 
 | ||||||
|  | 	corev1 "k8s.io/api/core/v1" | ||||||
|  | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
|  | 	"k8s.io/apimachinery/pkg/runtime" | ||||||
|  | 
 | ||||||
|  | 	"knative.dev/pkg/apis" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // KRShaped is an interface for retrieving the duck elements of an arbitraty resource.
 | ||||||
|  | type KRShaped interface { | ||||||
|  | 	GetTypeMeta() *metav1.TypeMeta | ||||||
|  | 
 | ||||||
|  | 	GetObjectMeta() *metav1.ObjectMeta | ||||||
|  | 
 | ||||||
|  | 	GetStatus() *Status | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Asserts KResource conformance with KRShaped
 | ||||||
|  | var _ KRShaped = (*KResource)(nil) | ||||||
|  | 
 | ||||||
|  | // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | ||||||
|  | 
 | ||||||
|  | // KResource is a skeleton type wrapping Conditions in the manner we expect
 | ||||||
|  | // resource writers defining compatible resources to embed it.  We will
 | ||||||
|  | // typically use this type to deserialize Conditions ObjectReferences and
 | ||||||
|  | // access the Conditions data.  This is not a real resource.
 | ||||||
|  | type KResource struct { | ||||||
|  | 	metav1.TypeMeta   `json:",inline"` | ||||||
|  | 	metav1.ObjectMeta `json:"metadata,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	Status Status `json:"status"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Populate implements duck.Populatable
 | ||||||
|  | func (t *KResource) Populate() { | ||||||
|  | 	t.Status.ObservedGeneration = 42 | ||||||
|  | 	t.Status.Conditions = Conditions{{ | ||||||
|  | 		// Populate ALL fields
 | ||||||
|  | 		Type:               "Birthday", | ||||||
|  | 		Status:             corev1.ConditionTrue, | ||||||
|  | 		LastTransitionTime: apis.VolatileTime{Inner: metav1.NewTime(time.Date(1984, 02, 28, 18, 52, 00, 00, time.UTC))}, | ||||||
|  | 		Reason:             "Celebrate", | ||||||
|  | 		Message:            "n3wScott, find your party hat :tada:", | ||||||
|  | 	}} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetListType implements apis.Listable
 | ||||||
|  | func (*KResource) GetListType() runtime.Object { | ||||||
|  | 	return &KResourceList{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | ||||||
|  | 
 | ||||||
|  | // KResourceList is a list of KResource resources
 | ||||||
|  | type KResourceList struct { | ||||||
|  | 	metav1.TypeMeta `json:",inline"` | ||||||
|  | 	metav1.ListMeta `json:"metadata"` | ||||||
|  | 
 | ||||||
|  | 	Items []KResource `json:"items"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetTypeMeta retrieves the ObjectMeta of the KResource. Implements the KRShaped interface.
 | ||||||
|  | func (t *KResource) GetTypeMeta() *metav1.TypeMeta { | ||||||
|  | 	return &t.TypeMeta | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetObjectMeta retrieves the ObjectMeta of the KResource. Implements the KRShaped interface.
 | ||||||
|  | func (t *KResource) GetObjectMeta() *metav1.ObjectMeta { | ||||||
|  | 	return &t.ObjectMeta | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetStatus retrieves the status of the KResource. Implements the KRShaped interface.
 | ||||||
|  | func (t *KResource) GetStatus() *Status { | ||||||
|  | 	return &t.Status | ||||||
|  | } | ||||||
|  | @ -18,11 +18,6 @@ package v1 | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"time" |  | ||||||
| 
 |  | ||||||
| 	corev1 "k8s.io/api/core/v1" |  | ||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |  | ||||||
| 	"k8s.io/apimachinery/pkg/runtime" |  | ||||||
| 
 | 
 | ||||||
| 	"knative.dev/pkg/apis" | 	"knative.dev/pkg/apis" | ||||||
| 	"knative.dev/pkg/apis/duck" | 	"knative.dev/pkg/apis/duck" | ||||||
|  | @ -36,19 +31,6 @@ type Conditions apis.Conditions | ||||||
| // Conditions is an Implementable "duck type".
 | // Conditions is an Implementable "duck type".
 | ||||||
| var _ duck.Implementable = (*Conditions)(nil) | var _ duck.Implementable = (*Conditions)(nil) | ||||||
| 
 | 
 | ||||||
| // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 |  | ||||||
| 
 |  | ||||||
| // KResource is a skeleton type wrapping Conditions in the manner we expect
 |  | ||||||
| // resource writers defining compatible resources to embed it.  We will
 |  | ||||||
| // typically use this type to deserialize Conditions ObjectReferences and
 |  | ||||||
| // access the Conditions data.  This is not a real resource.
 |  | ||||||
| type KResource struct { |  | ||||||
| 	metav1.TypeMeta   `json:",inline"` |  | ||||||
| 	metav1.ObjectMeta `json:"metadata,omitempty"` |  | ||||||
| 
 |  | ||||||
| 	Status Status `json:"status"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Status shows how we expect folks to embed Conditions in
 | // Status shows how we expect folks to embed Conditions in
 | ||||||
| // their Status field.
 | // their Status field.
 | ||||||
| // WARNING: Adding fields to this struct will add them to all Knative resources.
 | // WARNING: Adding fields to this struct will add them to all Knative resources.
 | ||||||
|  | @ -126,31 +108,3 @@ func (source *Status) ConvertTo(ctx context.Context, sink *Status, predicates .. | ||||||
| 
 | 
 | ||||||
| 	sink.SetConditions(conditions) | 	sink.SetConditions(conditions) | ||||||
| } | } | ||||||
| 
 |  | ||||||
| // Populate implements duck.Populatable
 |  | ||||||
| func (t *KResource) Populate() { |  | ||||||
| 	t.Status.ObservedGeneration = 42 |  | ||||||
| 	t.Status.Conditions = Conditions{{ |  | ||||||
| 		// Populate ALL fields
 |  | ||||||
| 		Type:               "Birthday", |  | ||||||
| 		Status:             corev1.ConditionTrue, |  | ||||||
| 		LastTransitionTime: apis.VolatileTime{Inner: metav1.NewTime(time.Date(1984, 02, 28, 18, 52, 00, 00, time.UTC))}, |  | ||||||
| 		Reason:             "Celebrate", |  | ||||||
| 		Message:            "n3wScott, find your party hat :tada:", |  | ||||||
| 	}} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // GetListType implements apis.Listable
 |  | ||||||
| func (*KResource) GetListType() runtime.Object { |  | ||||||
| 	return &KResourceList{} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 |  | ||||||
| 
 |  | ||||||
| // KResourceList is a list of KResource resources
 |  | ||||||
| type KResourceList struct { |  | ||||||
| 	metav1.TypeMeta `json:",inline"` |  | ||||||
| 	metav1.ListMeta `json:"metadata"` |  | ||||||
| 
 |  | ||||||
| 	Items []KResource `json:"items"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue