github.com/timstclair/heapster@v0.20.0-alpha1/Godeps/_workspace/src/k8s.io/kubernetes/pkg/client/unversioned/events.go (about)

     1  /*
     2  Copyright 2014 The Kubernetes Authors All rights reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package unversioned
    18  
    19  import (
    20  	"fmt"
    21  
    22  	"k8s.io/kubernetes/pkg/api"
    23  	"k8s.io/kubernetes/pkg/fields"
    24  	"k8s.io/kubernetes/pkg/labels"
    25  	"k8s.io/kubernetes/pkg/runtime"
    26  	"k8s.io/kubernetes/pkg/watch"
    27  )
    28  
    29  // EventNamespacer can return an EventInterface for the given namespace.
    30  type EventNamespacer interface {
    31  	Events(namespace string) EventInterface
    32  }
    33  
    34  // EventInterface has methods to work with Event resources
    35  type EventInterface interface {
    36  	Create(event *api.Event) (*api.Event, error)
    37  	Update(event *api.Event) (*api.Event, error)
    38  	Patch(event *api.Event, data []byte) (*api.Event, error)
    39  	List(label labels.Selector, field fields.Selector) (*api.EventList, error)
    40  	Get(name string) (*api.Event, error)
    41  	Watch(label labels.Selector, field fields.Selector, opts api.ListOptions) (watch.Interface, error)
    42  	// Search finds events about the specified object
    43  	Search(objOrRef runtime.Object) (*api.EventList, error)
    44  	Delete(name string) error
    45  	// Returns the appropriate field selector based on the API version being used to communicate with the server.
    46  	// The returned field selector can be used with List and Watch to filter desired events.
    47  	GetFieldSelector(involvedObjectName, involvedObjectNamespace, involvedObjectKind, involvedObjectUID *string) fields.Selector
    48  }
    49  
    50  // events implements Events interface
    51  type events struct {
    52  	client    *Client
    53  	namespace string
    54  }
    55  
    56  // newEvents returns a new events object.
    57  func newEvents(c *Client, ns string) *events {
    58  	return &events{
    59  		client:    c,
    60  		namespace: ns,
    61  	}
    62  }
    63  
    64  // Create makes a new event. Returns the copy of the event the server returns,
    65  // or an error. The namespace to create the event within is deduced from the
    66  // event; it must either match this event client's namespace, or this event
    67  // client must have been created with the "" namespace.
    68  func (e *events) Create(event *api.Event) (*api.Event, error) {
    69  	if e.namespace != "" && event.Namespace != e.namespace {
    70  		return nil, fmt.Errorf("can't create an event with namespace '%v' in namespace '%v'", event.Namespace, e.namespace)
    71  	}
    72  	result := &api.Event{}
    73  	err := e.client.Post().
    74  		NamespaceIfScoped(event.Namespace, len(event.Namespace) > 0).
    75  		Resource("events").
    76  		Body(event).
    77  		Do().
    78  		Into(result)
    79  	return result, err
    80  }
    81  
    82  // Update modifies an existing event. It returns the copy of the event that the server returns,
    83  // or an error. The namespace and key to update the event within is deduced from the event. The
    84  // namespace must either match this event client's namespace, or this event client must have been
    85  // created with the "" namespace. Update also requires the ResourceVersion to be set in the event
    86  // object.
    87  func (e *events) Update(event *api.Event) (*api.Event, error) {
    88  	if len(event.ResourceVersion) == 0 {
    89  		return nil, fmt.Errorf("invalid event update object, missing resource version: %#v", event)
    90  	}
    91  	result := &api.Event{}
    92  	err := e.client.Put().
    93  		NamespaceIfScoped(event.Namespace, len(event.Namespace) > 0).
    94  		Resource("events").
    95  		Name(event.Name).
    96  		Body(event).
    97  		Do().
    98  		Into(result)
    99  	return result, err
   100  }
   101  
   102  // Patch modifies an existing event. It returns the copy of the event that the server returns, or an
   103  // error. The namespace and name of the target event is deduced from the incompleteEvent. The
   104  // namespace must either match this event client's namespace, or this event client must have been
   105  // created with the "" namespace.
   106  func (e *events) Patch(incompleteEvent *api.Event, data []byte) (*api.Event, error) {
   107  	result := &api.Event{}
   108  	err := e.client.Patch(api.StrategicMergePatchType).
   109  		NamespaceIfScoped(incompleteEvent.Namespace, len(incompleteEvent.Namespace) > 0).
   110  		Resource("events").
   111  		Name(incompleteEvent.Name).
   112  		Body(data).
   113  		Do().
   114  		Into(result)
   115  	return result, err
   116  }
   117  
   118  // List returns a list of events matching the selectors.
   119  func (e *events) List(label labels.Selector, field fields.Selector) (*api.EventList, error) {
   120  	result := &api.EventList{}
   121  	err := e.client.Get().
   122  		NamespaceIfScoped(e.namespace, len(e.namespace) > 0).
   123  		Resource("events").
   124  		LabelsSelectorParam(label).
   125  		FieldsSelectorParam(field).
   126  		Do().
   127  		Into(result)
   128  	return result, err
   129  }
   130  
   131  // Get returns the given event, or an error.
   132  func (e *events) Get(name string) (*api.Event, error) {
   133  	result := &api.Event{}
   134  	err := e.client.Get().
   135  		NamespaceIfScoped(e.namespace, len(e.namespace) > 0).
   136  		Resource("events").
   137  		Name(name).
   138  		Do().
   139  		Into(result)
   140  	return result, err
   141  }
   142  
   143  // Watch starts watching for events matching the given selectors.
   144  func (e *events) Watch(label labels.Selector, field fields.Selector, opts api.ListOptions) (watch.Interface, error) {
   145  	return e.client.Get().
   146  		Prefix("watch").
   147  		NamespaceIfScoped(e.namespace, len(e.namespace) > 0).
   148  		Resource("events").
   149  		VersionedParams(&opts, api.Scheme).
   150  		LabelsSelectorParam(label).
   151  		FieldsSelectorParam(field).
   152  		Watch()
   153  }
   154  
   155  // Search finds events about the specified object. The namespace of the
   156  // object must match this event's client namespace unless the event client
   157  // was made with the "" namespace.
   158  func (e *events) Search(objOrRef runtime.Object) (*api.EventList, error) {
   159  	ref, err := api.GetReference(objOrRef)
   160  	if err != nil {
   161  		return nil, err
   162  	}
   163  	if e.namespace != "" && ref.Namespace != e.namespace {
   164  		return nil, fmt.Errorf("won't be able to find any events of namespace '%v' in namespace '%v'", ref.Namespace, e.namespace)
   165  	}
   166  	stringRefKind := string(ref.Kind)
   167  	var refKind *string
   168  	if stringRefKind != "" {
   169  		refKind = &stringRefKind
   170  	}
   171  	stringRefUID := string(ref.UID)
   172  	var refUID *string
   173  	if stringRefUID != "" {
   174  		refUID = &stringRefUID
   175  	}
   176  	fieldSelector := e.GetFieldSelector(&ref.Name, &ref.Namespace, refKind, refUID)
   177  	return e.List(labels.Everything(), fieldSelector)
   178  }
   179  
   180  // Delete deletes an existing event.
   181  func (e *events) Delete(name string) error {
   182  	return e.client.Delete().
   183  		NamespaceIfScoped(e.namespace, len(e.namespace) > 0).
   184  		Resource("events").
   185  		Name(name).
   186  		Do().
   187  		Error()
   188  }
   189  
   190  // Returns the appropriate field selector based on the API version being used to communicate with the server.
   191  // The returned field selector can be used with List and Watch to filter desired events.
   192  func (e *events) GetFieldSelector(involvedObjectName, involvedObjectNamespace, involvedObjectKind, involvedObjectUID *string) fields.Selector {
   193  	apiVersion := e.client.APIVersion()
   194  	field := fields.Set{}
   195  	if involvedObjectName != nil {
   196  		field[getInvolvedObjectNameFieldLabel(apiVersion)] = *involvedObjectName
   197  	}
   198  	if involvedObjectNamespace != nil {
   199  		field["involvedObject.namespace"] = *involvedObjectNamespace
   200  	}
   201  	if involvedObjectKind != nil {
   202  		field["involvedObject.kind"] = *involvedObjectKind
   203  	}
   204  	if involvedObjectUID != nil {
   205  		field["involvedObject.uid"] = *involvedObjectUID
   206  	}
   207  	return field.AsSelector()
   208  }
   209  
   210  // Returns the appropriate field label to use for name of the involved object as per the given API version.
   211  func getInvolvedObjectNameFieldLabel(version string) string {
   212  	return "involvedObject.name"
   213  }