diff --git a/pkg/apis/policy/register.go b/pkg/apis/policy/register.go index d9c26d2e82e..f6f223221b3 100644 --- a/pkg/apis/policy/register.go +++ b/pkg/apis/policy/register.go @@ -50,6 +50,7 @@ func addKnownTypes(scheme *runtime.Scheme) error { &PodDisruptionBudget{}, &PodDisruptionBudgetList{}, &api.ListOptions{}, + &Eviction{}, ) return nil } diff --git a/pkg/apis/policy/types.generated.go b/pkg/apis/policy/types.generated.go index df46abb38b1..0bd6db8e6fa 100644 --- a/pkg/apis/policy/types.generated.go +++ b/pkg/apis/policy/types.generated.go @@ -1320,15 +1320,330 @@ func (x *PodDisruptionBudgetList) codecDecodeSelfFromArray(l int, d *codec1978.D z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x *Eviction) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym112 := z.EncBinary() + _ = yym112 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep113 := !z.EncBinary() + yy2arr113 := z.EncBasicHandle().StructToArray + var yyq113 [4]bool + _, _, _ = yysep113, yyq113, yy2arr113 + const yyr113 bool = false + yyq113[0] = x.Kind != "" + yyq113[1] = x.APIVersion != "" + yyq113[2] = true + yyq113[3] = x.DeleteOptions != nil + var yynn113 int + if yyr113 || yy2arr113 { + r.EncodeArrayStart(4) + } else { + yynn113 = 0 + for _, b := range yyq113 { + if b { + yynn113++ + } + } + r.EncodeMapStart(yynn113) + yynn113 = 0 + } + if yyr113 || yy2arr113 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq113[0] { + yym115 := z.EncBinary() + _ = yym115 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq113[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym116 := z.EncBinary() + _ = yym116 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + } + if yyr113 || yy2arr113 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq113[1] { + yym118 := z.EncBinary() + _ = yym118 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq113[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym119 := z.EncBinary() + _ = yym119 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } + } + if yyr113 || yy2arr113 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq113[2] { + yy121 := &x.ObjectMeta + yy121.CodecEncodeSelf(e) + } else { + r.EncodeNil() + } + } else { + if yyq113[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy122 := &x.ObjectMeta + yy122.CodecEncodeSelf(e) + } + } + if yyr113 || yy2arr113 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq113[3] { + if x.DeleteOptions == nil { + r.EncodeNil() + } else { + x.DeleteOptions.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq113[3] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("deleteOptions")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.DeleteOptions == nil { + r.EncodeNil() + } else { + x.DeleteOptions.CodecEncodeSelf(e) + } + } + } + if yyr113 || yy2arr113 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *Eviction) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym124 := z.DecBinary() + _ = yym124 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct125 := r.ContainerType() + if yyct125 == codecSelferValueTypeMap1234 { + yyl125 := r.ReadMapStart() + if yyl125 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl125, d) + } + } else if yyct125 == codecSelferValueTypeArray1234 { + yyl125 := r.ReadArrayStart() + if yyl125 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl125, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *Eviction) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys126Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys126Slc + var yyhl126 bool = l >= 0 + for yyj126 := 0; ; yyj126++ { + if yyhl126 { + if yyj126 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys126Slc = r.DecodeBytes(yys126Slc, true, true) + yys126 := string(yys126Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys126 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + x.Kind = string(r.DecodeString()) + } + case "apiVersion": + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + x.APIVersion = string(r.DecodeString()) + } + case "metadata": + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg3_api.ObjectMeta{} + } else { + yyv129 := &x.ObjectMeta + yyv129.CodecDecodeSelf(d) + } + case "deleteOptions": + if r.TryDecodeAsNil() { + if x.DeleteOptions != nil { + x.DeleteOptions = nil + } + } else { + if x.DeleteOptions == nil { + x.DeleteOptions = new(pkg3_api.DeleteOptions) + } + x.DeleteOptions.CodecDecodeSelf(d) + } + default: + z.DecStructFieldNotFound(-1, yys126) + } // end switch yys126 + } // end for yyj126 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *Eviction) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj131 int + var yyb131 bool + var yyhl131 bool = l >= 0 + yyj131++ + if yyhl131 { + yyb131 = yyj131 > l + } else { + yyb131 = r.CheckBreak() + } + if yyb131 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + x.Kind = string(r.DecodeString()) + } + yyj131++ + if yyhl131 { + yyb131 = yyj131 > l + } else { + yyb131 = r.CheckBreak() + } + if yyb131 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + x.APIVersion = string(r.DecodeString()) + } + yyj131++ + if yyhl131 { + yyb131 = yyj131 > l + } else { + yyb131 = r.CheckBreak() + } + if yyb131 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg3_api.ObjectMeta{} + } else { + yyv134 := &x.ObjectMeta + yyv134.CodecDecodeSelf(d) + } + yyj131++ + if yyhl131 { + yyb131 = yyj131 > l + } else { + yyb131 = r.CheckBreak() + } + if yyb131 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.DeleteOptions != nil { + x.DeleteOptions = nil + } + } else { + if x.DeleteOptions == nil { + x.DeleteOptions = new(pkg3_api.DeleteOptions) + } + x.DeleteOptions.CodecDecodeSelf(d) + } + for { + yyj131++ + if yyhl131 { + yyb131 = yyj131 > l + } else { + yyb131 = r.CheckBreak() + } + if yyb131 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj131-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + func (x codecSelfer1234) encSlicePodDisruptionBudget(v []PodDisruptionBudget, e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) _, _, _ = h, z, r r.EncodeArrayStart(len(v)) - for _, yyv112 := range v { + for _, yyv136 := range v { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - yy113 := &yyv112 - yy113.CodecEncodeSelf(e) + yy137 := &yyv136 + yy137.CodecEncodeSelf(e) } z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -1338,83 +1653,83 @@ func (x codecSelfer1234) decSlicePodDisruptionBudget(v *[]PodDisruptionBudget, d z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - yyv114 := *v - yyh114, yyl114 := z.DecSliceHelperStart() - var yyc114 bool - if yyl114 == 0 { - if yyv114 == nil { - yyv114 = []PodDisruptionBudget{} - yyc114 = true - } else if len(yyv114) != 0 { - yyv114 = yyv114[:0] - yyc114 = true + yyv138 := *v + yyh138, yyl138 := z.DecSliceHelperStart() + var yyc138 bool + if yyl138 == 0 { + if yyv138 == nil { + yyv138 = []PodDisruptionBudget{} + yyc138 = true + } else if len(yyv138) != 0 { + yyv138 = yyv138[:0] + yyc138 = true } - } else if yyl114 > 0 { - var yyrr114, yyrl114 int - var yyrt114 bool - if yyl114 > cap(yyv114) { + } else if yyl138 > 0 { + var yyrr138, yyrl138 int + var yyrt138 bool + if yyl138 > cap(yyv138) { - yyrg114 := len(yyv114) > 0 - yyv2114 := yyv114 - yyrl114, yyrt114 = z.DecInferLen(yyl114, z.DecBasicHandle().MaxInitLen, 296) - if yyrt114 { - if yyrl114 <= cap(yyv114) { - yyv114 = yyv114[:yyrl114] + yyrg138 := len(yyv138) > 0 + yyv2138 := yyv138 + yyrl138, yyrt138 = z.DecInferLen(yyl138, z.DecBasicHandle().MaxInitLen, 296) + if yyrt138 { + if yyrl138 <= cap(yyv138) { + yyv138 = yyv138[:yyrl138] } else { - yyv114 = make([]PodDisruptionBudget, yyrl114) + yyv138 = make([]PodDisruptionBudget, yyrl138) } } else { - yyv114 = make([]PodDisruptionBudget, yyrl114) + yyv138 = make([]PodDisruptionBudget, yyrl138) } - yyc114 = true - yyrr114 = len(yyv114) - if yyrg114 { - copy(yyv114, yyv2114) + yyc138 = true + yyrr138 = len(yyv138) + if yyrg138 { + copy(yyv138, yyv2138) } - } else if yyl114 != len(yyv114) { - yyv114 = yyv114[:yyl114] - yyc114 = true + } else if yyl138 != len(yyv138) { + yyv138 = yyv138[:yyl138] + yyc138 = true } - yyj114 := 0 - for ; yyj114 < yyrr114; yyj114++ { - yyh114.ElemContainerState(yyj114) + yyj138 := 0 + for ; yyj138 < yyrr138; yyj138++ { + yyh138.ElemContainerState(yyj138) if r.TryDecodeAsNil() { - yyv114[yyj114] = PodDisruptionBudget{} + yyv138[yyj138] = PodDisruptionBudget{} } else { - yyv115 := &yyv114[yyj114] - yyv115.CodecDecodeSelf(d) + yyv139 := &yyv138[yyj138] + yyv139.CodecDecodeSelf(d) } } - if yyrt114 { - for ; yyj114 < yyl114; yyj114++ { - yyv114 = append(yyv114, PodDisruptionBudget{}) - yyh114.ElemContainerState(yyj114) + if yyrt138 { + for ; yyj138 < yyl138; yyj138++ { + yyv138 = append(yyv138, PodDisruptionBudget{}) + yyh138.ElemContainerState(yyj138) if r.TryDecodeAsNil() { - yyv114[yyj114] = PodDisruptionBudget{} + yyv138[yyj138] = PodDisruptionBudget{} } else { - yyv116 := &yyv114[yyj114] - yyv116.CodecDecodeSelf(d) + yyv140 := &yyv138[yyj138] + yyv140.CodecDecodeSelf(d) } } } } else { - yyj114 := 0 - for ; !r.CheckBreak(); yyj114++ { + yyj138 := 0 + for ; !r.CheckBreak(); yyj138++ { - if yyj114 >= len(yyv114) { - yyv114 = append(yyv114, PodDisruptionBudget{}) // var yyz114 PodDisruptionBudget - yyc114 = true + if yyj138 >= len(yyv138) { + yyv138 = append(yyv138, PodDisruptionBudget{}) // var yyz138 PodDisruptionBudget + yyc138 = true } - yyh114.ElemContainerState(yyj114) - if yyj114 < len(yyv114) { + yyh138.ElemContainerState(yyj138) + if yyj138 < len(yyv138) { if r.TryDecodeAsNil() { - yyv114[yyj114] = PodDisruptionBudget{} + yyv138[yyj138] = PodDisruptionBudget{} } else { - yyv117 := &yyv114[yyj114] - yyv117.CodecDecodeSelf(d) + yyv141 := &yyv138[yyj138] + yyv141.CodecDecodeSelf(d) } } else { @@ -1422,16 +1737,16 @@ func (x codecSelfer1234) decSlicePodDisruptionBudget(v *[]PodDisruptionBudget, d } } - if yyj114 < len(yyv114) { - yyv114 = yyv114[:yyj114] - yyc114 = true - } else if yyj114 == 0 && yyv114 == nil { - yyv114 = []PodDisruptionBudget{} - yyc114 = true + if yyj138 < len(yyv138) { + yyv138 = yyv138[:yyj138] + yyc138 = true + } else if yyj138 == 0 && yyv138 == nil { + yyv138 = []PodDisruptionBudget{} + yyc138 = true } } - yyh114.End() - if yyc114 { - *v = yyv114 + yyh138.End() + if yyc138 { + *v = yyv138 } } diff --git a/pkg/apis/policy/types.go b/pkg/apis/policy/types.go index adc31e59f15..d7c7e86151c 100644 --- a/pkg/apis/policy/types.go +++ b/pkg/apis/policy/types.go @@ -69,3 +69,16 @@ type PodDisruptionBudgetList struct { unversioned.ListMeta `json:"metadata,omitempty"` Items []PodDisruptionBudget `json:"items"` } + +// Eviction evicts a pod from its node subject to certain policies and safety constraints. +// This is a subresource of Pod. A request to cause such an eviction is +// created by POSTing to .../pods/foo/evictions. +type Eviction struct { + unversioned.TypeMeta `json:",inline"` + + // ObjectMeta describes the pod that is being evicted. + api.ObjectMeta `json:"metadata,omitempty"` + + // DeleteOptions may be provided + DeleteOptions *api.DeleteOptions `json:"deleteOptions,omitempty"` +} diff --git a/pkg/apis/policy/v1alpha1/generated.pb.go b/pkg/apis/policy/v1alpha1/generated.pb.go index b38407716db..3f3daf97ecd 100644 --- a/pkg/apis/policy/v1alpha1/generated.pb.go +++ b/pkg/apis/policy/v1alpha1/generated.pb.go @@ -25,6 +25,7 @@ limitations under the License. k8s.io/kubernetes/pkg/apis/policy/v1alpha1/generated.proto It has these top-level messages: + Eviction PodDisruptionBudget PodDisruptionBudgetList PodDisruptionBudgetSpec @@ -37,6 +38,7 @@ import fmt "fmt" import math "math" import k8s_io_kubernetes_pkg_api_unversioned "k8s.io/kubernetes/pkg/api/unversioned" +import k8s_io_kubernetes_pkg_api_v1 "k8s.io/kubernetes/pkg/api/v1" import strings "strings" import reflect "reflect" @@ -52,30 +54,71 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. const _ = proto.GoGoProtoPackageIsVersion1 +func (m *Eviction) Reset() { *m = Eviction{} } +func (*Eviction) ProtoMessage() {} +func (*Eviction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } + func (m *PodDisruptionBudget) Reset() { *m = PodDisruptionBudget{} } func (*PodDisruptionBudget) ProtoMessage() {} -func (*PodDisruptionBudget) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } +func (*PodDisruptionBudget) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } func (m *PodDisruptionBudgetList) Reset() { *m = PodDisruptionBudgetList{} } func (*PodDisruptionBudgetList) ProtoMessage() {} -func (*PodDisruptionBudgetList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } +func (*PodDisruptionBudgetList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} } func (m *PodDisruptionBudgetSpec) Reset() { *m = PodDisruptionBudgetSpec{} } func (*PodDisruptionBudgetSpec) ProtoMessage() {} -func (*PodDisruptionBudgetSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} } +func (*PodDisruptionBudgetSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{3} } func (m *PodDisruptionBudgetStatus) Reset() { *m = PodDisruptionBudgetStatus{} } func (*PodDisruptionBudgetStatus) ProtoMessage() {} func (*PodDisruptionBudgetStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{3} + return fileDescriptorGenerated, []int{4} } func init() { + proto.RegisterType((*Eviction)(nil), "k8s.io.kubernetes.pkg.apis.policy.v1alpha1.Eviction") proto.RegisterType((*PodDisruptionBudget)(nil), "k8s.io.kubernetes.pkg.apis.policy.v1alpha1.PodDisruptionBudget") proto.RegisterType((*PodDisruptionBudgetList)(nil), "k8s.io.kubernetes.pkg.apis.policy.v1alpha1.PodDisruptionBudgetList") proto.RegisterType((*PodDisruptionBudgetSpec)(nil), "k8s.io.kubernetes.pkg.apis.policy.v1alpha1.PodDisruptionBudgetSpec") proto.RegisterType((*PodDisruptionBudgetStatus)(nil), "k8s.io.kubernetes.pkg.apis.policy.v1alpha1.PodDisruptionBudgetStatus") } +func (m *Eviction) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *Eviction) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + data[i] = 0xa + i++ + i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) + n1, err := m.ObjectMeta.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n1 + if m.DeleteOptions != nil { + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.DeleteOptions.Size())) + n2, err := m.DeleteOptions.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n2 + } + return i, nil +} + func (m *PodDisruptionBudget) Marshal() (data []byte, err error) { size := m.Size() data = make([]byte, size) @@ -94,27 +137,27 @@ func (m *PodDisruptionBudget) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ObjectMeta.Size())) - n1, err := m.ObjectMeta.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n1 - data[i] = 0x12 - i++ - i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) - n2, err := m.Spec.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n2 - data[i] = 0x1a - i++ - i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) - n3, err := m.Status.MarshalTo(data[i:]) + n3, err := m.ObjectMeta.MarshalTo(data[i:]) if err != nil { return 0, err } i += n3 + data[i] = 0x12 + i++ + i = encodeVarintGenerated(data, i, uint64(m.Spec.Size())) + n4, err := m.Spec.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n4 + data[i] = 0x1a + i++ + i = encodeVarintGenerated(data, i, uint64(m.Status.Size())) + n5, err := m.Status.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n5 return i, nil } @@ -136,11 +179,11 @@ func (m *PodDisruptionBudgetList) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.ListMeta.Size())) - n4, err := m.ListMeta.MarshalTo(data[i:]) + n6, err := m.ListMeta.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n4 + i += n6 if len(m.Items) > 0 { for _, msg := range m.Items { data[i] = 0x12 @@ -174,20 +217,20 @@ func (m *PodDisruptionBudgetSpec) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintGenerated(data, i, uint64(m.MinAvailable.Size())) - n5, err := m.MinAvailable.MarshalTo(data[i:]) + n7, err := m.MinAvailable.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n5 + i += n7 if m.Selector != nil { data[i] = 0x12 i++ i = encodeVarintGenerated(data, i, uint64(m.Selector.Size())) - n6, err := m.Selector.MarshalTo(data[i:]) + n8, err := m.Selector.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n6 + i += n8 } return i, nil } @@ -254,6 +297,18 @@ func encodeVarintGenerated(data []byte, offset int, v uint64) int { data[offset] = uint8(v) return offset + 1 } +func (m *Eviction) Size() (n int) { + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.DeleteOptions != nil { + l = m.DeleteOptions.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *PodDisruptionBudget) Size() (n int) { var l int _ = l @@ -315,6 +370,17 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *Eviction) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Eviction{`, + `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_kubernetes_pkg_api_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `DeleteOptions:` + strings.Replace(fmt.Sprintf("%v", this.DeleteOptions), "DeleteOptions", "k8s_io_kubernetes_pkg_api_v1.DeleteOptions", 1) + `,`, + `}`, + }, "") + return s +} func (this *PodDisruptionBudget) String() string { if this == nil { return "nil" @@ -370,6 +436,119 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *Eviction) Unmarshal(data []byte) error { + l := len(data) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Eviction: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Eviction: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeleteOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DeleteOptions == nil { + m.DeleteOptions = &k8s_io_kubernetes_pkg_api_v1.DeleteOptions{} + } + if err := m.DeleteOptions.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(data[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *PodDisruptionBudget) Unmarshal(data []byte) error { l := len(data) iNdEx := 0 @@ -967,43 +1146,46 @@ var ( ) var fileDescriptorGenerated = []byte{ - // 607 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x94, 0xdf, 0x6a, 0x13, 0x4f, - 0x14, 0xc7, 0x9b, 0xfe, 0x23, 0xcc, 0x2f, 0xbf, 0xa2, 0x6b, 0xd1, 0x18, 0xa4, 0x95, 0x5c, 0x95, - 0x62, 0x67, 0x69, 0x51, 0x28, 0x5e, 0x28, 0xdd, 0xb6, 0x60, 0xc5, 0x52, 0xd9, 0xdc, 0x88, 0xa0, - 0x30, 0xbb, 0x7b, 0xdc, 0x8c, 0xd9, 0xdd, 0x59, 0x66, 0x66, 0xa3, 0xbd, 0xf3, 0x11, 0x7c, 0x05, - 0x1f, 0x46, 0xc8, 0x65, 0x2f, 0xbd, 0x0a, 0xda, 0xbe, 0x88, 0xb3, 0xb3, 0x93, 0x34, 0x9b, 0x64, - 0xa5, 0xd0, 0x8b, 0x03, 0x39, 0x3b, 0xe7, 0xf3, 0x3d, 0x7f, 0x09, 0x7a, 0xde, 0xdb, 0x17, 0x98, - 0x32, 0xbb, 0x97, 0x79, 0xc0, 0x13, 0x90, 0x20, 0xec, 0xb4, 0x17, 0xda, 0x24, 0xa5, 0xea, 0x07, - 0x8b, 0xa8, 0x7f, 0x6e, 0xf7, 0x77, 0x49, 0x94, 0x76, 0xc9, 0xae, 0x1d, 0x42, 0x02, 0x9c, 0x48, - 0x08, 0x70, 0xca, 0x99, 0x64, 0xd6, 0x76, 0xc1, 0xe2, 0x6b, 0x16, 0x2b, 0x16, 0xe7, 0x2c, 0x2e, - 0x58, 0x3c, 0x62, 0x5b, 0x3b, 0x21, 0x95, 0xdd, 0xcc, 0xc3, 0x3e, 0x8b, 0xed, 0x90, 0x85, 0xcc, - 0xd6, 0x12, 0x5e, 0xf6, 0x49, 0x7b, 0xda, 0xd1, 0xbf, 0x0a, 0xe9, 0xd6, 0x5e, 0x65, 0x59, 0x36, - 0x07, 0xc1, 0x32, 0xee, 0xc3, 0x74, 0x39, 0xad, 0x67, 0xd5, 0x4c, 0x96, 0xf4, 0x81, 0x0b, 0xca, - 0x12, 0x08, 0x66, 0xb0, 0x27, 0xd5, 0x58, 0x7f, 0xa6, 0xe7, 0xd6, 0xce, 0xfc, 0x68, 0x9e, 0x25, - 0x92, 0xc6, 0xb3, 0x35, 0xed, 0xce, 0x0f, 0xcf, 0x24, 0x8d, 0x6c, 0x9a, 0x48, 0x21, 0xf9, 0x34, - 0xd2, 0xfe, 0xb9, 0x88, 0xee, 0xbd, 0x65, 0xc1, 0x11, 0x15, 0x3c, 0x4b, 0xa5, 0xaa, 0xd9, 0xc9, - 0x82, 0x10, 0xa4, 0xf5, 0x0e, 0xd5, 0x63, 0x90, 0x24, 0x20, 0x92, 0x34, 0x6b, 0x8f, 0x6b, 0x5b, - 0xff, 0xed, 0x6d, 0xe1, 0xca, 0x05, 0xa8, 0xc1, 0xe3, 0x33, 0xef, 0x33, 0xf8, 0xf2, 0x54, 0x31, - 0x8e, 0x35, 0x18, 0x6e, 0x2e, 0x5c, 0x0e, 0x37, 0xd1, 0xf5, 0x37, 0x77, 0xac, 0x66, 0x01, 0x5a, - 0x16, 0x29, 0xf8, 0xcd, 0x45, 0xad, 0x7a, 0x88, 0x6f, 0xbe, 0x56, 0x3c, 0xa7, 0xd0, 0x8e, 0x92, - 0x72, 0x1a, 0x26, 0xe1, 0x72, 0xee, 0xb9, 0x5a, 0xde, 0x8a, 0xd1, 0xaa, 0x90, 0x44, 0x66, 0xa2, - 0xb9, 0xa4, 0x13, 0x1d, 0xdf, 0x36, 0x91, 0x16, 0x73, 0xd6, 0x4c, 0xaa, 0xd5, 0xc2, 0x77, 0x4d, - 0x92, 0xf6, 0xb0, 0x86, 0x1e, 0xcc, 0xa1, 0xde, 0x50, 0x21, 0xad, 0x0f, 0x33, 0xb3, 0xb4, 0xff, - 0x31, 0xcb, 0x89, 0xeb, 0xc1, 0x39, 0xae, 0x47, 0x7a, 0xc7, 0xa4, 0xad, 0x8f, 0xbe, 0x4c, 0x0c, - 0x34, 0x40, 0x2b, 0x54, 0x42, 0x2c, 0xd4, 0x44, 0x97, 0x94, 0xf6, 0xcb, 0x5b, 0x36, 0xea, 0xfc, - 0x6f, 0x72, 0xad, 0x9c, 0xe4, 0xaa, 0x6e, 0x21, 0xde, 0xbe, 0x9a, 0xdf, 0x60, 0x3e, 0x71, 0xab, - 0x8b, 0x1a, 0x31, 0x4d, 0x0e, 0xfa, 0x84, 0x46, 0xc4, 0x8b, 0xc0, 0x34, 0x89, 0x2b, 0x0a, 0xc9, - 0xcf, 0x11, 0x17, 0xe7, 0x88, 0x4f, 0x12, 0x79, 0xc6, 0x3b, 0x92, 0xd3, 0x24, 0x74, 0xd6, 0x4d, - 0xde, 0xc6, 0xe9, 0x84, 0x96, 0x5b, 0x52, 0xb6, 0x3e, 0xa2, 0xba, 0x80, 0x48, 0x1d, 0x15, 0xe3, - 0xe6, 0x80, 0x9e, 0xde, 0x74, 0x94, 0xc4, 0x83, 0xa8, 0x63, 0x58, 0xa7, 0x91, 0xcf, 0x72, 0xe4, - 0xb9, 0x63, 0xcd, 0xf6, 0x8f, 0x45, 0xf4, 0xb0, 0x72, 0xf9, 0xd6, 0x6b, 0x74, 0x37, 0x18, 0xbf, - 0x1c, 0x44, 0x11, 0xfb, 0x02, 0x81, 0x6e, 0xb6, 0xee, 0x3c, 0x32, 0xc5, 0xaf, 0x97, 0x68, 0x13, - 0xe3, 0xce, 0x62, 0xd6, 0x0b, 0xb4, 0xe6, 0x67, 0x9c, 0x43, 0x22, 0x5f, 0x01, 0x89, 0x64, 0xf7, - 0x5c, 0xf7, 0xb3, 0xe2, 0xdc, 0x37, 0x42, 0x6b, 0x87, 0xa5, 0x57, 0x77, 0x2a, 0x3a, 0xe7, 0x03, - 0x10, 0x94, 0x43, 0x30, 0xe2, 0x97, 0xca, 0xfc, 0x51, 0xe9, 0xd5, 0x9d, 0x8a, 0xb6, 0xf6, 0x51, - 0x03, 0xbe, 0xaa, 0xe5, 0xa9, 0xbf, 0x02, 0x55, 0xb2, 0x68, 0x2e, 0x6b, 0x7a, 0xbc, 0x83, 0xe3, - 0x89, 0x37, 0xb7, 0x14, 0xe9, 0x6c, 0x0f, 0xfe, 0x6c, 0x2c, 0x5c, 0x28, 0xfb, 0xa5, 0xec, 0xdb, - 0xe5, 0x46, 0x6d, 0xa0, 0xec, 0x42, 0xd9, 0x6f, 0x65, 0xdf, 0xaf, 0x36, 0x16, 0xde, 0xd7, 0x47, - 0xf7, 0xf5, 0x37, 0x00, 0x00, 0xff, 0xff, 0x3d, 0xae, 0xf9, 0xfa, 0xf1, 0x05, 0x00, 0x00, + // 648 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x94, 0xdf, 0x6a, 0xd4, 0x4e, + 0x14, 0xc7, 0xbb, 0xfd, 0xc7, 0x32, 0xbf, 0x6d, 0xf9, 0x35, 0x16, 0x5d, 0x17, 0x69, 0x65, 0xaf, + 0x4a, 0xb5, 0x13, 0x5a, 0x14, 0x8a, 0x17, 0x4a, 0xd3, 0x16, 0xac, 0x58, 0x2a, 0xe9, 0x8d, 0x08, + 0x0a, 0x93, 0xe4, 0x98, 0x1d, 0x9b, 0x64, 0xc2, 0xcc, 0x64, 0xb5, 0x77, 0x3e, 0x82, 0xaf, 0xe0, + 0xc3, 0x08, 0xc5, 0xab, 0x5e, 0x7a, 0xb5, 0x68, 0xfb, 0x22, 0x4e, 0x26, 0xb3, 0xdb, 0xcd, 0xee, + 0xa6, 0x14, 0x8a, 0x17, 0x03, 0x39, 0x33, 0xe7, 0xf3, 0x3d, 0x7f, 0xe6, 0x4c, 0xd0, 0xb3, 0x93, + 0x6d, 0x81, 0x29, 0xb3, 0x4f, 0x32, 0x0f, 0x78, 0x02, 0x12, 0x84, 0x9d, 0x9e, 0x84, 0x36, 0x49, + 0xa9, 0xfa, 0x60, 0x11, 0xf5, 0x4f, 0xed, 0xee, 0x26, 0x89, 0xd2, 0x0e, 0xd9, 0xb4, 0x43, 0x48, + 0x80, 0x13, 0x09, 0x01, 0x4e, 0x39, 0x93, 0xcc, 0x5a, 0x2f, 0x58, 0x7c, 0xc5, 0x62, 0xc5, 0xe2, + 0x9c, 0xc5, 0x05, 0x8b, 0xfb, 0x6c, 0x6b, 0x23, 0xa4, 0xb2, 0x93, 0x79, 0xd8, 0x67, 0xb1, 0x1d, + 0xb2, 0x90, 0xd9, 0x5a, 0xc2, 0xcb, 0x3e, 0x6a, 0x4b, 0x1b, 0xfa, 0xab, 0x90, 0x6e, 0x6d, 0x55, + 0xa6, 0x65, 0x73, 0x10, 0x2c, 0xe3, 0x3e, 0x8c, 0xa6, 0xd3, 0x7a, 0x5a, 0xcd, 0x64, 0x49, 0x17, + 0xb8, 0xa0, 0x2c, 0x81, 0x60, 0x0c, 0x7b, 0x5c, 0x8d, 0x75, 0xc7, 0x6a, 0x6e, 0x6d, 0x4c, 0xf6, + 0xe6, 0x59, 0x22, 0x69, 0x3c, 0x9e, 0xd3, 0xe6, 0x64, 0xf7, 0x4c, 0xd2, 0xc8, 0xa6, 0x89, 0x14, + 0x92, 0x8f, 0x22, 0xed, 0x9f, 0x35, 0x54, 0xdf, 0xef, 0x52, 0x5f, 0xaa, 0x74, 0xad, 0xb7, 0xa8, + 0x1e, 0x83, 0x24, 0x01, 0x91, 0xa4, 0x59, 0x7b, 0x58, 0x5b, 0xfb, 0x6f, 0x6b, 0x0d, 0x57, 0x76, + 0x5d, 0x75, 0x1b, 0x1f, 0x79, 0x9f, 0xc0, 0x97, 0x87, 0x8a, 0x71, 0xac, 0xb3, 0xde, 0xea, 0xd4, + 0x45, 0x6f, 0x15, 0x5d, 0xed, 0xb9, 0x03, 0x35, 0x2b, 0x40, 0x0b, 0x01, 0x44, 0x0a, 0x3f, 0x4a, + 0xf3, 0x48, 0xa2, 0x39, 0xad, 0xe5, 0x1f, 0x5d, 0x2f, 0xbf, 0x37, 0x8c, 0x38, 0x4b, 0x4a, 0x7d, + 0xa1, 0xb4, 0xe5, 0x96, 0x45, 0xdb, 0x3f, 0xa6, 0xd1, 0x9d, 0x37, 0x2c, 0xd8, 0xa3, 0x82, 0x67, + 0x7a, 0xcb, 0xc9, 0x82, 0x10, 0xe4, 0x3f, 0xac, 0x0b, 0xd0, 0xac, 0x48, 0xc1, 0x37, 0xe5, 0xec, + 0xe2, 0x9b, 0xcf, 0x28, 0x9e, 0x90, 0xe8, 0xb1, 0x92, 0x72, 0x1a, 0x26, 0xe0, 0x6c, 0x6e, 0xb9, + 0x5a, 0xde, 0x8a, 0xd1, 0xbc, 0x90, 0x44, 0x66, 0xa2, 0x39, 0xa3, 0x03, 0xed, 0xdf, 0x36, 0x90, + 0x16, 0x73, 0x16, 0x4d, 0xa8, 0xf9, 0xc2, 0x76, 0x4d, 0x90, 0x76, 0xaf, 0x86, 0xee, 0x4d, 0xa0, + 0x5e, 0x53, 0x21, 0xad, 0xf7, 0x63, 0xbd, 0xb4, 0xaf, 0xe9, 0xe5, 0xd0, 0x53, 0xc0, 0x39, 0xae, + 0x5b, 0xfa, 0xbf, 0x09, 0x5b, 0xef, 0xef, 0x94, 0x06, 0x65, 0x8e, 0x4a, 0x88, 0xf3, 0x01, 0x99, + 0x51, 0xda, 0x2f, 0x6e, 0x59, 0xa8, 0xb3, 0x60, 0x62, 0xcd, 0x1d, 0xe4, 0xaa, 0x6e, 0x21, 0xde, + 0xbe, 0x9c, 0x5c, 0x60, 0xde, 0x71, 0xab, 0x83, 0x1a, 0x31, 0x4d, 0x76, 0xba, 0x84, 0x46, 0xc4, + 0x8b, 0xc0, 0x14, 0x89, 0x2b, 0x12, 0xc9, 0xdf, 0x16, 0x2e, 0xde, 0x16, 0x3e, 0x48, 0xe4, 0x11, + 0x3f, 0x96, 0x9c, 0x26, 0xa1, 0xb3, 0x6c, 0xe2, 0x36, 0x0e, 0x87, 0xb4, 0xdc, 0x92, 0xb2, 0xf5, + 0x01, 0xd5, 0x85, 0x9a, 0x5f, 0x5f, 0x32, 0x6e, 0x06, 0xe8, 0xc9, 0x4d, 0x5b, 0x49, 0x3c, 0x88, + 0x8e, 0x0d, 0xeb, 0x34, 0xf2, 0x5e, 0xf6, 0x2d, 0x77, 0xa0, 0xd9, 0xfe, 0x3e, 0x8d, 0xee, 0x57, + 0x5e, 0xbe, 0xf5, 0x0a, 0x2d, 0x05, 0x83, 0x93, 0x9d, 0x28, 0x62, 0x9f, 0x21, 0xd0, 0xc5, 0xd6, + 0x9d, 0x07, 0x26, 0xf9, 0xe5, 0x12, 0x6d, 0x7c, 0xdc, 0x71, 0xcc, 0x7a, 0x8e, 0x16, 0xfd, 0x8c, + 0x73, 0x48, 0xe4, 0x4b, 0x20, 0x91, 0xec, 0x9c, 0xea, 0x7a, 0xe6, 0x9c, 0xbb, 0x46, 0x68, 0x71, + 0xb7, 0x74, 0xea, 0x8e, 0x78, 0xe7, 0x7c, 0x00, 0x82, 0x72, 0x08, 0xfa, 0xfc, 0x4c, 0x99, 0xdf, + 0x2b, 0x9d, 0xba, 0x23, 0xde, 0xd6, 0x36, 0x6a, 0xc0, 0x17, 0x75, 0x79, 0xea, 0xbf, 0xa6, 0x52, + 0x16, 0xcd, 0x59, 0x4d, 0x0f, 0xee, 0x60, 0x7f, 0xe8, 0xcc, 0x2d, 0x79, 0x3a, 0xeb, 0x67, 0x7f, + 0x56, 0xa6, 0xce, 0xd5, 0xfa, 0xa5, 0xd6, 0xd7, 0x8b, 0x95, 0xda, 0x99, 0x5a, 0xe7, 0x6a, 0xfd, + 0x56, 0xeb, 0xdb, 0xe5, 0xca, 0xd4, 0xbb, 0x7a, 0x7f, 0xbe, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, + 0x7d, 0xdd, 0x26, 0x2d, 0xbe, 0x06, 0x00, 0x00, } diff --git a/pkg/apis/policy/v1alpha1/generated.proto b/pkg/apis/policy/v1alpha1/generated.proto index d04a0af8cd2..2bc3b524b8b 100644 --- a/pkg/apis/policy/v1alpha1/generated.proto +++ b/pkg/apis/policy/v1alpha1/generated.proto @@ -30,6 +30,17 @@ import "k8s.io/kubernetes/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1alpha1"; +// Eviction evicts a pod from its node subject to certain policies and safety constraints. +// This is a subresource of Pod. A request to cause such an eviction is +// created by POSTing to .../pods/foo/evictions. +message Eviction { + // ObjectMeta describes the pod that is being evicted. + optional k8s.io.kubernetes.pkg.api.v1.ObjectMeta metadata = 1; + + // DeleteOptions may be provided + optional k8s.io.kubernetes.pkg.api.v1.DeleteOptions deleteOptions = 2; +} + // PodDisruptionBudget is an object to define the max disruption that can be caused to a collection of pods message PodDisruptionBudget { optional k8s.io.kubernetes.pkg.api.v1.ObjectMeta metadata = 1; diff --git a/pkg/apis/policy/v1alpha1/register.go b/pkg/apis/policy/v1alpha1/register.go index 9cba49d20bc..8fcb0be023f 100644 --- a/pkg/apis/policy/v1alpha1/register.go +++ b/pkg/apis/policy/v1alpha1/register.go @@ -39,6 +39,7 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &PodDisruptionBudget{}, &PodDisruptionBudgetList{}, + &Eviction{}, &v1.ListOptions{}, &v1.DeleteOptions{}, ) diff --git a/pkg/apis/policy/v1alpha1/types.generated.go b/pkg/apis/policy/v1alpha1/types.generated.go index f18ee2af817..f238733f8e6 100644 --- a/pkg/apis/policy/v1alpha1/types.generated.go +++ b/pkg/apis/policy/v1alpha1/types.generated.go @@ -1320,15 +1320,330 @@ func (x *PodDisruptionBudgetList) codecDecodeSelfFromArray(l int, d *codec1978.D z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x *Eviction) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym112 := z.EncBinary() + _ = yym112 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep113 := !z.EncBinary() + yy2arr113 := z.EncBasicHandle().StructToArray + var yyq113 [4]bool + _, _, _ = yysep113, yyq113, yy2arr113 + const yyr113 bool = false + yyq113[0] = x.Kind != "" + yyq113[1] = x.APIVersion != "" + yyq113[2] = true + yyq113[3] = x.DeleteOptions != nil + var yynn113 int + if yyr113 || yy2arr113 { + r.EncodeArrayStart(4) + } else { + yynn113 = 0 + for _, b := range yyq113 { + if b { + yynn113++ + } + } + r.EncodeMapStart(yynn113) + yynn113 = 0 + } + if yyr113 || yy2arr113 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq113[0] { + yym115 := z.EncBinary() + _ = yym115 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq113[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("kind")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym116 := z.EncBinary() + _ = yym116 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Kind)) + } + } + } + if yyr113 || yy2arr113 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq113[1] { + yym118 := z.EncBinary() + _ = yym118 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq113[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("apiVersion")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym119 := z.EncBinary() + _ = yym119 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.APIVersion)) + } + } + } + if yyr113 || yy2arr113 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq113[2] { + yy121 := &x.ObjectMeta + yy121.CodecEncodeSelf(e) + } else { + r.EncodeNil() + } + } else { + if yyq113[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("metadata")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy122 := &x.ObjectMeta + yy122.CodecEncodeSelf(e) + } + } + if yyr113 || yy2arr113 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq113[3] { + if x.DeleteOptions == nil { + r.EncodeNil() + } else { + x.DeleteOptions.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq113[3] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("deleteOptions")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.DeleteOptions == nil { + r.EncodeNil() + } else { + x.DeleteOptions.CodecEncodeSelf(e) + } + } + } + if yyr113 || yy2arr113 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *Eviction) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym124 := z.DecBinary() + _ = yym124 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct125 := r.ContainerType() + if yyct125 == codecSelferValueTypeMap1234 { + yyl125 := r.ReadMapStart() + if yyl125 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl125, d) + } + } else if yyct125 == codecSelferValueTypeArray1234 { + yyl125 := r.ReadArrayStart() + if yyl125 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl125, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *Eviction) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys126Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys126Slc + var yyhl126 bool = l >= 0 + for yyj126 := 0; ; yyj126++ { + if yyhl126 { + if yyj126 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys126Slc = r.DecodeBytes(yys126Slc, true, true) + yys126 := string(yys126Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys126 { + case "kind": + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + x.Kind = string(r.DecodeString()) + } + case "apiVersion": + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + x.APIVersion = string(r.DecodeString()) + } + case "metadata": + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg3_v1.ObjectMeta{} + } else { + yyv129 := &x.ObjectMeta + yyv129.CodecDecodeSelf(d) + } + case "deleteOptions": + if r.TryDecodeAsNil() { + if x.DeleteOptions != nil { + x.DeleteOptions = nil + } + } else { + if x.DeleteOptions == nil { + x.DeleteOptions = new(pkg3_v1.DeleteOptions) + } + x.DeleteOptions.CodecDecodeSelf(d) + } + default: + z.DecStructFieldNotFound(-1, yys126) + } // end switch yys126 + } // end for yyj126 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *Eviction) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj131 int + var yyb131 bool + var yyhl131 bool = l >= 0 + yyj131++ + if yyhl131 { + yyb131 = yyj131 > l + } else { + yyb131 = r.CheckBreak() + } + if yyb131 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Kind = "" + } else { + x.Kind = string(r.DecodeString()) + } + yyj131++ + if yyhl131 { + yyb131 = yyj131 > l + } else { + yyb131 = r.CheckBreak() + } + if yyb131 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.APIVersion = "" + } else { + x.APIVersion = string(r.DecodeString()) + } + yyj131++ + if yyhl131 { + yyb131 = yyj131 > l + } else { + yyb131 = r.CheckBreak() + } + if yyb131 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ObjectMeta = pkg3_v1.ObjectMeta{} + } else { + yyv134 := &x.ObjectMeta + yyv134.CodecDecodeSelf(d) + } + yyj131++ + if yyhl131 { + yyb131 = yyj131 > l + } else { + yyb131 = r.CheckBreak() + } + if yyb131 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.DeleteOptions != nil { + x.DeleteOptions = nil + } + } else { + if x.DeleteOptions == nil { + x.DeleteOptions = new(pkg3_v1.DeleteOptions) + } + x.DeleteOptions.CodecDecodeSelf(d) + } + for { + yyj131++ + if yyhl131 { + yyb131 = yyj131 > l + } else { + yyb131 = r.CheckBreak() + } + if yyb131 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj131-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + func (x codecSelfer1234) encSlicePodDisruptionBudget(v []PodDisruptionBudget, e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) _, _, _ = h, z, r r.EncodeArrayStart(len(v)) - for _, yyv112 := range v { + for _, yyv136 := range v { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - yy113 := &yyv112 - yy113.CodecEncodeSelf(e) + yy137 := &yyv136 + yy137.CodecEncodeSelf(e) } z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -1338,83 +1653,83 @@ func (x codecSelfer1234) decSlicePodDisruptionBudget(v *[]PodDisruptionBudget, d z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - yyv114 := *v - yyh114, yyl114 := z.DecSliceHelperStart() - var yyc114 bool - if yyl114 == 0 { - if yyv114 == nil { - yyv114 = []PodDisruptionBudget{} - yyc114 = true - } else if len(yyv114) != 0 { - yyv114 = yyv114[:0] - yyc114 = true + yyv138 := *v + yyh138, yyl138 := z.DecSliceHelperStart() + var yyc138 bool + if yyl138 == 0 { + if yyv138 == nil { + yyv138 = []PodDisruptionBudget{} + yyc138 = true + } else if len(yyv138) != 0 { + yyv138 = yyv138[:0] + yyc138 = true } - } else if yyl114 > 0 { - var yyrr114, yyrl114 int - var yyrt114 bool - if yyl114 > cap(yyv114) { + } else if yyl138 > 0 { + var yyrr138, yyrl138 int + var yyrt138 bool + if yyl138 > cap(yyv138) { - yyrg114 := len(yyv114) > 0 - yyv2114 := yyv114 - yyrl114, yyrt114 = z.DecInferLen(yyl114, z.DecBasicHandle().MaxInitLen, 296) - if yyrt114 { - if yyrl114 <= cap(yyv114) { - yyv114 = yyv114[:yyrl114] + yyrg138 := len(yyv138) > 0 + yyv2138 := yyv138 + yyrl138, yyrt138 = z.DecInferLen(yyl138, z.DecBasicHandle().MaxInitLen, 296) + if yyrt138 { + if yyrl138 <= cap(yyv138) { + yyv138 = yyv138[:yyrl138] } else { - yyv114 = make([]PodDisruptionBudget, yyrl114) + yyv138 = make([]PodDisruptionBudget, yyrl138) } } else { - yyv114 = make([]PodDisruptionBudget, yyrl114) + yyv138 = make([]PodDisruptionBudget, yyrl138) } - yyc114 = true - yyrr114 = len(yyv114) - if yyrg114 { - copy(yyv114, yyv2114) + yyc138 = true + yyrr138 = len(yyv138) + if yyrg138 { + copy(yyv138, yyv2138) } - } else if yyl114 != len(yyv114) { - yyv114 = yyv114[:yyl114] - yyc114 = true + } else if yyl138 != len(yyv138) { + yyv138 = yyv138[:yyl138] + yyc138 = true } - yyj114 := 0 - for ; yyj114 < yyrr114; yyj114++ { - yyh114.ElemContainerState(yyj114) + yyj138 := 0 + for ; yyj138 < yyrr138; yyj138++ { + yyh138.ElemContainerState(yyj138) if r.TryDecodeAsNil() { - yyv114[yyj114] = PodDisruptionBudget{} + yyv138[yyj138] = PodDisruptionBudget{} } else { - yyv115 := &yyv114[yyj114] - yyv115.CodecDecodeSelf(d) + yyv139 := &yyv138[yyj138] + yyv139.CodecDecodeSelf(d) } } - if yyrt114 { - for ; yyj114 < yyl114; yyj114++ { - yyv114 = append(yyv114, PodDisruptionBudget{}) - yyh114.ElemContainerState(yyj114) + if yyrt138 { + for ; yyj138 < yyl138; yyj138++ { + yyv138 = append(yyv138, PodDisruptionBudget{}) + yyh138.ElemContainerState(yyj138) if r.TryDecodeAsNil() { - yyv114[yyj114] = PodDisruptionBudget{} + yyv138[yyj138] = PodDisruptionBudget{} } else { - yyv116 := &yyv114[yyj114] - yyv116.CodecDecodeSelf(d) + yyv140 := &yyv138[yyj138] + yyv140.CodecDecodeSelf(d) } } } } else { - yyj114 := 0 - for ; !r.CheckBreak(); yyj114++ { + yyj138 := 0 + for ; !r.CheckBreak(); yyj138++ { - if yyj114 >= len(yyv114) { - yyv114 = append(yyv114, PodDisruptionBudget{}) // var yyz114 PodDisruptionBudget - yyc114 = true + if yyj138 >= len(yyv138) { + yyv138 = append(yyv138, PodDisruptionBudget{}) // var yyz138 PodDisruptionBudget + yyc138 = true } - yyh114.ElemContainerState(yyj114) - if yyj114 < len(yyv114) { + yyh138.ElemContainerState(yyj138) + if yyj138 < len(yyv138) { if r.TryDecodeAsNil() { - yyv114[yyj114] = PodDisruptionBudget{} + yyv138[yyj138] = PodDisruptionBudget{} } else { - yyv117 := &yyv114[yyj114] - yyv117.CodecDecodeSelf(d) + yyv141 := &yyv138[yyj138] + yyv141.CodecDecodeSelf(d) } } else { @@ -1422,16 +1737,16 @@ func (x codecSelfer1234) decSlicePodDisruptionBudget(v *[]PodDisruptionBudget, d } } - if yyj114 < len(yyv114) { - yyv114 = yyv114[:yyj114] - yyc114 = true - } else if yyj114 == 0 && yyv114 == nil { - yyv114 = []PodDisruptionBudget{} - yyc114 = true + if yyj138 < len(yyv138) { + yyv138 = yyv138[:yyj138] + yyc138 = true + } else if yyj138 == 0 && yyv138 == nil { + yyv138 = []PodDisruptionBudget{} + yyc138 = true } } - yyh114.End() - if yyc114 { - *v = yyv114 + yyh138.End() + if yyc138 { + *v = yyv138 } } diff --git a/pkg/apis/policy/v1alpha1/types.go b/pkg/apis/policy/v1alpha1/types.go index efe136fda2a..0b9e1b38713 100644 --- a/pkg/apis/policy/v1alpha1/types.go +++ b/pkg/apis/policy/v1alpha1/types.go @@ -18,7 +18,6 @@ package v1alpha1 import ( "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/util/intstr" ) @@ -70,3 +69,16 @@ type PodDisruptionBudgetList struct { unversioned.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` Items []PodDisruptionBudget `json:"items" protobuf:"bytes,2,rep,name=items"` } + +// Eviction evicts a pod from its node subject to certain policies and safety constraints. +// This is a subresource of Pod. A request to cause such an eviction is +// created by POSTing to .../pods/foo/evictions. +type Eviction struct { + unversioned.TypeMeta `json:",inline"` + + // ObjectMeta describes the pod that is being evicted. + v1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // DeleteOptions may be provided + DeleteOptions *v1.DeleteOptions `json:"deleteOptions,omitempty" protobuf:"bytes,2,opt,name=deleteOptions"` +} diff --git a/pkg/apis/policy/v1alpha1/zz_generated.conversion.go b/pkg/apis/policy/v1alpha1/zz_generated.conversion.go index 589d25b06dd..9a59f8ea29a 100644 --- a/pkg/apis/policy/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/policy/v1alpha1/zz_generated.conversion.go @@ -22,6 +22,7 @@ package v1alpha1 import ( api "k8s.io/kubernetes/pkg/api" + v1 "k8s.io/kubernetes/pkg/api/v1" policy "k8s.io/kubernetes/pkg/apis/policy" conversion "k8s.io/kubernetes/pkg/conversion" runtime "k8s.io/kubernetes/pkg/runtime" @@ -35,6 +36,8 @@ func init() { // Public to allow building arbitrary schemes. func RegisterConversions(scheme *runtime.Scheme) error { return scheme.AddGeneratedConversionFuncs( + Convert_v1alpha1_Eviction_To_policy_Eviction, + Convert_policy_Eviction_To_v1alpha1_Eviction, Convert_v1alpha1_PodDisruptionBudget_To_policy_PodDisruptionBudget, Convert_policy_PodDisruptionBudget_To_v1alpha1_PodDisruptionBudget, Convert_v1alpha1_PodDisruptionBudgetList_To_policy_PodDisruptionBudgetList, @@ -46,6 +49,56 @@ func RegisterConversions(scheme *runtime.Scheme) error { ) } +func autoConvert_v1alpha1_Eviction_To_policy_Eviction(in *Eviction, out *policy.Eviction, s conversion.Scope) error { + if err := api.Convert_unversioned_TypeMeta_To_unversioned_TypeMeta(&in.TypeMeta, &out.TypeMeta, s); err != nil { + return err + } + // TODO: Inefficient conversion - can we improve it? + if err := s.Convert(&in.ObjectMeta, &out.ObjectMeta, 0); err != nil { + return err + } + if in.DeleteOptions != nil { + in, out := &in.DeleteOptions, &out.DeleteOptions + *out = new(api.DeleteOptions) + // TODO: Inefficient conversion - can we improve it? + if err := s.Convert(*in, *out, 0); err != nil { + return err + } + } else { + out.DeleteOptions = nil + } + return nil +} + +func Convert_v1alpha1_Eviction_To_policy_Eviction(in *Eviction, out *policy.Eviction, s conversion.Scope) error { + return autoConvert_v1alpha1_Eviction_To_policy_Eviction(in, out, s) +} + +func autoConvert_policy_Eviction_To_v1alpha1_Eviction(in *policy.Eviction, out *Eviction, s conversion.Scope) error { + if err := api.Convert_unversioned_TypeMeta_To_unversioned_TypeMeta(&in.TypeMeta, &out.TypeMeta, s); err != nil { + return err + } + // TODO: Inefficient conversion - can we improve it? + if err := s.Convert(&in.ObjectMeta, &out.ObjectMeta, 0); err != nil { + return err + } + if in.DeleteOptions != nil { + in, out := &in.DeleteOptions, &out.DeleteOptions + *out = new(v1.DeleteOptions) + // TODO: Inefficient conversion - can we improve it? + if err := s.Convert(*in, *out, 0); err != nil { + return err + } + } else { + out.DeleteOptions = nil + } + return nil +} + +func Convert_policy_Eviction_To_v1alpha1_Eviction(in *policy.Eviction, out *Eviction, s conversion.Scope) error { + return autoConvert_policy_Eviction_To_v1alpha1_Eviction(in, out, s) +} + func autoConvert_v1alpha1_PodDisruptionBudget_To_policy_PodDisruptionBudget(in *PodDisruptionBudget, out *policy.PodDisruptionBudget, s conversion.Scope) error { if err := api.Convert_unversioned_TypeMeta_To_unversioned_TypeMeta(&in.TypeMeta, &out.TypeMeta, s); err != nil { return err diff --git a/pkg/apis/policy/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/policy/v1alpha1/zz_generated.deepcopy.go index f36bc703b8a..c5a4ee22a54 100644 --- a/pkg/apis/policy/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/policy/v1alpha1/zz_generated.deepcopy.go @@ -36,6 +36,7 @@ func init() { // to allow building arbitrary schemes. func RegisterDeepCopies(scheme *runtime.Scheme) error { return scheme.AddGeneratedDeepCopyFuncs( + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_Eviction, InType: reflect.TypeOf(&Eviction{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_PodDisruptionBudget, InType: reflect.TypeOf(&PodDisruptionBudget{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_PodDisruptionBudgetList, InType: reflect.TypeOf(&PodDisruptionBudgetList{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_PodDisruptionBudgetSpec, InType: reflect.TypeOf(&PodDisruptionBudgetSpec{})}, @@ -43,6 +44,27 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { ) } +func DeepCopy_v1alpha1_Eviction(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*Eviction) + out := out.(*Eviction) + out.TypeMeta = in.TypeMeta + if err := v1.DeepCopy_v1_ObjectMeta(&in.ObjectMeta, &out.ObjectMeta, c); err != nil { + return err + } + if in.DeleteOptions != nil { + in, out := &in.DeleteOptions, &out.DeleteOptions + *out = new(v1.DeleteOptions) + if err := v1.DeepCopy_v1_DeleteOptions(*in, *out, c); err != nil { + return err + } + } else { + out.DeleteOptions = nil + } + return nil + } +} + func DeepCopy_v1alpha1_PodDisruptionBudget(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*PodDisruptionBudget) diff --git a/pkg/apis/policy/zz_generated.deepcopy.go b/pkg/apis/policy/zz_generated.deepcopy.go index b03180edae5..ed2db3be69c 100644 --- a/pkg/apis/policy/zz_generated.deepcopy.go +++ b/pkg/apis/policy/zz_generated.deepcopy.go @@ -36,6 +36,7 @@ func init() { // to allow building arbitrary schemes. func RegisterDeepCopies(scheme *runtime.Scheme) error { return scheme.AddGeneratedDeepCopyFuncs( + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_policy_Eviction, InType: reflect.TypeOf(&Eviction{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_policy_PodDisruptionBudget, InType: reflect.TypeOf(&PodDisruptionBudget{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_policy_PodDisruptionBudgetList, InType: reflect.TypeOf(&PodDisruptionBudgetList{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_policy_PodDisruptionBudgetSpec, InType: reflect.TypeOf(&PodDisruptionBudgetSpec{})}, @@ -43,6 +44,27 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { ) } +func DeepCopy_policy_Eviction(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*Eviction) + out := out.(*Eviction) + out.TypeMeta = in.TypeMeta + if err := api.DeepCopy_api_ObjectMeta(&in.ObjectMeta, &out.ObjectMeta, c); err != nil { + return err + } + if in.DeleteOptions != nil { + in, out := &in.DeleteOptions, &out.DeleteOptions + *out = new(api.DeleteOptions) + if err := api.DeepCopy_api_DeleteOptions(*in, *out, c); err != nil { + return err + } + } else { + out.DeleteOptions = nil + } + return nil + } +} + func DeepCopy_policy_PodDisruptionBudget(in interface{}, out interface{}, c *conversion.Cloner) error { { in := in.(*PodDisruptionBudget) diff --git a/pkg/master/master.go b/pkg/master/master.go index 59072cbf803..8e3d9d82551 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -242,15 +242,17 @@ func (m *Master) InstallAPIs(c *Config) { VersionedResourcesStorageMap: map[string]map[string]rest.Storage{ "v1": m.v1ResourcesStorage, }, - IsLegacyGroup: true, - Scheme: api.Scheme, - ParameterCodec: api.ParameterCodec, - NegotiatedSerializer: api.Codecs, + IsLegacyGroup: true, + Scheme: api.Scheme, + ParameterCodec: api.ParameterCodec, + NegotiatedSerializer: api.Codecs, + SubresourceGroupVersionKind: map[string]unversioned.GroupVersionKind{}, } if autoscalingGroupVersion := (unversioned.GroupVersion{Group: "autoscaling", Version: "v1"}); registered.IsEnabledVersion(autoscalingGroupVersion) { - apiGroupInfo.SubresourceGroupVersionKind = map[string]unversioned.GroupVersionKind{ - "replicationcontrollers/scale": autoscalingGroupVersion.WithKind("Scale"), - } + apiGroupInfo.SubresourceGroupVersionKind["replicationcontrollers/scale"] = autoscalingGroupVersion.WithKind("Scale") + } + if policyGroupVersion := (unversioned.GroupVersion{Group: "policy", Version: "v1alpha1"}); registered.IsEnabledVersion(policyGroupVersion) { + apiGroupInfo.SubresourceGroupVersionKind["pods/eviction"] = policyGroupVersion.WithKind("Eviction") } apiGroupsInfo = append(apiGroupsInfo, apiGroupInfo) } @@ -300,6 +302,19 @@ func (m *Master) InstallAPIs(c *Config) { continue } + // This is here so that, if the policy group is present, the eviction + // subresource handler wil be able to find poddisruptionbudgets + // TODO(lavalamp) find a better way for groups to discover and interact + // with each other + if group == "policy" { + storage := apiGroupsInfo[0].VersionedResourcesStorageMap["v1"]["pods/eviction"] + evictionStorage := storage.(*podetcd.EvictionREST) + + storage = apiGroupInfo.VersionedResourcesStorageMap["v1alpha1"]["poddisruptionbudgets"] + evictionStorage.PodDisruptionBudgetLister = storage.(rest.Lister) + evictionStorage.PodDisruptionBudgetUpdater = storage.(rest.Updater) + } + apiGroupsInfo = append(apiGroupsInfo, apiGroupInfo) } @@ -426,6 +441,9 @@ func (m *Master) initV1ResourcesStorage(c *Config) { if registered.IsEnabledVersion(unversioned.GroupVersion{Group: "autoscaling", Version: "v1"}) { m.v1ResourcesStorage["replicationControllers/scale"] = controllerStorage.Scale } + if registered.IsEnabledVersion(unversioned.GroupVersion{Group: "policy", Version: "v1alpha1"}) { + m.v1ResourcesStorage["pods/eviction"] = podStorage.Eviction + } } // NewBootstrapController returns a controller for watching the core capabilities of the master. If diff --git a/pkg/registry/pod/etcd/etcd.go b/pkg/registry/pod/etcd/etcd.go index bdcab477a3f..ca5368d676a 100644 --- a/pkg/registry/pod/etcd/etcd.go +++ b/pkg/registry/pod/etcd/etcd.go @@ -27,7 +27,9 @@ import ( "k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/validation" + "k8s.io/kubernetes/pkg/apis/policy" "k8s.io/kubernetes/pkg/kubelet/client" + "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic/registry" @@ -41,6 +43,7 @@ import ( type PodStorage struct { Pod *REST Binding *BindingREST + Eviction *EvictionREST Status *StatusREST Log *podrest.LogREST Proxy *podrest.ProxyREST @@ -100,6 +103,7 @@ func NewStorage(opts generic.RESTOptions, k client.ConnectionInfoGetter, proxyTr return PodStorage{ Pod: &REST{store, proxyTransport}, Binding: &BindingREST{store: store}, + Eviction: &EvictionREST{store: store}, Status: &StatusREST{store: &statusStore}, Log: &podrest.LogREST{Store: store, KubeletConn: k}, Proxy: &podrest.ProxyREST{Store: store, ProxyTransport: proxyTransport}, @@ -117,6 +121,155 @@ func (r *REST) ResourceLocation(ctx api.Context, name string) (*url.URL, http.Ro return pod.ResourceLocation(r, r.proxyTransport, ctx, name) } +// EvictionREST implements the REST endpoint for evicting pods from nodes when etcd is in use. +type EvictionREST struct { + store *registry.Store + PodDisruptionBudgetLister rest.Lister + PodDisruptionBudgetUpdater rest.Updater +} + +var _ = rest.Creater(&EvictionREST{}) + +// New creates a new eviction resource +func (r *EvictionREST) New() runtime.Object { + return &policy.Eviction{} +} + +// Create attempts to create a new eviction. That is, it tries to evict a pod. +func (r *EvictionREST) Create(ctx api.Context, obj runtime.Object) (runtime.Object, error) { + eviction := obj.(*policy.Eviction) + + obj, err := r.store.Get(ctx, eviction.Name) + if err != nil { + return nil, err + } + pod := obj.(*api.Pod) + pdbs, err := r.getPodDisruptionBudgets(ctx, pod) + if err != nil { + return nil, err + } + + if len(pdbs) > 1 { + return &unversioned.Status{ + Status: unversioned.StatusFailure, + Message: "This pod has more than one PodDisruptionBudget, which the eviction subresource does not support.", + Code: 500, + }, nil + } else if len(pdbs) == 1 { + pdb := pdbs[0] + // Try to verify-and-decrement + + // If it was false already, or if it becomes false during the course of our retries, + // raise an error marked as a ... 429 maybe? + ok, err := r.checkAndDecrement(ctx, pdb) + if err != nil { + return nil, err + } + + if !ok { + return &unversioned.Status{ + Status: unversioned.StatusFailure, + // TODO(mml): Include some more details about why the eviction is disallowed. + // Ideally any such text is generated by the DisruptionController (offline). + Message: "Cannot evict pod as it would violate the pod's disruption budget.", + Code: 429, + // TODO(mml): Add a Retry-After header. Once there are time-based + // budgets, we can sometimes compute a sensible suggested value. But + // even without that, we can give a suggestion (10 minutes?) that + // prevents well-behaved clients from hammering us. + }, nil + } + } + + // At this point there was either no PDB or we succeded in decrementing + + // Try the delete + _, err = r.store.Delete(ctx, eviction.Name, eviction.DeleteOptions) + if err != nil { + return nil, err + } + + // Success! + return &unversioned.Status{Status: unversioned.StatusSuccess}, nil +} + +// UpdatedObjectInfo is a simple interface for attempting updates to +// runtime.Objects. EvictionREST implements it directly. +var _ = rest.UpdatedObjectInfo(&EvictionREST{}) + +// Preconditions returns any preconditions required prior to updating the +// PDB. None currently. +func (r *EvictionREST) Preconditions() *api.Preconditions { + return nil +} + +// UpdatedObject returns the updated PDB if it is able to update +// PodDisruptionAllowed from true->false. +func (r *EvictionREST) UpdatedObject(ctx api.Context, oldObj runtime.Object) (newObj runtime.Object, err error) { + copy, err := api.Scheme.DeepCopy(oldObj) + if err != nil { + return + } + newObj = copy.(runtime.Object) + pdb := oldObj.(*policy.PodDisruptionBudget) + if !pdb.Status.PodDisruptionAllowed { + return nil, fmt.Errorf("PodDisruptionAllowed is already false") + } + pdb.Status.PodDisruptionAllowed = false + + return +} + +func (r *EvictionREST) checkAndDecrement(ctx api.Context, pdb policy.PodDisruptionBudget) (ok bool, err error) { + if !pdb.Status.PodDisruptionAllowed { + return false, nil + } + newObj, _, err := r.PodDisruptionBudgetUpdater.Update(ctx, pdb.Name, r) + if err != nil { + return false, err + } + + newPdb := newObj.(*policy.PodDisruptionBudget) + if newPdb.Status.PodDisruptionAllowed { + return false, fmt.Errorf("update did not succeed") + } + + return true, nil +} + +// Returns any PDBs that match the pod. +// err is set if there's an error. +func (r *EvictionREST) getPodDisruptionBudgets(ctx api.Context, pod *api.Pod) (pdbs []policy.PodDisruptionBudget, err error) { + if len(pod.Labels) == 0 { + return + } + + l, err := r.PodDisruptionBudgetLister.List(ctx, nil) + if err != nil { + return + } + + pdbList := l.(*policy.PodDisruptionBudgetList) + + for _, pdb := range pdbList.Items { + if pdb.Namespace != pod.Namespace { + continue + } + selector, err := unversioned.LabelSelectorAsSelector(pdb.Spec.Selector) + if err != nil { + continue + } + // If a PDB with a nil or empty selector creeps in, it should match nothing, not everything. + if selector.Empty() || !selector.Matches(labels.Set(pod.Labels)) { + continue + } + + pdbs = append(pdbs, pdb) + } + + return pdbs, nil +} + // BindingREST implements the REST endpoint for binding pods to nodes when etcd is in use. type BindingREST struct { store *registry.Store diff --git a/plugin/pkg/admission/securitycontext/scdeny/admission.go b/plugin/pkg/admission/securitycontext/scdeny/admission.go index 941a277cf78..ae2be16e0b4 100644 --- a/plugin/pkg/admission/securitycontext/scdeny/admission.go +++ b/plugin/pkg/admission/securitycontext/scdeny/admission.go @@ -49,7 +49,7 @@ func NewSecurityContextDeny(client clientset.Interface) admission.Interface { // Admit will deny any pod that defines SELinuxOptions or RunAsUser. func (p *plugin) Admit(a admission.Attributes) (err error) { - if a.GetResource().GroupResource() != api.Resource("pods") { + if a.GetSubresource() != "" || a.GetResource().GroupResource() != api.Resource("pods") { return nil }