Skip to content

Commit

Permalink
feat(lifecycle-operator): add KEPTN_CONTEXT to task container env v…
Browse files Browse the repository at this point in the history
…ars (#2516)

Signed-off-by: Florian Bacher <florian.bacher@dynatrace.com>
  • Loading branch information
bacherfl committed Nov 20, 2023
1 parent 540ca90 commit a18a833
Show file tree
Hide file tree
Showing 5 changed files with 141 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -1,34 +1,71 @@
package keptntask

import (
"encoding/json"

klcv1alpha3 "github.com/keptn/lifecycle-toolkit/lifecycle-operator/apis/lifecycle/v1alpha3"
"github.com/keptn/lifecycle-toolkit/lifecycle-operator/controllers/common/taskdefinition"
"github.com/pkg/errors"
"golang.org/x/net/context"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
)

// ContainerBuilder implements container builder interface for python
type ContainerBuilder struct {
spec *klcv1alpha3.ContainerSpec
containerSpec klcv1alpha3.ContainerSpec
taskSpec klcv1alpha3.KeptnTaskSpec
}

func NewContainerBuilder(options BuilderOptions) *ContainerBuilder {
return &ContainerBuilder{
spec: options.containerSpec,
builder := &ContainerBuilder{
containerSpec: *options.containerSpec,
}

if options.task != nil {
builder.taskSpec = options.task.Spec
}

return builder
}

func (c *ContainerBuilder) CreateContainer(ctx context.Context) (*corev1.Container, error) {
return c.spec.Container, nil
if c.containerSpec.Container == nil {
return nil, errors.New("no container definition provided")
}
result := c.containerSpec.Container

taskContext := c.taskSpec.Context

jsonContext, err := json.Marshal(taskContext)
if err != nil {
return nil, err
}

foundKeptnContextVar := false
for i, envVar := range result.Env {
if envVar.Name == KeptnContextEnvVarName {
foundKeptnContextVar = true
result.Env[i].Value = string(jsonContext)
}
}

if !foundKeptnContextVar {
result.Env = append(result.Env, corev1.EnvVar{
Name: KeptnContextEnvVarName,
Value: string(jsonContext),
})
}

return result, nil
}

func (c *ContainerBuilder) CreateVolume(ctx context.Context) (*corev1.Volume, error) {
return c.generateVolume(), nil
}

func (c *ContainerBuilder) getVolumeSource() *corev1.EmptyDirVolumeSource {
quantity, ok := c.spec.Resources.Limits["memory"]
quantity, ok := c.containerSpec.Resources.Limits["memory"]
if ok {
return &corev1.EmptyDirVolumeSource{
SizeLimit: &quantity,
Expand All @@ -44,11 +81,11 @@ func (c *ContainerBuilder) getVolumeSource() *corev1.EmptyDirVolumeSource {
}

func (c *ContainerBuilder) generateVolume() *corev1.Volume {
if !taskdefinition.IsVolumeMountPresent(c.spec) {
if !taskdefinition.IsVolumeMountPresent(&c.containerSpec) {
return nil
}
return &corev1.Volume{
Name: c.spec.VolumeMounts[0].Name,
Name: c.containerSpec.VolumeMounts[0].Name,
VolumeSource: corev1.VolumeSource{
EmptyDir: c.getVolumeSource(),
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,34 +15,101 @@ func TestContainerBuilder_CreateContainerWithVolumes(t *testing.T) {
name string
builder ContainerBuilder
wantContainer *v1.Container
wantError bool
}{
{
name: "defined",
name: "defined, no task spec",
builder: ContainerBuilder{
containerSpec: v1alpha3.ContainerSpec{
Container: &v1.Container{
Image: "image",
},
},
},
wantContainer: &v1.Container{
Image: "image",
Env: []v1.EnvVar{
{
Name: KeptnContextEnvVarName,
Value: `{"workloadName":"","appName":"","appVersion":"","workloadVersion":"","taskType":"","objectType":""}`,
},
},
},
},
{
name: "defined, adding context",
builder: ContainerBuilder{
containerSpec: v1alpha3.ContainerSpec{
Container: &v1.Container{
Image: "image",
},
},
taskSpec: v1alpha3.KeptnTaskSpec{
Context: v1alpha3.TaskContext{
WorkloadName: "my-workload",
},
},
},
wantContainer: &v1.Container{
Image: "image",
Env: []v1.EnvVar{
{
Name: KeptnContextEnvVarName,
Value: `{"workloadName":"my-workload","appName":"","appVersion":"","workloadVersion":"","taskType":"","objectType":""}`,
},
},
},
},
{
name: "defined, replacing context",
builder: ContainerBuilder{
spec: &v1alpha3.ContainerSpec{
containerSpec: v1alpha3.ContainerSpec{
Container: &v1.Container{
Image: "image",
Env: []v1.EnvVar{
{
Name: KeptnContextEnvVarName,
Value: `foo`,
},
},
},
},
taskSpec: v1alpha3.KeptnTaskSpec{
Context: v1alpha3.TaskContext{
WorkloadName: "my-workload",
},
},
},
wantContainer: &v1.Container{
Image: "image",
Env: []v1.EnvVar{
{
Name: KeptnContextEnvVarName,
Value: `{"workloadName":"my-workload","appName":"","appVersion":"","workloadVersion":"","taskType":"","objectType":""}`,
},
},
},
},
{
name: "nil",
builder: ContainerBuilder{
spec: &v1alpha3.ContainerSpec{
containerSpec: v1alpha3.ContainerSpec{
Container: nil,
},
},
wantContainer: nil,
wantError: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
container, _ := tt.builder.CreateContainer(context.TODO())
container, err := tt.builder.CreateContainer(context.TODO())
require.Equal(t, tt.wantContainer, container)
if tt.wantError {
require.NotNil(t, err)
} else {
require.Nil(t, err)
}
})
}
}
Expand All @@ -56,7 +123,7 @@ func TestContainerBuilder_CreateVolume(t *testing.T) {
{
name: "defined without volume",
builder: ContainerBuilder{
spec: &v1alpha3.ContainerSpec{
containerSpec: v1alpha3.ContainerSpec{
Container: &v1.Container{
Image: "image",
},
Expand All @@ -67,7 +134,7 @@ func TestContainerBuilder_CreateVolume(t *testing.T) {
{
name: "defined with volume",
builder: ContainerBuilder{
spec: &v1alpha3.ContainerSpec{
containerSpec: v1alpha3.ContainerSpec{
Container: &v1.Container{
Image: "image",
VolumeMounts: []v1.VolumeMount{
Expand All @@ -92,7 +159,7 @@ func TestContainerBuilder_CreateVolume(t *testing.T) {
{
name: "defined with volume and limits",
builder: ContainerBuilder{
spec: &v1alpha3.ContainerSpec{
containerSpec: v1alpha3.ContainerSpec{
Container: &v1.Container{
Image: "image",
Resources: v1.ResourceRequirements{
Expand Down Expand Up @@ -165,7 +232,7 @@ func Test_GenerateVolumes(t *testing.T) {
}
for _, tt := range tests {
builder := ContainerBuilder{
spec: tt.spec,
containerSpec: *tt.spec,
}
t.Run(tt.name, func(t *testing.T) {
require.Equal(t, tt.want, builder.generateVolume())
Expand Down Expand Up @@ -214,7 +281,7 @@ func Test_GetVolumeSource(t *testing.T) {
}
for _, tt := range tests {
builder := ContainerBuilder{
spec: tt.spec,
containerSpec: *tt.spec,
}
t.Run(tt.name, func(t *testing.T) {
require.Equal(t, tt.want, builder.getVolumeSource())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (

// JobRunnerBuilder is the interface that describes the operations needed to help build job specs of a task
type JobRunnerBuilder interface {
// CreateContainerWithVolumes returns a job container and volumes based on the task definition spec
// CreateContainer returns a job container based on the task definition spec
CreateContainer(ctx context.Context) (*corev1.Container, error)
CreateVolume(ctx context.Context) (*corev1.Volume, error)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,13 @@ type RuntimeExecutionParams struct {
}

const (
Context = "CONTEXT"
SecureData = "SECURE_DATA"
Data = "DATA"
CmdArgs = "CMD_ARGS"
Script = "SCRIPT"
FunctionMountName = "function-mount"
Context = "CONTEXT"
KeptnContextEnvVarName = "KEPTN_CONTEXT"
SecureData = "SECURE_DATA"
Data = "DATA"
CmdArgs = "CMD_ARGS"
Script = "SCRIPT"
FunctionMountName = "function-mount"
)

func (fb *RuntimeBuilder) CreateContainer(ctx context.Context) (*corev1.Container, error) {
Expand Down
13 changes: 13 additions & 0 deletions test/integration/container-runtime/00-assert.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,19 @@ metadata:
keptn.sh/app: waiter
keptn.sh/version: '0.4'
keptn.sh/workload: waiter-waiter
spec:
template:
spec:
containers:
- name: testy-test
image: busybox:1.36.1
env:
- name: KEPTN_CONTEXT
value: '{"workloadName":"waiter-waiter","appName":"waiter","appVersion":"","workloadVersion":"0.4","taskType":"pre","objectType":"Workload"}'
command:
- 'sh'
- '-c'
- 'sleep 30'
status:
conditions:
- type: Complete
Expand Down

0 comments on commit a18a833

Please sign in to comment.