mirror of
https://github.com/gravitational/teleport.git
synced 2026-09-19 01:58:44 +08:00
Introduce patch_type to KubernetesWaitingContainer (#39738)
This PR adds the `patch_type` to `KubernetesWaitingContainer` objects. This patch type is used to decode the contents correctly depending on different patch strategies allowed by Kubernetes clients. Signed-off-by: Tiago Silva <tiago.silva@goteleport.com>
This commit is contained in:
@@ -141,6 +141,8 @@ type KubernetesWaitingContainerSpec struct {
|
||||
// patch is the patch that should be applied to the parent pod
|
||||
// to create this ephemeral container
|
||||
Patch []byte `protobuf:"bytes,6,opt,name=patch,proto3" json:"patch,omitempty"`
|
||||
// patch_type identifies the patch model to be applied.
|
||||
PatchType string `protobuf:"bytes,7,opt,name=patch_type,json=patchType,proto3" json:"patch_type,omitempty"`
|
||||
}
|
||||
|
||||
func (x *KubernetesWaitingContainerSpec) Reset() {
|
||||
@@ -217,6 +219,13 @@ func (x *KubernetesWaitingContainerSpec) GetPatch() []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *KubernetesWaitingContainerSpec) GetPatchType() string {
|
||||
if x != nil {
|
||||
return x.PatchType
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var File_teleport_kubewaitingcontainer_v1_kubewaitingcontainer_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_teleport_kubewaitingcontainer_v1_kubewaitingcontainer_proto_rawDesc = []byte{
|
||||
@@ -243,7 +252,7 @@ var file_teleport_kubewaitingcontainer_v1_kubewaitingcontainer_proto_rawDesc = [
|
||||
0x62, 0x65, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
|
||||
0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73,
|
||||
0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
|
||||
0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xcc, 0x01, 0x0a, 0x1e, 0x4b,
|
||||
0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xeb, 0x01, 0x0a, 0x1e, 0x4b,
|
||||
0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67,
|
||||
0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1a, 0x0a,
|
||||
0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
@@ -256,14 +265,16 @@ var file_teleport_kubewaitingcontainer_v1_kubewaitingcontainer_proto_rawDesc = [
|
||||
0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e,
|
||||
0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01,
|
||||
0x28, 0x0c, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x42, 0x6c, 0x5a, 0x6a, 0x67, 0x69, 0x74,
|
||||
0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61,
|
||||
0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f,
|
||||
0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x77, 0x61, 0x69,
|
||||
0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31,
|
||||
0x3b, 0x6b, 0x75, 0x62, 0x65, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74,
|
||||
0x61, 0x69, 0x6e, 0x65, 0x72, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
0x28, 0x0c, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x74,
|
||||
0x63, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70,
|
||||
0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x42, 0x6c, 0x5a, 0x6a, 0x67, 0x69, 0x74, 0x68,
|
||||
0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69,
|
||||
0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70,
|
||||
0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74,
|
||||
0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x77, 0x61, 0x69, 0x74,
|
||||
0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b,
|
||||
0x6b, 0x75, 0x62, 0x65, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61,
|
||||
0x69, 0x6e, 0x65, 0x72, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
||||
@@ -51,4 +51,6 @@ message KubernetesWaitingContainerSpec {
|
||||
// patch is the patch that should be applied to the parent pod
|
||||
// to create this ephemeral container
|
||||
bytes patch = 6;
|
||||
// patch_type identifies the patch model to be applied.
|
||||
string patch_type = 7;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ limitations under the License.
|
||||
package kubewaitingcontainer
|
||||
|
||||
import (
|
||||
"slices"
|
||||
"time"
|
||||
|
||||
"github.com/gravitational/trace"
|
||||
@@ -27,6 +28,27 @@ import (
|
||||
"github.com/gravitational/teleport/api/types"
|
||||
)
|
||||
|
||||
const (
|
||||
// JSONPatchType is the JSON patch type supported by Kubernetes
|
||||
JSONPatchType string = "application/json-patch+json"
|
||||
// MergePatchType is the merge patch type supported by Kubernetes
|
||||
MergePatchType string = "application/merge-patch+json"
|
||||
// StrategicMergePatchType is the strategic merge patch type supported by Kubernetes
|
||||
StrategicMergePatchType string = "application/strategic-merge-patch+json"
|
||||
// ApplyPatchType is the apply patch type supported by Kubernetes
|
||||
ApplyPatchType string = "application/apply-patch+yaml"
|
||||
)
|
||||
|
||||
var (
|
||||
// PatchTypes is a list of all supported patch types
|
||||
PatchTypes = []string{
|
||||
JSONPatchType,
|
||||
MergePatchType,
|
||||
StrategicMergePatchType,
|
||||
ApplyPatchType,
|
||||
}
|
||||
)
|
||||
|
||||
// NewKubeWaitingContainer creates a new Kubernetes ephemeral
|
||||
// container that are waiting to be created until moderated
|
||||
// session conditions are met.
|
||||
@@ -78,7 +100,12 @@ func ValidateKubeWaitingContainer(k *kubewaitingcontainerpb.KubernetesWaitingCon
|
||||
if len(k.Spec.Patch) == 0 {
|
||||
return trace.BadParameter("Patch is unset")
|
||||
}
|
||||
|
||||
if len(k.Spec.PatchType) == 0 {
|
||||
return trace.BadParameter("PatchType is unset")
|
||||
}
|
||||
if !slices.Contains(PatchTypes, k.Spec.PatchType) {
|
||||
return trace.BadParameter("PatchType is invalid: valid types are %v", PatchTypes)
|
||||
}
|
||||
if k.Metadata.Name == "" {
|
||||
return trace.BadParameter("Name is unset")
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ func TestKubeWaitingContainerServiceCRUD(t *testing.T) {
|
||||
const cluster = "cluster"
|
||||
const namespace = "default"
|
||||
const podName = "pod"
|
||||
const patchType = kubewaitingcontainer.JSONPatchType
|
||||
|
||||
sampleKubeWaitingContFn := func(t *testing.T, name string) *kubewaitingcontainerpb.KubernetesWaitingContainer {
|
||||
wc, err := kubewaitingcontainer.NewKubeWaitingContainer(
|
||||
@@ -49,6 +50,7 @@ func TestKubeWaitingContainerServiceCRUD(t *testing.T) {
|
||||
PodName: podName,
|
||||
ContainerName: name,
|
||||
Patch: []byte("patch"),
|
||||
PatchType: patchType,
|
||||
},
|
||||
)
|
||||
require.NoError(t, err)
|
||||
@@ -130,6 +132,7 @@ func TestKubeWaitingContainerServiceCRUD(t *testing.T) {
|
||||
require.Equal(t, namespace, out.Spec.Namespace)
|
||||
require.Equal(t, podName, out.Spec.PodName)
|
||||
require.Equal(t, wcName, out.Spec.ContainerName)
|
||||
require.Equal(t, patchType, out.Spec.PatchType)
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -186,6 +189,7 @@ func TestKubeWaitingContainerServiceCRUD(t *testing.T) {
|
||||
require.Equal(t, namespace, out.Spec.Namespace)
|
||||
require.Equal(t, podName, out.Spec.PodName)
|
||||
require.Equal(t, wcName, out.Spec.ContainerName)
|
||||
require.Equal(t, patchType, out.Spec.PatchType)
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
Vendored
+1
@@ -3383,6 +3383,7 @@ func newKubeWaitingContainer(t *testing.T) types.Resource {
|
||||
PodName: "pod",
|
||||
ContainerName: "container",
|
||||
Patch: []byte("patch"),
|
||||
PatchType: "application/json-patch+json",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user