Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(lifecycle-operator): remove hardcoded keptn namespace #2141

Merged
merged 9 commits into from
Sep 21, 2023
14 changes: 6 additions & 8 deletions lifecycle-operator/controllers/common/helperfunctions.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
)

const KLTNamespace = "keptn-lifecycle-toolkit-system"

// GetItemStatus retrieves the state of the task/evaluation, if it does not exists, it creates a default one
func GetItemStatus(name string, instanceStatus []klcv1alpha3.ItemStatus) klcv1alpha3.ItemStatus {
for _, status := range instanceStatus {
Expand Down Expand Up @@ -75,28 +73,28 @@ func copyMap[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2) {
}
}

func GetTaskDefinition(k8sclient client.Client, log logr.Logger, ctx context.Context, definitionName string, namespace string) (*klcv1alpha3.KeptnTaskDefinition, error) {
func GetTaskDefinition(k8sclient client.Client, log logr.Logger, ctx context.Context, definitionName string, namespace string, defaultNamespace string) (*klcv1alpha3.KeptnTaskDefinition, error) {
definition := &klcv1alpha3.KeptnTaskDefinition{}
if err := getObject(k8sclient, log, ctx, definitionName, namespace, definition); err != nil {
if err := getObject(k8sclient, log, ctx, definitionName, namespace, definition, defaultNamespace); err != nil {
return nil, err
}
return definition, nil
}

func GetEvaluationDefinition(k8sclient client.Client, log logr.Logger, ctx context.Context, definitionName string, namespace string) (*klcv1alpha3.KeptnEvaluationDefinition, error) {
func GetEvaluationDefinition(k8sclient client.Client, log logr.Logger, ctx context.Context, definitionName string, namespace string, defaultNamespace string) (*klcv1alpha3.KeptnEvaluationDefinition, error) {
definition := &klcv1alpha3.KeptnEvaluationDefinition{}
if err := getObject(k8sclient, log, ctx, definitionName, namespace, definition); err != nil {
if err := getObject(k8sclient, log, ctx, definitionName, namespace, definition, defaultNamespace); err != nil {
return nil, err
}
return definition, nil
}

func getObject(k8sclient client.Client, log logr.Logger, ctx context.Context, definitionName string, namespace string, definition client.Object) error {
func getObject(k8sclient client.Client, log logr.Logger, ctx context.Context, definitionName string, namespace string, definition client.Object, defaultNamespace string) error {
err := k8sclient.Get(ctx, types.NamespacedName{Name: definitionName, Namespace: namespace}, definition)
if err != nil {
log.Info("Failed to get resource from application namespace", "resource type", fmt.Sprintf("%T", definition), "Definition name", definitionName, "namespace", namespace)
if k8serrors.IsNotFound(err) {
if err := k8sclient.Get(ctx, types.NamespacedName{Name: definitionName, Namespace: KLTNamespace}, definition); err != nil {
if err := k8sclient.Get(ctx, types.NamespacedName{Name: definitionName, Namespace: defaultNamespace}, definition); err != nil {
log.Info("Failed to get resource from default KLT namespace", "resource type", fmt.Sprintf("%T", definition), "definition name", definitionName)
return err
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

const KLTNamespace = "keptn"
RealAnna marked this conversation as resolved.
Show resolved Hide resolved

func Test_GetItemStatus(t *testing.T) {
tests := []struct {
name string
Expand Down Expand Up @@ -423,7 +425,7 @@ func Test_GetTaskDefinition(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
client := fake.NewClientBuilder().WithObjects(tt.taskDef).Build()
d, err := GetTaskDefinition(client, ctrl.Log.WithName("testytest"), context.TODO(), tt.taskDefName, tt.taskDefNamespace)
d, err := GetTaskDefinition(client, ctrl.Log.WithName("testytest"), context.TODO(), tt.taskDefName, tt.taskDefNamespace, KLTNamespace)
if tt.out != nil && d != nil {
require.Equal(t, tt.out.Name, d.Name)
require.Equal(t, tt.out.Namespace, d.Namespace)
Expand Down Expand Up @@ -505,7 +507,7 @@ func Test_GetEvaluationDefinition(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
client := fake.NewClientBuilder().WithObjects(tt.evalDef).Build()
d, err := GetEvaluationDefinition(client, ctrl.Log.WithName("testytest"), context.TODO(), tt.evalDefName, tt.evalDefNamespace)
d, err := GetEvaluationDefinition(client, ctrl.Log.WithName("testytest"), context.TODO(), tt.evalDefName, tt.evalDefNamespace, KLTNamespace)
if tt.out != nil && d != nil {
require.Equal(t, tt.out.Name, d.Name)
require.Equal(t, tt.out.Namespace, d.Namespace)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ import (

"github.com/go-logr/logr"
klcv1alpha3 "github.com/keptn/lifecycle-toolkit/lifecycle-operator/apis/lifecycle/v1alpha3"
"github.com/keptn/lifecycle-toolkit/lifecycle-operator/controllers/common"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
)

type KeptnMetricProvider struct {
Log logr.Logger
K8sClient client.Client
Log logr.Logger
K8sClient client.Client
DefaultNamespace string
}

// FetchData fetches the SLI values from KeptnMetric resource
Expand Down Expand Up @@ -57,8 +57,8 @@ func (p *KeptnMetricProvider) GetKeptnMetric(ctx context.Context, objective klcv
} else {
if err := p.K8sClient.Get(ctx, types.NamespacedName{Name: objective.KeptnMetricRef.Name, Namespace: namespace}, metric); err != nil {
p.Log.Error(err, "Failed to get KeptnMetric from KeptnEvaluation resource namespace")
if err := p.K8sClient.Get(ctx, types.NamespacedName{Name: objective.KeptnMetricRef.Name, Namespace: common.KLTNamespace}, metric); err != nil {
p.Log.Error(err, "Failed to get KeptnMetric from "+common.KLTNamespace+" namespace")
if err := p.K8sClient.Get(ctx, types.NamespacedName{Name: objective.KeptnMetricRef.Name, Namespace: p.DefaultNamespace}, metric); err != nil {
p.Log.Error(err, "Failed to get KeptnMetric from "+p.DefaultNamespace+" namespace")
return nil, err
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"testing"

klcv1alpha3 "github.com/keptn/lifecycle-toolkit/lifecycle-operator/apis/lifecycle/v1alpha3"
"github.com/keptn/lifecycle-toolkit/lifecycle-operator/controllers/common"
metricsapi "github.com/keptn/lifecycle-toolkit/lifecycle-operator/test/api/metrics/v1alpha3"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand All @@ -15,6 +14,8 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

const KLTNamespace = "test"
RealAnna marked this conversation as resolved.
Show resolved Hide resolved

func Test_keptnmetric(t *testing.T) {
tests := []struct {
name string
Expand Down Expand Up @@ -82,8 +83,9 @@ func Test_keptnmetric(t *testing.T) {
client := fake.NewClientBuilder().WithObjects(tt.metric).Build()

kmp := KeptnMetricProvider{
Log: ctrl.Log.WithName("testytest"),
K8sClient: client,
Log: ctrl.Log.WithName("testytest"),
K8sClient: client,
DefaultNamespace: KLTNamespace,
}

obj := klcv1alpha3.Objective{
Expand Down Expand Up @@ -187,14 +189,14 @@ func Test_Getkeptnmetric(t *testing.T) {
metric: &metricsapi.KeptnMetric{
ObjectMeta: metav1.ObjectMeta{
Name: "metric",
Namespace: common.KLTNamespace,
Namespace: KLTNamespace,
},
},
namespace: "my-other-namespace",
out: &metricsapi.KeptnMetric{
ObjectMeta: metav1.ObjectMeta{
Name: "metric",
Namespace: common.KLTNamespace,
Namespace: KLTNamespace,
},
},
wantError: false,
Expand All @@ -208,8 +210,9 @@ func Test_Getkeptnmetric(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
client := fake.NewClientBuilder().WithObjects(tt.metric).Build()
kmp := KeptnMetricProvider{
Log: ctrl.Log.WithName("testytest"),
K8sClient: client,
Log: ctrl.Log.WithName("testytest"),
K8sClient: client,
DefaultNamespace: KLTNamespace,
}

m, err := kmp.GetKeptnMetric(context.TODO(), tt.objective, tt.namespace)
Expand Down
13 changes: 7 additions & 6 deletions lifecycle-operator/controllers/common/taskhandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,12 @@ import (

type TaskHandler struct {
client.Client
EventSender IEvent
Log logr.Logger
Tracer trace.Tracer
Scheme *runtime.Scheme
SpanHandler telemetry.ISpanHandler
EventSender IEvent
Log logr.Logger
Tracer trace.Tracer
Scheme *runtime.Scheme
SpanHandler telemetry.ISpanHandler
DefaultNamespace string
}

type CreateTaskAttributes struct {
Expand Down Expand Up @@ -158,7 +159,7 @@ func (r TaskHandler) setupTasks(taskCreateAttributes CreateTaskAttributes, piWra
}

func (r TaskHandler) handleTaskNotExists(ctx context.Context, phaseCtx context.Context, taskCreateAttributes CreateTaskAttributes, taskName string, piWrapper *interfaces.PhaseItemWrapper, reconcileObject client.Object, task *klcv1alpha3.KeptnTask, taskStatus *klcv1alpha3.ItemStatus) error {
definition, err := GetTaskDefinition(r.Client, r.Log, ctx, taskName, piWrapper.GetNamespace())
definition, err := GetTaskDefinition(r.Client, r.Log, ctx, taskName, piWrapper.GetNamespace(), r.DefaultNamespace)
if err != nil {
r.Log.Error(err, "could not find KeptnTaskDefinition")
return controllererrors.ErrCannotGetKeptnTaskDefinition
Expand Down
13 changes: 7 additions & 6 deletions lifecycle-operator/controllers/common/taskhandler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -371,12 +371,13 @@ func TestTaskHandler(t *testing.T) {
initObjs = append(initObjs, tt.taskDef)
}
handler := TaskHandler{
SpanHandler: &spanHandlerMock,
Log: ctrl.Log.WithName("controller"),
EventSender: NewK8sSender(record.NewFakeRecorder(100)),
Client: fake.NewClientBuilder().WithObjects(initObjs...).Build(),
Tracer: trace.NewNoopTracerProvider().Tracer("tracer"),
Scheme: scheme.Scheme,
SpanHandler: &spanHandlerMock,
Log: ctrl.Log.WithName("controller"),
EventSender: NewK8sSender(record.NewFakeRecorder(100)),
Client: fake.NewClientBuilder().WithObjects(initObjs...).Build(),
Tracer: trace.NewNoopTracerProvider().Tracer("tracer"),
Scheme: scheme.Scheme,
DefaultNamespace: KLTNamespace,
}
status, summary, err := handler.ReconcileTasks(context.TODO(), context.TODO(), tt.object, tt.createAttr)
if len(tt.wantStatus) == len(status) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ type KeptnAppVersionReconciler struct {
TracerFactory telemetry.TracerFactory
Meters apicommon.KeptnMeters
SpanHandler telemetry.ISpanHandler
Namespace string
}

// +kubebuilder:rbac:groups=lifecycle.keptn.sh,resources=keptnappversions,verbs=get;list;watch;create;update;patch;delete
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@ import (

func (r *KeptnAppVersionReconciler) reconcilePrePostDeployment(ctx context.Context, phaseCtx context.Context, appVersion *klcv1alpha3.KeptnAppVersion, checkType apicommon.CheckType) (apicommon.KeptnState, error) {
taskHandler := controllercommon.TaskHandler{
Client: r.Client,
EventSender: r.EventSender,
Log: r.Log,
Tracer: r.getTracer(),
Scheme: r.Scheme,
SpanHandler: r.SpanHandler,
Client: r.Client,
EventSender: r.EventSender,
Log: r.Log,
Tracer: r.getTracer(),
Scheme: r.Scheme,
SpanHandler: r.SpanHandler,
DefaultNamespace: r.Namespace,
}

taskCreateAttributes := controllercommon.CreateTaskAttributes{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func (r *KeptnEvaluationReconciler) Reconcile(ctx context.Context, req ctrl.Requ
}

if !evaluation.Status.OverallStatus.IsSucceeded() {
evaluationDefinition, err := controllercommon.GetEvaluationDefinition(r.Client, r.Log, ctx, evaluation.Spec.EvaluationDefinition, req.NamespacedName.Namespace)
evaluationDefinition, err := controllercommon.GetEvaluationDefinition(r.Client, r.Log, ctx, evaluation.Spec.EvaluationDefinition, req.NamespacedName.Namespace, r.Namespace)
if err != nil {
if errors.IsNotFound(err) {
r.Log.Info(err.Error() + ", ignoring error since object must be deleted")
Expand Down Expand Up @@ -168,8 +168,9 @@ func (r *KeptnEvaluationReconciler) performEvaluation(ctx context.Context, evalu
}

provider := &keptnmetric.KeptnMetricProvider{
Log: r.Log,
K8sClient: r.Client,
Log: r.Log,
K8sClient: r.Client,
DefaultNamespace: r.Namespace,
}

for _, query := range evaluationDefinition.Spec.Objectives {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ func TestKeptnEvaluationReconciler_Reconcile_SucceedEvaluation_withDefinitionInD
evaluationDefinition := &klcv1alpha3.KeptnEvaluationDefinition{
ObjectMeta: metav1.ObjectMeta{
Name: "my-definition",
Namespace: controllercommon.KLTNamespace,
Namespace: "keptn",
},
Spec: klcv1alpha3.KeptnEvaluationDefinitionSpec{
Objectives: []klcv1alpha3.Objective{
Expand Down Expand Up @@ -263,6 +263,7 @@ func setupReconcilerAndClient(t *testing.T, objects ...client.Object) (*KeptnEva
EventSender: controllercommon.NewK8sSender(record.NewFakeRecorder(100)),
Meters: telemetry.SetUpKeptnTaskMeters(meter),
TracerFactory: tf,
Namespace: "keptn",
}
return r, fakeClient
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ type KeptnTaskReconciler struct {
Log logr.Logger
Meters apicommon.KeptnMeters
TracerFactory telemetry.TracerFactory
Namespace string
}

// +kubebuilder:rbac:groups=lifecycle.keptn.sh,resources=keptntasks,verbs=get;list;watch;create;update;patch;delete
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (

func (r *KeptnTaskReconciler) createJob(ctx context.Context, req ctrl.Request, task *klcv1alpha3.KeptnTask) error {
jobName := ""
definition, err := controllercommon.GetTaskDefinition(r.Client, r.Log, ctx, task.Spec.TaskDefinition, req.Namespace)
definition, err := controllercommon.GetTaskDefinition(r.Client, r.Log, ctx, task.Spec.TaskDefinition, req.Namespace, r.Namespace)
if err != nil {
r.Log.Error(err, fmt.Sprintf("could not find KeptnTaskDefinition: %s ", task.Spec.TaskDefinition))
r.EventSender.Emit(apicommon.PhaseCreateTask, "Warning", task, apicommon.PhaseStateNotFound, fmt.Sprintf("could not find KeptnTaskDefinition: %s ", task.Spec.TaskDefinition), "")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (

klcv1alpha3 "github.com/keptn/lifecycle-toolkit/lifecycle-operator/apis/lifecycle/v1alpha3"
apicommon "github.com/keptn/lifecycle-toolkit/lifecycle-operator/apis/lifecycle/v1alpha3/common"
"github.com/keptn/lifecycle-toolkit/lifecycle-operator/controllers/common"
controllercommon "github.com/keptn/lifecycle-toolkit/lifecycle-operator/controllers/common"
fakeclient "github.com/keptn/lifecycle-toolkit/lifecycle-operator/controllers/common/fake"
"github.com/stretchr/testify/require"
Expand All @@ -19,6 +18,8 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

const KLTNamespace = "mynamespace"
RealAnna marked this conversation as resolved.
Show resolved Hide resolved

func TestKeptnTaskReconciler_createJob(t *testing.T) {
namespace := "default"
cmName := "my-cmd"
Expand Down Expand Up @@ -90,7 +91,7 @@ func TestKeptnTaskReconciler_createJob_withTaskDefInDefaultNamespace(t *testing.
taskDefinitionName := "my-task-definition"

cm := makeConfigMap(cmName, namespace)
taskDefinition := makeTaskDefinitionWithConfigmapRef(taskDefinitionName, common.KLTNamespace, cmName)
taskDefinition := makeTaskDefinitionWithConfigmapRef(taskDefinitionName, KLTNamespace, cmName)

fakeClient := fakeclient.NewClient(cm, taskDefinition)

Expand All @@ -103,6 +104,7 @@ func TestKeptnTaskReconciler_createJob_withTaskDefInDefaultNamespace(t *testing.
EventSender: controllercommon.NewK8sSender(record.NewFakeRecorder(100)),
Log: ctrl.Log.WithName("task-controller"),
Scheme: fakeClient.Scheme(),
Namespace: KLTNamespace,
}

task := makeTask("my-task", namespace, taskDefinitionName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ func (fb *RuntimeBuilder) parseRuntimeTaskDefinition(spec *klcv1alpha3.RuntimeSp

func (fb *RuntimeBuilder) handleParent(ctx context.Context, params *RuntimeExecutionParams) error {
var parentJobParams RuntimeExecutionParams
parentDefinition, err := controllercommon.GetTaskDefinition(fb.options.Client, fb.options.Log, ctx, fb.options.funcSpec.FunctionReference.Name, fb.options.req.Namespace)
parentDefinition, err := controllercommon.GetTaskDefinition(fb.options.Client, fb.options.Log, ctx, fb.options.funcSpec.FunctionReference.Name, fb.options.req.Namespace, "")
if err != nil {
fb.options.eventSender.Emit(apicommon.PhaseCreateTask, "Warning", fb.options.task, apicommon.PhaseStateNotFound, fmt.Sprintf("could not find KeptnTaskDefinition: %s ", fb.options.task.Spec.TaskDefinition), "")
return err
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ type KeptnWorkloadInstanceReconciler struct {
Meters apicommon.KeptnMeters
SpanHandler *telemetry.SpanHandler
TracerFactory telemetry.TracerFactory
Namespace string
}

// +kubebuilder:rbac:groups=lifecycle.keptn.sh,resources=keptnworkloadinstances,verbs=get;list;watch;create;update;patch;delete
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@ import (

func (r *KeptnWorkloadInstanceReconciler) reconcilePrePostDeployment(ctx context.Context, phaseCtx context.Context, workloadInstance *klcv1alpha3.KeptnWorkloadInstance, checkType apicommon.CheckType) (apicommon.KeptnState, error) {
taskHandler := controllercommon.TaskHandler{
Client: r.Client,
EventSender: r.EventSender,
Log: r.Log,
Tracer: r.getTracer(),
Scheme: r.Scheme,
SpanHandler: r.SpanHandler,
Client: r.Client,
EventSender: r.EventSender,
Log: r.Log,
Tracer: r.getTracer(),
Scheme: r.Scheme,
SpanHandler: r.SpanHandler,
DefaultNamespace: r.Namespace,
}

taskCreateAttributes := controllercommon.CreateTaskAttributes{
Expand Down
3 changes: 3 additions & 0 deletions lifecycle-operator/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ func main() {
EventSender: controllercommon.NewEventMultiplexer(taskLogger, taskRecorder, ceClient),
Meters: keptnMeters,
TracerFactory: telemetry.GetOtelInstance(),
Namespace: env.PodNamespace,
}
if err = (taskReconciler).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "KeptnTask")
Expand Down Expand Up @@ -262,6 +263,7 @@ func main() {
Meters: keptnMeters,
TracerFactory: telemetry.GetOtelInstance(),
SpanHandler: spanHandler,
Namespace: env.PodNamespace,
}
if err = (workloadInstanceReconciler).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "KeptnWorkloadInstance")
Expand All @@ -278,6 +280,7 @@ func main() {
TracerFactory: telemetry.GetOtelInstance(),
Meters: keptnMeters,
SpanHandler: spanHandler,
Namespace: env.PodNamespace,
}
if err = (appVersionReconciler).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "KeptnAppVersion")
Expand Down
Loading
Loading