Skip to content

Commit 3f59dd2

Browse files
author
Leonid Podolinskiy
authored
Merge pull request #2 from lightrun-platform/2-crs-same-deployment
handling of already patched deployment
2 parents 024c092 + 0b67e2b commit 3f59dd2

File tree

2 files changed

+122
-4
lines changed

2 files changed

+122
-4
lines changed

controllers/lightrunjavaagent_controller.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ func (r *LightrunJavaAgentReconciler) Reconcile(ctx context.Context, req ctrl.Re
8989
}
9090
}
9191

92+
if oldLrjaName, ok := originalDeployment.Annotations["lightrun.com/lightrunjavaagent"]; ok && oldLrjaName != lightrunJavaAgent.Name {
93+
log.Error(err, "Deployment already patched by LightrunJavaAgent", "Existing LightrunJavaAgent", oldLrjaName)
94+
return r.errorStatus(ctx, lightrunJavaAgent, errors.New("deployment already patched"))
95+
}
96+
9297
deploymentApplyConfig, err := appsv1ac.ExtractDeployment(originalDeployment, fieldManager)
9398
if err != nil {
9499
log.Error(err, "failed to extract Deployment")

controllers/lightrunjavaagent_controller_test.go

Lines changed: 117 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,13 @@ var _ = Describe("LightrunJavaAgent controller", func() {
4141

4242
var patchedDepl appsv1.Deployment
4343
deplRequest := types.NamespacedName{
44-
Name: "app-deployment",
44+
Name: deployment,
45+
Namespace: namespace,
46+
}
47+
48+
var patchedDepl2 appsv1.Deployment
49+
deplRequest2 := types.NamespacedName{
50+
Name: deployment + "-2",
4551
Namespace: namespace,
4652
}
4753

@@ -63,6 +69,12 @@ var _ = Describe("LightrunJavaAgent controller", func() {
6369
Namespace: namespace,
6470
}
6571

72+
var lrAgent3 agentsv1beta.LightrunJavaAgent
73+
lrAgentRequest3 := types.NamespacedName{
74+
Name: "duplicate",
75+
Namespace: namespace,
76+
}
77+
6678
ctx := context.Background()
6779
Context("When setting up the test environment", func() {
6880
It("Should create LightrunJavaAgent custom resource", func() {
@@ -134,7 +146,7 @@ var _ = Describe("LightrunJavaAgent controller", func() {
134146
depl := appsv1.Deployment{
135147
TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String(), Kind: "Deployment"},
136148
ObjectMeta: metav1.ObjectMeta{
137-
Name: "app-deployment",
149+
Name: deployment,
138150
Namespace: namespace,
139151
},
140152
Spec: appsv1.DeploymentSpec{
@@ -421,7 +433,7 @@ var _ = Describe("LightrunJavaAgent controller", func() {
421433
depl := appsv1.Deployment{
422434
TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String(), Kind: "Deployment"},
423435
ObjectMeta: metav1.ObjectMeta{
424-
Name: "app-deployment-2",
436+
Name: deployment + "-2",
425437
Namespace: namespace,
426438
},
427439
Spec: appsv1.DeploymentSpec{
@@ -472,7 +484,7 @@ var _ = Describe("LightrunJavaAgent controller", func() {
472484
It("Should delete deployment", func() {
473485
depl := appsv1.Deployment{
474486
ObjectMeta: metav1.ObjectMeta{
475-
Name: "app-deployment-2",
487+
Name: deployment + "-2",
476488
Namespace: namespace,
477489
},
478490
}
@@ -489,4 +501,105 @@ var _ = Describe("LightrunJavaAgent controller", func() {
489501
})
490502

491503
})
504+
505+
Context("When creating CR with deployment already patched by another CR", func() {
506+
It("Should create Deployment", func() {
507+
By("Creating deployment")
508+
depl := appsv1.Deployment{
509+
TypeMeta: metav1.TypeMeta{APIVersion: appsv1.SchemeGroupVersion.String(), Kind: "Deployment"},
510+
ObjectMeta: metav1.ObjectMeta{
511+
Name: deployment + "-2",
512+
Namespace: namespace,
513+
},
514+
Spec: appsv1.DeploymentSpec{
515+
Selector: &metav1.LabelSelector{
516+
MatchLabels: map[string]string{"app": "app"},
517+
},
518+
Template: corev1.PodTemplateSpec{
519+
ObjectMeta: metav1.ObjectMeta{
520+
Labels: map[string]string{"app": "app"},
521+
},
522+
Spec: corev1.PodSpec{
523+
Containers: []corev1.Container{
524+
{
525+
Name: "app",
526+
Image: "busybox",
527+
},
528+
{
529+
Name: "app2",
530+
Image: "busybox",
531+
Env: []corev1.EnvVar{
532+
{
533+
Name: javaEnv,
534+
Value: "-Djava.net.preferIPv4Stack=true",
535+
},
536+
},
537+
},
538+
{
539+
Name: "no-patch",
540+
Image: "busybox",
541+
},
542+
},
543+
},
544+
},
545+
},
546+
}
547+
Expect(k8sClient.Create(ctx, &depl)).Should(Succeed())
548+
})
549+
550+
It("prepare new CR with patched deployment", func() {
551+
By("Creating new CR")
552+
lrAgent3 := agentsv1beta.LightrunJavaAgent{
553+
ObjectMeta: metav1.ObjectMeta{
554+
Name: "duplicate",
555+
Namespace: namespace,
556+
},
557+
Spec: agentsv1beta.LightrunJavaAgentSpec{
558+
DeploymentName: deployment + "-2",
559+
SecretName: secret,
560+
ServerHostname: server,
561+
AgentName: agentName,
562+
AgentTags: agentTags,
563+
AgentConfig: agentConfig,
564+
AgentEnvVarName: javaEnv,
565+
ContainerSelector: containerSelector,
566+
InitContainer: agentsv1beta.InitContainer{
567+
Image: initContainerImage,
568+
SharedVolumeName: initVolumeName,
569+
SharedVolumeMountPath: "/lightrun",
570+
},
571+
},
572+
}
573+
Expect(k8sClient.Create(ctx, &lrAgent3)).Should(Succeed())
574+
})
575+
576+
It("Should have failed status of CR", func() {
577+
Eventually(func() bool {
578+
if err := k8sClient.Get(ctx, lrAgentRequest3, &lrAgent3); err != nil {
579+
return false
580+
}
581+
return lrAgent3.Status.DeploymentStatus == "ReconcileFailed"
582+
}).Should(BeTrue())
583+
})
584+
585+
It("Should not add finalizer to the duplicate CR", func() {
586+
Eventually(func() bool {
587+
if err := k8sClient.Get(ctx, lrAgentRequest3, &lrAgent3); err != nil {
588+
return false
589+
}
590+
return len(lrAgent3.ObjectMeta.Finalizers) == 0
591+
}).Should(BeTrue())
592+
})
593+
594+
It("Should keep deployment annotation of the original CR", func() {
595+
Eventually(func() bool {
596+
if err := k8sClient.Get(ctx, deplRequest2, &patchedDepl2); err != nil {
597+
return false
598+
}
599+
return patchedDepl2.Annotations["lightrun.com/lightrunjavaagent"] == lrAgent2.Name
600+
}).Should(BeTrue())
601+
})
602+
603+
})
604+
492605
})

0 commit comments

Comments
 (0)