Skip to content

Commit bc32558

Browse files
Rizwana777jgwest
authored andcommitted
Improve test coverage of appstudio-controller and remove application_controller.go file
1 parent 87e1f9a commit bc32558

8 files changed

+192
-72
lines changed

appstudio-controller/controllers/appstudio.redhat.com/application_controller.go

Lines changed: 0 additions & 65 deletions
This file was deleted.

appstudio-controller/controllers/appstudio.redhat.com/deploymenttarget_controller_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import (
1515
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1616
"k8s.io/apimachinery/pkg/types"
1717

18+
"github.com/golang/mock/gomock"
19+
"github.com/redhat-appstudio/managed-gitops/backend-shared/apis/managed-gitops/v1alpha1/mocks"
1820
ctrl "sigs.k8s.io/controller-runtime"
1921
"sigs.k8s.io/controller-runtime/pkg/client"
2022
"sigs.k8s.io/controller-runtime/pkg/client/fake"
@@ -351,6 +353,44 @@ var _ = Describe("Test DeploymentTargetReclaimController", func() {
351353
})
352354

353355
})
356+
357+
It("test findMatchingSpaceRequestForDT for SpaceRequestList", func() {
358+
var (
359+
mockK8sClient *mocks.MockClient
360+
ctx context.Context
361+
deploymentTarget appstudiosharedv1.DeploymentTarget
362+
)
363+
364+
// Create a list of SpaceRequests with different TierNames
365+
spaceRequests := []codereadytoolchainv1alpha1.SpaceRequest{
366+
{
367+
ObjectMeta: metav1.ObjectMeta{
368+
Labels: map[string]string{
369+
DeploymentTargetLabel: deploymentTarget.Name,
370+
},
371+
},
372+
Spec: codereadytoolchainv1alpha1.SpaceRequestSpec{
373+
TierName: "appstudio-env",
374+
},
375+
},
376+
}
377+
378+
mockCtrl := gomock.NewController(GinkgoT())
379+
defer mockCtrl.Finish()
380+
mockK8sClient = mocks.NewMockClient(mockCtrl)
381+
382+
// Mock the List operation to return the list of SpaceRequests
383+
mockK8sClient.EXPECT().
384+
List(ctx, gomock.Any(), gomock.Any()).
385+
SetArg(1, codereadytoolchainv1alpha1.SpaceRequestList{Items: spaceRequests}).
386+
Return(nil)
387+
388+
result, err := findMatchingSpaceRequestForDT(ctx, mockK8sClient, deploymentTarget)
389+
Expect(err).ToNot(HaveOccurred())
390+
Expect(result).ToNot(BeNil())
391+
Expect(result.Spec.TierName).To(Equal("appstudio-env"))
392+
})
393+
354394
})
355395

356396
})

