Skip to content

Commit

Permalink
test: introduce suite for each controller component test (#1019)
Browse files Browse the repository at this point in the history
Signed-off-by: odubajDT <ondrej.dubaj@dynatrace.com>
  • Loading branch information
odubajDT committed Mar 9, 2023
1 parent 7ba66c9 commit 5ffd00e
Show file tree
Hide file tree
Showing 21 changed files with 890 additions and 727 deletions.
19 changes: 18 additions & 1 deletion operator/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,24 @@ test: manifests fmt vet generate envtest ## Run tests.

.PHONY: component-test
component-test: manifests generate envtest ## Run tests.
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./test/component/... -v -timeout 30m -coverprofile cover.out -coverpkg "github.com/keptn/lifecycle-toolkit/operator/controllers/..."
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./test/component/app/... -v -timeout 30m -coverprofile cover-app.out -coverpkg "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnapp/..."
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./test/component/appversion/... -v -timeout 30m -coverprofile cover-appversion.out -coverpkg "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnappversion/..."
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./test/component/evaluation/... -v -timeout 30m -coverprofile cover-evaluation.out -coverpkg "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnevaluation/..."
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./test/component/load/... -v -timeout 30m
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./test/component/task/... -v -timeout 30m -coverprofile cover-task.out -coverpkg "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptntask/..."
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./test/component/taskdefinition/... -v -timeout 30m -coverprofile cover-taskdefinition.out -coverpkg "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptntaskdefinition/..."
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./test/component/workload/... -v -timeout 30m -coverprofile cover-workload.out -coverpkg "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnworkload/..."
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./test/component/workloadinstance/... -v -timeout 30m -coverprofile cover-workloadinstance.out -coverpkg "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnworkloadinstance/..."
sed -i '/mode: set/d' "cover-app.out"
sed -i '/mode: set/d' "cover-appversion.out"
sed -i '/mode: set/d' "cover-evaluation.out"
sed -i '/mode: set/d' "cover-task.out"
sed -i '/mode: set/d' "cover-taskdefinition.out"
sed -i '/mode: set/d' "cover-workload.out"
sed -i '/mode: set/d' "cover-workloadinstance.out"
echo "mode: set" > cover.out
cat cover-app.out cover-appversion.out cover-evaluation.out cover-task.out cover-taskdefinition.out cover-workload.out cover-workloadinstance.out >> cover.out
rm cover-app.out cover-appversion.out cover-evaluation.out cover-task.out cover-taskdefinition.out cover-workload.out cover-workloadinstance.out

.PHONY: performance-test
performance-test: manifests generate envtest ## Run tests.
Expand Down
56 changes: 56 additions & 0 deletions operator/test/component/app/app_suite_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package app_test

import (
"context"
"os"
"testing"

"github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnapp"
"github.com/keptn/lifecycle-toolkit/operator/test/component/common"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
otelsdk "go.opentelemetry.io/otel/sdk/trace"
sdktest "go.opentelemetry.io/otel/sdk/trace/tracetest"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
// nolint:gci
// +kubebuilder:scaffold:imports
)

func TestApp(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "App Suite")
}

var (
k8sManager ctrl.Manager
tracer *otelsdk.TracerProvider
k8sClient client.Client
ctx context.Context
spanRecorder *sdktest.SpanRecorder
)

var _ = BeforeSuite(func() {
ctx, k8sManager, tracer, spanRecorder, k8sClient, _ = common.InitSuite()

////setup controllers here
controller := &keptnapp.KeptnAppReconciler{
Client: k8sManager.GetClient(),
Scheme: k8sManager.GetScheme(),
Recorder: k8sManager.GetEventRecorderFor("test-app-controller"),
Log: GinkgoLogr,
TracerFactory: &common.TracerFactory{Tracer: tracer},
}
err := controller.SetupWithManager(k8sManager)
Expect(err).To(BeNil())

})

