Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed pkg/core/.DS_Store
Binary file not shown.
Binary file removed pkg/core/pod/.DS_Store
Binary file not shown.
26 changes: 10 additions & 16 deletions pkg/core/pod/affinity/to_kube.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,25 +22,19 @@ func (a *Affinity) ToKube(version string) (interface{}, error) {
}

func (a *Affinity) toKubeV1() (*v1.Affinity, error) {
var nodeAffinity *v1.NodeAffinity
var podAffinity *v1.PodAffinity
var podAntiAffinity *v1.PodAntiAffinity

if a != nil {
nodeAffinity = a.toKubeNodeAffinityV1(a.NodeAffinity)
podAffinity = a.toKubePodAffinityV1(a.PodAffinity)
podAntiAffinity = a.toKubePodAntiAffinityV1(a.PodAntiAffinity)
if a == nil {
return nil, nil
}

if podAffinity != nil || podAntiAffinity != nil || nodeAffinity != nil {
return &v1.Affinity{
NodeAffinity: nodeAffinity,
PodAffinity: podAffinity,
PodAntiAffinity: podAntiAffinity,
}, nil
}
nodeAffinity := a.toKubeNodeAffinityV1(a.NodeAffinity)
podAffinity := a.toKubePodAffinityV1(a.PodAffinity)
podAntiAffinity := a.toKubePodAntiAffinityV1(a.PodAntiAffinity)

return nil, nil
return &v1.Affinity{
NodeAffinity: nodeAffinity,
PodAffinity: podAffinity,
PodAntiAffinity: podAntiAffinity,
}, nil
}

func (a *Affinity) toKubePodAffinityV1(affinities map[AffinityType][]PodTerm) *v1.PodAffinity {
Expand Down
99 changes: 63 additions & 36 deletions pkg/core/pod/container/container.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package container

import (
"fmt"

"mantle/pkg/core/action"
"mantle/pkg/core/pod/container/env"
"mantle/pkg/core/pod/container/port"
"mantle/pkg/core/pod/container/probe"
"mantle/pkg/core/pod/container/resources"
"mantle/pkg/core/pod/container/volumedevice"
"mantle/pkg/core/pod/container/volumemount"
"mantle/pkg/core/selinux"
"mantle/pkg/util/floatstr"
Expand All @@ -14,42 +17,45 @@ import (
)

type Container struct {
Command []string `json:"command,omitempty"`
Args []floatstr.FloatOrString `json:"args,omitempty"`
Env []env.Env `json:"env,omitempty"`
Image string `json:"image"`
Pull PullPolicy `json:"pull,omitempty"`
OnStart *action.Action `json:"on_start,omitempty"`
PreStop *action.Action `json:"pre_stop,omitempty"`
CPU *resources.CPU `json:"cpu,omitempty"`
Mem *resources.Mem `json:"mem,omitempty"`
Name string `json:"name,omitempty"`
AddCapabilities []string `json:"cap_add,omitempty"`
DelCapabilities []string `json:"cap_drop,omitempty"`
Privileged *bool `json:"privileged,omitempty"`
AllowEscalation *bool `json:"allow_escalation,omitempty"`
RW *bool `json:"rw,omitempty"`
RO *bool `json:"ro,omitempty"`
ForceNonRoot *bool `json:"force_non_root,omitempty"`
UID *int64 `json:"uid,omitempty"`
GID *int64 `json:"gid,omitempty"`
SELinux *selinux.SELinux `json:"selinux,omitempty"`
LivenessProbe *probe.Probe `json:"liveness_probe,omitempty"`
ReadinessProbe *probe.Probe `json:"readiness_probe,omitempty"`
Expose []port.Port `json:"expose,omitempty"`
Stdin bool `json:"stdin,omitempty"`
StdinOnce bool `json:"stdin_once,omitempty"`
TTY bool `json:"tty,omitempty"`
WorkingDir string `json:"wd,omitempty"`
TerminationMsgPath string `json:"termination_msg_path,omitempty"`
TerminationMsgPolicy TerminationMessagePolicy `json:"termination_msg_policy,omitempty"`
ContainerID string `json:"container_id,omitempty"`
ImageID string `json:"image_id,omitempty"`
Ready bool `json:"ready,omitempty"`
LastState *ContainerState `json:"last_state,omitempty"`
CurrentState *ContainerState `json:"current_state,omitempty"`
VolumeMounts []volumemount.VolumeMount `json:"volume,omitempty"`
Restarts int32 `json:"restarts,omitempty"`
Command []string `json:"command,omitempty"`
Args []floatstr.FloatOrString `json:"args,omitempty"`
Env []env.Env `json:"env,omitempty"`
Image string `json:"image"`
Pull PullPolicy `json:"pull,omitempty"`
OnStart *action.Action `json:"on_start,omitempty"`
PreStop *action.Action `json:"pre_stop,omitempty"`
CPU *resources.CPU `json:"cpu,omitempty"`
Mem *resources.Mem `json:"mem,omitempty"`
Name string `json:"name,omitempty"`
AddCapabilities []string `json:"cap_add,omitempty"`
DelCapabilities []string `json:"cap_drop,omitempty"`
Privileged *bool `json:"privileged,omitempty"`
AllowEscalation *bool `json:"allow_escalation,omitempty"`
RO *bool `json:"ro,omitempty"`
ForceNonRoot *bool `json:"force_non_root,omitempty"`
UID *int64 `json:"uid,omitempty"`
GID *int64 `json:"gid,omitempty"`
SELinux *selinux.SELinux `json:"selinux,omitempty"`
LivenessProbe *probe.Probe `json:"liveness_probe,omitempty"`
ReadinessProbe *probe.Probe `json:"readiness_probe,omitempty"`
Expose []port.Port `json:"expose,omitempty"`
Stdin bool `json:"stdin,omitempty"`
StdinOnce bool `json:"stdin_once,omitempty"`
TTY bool `json:"tty,omitempty"`
ProcMount *MountType `json:"procMount,omitempty"`
WorkingDir string `json:"wd,omitempty"`
TerminationMsgPath string `json:"termination_msg_path,omitempty"`
TerminationMsgPolicy TerminationMessagePolicy `json:"termination_msg_policy,omitempty"`
VolumeMounts []volumemount.VolumeMount `json:"volume,omitempty"`
VolumeDevices []volumedevice.VolumeDevice `json:"device,omitempty `

// Status
ContainerID string `json:"container_id,omitempty"`
ImageID string `json:"image_id,omitempty"`
Ready bool `json:"ready,omitempty"`
LastState *ContainerState `json:"last_state,omitempty"`
CurrentState *ContainerState `json:"current_state,omitempty"`
Restarts int32 `json:"restarts,omitempty"`
}

type ContainerState struct {
Expand Down Expand Up @@ -92,3 +98,24 @@ const (
PullIfNotPresent
PullDefault
)

type MountType int

const (
MountTypeDefault MountType = iota
MountTypeUnmasked
MountTypeInvalid
)

func (m *MountType) ToString() string {
switch *m {
case MountTypeDefault:
return "MountTypeDefault"
case MountTypeUnmasked:
return "MountTypeUnmasked"
case MountTypeInvalid:
return "MountTypeInvalid"
default:
return fmt.Sprintf("unknown mount type: %d", *m)
}
}
178 changes: 178 additions & 0 deletions pkg/core/pod/container/container_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
package container

import (
"mantle/pkg/core/action"
"mantle/pkg/core/pod/container/env"
"mantle/pkg/core/pod/container/port"
"mantle/pkg/core/pod/container/probe"
"mantle/pkg/core/pod/container/resources"
"mantle/pkg/core/pod/container/volumedevice"
"mantle/pkg/core/pod/container/volumemount"
"mantle/pkg/core/protocol"
"mantle/pkg/core/selinux"
"mantle/pkg/util/floatstr"
)

var int64Val = int64(5)
var boolEntry = true
var int32Val = int32(1)
var strEntry = "testStr"
var mountType = MountTypeDefault
var mountPropagation = volumemount.MountPropagationNone
var FullTestMantleContainer = Container{
Command: []string{"cmd1", "cmd2"},
Args: []floatstr.FloatOrString{
{
Type: floatstr.Float,
FloatVal: 3.1459267,
},
{
Type: floatstr.String,
StringVal: "strVal",
},
},
Env: []env.Env{
{
Type: env.EnvValEnvType,
Val: &env.EnvVal{
Key: "key1",
Val: "val1",
},
},
{
Type: env.EnvFromEnvType,
From: &env.EnvFrom{
From: env.EnvFromTypeSecret,
VarNameOrPrefix: "EnvName",
ConfigMapOrSecretName: "SecretName",
ConfigMapOrSecretKey: "SecretKey",
Required: &boolEntry,
},
},
},
Image: "registry.io/path/to/image",
Pull: PullAlways,
OnStart: &action.Action{
ActionType: action.ActionTypeTCP,
Host: "actionHost",
Port: "22",
},
PreStop: &action.Action{
ActionType: action.ActionTypeHTTPS,
Path: "/action/path",
Host: "actionHost",
Port: "443",
Headers: []string{"Key:Value", "HEADER:VALUE"},
},
CPU: &resources.CPU{
Min: "1",
Max: "3",
},
Mem: &resources.Mem{
Min: "10Gi",
Max: "10Ti",
},
Name: "container-name",
AddCapabilities: []string{"CAP1", "CAP2"},
DelCapabilities: []string{"CAP3"},
Privileged: &boolEntry,
AllowEscalation: &boolEntry,
RO: &boolEntry,
ForceNonRoot: &boolEntry,
UID: &int64Val,
GID: &int64Val,
SELinux: &selinux.SELinux{
Level: "selinuxlevel",
Role: "selinuxrole",
Type: "selinuxtype",
User: "selinuxuser",
},
LivenessProbe: &probe.Probe{
Action: action.Action{
ActionType: action.ActionTypeCommand,
Command: []string{"cmd1", "cmd2"},
},
Delay: int32Val,
Interval: int32Val,
MinCountSuccess: int32Val,
MinCountFailure: int32Val,
Timeout: int32Val,
},
ReadinessProbe: &probe.Probe{
Action: action.Action{
ActionType: action.ActionTypeCommand,
Command: []string{"cmd3", "cmd4"},
},
Delay: int32Val,
Interval: int32Val,
MinCountSuccess: int32Val,
MinCountFailure: int32Val,
Timeout: int32Val,
},
Expose: []port.Port{
{
Name: "port1",
Protocol: protocol.ProtocolTCP,
IP: "1.1.1.1",
HostPort: "1000",
ContainerPort: "1000",
},
},
Stdin: boolEntry,
StdinOnce: boolEntry,
TTY: boolEntry,
ProcMount: &mountType,
WorkingDir: "/path/to/dir",
TerminationMsgPath: "/msg/path",
TerminationMsgPolicy: TerminationMessageReadFile,
VolumeMounts: []volumemount.VolumeMount{
{
MountPath: "/path/to/mount",
Propagation: &mountPropagation,
Store: "storeName",
ReadOnly: false,
},
},
VolumeDevices: []volumedevice.VolumeDevice{
{
Name: "deviceName",
Path: "/path/to/device",
},
},
}

var EmptyTestMantleContainer = Container{
Command: []string{},
Args: []floatstr.FloatOrString{},
Env: []env.Env{},
Image: "",
Pull: PullDefault,
OnStart: &action.Action{},
PreStop: &action.Action{},
CPU: &resources.CPU{},
Mem: &resources.Mem{},
Name: "",
AddCapabilities: []string{},
DelCapabilities: []string{},
Privileged: nil,
AllowEscalation: nil,
RO: nil,
ForceNonRoot: nil,
UID: nil,
GID: nil,
SELinux: &selinux.SELinux{},
LivenessProbe: &probe.Probe{
Action: action.Action{},
},
ReadinessProbe: &probe.Probe{},
Expose: []port.Port{},
Stdin: false,
StdinOnce: false,
TTY: false,
ProcMount: nil,
WorkingDir: "",
TerminationMsgPath: "",
TerminationMsgPolicy: TerminationMessageDefault,
VolumeMounts: []volumemount.VolumeMount{},
VolumeDevices: []volumedevice.VolumeDevice{},
}
Loading