appstudio-controller/controllers/appstudio.redhat.com/environment_controller_test.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import (
55
"fmt"
66
"reflect"
77

8+
"github.com/golang/mock/gomock"
89
. "github.com/onsi/ginkgo/v2"
910
. "github.com/onsi/gomega"
1011
appstudioshared "github.com/redhat-appstudio/application-api/api/v1alpha1"
1112

1213
managedgitopsv1alpha1 "github.com/redhat-appstudio/managed-gitops/backend-shared/apis/managed-gitops/v1alpha1"
14+
"github.com/redhat-appstudio/managed-gitops/backend-shared/apis/managed-gitops/v1alpha1/mocks"
1315
"github.com/redhat-appstudio/managed-gitops/backend-shared/util/tests"
1416

1517
sharedutil "github.com/redhat-appstudio/managed-gitops/backend-shared/util"
@@ -1778,6 +1780,109 @@ var _ = Describe("Environment controller tests", func() {
17781780
)
17791781

17801782
})
1783+
1784+
Context("test generateDesiredResource function", func() {
1785+
var mockCtrl *gomock.Controller
1786+
var mockK8sClient *mocks.MockClient
1787+
log := log.FromContext(ctx)
1788+
var env appstudioshared.Environment
1789+
BeforeEach(func() {
1790+
1791+
scheme,
1792+
argocdNamespace,
1793+
kubesystemNamespace,
1794+
namespace,
1795+
err := tests.GenericTestSetup()
1796+
Expect(err).ToNot(HaveOccurred())
1797+
1798+
err = appstudioshared.AddToScheme(scheme)
1799+
Expect(err).ToNot(HaveOccurred())
1800+
1801+
apiNamespace = *namespace
1802+
1803+
// Create fake client
1804+
k8sClient = fake.NewClientBuilder().
1805+
WithScheme(scheme).
1806+
WithObjects(namespace, argocdNamespace, kubesystemNamespace).
1807+
Build()
1808+
1809+
mockCtrl = gomock.NewController(GinkgoT())
1810+
mockK8sClient = mocks.NewMockClient(mockCtrl)
1811+
1812+
env = appstudioshared.Environment{
1813+
ObjectMeta: metav1.ObjectMeta{
1814+
Name: "my-env",
1815+
Namespace: apiNamespace.Name,
1816+
},
1817+
Spec: appstudioshared.EnvironmentSpec{
1818+
DisplayName: "my-environment",
1819+
DeploymentStrategy: appstudioshared.DeploymentStrategy_Manual,
1820+
ParentEnvironment: "",
1821+
Tags: []string{},
1822+
Configuration: appstudioshared.EnvironmentConfiguration{},
1823+
UnstableConfigurationFields: &appstudioshared.UnstableEnvironmentConfiguration{
1824+
KubernetesClusterCredentials: appstudioshared.KubernetesClusterCredentials{
1825+
TargetNamespace: "my-target-namespace",
1826+
APIURL: "https://my-api-url",
1827+
ClusterCredentialsSecret: "test-non-exist",
1828+
AllowInsecureSkipTLSVerify: false,
1829+
},
1830+
},
1831+
},
1832+
}
1833+
1834+
reconciler = EnvironmentReconciler{
1835+
Client: k8sClient,
1836+
Scheme: scheme,
1837+
}
1838+
1839+
})
1840+
1841+
AfterEach(func() {
1842+
mockCtrl.Finish()
1843+
})
1844+
1845+
It("test to cover updateEnvironmentReconciledStatusCondition for generic error while fetching secret", func() {
1846+
1847+
err := k8sClient.Create(ctx, &env)
1848+
Expect(err).ToNot(HaveOccurred())
1849+
1850+
mockK8sClient.EXPECT().Get(gomock.Any(), gomock.Any(), gomock.Any()).Return(fmt.Errorf("some generic error"))
1851+
mockK8sClient.EXPECT().Status().Return(mockK8sClient)
1852+
mockK8sClient.EXPECT().Update(gomock.Any(), gomock.Any()).Return(fmt.Errorf("unable to update environment status condition."))
1853+
1854+
desiredManagedEnv, semanticErrOccurred_dontContinue, err := generateDesiredResource(ctx, env, mockK8sClient, log)
1855+
Expect(desiredManagedEnv).To(BeNil())
1856+
Expect(semanticErrOccurred_dontContinue).To(BeFalse())
1857+
Expect(err).To(HaveOccurred())
1858+
Expect(err.Error()).To(ContainSubstring("unable to update environment status condition"))
1859+
1860+
err = k8sClient.Delete(ctx, &env)
1861+
Expect(err).ToNot(HaveOccurred())
1862+
1863+
})
1864+
1865+
It("test to cover updateEnvironmentReconciledStatusCondition for generic error while fetching dtc", func() {
1866+
1867+
env.Spec.Configuration.Target.DeploymentTargetClaim.ClaimName = "test-dtc"
1868+
err := k8sClient.Create(ctx, &env)
1869+
Expect(err).ToNot(HaveOccurred())
1870+
1871+
mockK8sClient.EXPECT().Get(gomock.Any(), gomock.Any(), gomock.Any()).Return(fmt.Errorf("some generic error"))
1872+
mockK8sClient.EXPECT().Status().Return(mockK8sClient)
1873+
mockK8sClient.EXPECT().Update(gomock.Any(), gomock.Any()).Return(fmt.Errorf("unable to update environment status condition."))
1874+
1875+
desiredManagedEnv, semanticErrOccurred_dontContinue, err := generateDesiredResource(ctx, env, mockK8sClient, log)
1876+
Expect(desiredManagedEnv).To(BeNil())
1877+
Expect(semanticErrOccurred_dontContinue).To(BeFalse())
1878+
Expect(err).To(HaveOccurred())
1879+
Expect(err.Error()).To(ContainSubstring("unable to update environment status condition"))
1880+
1881+
err = k8sClient.Delete(ctx, &env)
1882+
Expect(err).ToNot(HaveOccurred())
1883+
})
1884+
1885+
})
17811886
})
17821887

17831888
// expectEnvironmentStatusConditionError verifies that both a Reconciled and an EnvironmentConditionErrorOccurred

