mirror of
https://github.com/rocky-linux/peridot.git
synced 2024-10-19 07:55:07 +00:00
166 lines
6.6 KiB
Go
166 lines
6.6 KiB
Go
|
/*
|
||
|
Copyright 2016 The Kubernetes 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 (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
|
||
|
v1 "k8s.io/api/core/v1"
|
||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||
|
"k8s.io/apimachinery/pkg/fields"
|
||
|
"k8s.io/apimachinery/pkg/runtime"
|
||
|
"k8s.io/apimachinery/pkg/types"
|
||
|
ref "k8s.io/client-go/tools/reference"
|
||
|
)
|
||
|
|
||
|
// The EventExpansion interface allows manually adding extra methods to the EventInterface.
|
||
|
type EventExpansion interface {
|
||
|
// CreateWithEventNamespace is the same as a Create, except that it sends the request to the event.Namespace.
|
||
|
CreateWithEventNamespace(event *v1.Event) (*v1.Event, error)
|
||
|
// UpdateWithEventNamespace is the same as a Update, except that it sends the request to the event.Namespace.
|
||
|
UpdateWithEventNamespace(event *v1.Event) (*v1.Event, error)
|
||
|
PatchWithEventNamespace(event *v1.Event, data []byte) (*v1.Event, error)
|
||
|
// Search finds events about the specified object
|
||
|
Search(scheme *runtime.Scheme, objOrRef runtime.Object) (*v1.EventList, error)
|
||
|
// Returns the appropriate field selector based on the API version being used to communicate with the server.
|
||
|
// The returned field selector can be used with List and Watch to filter desired events.
|
||
|
GetFieldSelector(involvedObjectName, involvedObjectNamespace, involvedObjectKind, involvedObjectUID *string) fields.Selector
|
||
|
}
|
||
|
|
||
|
// CreateWithEventNamespace makes a new event. Returns the copy of the event the server returns,
|
||
|
// or an error. The namespace to create the event within is deduced from the
|
||
|
// event; it must either match this event client's namespace, or this event
|
||
|
// client must have been created with the "" namespace.
|
||
|
func (e *events) CreateWithEventNamespace(event *v1.Event) (*v1.Event, error) {
|
||
|
if e.ns != "" && event.Namespace != e.ns {
|
||
|
return nil, fmt.Errorf("can't create an event with namespace '%v' in namespace '%v'", event.Namespace, e.ns)
|
||
|
}
|
||
|
result := &v1.Event{}
|
||
|
err := e.client.Post().
|
||
|
NamespaceIfScoped(event.Namespace, len(event.Namespace) > 0).
|
||
|
Resource("events").
|
||
|
Body(event).
|
||
|
Do(context.TODO()).
|
||
|
Into(result)
|
||
|
return result, err
|
||
|
}
|
||
|
|
||
|
// UpdateWithEventNamespace modifies an existing event. It returns the copy of the event that the server returns,
|
||
|
// or an error. The namespace and key to update the event within is deduced from the event. The
|
||
|
// namespace must either match this event client's namespace, or this event client must have been
|
||
|
// created with the "" namespace. Update also requires the ResourceVersion to be set in the event
|
||
|
// object.
|
||
|
func (e *events) UpdateWithEventNamespace(event *v1.Event) (*v1.Event, error) {
|
||
|
result := &v1.Event{}
|
||
|
err := e.client.Put().
|
||
|
NamespaceIfScoped(event.Namespace, len(event.Namespace) > 0).
|
||
|
Resource("events").
|
||
|
Name(event.Name).
|
||
|
Body(event).
|
||
|
Do(context.TODO()).
|
||
|
Into(result)
|
||
|
return result, err
|
||
|
}
|
||
|
|
||
|
// PatchWithEventNamespace modifies an existing event. It returns the copy of
|
||
|
// the event that the server returns, or an error. The namespace and name of the
|
||
|
// target event is deduced from the incompleteEvent. The namespace must either
|
||
|
// match this event client's namespace, or this event client must have been
|
||
|
// created with the "" namespace.
|
||
|
func (e *events) PatchWithEventNamespace(incompleteEvent *v1.Event, data []byte) (*v1.Event, error) {
|
||
|
if e.ns != "" && incompleteEvent.Namespace != e.ns {
|
||
|
return nil, fmt.Errorf("can't patch an event with namespace '%v' in namespace '%v'", incompleteEvent.Namespace, e.ns)
|
||
|
}
|
||
|
result := &v1.Event{}
|
||
|
err := e.client.Patch(types.StrategicMergePatchType).
|
||
|
NamespaceIfScoped(incompleteEvent.Namespace, len(incompleteEvent.Namespace) > 0).
|
||
|
Resource("events").
|
||
|
Name(incompleteEvent.Name).
|
||
|
Body(data).
|
||
|
Do(context.TODO()).
|
||
|
Into(result)
|
||
|
return result, err
|
||
|
}
|
||
|
|
||
|
// Search finds events about the specified object. The namespace of the
|
||
|
// object must match this event's client namespace unless the event client
|
||
|
// was made with the "" namespace.
|
||
|
func (e *events) Search(scheme *runtime.Scheme, objOrRef runtime.Object) (*v1.EventList, error) {
|
||
|
ref, err := ref.GetReference(scheme, objOrRef)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
if len(e.ns) > 0 && ref.Namespace != e.ns {
|
||
|
return nil, fmt.Errorf("won't be able to find any events of namespace '%v' in namespace '%v'", ref.Namespace, e.ns)
|
||
|
}
|
||
|
stringRefKind := string(ref.Kind)
|
||
|
var refKind *string
|
||
|
if len(stringRefKind) > 0 {
|
||
|
refKind = &stringRefKind
|
||
|
}
|
||
|
stringRefUID := string(ref.UID)
|
||
|
var refUID *string
|
||
|
if len(stringRefUID) > 0 {
|
||
|
refUID = &stringRefUID
|
||
|
}
|
||
|
fieldSelector := e.GetFieldSelector(&ref.Name, &ref.Namespace, refKind, refUID)
|
||
|
return e.List(context.TODO(), metav1.ListOptions{FieldSelector: fieldSelector.String()})
|
||
|
}
|
||
|
|
||
|
// Returns the appropriate field selector based on the API version being used to communicate with the server.
|
||
|
// The returned field selector can be used with List and Watch to filter desired events.
|
||
|
func (e *events) GetFieldSelector(involvedObjectName, involvedObjectNamespace, involvedObjectKind, involvedObjectUID *string) fields.Selector {
|
||
|
field := fields.Set{}
|
||
|
if involvedObjectName != nil {
|
||
|
field["involvedObject.name"] = *involvedObjectName
|
||
|
}
|
||
|
if involvedObjectNamespace != nil {
|
||
|
field["involvedObject.namespace"] = *involvedObjectNamespace
|
||
|
}
|
||
|
if involvedObjectKind != nil {
|
||
|
field["involvedObject.kind"] = *involvedObjectKind
|
||
|
}
|
||
|
if involvedObjectUID != nil {
|
||
|
field["involvedObject.uid"] = *involvedObjectUID
|
||
|
}
|
||
|
return field.AsSelector()
|
||
|
}
|
||
|
|
||
|
// Returns the appropriate field label to use for name of the involved object as per the given API version.
|
||
|
// DEPRECATED: please use "involvedObject.name" inline.
|
||
|
func GetInvolvedObjectNameFieldLabel(version string) string {
|
||
|
return "involvedObject.name"
|
||
|
}
|
||
|
|
||
|
// TODO: This is a temporary arrangement and will be removed once all clients are moved to use the clientset.
|
||
|
type EventSinkImpl struct {
|
||
|
Interface EventInterface
|
||
|
}
|
||
|
|
||
|
func (e *EventSinkImpl) Create(event *v1.Event) (*v1.Event, error) {
|
||
|
return e.Interface.CreateWithEventNamespace(event)
|
||
|
}
|
||
|
|
||
|
func (e *EventSinkImpl) Update(event *v1.Event) (*v1.Event, error) {
|
||
|
return e.Interface.UpdateWithEventNamespace(event)
|
||
|
}
|
||
|
|
||
|
func (e *EventSinkImpl) Patch(event *v1.Event, data []byte) (*v1.Event, error) {
|
||
|
return e.Interface.PatchWithEventNamespace(event, data)
|
||
|
}
|