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 }