Skip to content

Commit 69e2a9c

Browse files
author
gmarek
committed
Add new Events API group
1 parent 2a724df commit 69e2a9c

File tree

37 files changed

+1045
-16
lines changed

37 files changed

+1045
-16
lines changed

cmd/kube-apiserver/app/aggregator.go

+1
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ var apiVersionPriorities = map[schema.GroupVersion]priority{
205205
{Group: "apps", Version: "v1beta1"}: {group: 17800, version: 1},
206206
{Group: "apps", Version: "v1beta2"}: {group: 17800, version: 9},
207207
{Group: "apps", Version: "v1"}: {group: 17800, version: 15},
208+
{Group: "events.k8s.io", Version: "v1beta1"}: {group: 17750, version: 5},
208209
{Group: "authentication.k8s.io", Version: "v1"}: {group: 17700, version: 15},
209210
{Group: "authentication.k8s.io", Version: "v1beta1"}: {group: 17700, version: 9},
210211
{Group: "authorization.k8s.io", Version: "v1"}: {group: 17600, version: 15},

cmd/kube-apiserver/app/server.go

+2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ import (
6666
"k8s.io/kubernetes/pkg/apis/apps"
6767
"k8s.io/kubernetes/pkg/apis/batch"
6868
api "k8s.io/kubernetes/pkg/apis/core"
69+
"k8s.io/kubernetes/pkg/apis/events"
6970
"k8s.io/kubernetes/pkg/apis/extensions"
7071
"k8s.io/kubernetes/pkg/apis/networking"
7172
"k8s.io/kubernetes/pkg/apis/storage"
@@ -579,6 +580,7 @@ func BuildStorageFactory(s *options.ServerRunOptions) (*serverstorage.DefaultSto
579580
storageFactory.AddCohabitatingResources(extensions.Resource("deployments"), apps.Resource("deployments"))
580581
storageFactory.AddCohabitatingResources(extensions.Resource("daemonsets"), apps.Resource("daemonsets"))
581582
storageFactory.AddCohabitatingResources(extensions.Resource("replicasets"), apps.Resource("replicasets"))
583+
storageFactory.AddCohabitatingResources(api.Resource("events"), events.Resource("events"))
582584
for _, override := range s.Etcd.EtcdServersOverrides {
583585
tokens := strings.Split(override, "#")
584586
if len(tokens) != 2 {

cmd/kube-controller-manager/app/import_known_versions.go

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
_ "k8s.io/kubernetes/pkg/apis/batch/install"
3131
_ "k8s.io/kubernetes/pkg/apis/certificates/install"
3232
_ "k8s.io/kubernetes/pkg/apis/core/install"
33+
_ "k8s.io/kubernetes/pkg/apis/events/install"
3334
_ "k8s.io/kubernetes/pkg/apis/extensions/install"
3435
_ "k8s.io/kubernetes/pkg/apis/policy/install"
3536
_ "k8s.io/kubernetes/pkg/apis/rbac/install"

hack/.golint_failures

+6
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ pkg/apis/core/v1/helper
5353
pkg/apis/core/v1/helper/qos
5454
pkg/apis/core/v1/validation
5555
pkg/apis/core/validation
56+
pkg/apis/events
57+
pkg/apis/events/v1beta1
5658
pkg/apis/extensions
5759
pkg/apis/extensions/validation
5860
pkg/apis/imagepolicy
@@ -292,6 +294,7 @@ pkg/registry/core/service/portallocator
292294
pkg/registry/core/service/portallocator/controller
293295
pkg/registry/core/service/storage
294296
pkg/registry/core/serviceaccount/storage
297+
pkg/registry/events/rest
295298
pkg/registry/extensions/controller/storage
296299
pkg/registry/extensions/daemonset
297300
pkg/registry/extensions/daemonset/storage
@@ -449,6 +452,7 @@ staging/src/k8s.io/api/batch/v1beta1
449452
staging/src/k8s.io/api/batch/v2alpha1
450453
staging/src/k8s.io/api/certificates/v1beta1
451454
staging/src/k8s.io/api/core/v1
455+
staging/src/k8s.io/api/events/v1beta1
452456
staging/src/k8s.io/api/extensions/v1beta1
453457
staging/src/k8s.io/api/imagepolicy/v1alpha1
454458
staging/src/k8s.io/api/networking/v1
@@ -659,6 +663,8 @@ staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1
659663
staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake
660664
staging/src/k8s.io/client-go/kubernetes/typed/core/v1
661665
staging/src/k8s.io/client-go/kubernetes/typed/core/v1/fake
666+
staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1
667+
staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake
662668
staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1
663669
staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake
664670
staging/src/k8s.io/client-go/kubernetes/typed/networking/v1

hack/lib/init.sh

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ batch/v1beta1 \
6969
batch/v2alpha1 \
7070
certificates.k8s.io/v1beta1 \
7171
extensions/v1beta1 \
72+
events.k8s.io/v1beta1 \
7273
imagepolicy.k8s.io/v1alpha1 \
7374
networking.k8s.io/v1 \
7475
policy/v1beta1 \

hack/update-codegen.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ for gv in "${GROUP_VERSIONS[@]}"; do
5959
# collect internal groups
6060
int_group="${pkg_dir%/*}/"
6161
if [[ "${pkg_dir}" = core/* ]]; then
62-
int_group="api/"
62+
int_group="api/"
6363
fi
6464
if ! [[ " ${INTERNAL_DIRS[@]:-} " =~ " ${int_group} " ]]; then
65-
INTERNAL_DIRS+=("${int_group}")
65+
INTERNAL_DIRS+=("${int_group}")
6666
fi
6767
done
6868
# delimit by commas for the command

hack/update-generated-protobuf-dockerized.sh

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ PACKAGES=(
6060
k8s.io/api/apps/v1
6161
k8s.io/api/authentication/v1
6262
k8s.io/api/authentication/v1beta1
63+
k8s.io/api/events/v1beta1
6364
k8s.io/api/rbac/v1alpha1
6465
k8s.io/api/rbac/v1beta1
6566
k8s.io/api/rbac/v1

pkg/api/testapi/testapi.go

+13
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import (
4343
"k8s.io/kubernetes/pkg/apis/batch"
4444
"k8s.io/kubernetes/pkg/apis/certificates"
4545
api "k8s.io/kubernetes/pkg/apis/core"
46+
"k8s.io/kubernetes/pkg/apis/events"
4647
"k8s.io/kubernetes/pkg/apis/extensions"
4748
"k8s.io/kubernetes/pkg/apis/imagepolicy"
4849
"k8s.io/kubernetes/pkg/apis/networking"
@@ -62,6 +63,7 @@ import (
6263
_ "k8s.io/kubernetes/pkg/apis/certificates/install"
6364
_ "k8s.io/kubernetes/pkg/apis/componentconfig/install"
6465
_ "k8s.io/kubernetes/pkg/apis/core/install"
66+
_ "k8s.io/kubernetes/pkg/apis/events/install"
6567
_ "k8s.io/kubernetes/pkg/apis/extensions/install"
6668
_ "k8s.io/kubernetes/pkg/apis/imagepolicy/install"
6769
_ "k8s.io/kubernetes/pkg/apis/networking/install"
@@ -79,6 +81,7 @@ var (
7981
Autoscaling TestGroup
8082
Batch TestGroup
8183
Extensions TestGroup
84+
Events TestGroup
8285
Apps TestGroup
8386
Policy TestGroup
8487
Rbac TestGroup
@@ -314,6 +317,15 @@ func init() {
314317
externalTypes: legacyscheme.Scheme.KnownTypes(externalGroupVersion),
315318
}
316319
}
320+
if _, ok := Groups[events.GroupName]; !ok {
321+
externalGroupVersion := schema.GroupVersion{Group: events.GroupName, Version: legacyscheme.Registry.GroupOrDie(events.GroupName).GroupVersion.Version}
322+
Groups[events.GroupName] = TestGroup{
323+
externalGroupVersion: externalGroupVersion,
324+
internalGroupVersion: events.SchemeGroupVersion,
325+
internalTypes: legacyscheme.Scheme.KnownTypes(events.SchemeGroupVersion),
326+
externalTypes: legacyscheme.Scheme.KnownTypes(externalGroupVersion),
327+
}
328+
}
317329

318330
Default = Groups[api.GroupName]
319331
Autoscaling = Groups[autoscaling.GroupName]
@@ -322,6 +334,7 @@ func init() {
322334
Policy = Groups[policy.GroupName]
323335
Certificates = Groups[certificates.GroupName]
324336
Extensions = Groups[extensions.GroupName]
337+
Events = Groups[events.GroupName]
325338
Rbac = Groups[rbac.GroupName]
326339
Scheduling = Groups[scheduling.GroupName]
327340
Settings = Groups[settings.GroupName]

pkg/apis/core/field_constants.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ const (
2525
PodStatusField = "status.phase"
2626
SecretTypeField = "type"
2727

28-
EventReasonField = "reason"
29-
EventSourceField = "source"
28+
EventReasonField = "action"
29+
EventSourceField = "reportingComponent"
3030
EventTypeField = "type"
3131
EventInvolvedKindField = "involvedObject.kind"
3232
EventInvolvedNamespaceField = "involvedObject.namespace"

pkg/apis/core/fuzzer/fuzzer.go

+9
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@ package fuzzer
1919
import (
2020
"reflect"
2121
"strconv"
22+
"time"
2223

2324
fuzz "github.com/google/gofuzz"
2425

2526
"k8s.io/apimachinery/pkg/api/resource"
27+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2628
"k8s.io/apimachinery/pkg/fields"
2729
"k8s.io/apimachinery/pkg/labels"
2830
"k8s.io/apimachinery/pkg/runtime"
@@ -483,5 +485,12 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} {
483485
c.FuzzNoCustom(s)
484486
s.Allocatable = s.Capacity
485487
},
488+
func(e *core.Event, c fuzz.Continue) {
489+
c.FuzzNoCustom(e)
490+
e.EventTime = metav1.MicroTime{Time: time.Unix(1, 1000)}
491+
if e.Series != nil {
492+
e.Series.LastObservedTime = metav1.MicroTime{Time: time.Unix(3, 3000)}
493+
}
494+
},
486495
}
487496
}

pkg/apis/core/types.go

+43-2
Original file line numberDiff line numberDiff line change
@@ -3958,7 +3958,7 @@ type Event struct {
39583958
// +optional
39593959
metav1.ObjectMeta
39603960

3961-
// Required. The object that this event is about.
3961+
// Required. The object that this event is about. Mapped to events.Event.regarding
39623962
// +optional
39633963
InvolvedObject ObjectReference
39643964

@@ -3970,7 +3970,7 @@ type Event struct {
39703970
Reason string
39713971

39723972
// Optional. A human-readable description of the status of this operation.
3973-
// TODO: decide on maximum length.
3973+
// TODO: decide on maximum length. Mapped to events.Event.note
39743974
// +optional
39753975
Message string
39763976

@@ -3993,8 +3993,49 @@ type Event struct {
39933993
// Type of this event (Normal, Warning), new types could be added in the future.
39943994
// +optional
39953995
Type string
3996+
3997+
// Time when this Event was first observed.
3998+
// +optional
3999+
EventTime metav1.MicroTime
4000+
4001+
// Data about the Event series this event represents or nil if it's a singleton Event.
4002+
// +optional
4003+
Series *EventSeries
4004+
4005+
// What action was taken/failed regarding to the Regarding object.
4006+
// +optional
4007+
Action string
4008+
4009+
// Optional secondary object for more complex actions.
4010+
// +optional
4011+
Related *ObjectReference
4012+
4013+
// Name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`.
4014+
// +optional
4015+
ReportingController string
4016+
4017+
// ID of the controller instance, e.g. `kubelet-xyzf`.
4018+
// +optional
4019+
ReportingInstance string
4020+
}
4021+
4022+
type EventSeries struct {
4023+
// Number of occurrences in this series up to the last heartbeat time
4024+
Count int32
4025+
// Time of the last occurence observed
4026+
LastObservedTime metav1.MicroTime
4027+
// State of this Series: Ongoing or Finished
4028+
State EventSeriesState
39964029
}
39974030

4031+
type EventSeriesState string
4032+
4033+
const (
4034+
EventSeriesStateOngoing EventSeriesState = "Ongoing"
4035+
EventSeriesStateFinished EventSeriesState = "Finished"
4036+
EventSeriesStateUnknown EventSeriesState = "Unknown"
4037+
)
4038+
39984039
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
39994040

40004041
// EventList is a list of events.

pkg/apis/core/validation/events.go

+53-8
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package validation
1818

1919
import (
2020
"fmt"
21+
"time"
2122

2223
"k8s.io/apimachinery/pkg/api/meta"
2324
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -28,24 +29,68 @@ import (
2829
"k8s.io/kubernetes/pkg/apis/core"
2930
)
3031

32+
const (
33+
ReportingInstanceLengthLimit = 128
34+
ActionLengthLimit = 128
35+
ReasonLengthLimit = 128
36+
NoteLengthLimit = 1024
37+
)
38+
3139
// ValidateEvent makes sure that the event makes sense.
3240
func ValidateEvent(event *core.Event) field.ErrorList {
3341
allErrs := field.ErrorList{}
42+
// Because go
43+
zeroTime := time.Time{}
3444

35-
// Make sure event.Namespace and the involvedObject.Namespace agree
36-
if len(event.InvolvedObject.Namespace) == 0 {
37-
// event.Namespace must also be empty (or "default", for compatibility with old clients)
38-
if event.Namespace != metav1.NamespaceNone && event.Namespace != metav1.NamespaceDefault {
39-
allErrs = append(allErrs, field.Invalid(field.NewPath("involvedObject", "namespace"), event.InvolvedObject.Namespace, "does not match event.namespace"))
45+
// "New" Events need to have EventTime set, so it's validating old object.
46+
if event.EventTime.Time == zeroTime {
47+
// Make sure event.Namespace and the involvedInvolvedObject.Namespace agree
48+
if len(event.InvolvedObject.Namespace) == 0 {
49+
// event.Namespace must also be empty (or "default", for compatibility with old clients)
50+
if event.Namespace != metav1.NamespaceNone && event.Namespace != metav1.NamespaceDefault {
51+
allErrs = append(allErrs, field.Invalid(field.NewPath("involvedObject", "namespace"), event.InvolvedObject.Namespace, "does not match event.namespace"))
52+
}
53+
} else {
54+
// event namespace must match
55+
if event.Namespace != event.InvolvedObject.Namespace {
56+
allErrs = append(allErrs, field.Invalid(field.NewPath("involvedObject", "namespace"), event.InvolvedObject.Namespace, "does not match event.namespace"))
57+
}
4058
}
59+
4160
} else {
42-
// event namespace must match
43-
if event.Namespace != event.InvolvedObject.Namespace {
61+
if len(event.InvolvedObject.Namespace) == 0 && event.Namespace != metav1.NamespaceSystem {
4462
allErrs = append(allErrs, field.Invalid(field.NewPath("involvedObject", "namespace"), event.InvolvedObject.Namespace, "does not match event.namespace"))
4563
}
64+
if len(event.ReportingController) == 0 {
65+
allErrs = append(allErrs, field.Required(field.NewPath("reportingController"), ""))
66+
}
67+
for _, msg := range validation.IsQualifiedName(event.ReportingController) {
68+
allErrs = append(allErrs, field.Invalid(field.NewPath("reportingController"), event.ReportingController, msg))
69+
}
70+
if len(event.ReportingInstance) == 0 {
71+
allErrs = append(allErrs, field.Required(field.NewPath("reportingInstance"), ""))
72+
}
73+
if len(event.ReportingInstance) > ReportingInstanceLengthLimit {
74+
allErrs = append(allErrs, field.Invalid(field.NewPath("repotingIntance"), "", fmt.Sprintf("can have at most %v characters", ReportingInstanceLengthLimit)))
75+
}
76+
if len(event.Action) == 0 {
77+
allErrs = append(allErrs, field.Required(field.NewPath("action"), ""))
78+
}
79+
if len(event.Action) > ActionLengthLimit {
80+
allErrs = append(allErrs, field.Invalid(field.NewPath("action"), "", fmt.Sprintf("can have at most %v characters", ActionLengthLimit)))
81+
}
82+
if len(event.Reason) == 0 {
83+
allErrs = append(allErrs, field.Required(field.NewPath("reason"), ""))
84+
}
85+
if len(event.Reason) > ReasonLengthLimit {
86+
allErrs = append(allErrs, field.Invalid(field.NewPath("reason"), "", fmt.Sprintf("can have at most %v characters", ReasonLengthLimit)))
87+
}
88+
if len(event.Message) > NoteLengthLimit {
89+
allErrs = append(allErrs, field.Invalid(field.NewPath("message"), "", fmt.Sprintf("can have at most %v characters", NoteLengthLimit)))
90+
}
4691
}
4792

48-
// For kinds we recognize, make sure involvedObject.Namespace is set for namespaced kinds
93+
// For kinds we recognize, make sure InvolvedObject.Namespace is set for namespaced kinds
4994
if namespaced, err := isNamespacedKind(event.InvolvedObject.Kind, event.InvolvedObject.APIVersion); err == nil {
5095
if namespaced && len(event.InvolvedObject.Namespace) == 0 {
5196
allErrs = append(allErrs, field.Required(field.NewPath("involvedObject", "namespace"), fmt.Sprintf("required for kind %s", event.InvolvedObject.Kind)))

0 commit comments

Comments
 (0)