appstudio-controller/controllers/appstudio.redhat.com/snapshotenvironmentbinding_controller.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ type SnapshotEnvironmentBindingReconciler struct {
9292
//+kubebuilder:rbac:groups=managed-gitops.redhat.com,resources=gitopsdeployments,verbs=get;list;watch;create;update;patch;delete
9393
//+kubebuilder:rbac:groups=core,resources=namespaces,verbs=get;list;watch;
9494

95+
//+kubebuilder:rbac:groups=appstudio.redhat.com,resources=applications,verbs=get;list;watch;create;update;patch;delete
96+
//+kubebuilder:rbac:groups=appstudio.redhat.com,resources=applications/status,verbs=get;update;patch
97+
//+kubebuilder:rbac:groups=appstudio.redhat.com,resources=applications/finalizers,verbs=update
98+
9599
// Reconcile is part of the main kubernetes reconciliation loop which aims to
96100
// move the current state of the cluster closer to the desired state.
97101
//

appstudio-controller/controllers/appstudio.redhat.com/snapshotenvironmentbinding_controller_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,29 @@ var _ = Describe("SnapshotEnvironmentBinding Reconciler Tests", func() {
705705

706706
})
707707

708+
It("should verify that if DeploymentTargetClaim is not found referencing to an the Environment", func() {
709+
By("creating an Environment that references the DTC")
710+
environment.Spec.UnstableConfigurationFields = nil
711+
environment.Spec.Configuration.Target = appstudiosharedv1.EnvironmentTarget{
712+
DeploymentTargetClaim: appstudiosharedv1.DeploymentTargetClaimConfig{
713+
ClaimName: "dtc-that-doesnt-exist",
714+
},
715+
}
716+
err := bindingReconciler.Client.Update(ctx, &environment)
717+
Expect(err).ToNot(HaveOccurred())
718+
719+
By("creating default Binding")
720+
err = bindingReconciler.Client.Create(ctx, binding)
721+
Expect(err).ToNot(HaveOccurred())
722+
723+
By("calling Reconcile on the SnapshotEnvironmentBinding")
724+
request = newRequest(binding.Namespace, binding.Name)
725+
_, err = bindingReconciler.Reconcile(ctx, request)
726+
Expect(err).To(HaveOccurred())
727+
Expect(err.Error()).To(ContainSubstring("error on retrieving DeploymentTargetClaim"))
728+
729+
})
730+
708731
It("should verify that if the Environment contains configuration information, that it is included in the generated GitOpsDeployment", func() {
709732

710733
By("creating an Environment with valid configuration fields")

appstudio-controller/controllers/appstudio.redhat.com/spacerequest_controller_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,25 @@ var _ = Describe("Test DevsandboxDeploymentController", func() {
112112
Expect(dt.Annotations).ToNot(BeNil())
113113
Expect(dt.Annotations[appstudiosharedv1.AnnDynamicallyProvisioned]).To(Equal(string(appstudiosharedv1.Provisioner_Devsandbox)))
114114
Expect(dt.Spec.KubernetesClusterCredentials.AllowInsecureSkipTLSVerify).To(BeFalse())
115+
116+
By("verify when spacerequest has DeploymentTargetLabel label")
117+
err = k8sClient.Get(ctx, client.ObjectKeyFromObject(&spacerequest), &spacerequest)
118+
Expect(err).ToNot(HaveOccurred())
119+
120+
// Add DeploymentTargetLabel
121+
spacerequest.Labels = map[string]string{
122+
DeploymentTargetClaimLabel: dtc.Name,
123+
DeploymentTargetLabel: dt.Name,
124+
}
125+
126+
err = k8sClient.Update(ctx, &spacerequest)
127+
Expect(err).ToNot(HaveOccurred())
128+
129+
request = newRequest(spacerequest.Namespace, spacerequest.Name)
130+
res, err = reconciler.Reconcile(ctx, request)
131+
Expect(err).ToNot(HaveOccurred())
132+
Expect(res).To(Equal(ctrl.Result{}))
133+
115134
})
116135

117136
It("should return an error when handling a SpaceRequest that doesn't have a matching DTC", func() {

appstudio-controller/go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.19
55
require (
66
github.com/codeready-toolchain/api v0.0.0-20230417183849-f62ccbf3bd40
77
github.com/codeready-toolchain/toolchain-common v0.0.0-20230417235430-8258a3281250
8+
github.com/golang/mock v1.6.0
89
github.com/onsi/ginkgo/v2 v2.6.0
910
github.com/onsi/gomega v1.24.1
1011
github.com/redhat-appstudio/application-api v0.0.0-20231025105224-2790bb451725

appstudio-controller/main.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,6 @@ func main() {
113113
os.Exit(1)
114114
}
115115

116-
if err = (&appstudioredhatcomcontrollers.ApplicationReconciler{
117-
Client: mgr.GetClient(),
118-
Scheme: mgr.GetScheme(),
119-
}).SetupWithManager(mgr); err != nil {
120-
setupLog.Error(err, "unable to create controller", "controller", "Application")
121-
os.Exit(1)
122-
}
123116
if err = (&appstudioredhatcomcontrollers.SnapshotReconciler{
124117
Client: mgr.GetClient(),
125118
Scheme: mgr.GetScheme(),

0 commit comments

Comments
 (0)