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