var _ = ReportAfterSuite("custom report", func(report Report) {
f, err := os.Create("report.app-operator")
Expect(err).ToNot(HaveOccurred(), "failed to generate report")
for _, specReport := range report.SpecReports {
common.WriteReport(specReport, f)
}
f.Close()
})
101 changes: 101 additions & 0 deletions operator/test/component/app/app_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package app_test

import (
"fmt"

klcv1alpha3 "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3"
apicommon "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3/common"
"github.com/keptn/lifecycle-toolkit/operator/test/component/common"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
otelsdk "go.opentelemetry.io/otel/sdk/trace"
sdktest "go.opentelemetry.io/otel/sdk/trace/tracetest"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apiserver/pkg/storage/names"
)

var _ = Describe("App", Ordered, func() {
var (
name string
namespace string
version string
)
BeforeEach(func() { // list var here they will be copied for every spec
name = names.SimpleNameGenerator.GenerateName("my-app-")
namespace = "default" // namespaces are not deleted in the api so be careful
// when creating you can use ignoreAlreadyExists(err error)
version = "1.0.0"
})
Describe("Creation of AppVersion from a new App", func() {
var (
instance *klcv1alpha3.KeptnApp
)

BeforeEach(func() {
instance = createInstanceInCluster(name, namespace, version)
fmt.Println("created ", instance.Name)
})

Context("with a new App CRD", func() {

It("should update the spans", func() {
By("creating a new app version")
common.AssertResourceUpdated(ctx, k8sClient, instance)
assertAppSpan(instance, spanRecorder)
fmt.Println("spanned ", instance.Name)
})

})
AfterEach(func() {
// Remember to clean up the cluster after each test
common.DeleteAppInCluster(ctx, k8sClient, instance)
// Reset span recorder after each spec
common.ResetSpanRecords(tracer, spanRecorder)
})

})
})

func assertAppSpan(instance *klcv1alpha3.KeptnApp, spanRecorder *sdktest.SpanRecorder) {
By("Comparing spans")
var spans []otelsdk.ReadOnlySpan
Eventually(func() bool {
spans = spanRecorder.Ended()
return len(spans) >= 3
}, "10s").Should(BeTrue())

Expect(spans[0].Name()).To(Equal(fmt.Sprintf("%s-%s-%d", instance.Name, instance.Spec.Version, instance.Generation)))
Expect(spans[0].Attributes()).To(ContainElement(apicommon.AppName.String(instance.Name)))
Expect(spans[0].Attributes()).To(ContainElement(apicommon.AppVersion.String(instance.Spec.Version)))

Expect(spans[1].Name()).To(Equal("create_app_version"))
Expect(spans[1].Attributes()).To(ContainElement(apicommon.AppName.String(instance.Name)))
Expect(spans[1].Attributes()).To(ContainElement(apicommon.AppVersion.String(instance.Spec.Version)))

Expect(spans[2].Name()).To(Equal("reconcile_app"))
Expect(spans[2].Attributes()).To(ContainElement(apicommon.AppName.String(instance.Name)))
Expect(spans[2].Attributes()).To(ContainElement(apicommon.AppVersion.String(instance.Spec.Version)))
}

func createInstanceInCluster(name string, namespace string, version string) *klcv1alpha3.KeptnApp {
instance := &klcv1alpha3.KeptnApp{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: namespace,
Generation: 1,
},
Spec: klcv1alpha3.KeptnAppSpec{
Version: version,
Workloads: []klcv1alpha3.KeptnWorkloadRef{
{
Name: "app-wname",
Version: "2.0",
},
},
},
}
By("Invoking Reconciling for Create")

Expect(k8sClient.Create(ctx, instance)).Should(Succeed())
return instance
}
179 changes: 0 additions & 179 deletions operator/test/component/appcontroller_test.go

This file was deleted.

Loading

0 comments on commit 5ffd00e

Please sign in to comment.