Skip to content

Commit e790a01

Browse files
authored
Merge pull request #2130 from FabianKramm/print-feat
feat: allow command override
2 parents 139f957 + fd99ddf commit e790a01

4 files changed

Lines changed: 50 additions & 16 deletions

File tree

e2e/tests/replacepods/replacepods.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/loft-sh/devspace/pkg/devspace/kubectl/selector"
1515
"github.com/loft-sh/devspace/pkg/util/factory"
1616
"github.com/onsi/ginkgo"
17+
autoscalingv1 "k8s.io/api/autoscaling/v1"
1718
corev1 "k8s.io/api/core/v1"
1819
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1920
"k8s.io/apimachinery/pkg/util/wait"
@@ -269,6 +270,37 @@ var _ = DevSpaceDescribe("replacepods", func() {
269270
framework.ExpectNoError(err)
270271
framework.ExpectEqual(pods.Items[0].Spec.Containers[0].Image, "alpine:3.14")
271272

273+
// now scale down the devspace deployment and upscale the replaced deployment
274+
_, err = kubeClient.Client().KubeClient().AppsV1().Deployments(ns).UpdateScale(context.TODO(), "replace-deployment-devspace", &autoscalingv1.Scale{
275+
ObjectMeta: metav1.ObjectMeta{Name: "replace-deployment-devspace", Namespace: ns},
276+
Spec: autoscalingv1.ScaleSpec{Replicas: 0},
277+
}, metav1.UpdateOptions{})
278+
framework.ExpectNoError(err)
279+
_, err = kubeClient.Client().KubeClient().AppsV1().Deployments(ns).UpdateScale(context.TODO(), "replace-deployment", &autoscalingv1.Scale{
280+
ObjectMeta: metav1.ObjectMeta{Name: "replace-deployment", Namespace: ns},
281+
Spec: autoscalingv1.ScaleSpec{Replicas: 1},
282+
}, metav1.UpdateOptions{})
283+
framework.ExpectNoError(err)
284+
285+
// rerun the devspace command
286+
devCmd = &cmd.RunPipelineCmd{
287+
GlobalFlags: &flags.GlobalFlags{
288+
NoWarn: true,
289+
Namespace: ns,
290+
},
291+
Pipeline: "dev",
292+
}
293+
err = devCmd.RunDefault(f)
294+
framework.ExpectNoError(err)
295+
296+
// make sure the deployments are correctly scaled
297+
deployment, err := kubeClient.Client().KubeClient().AppsV1().Deployments(ns).Get(context.TODO(), "replace-deployment-devspace", metav1.GetOptions{})
298+
framework.ExpectNoError(err)
299+
framework.ExpectEqual(*deployment.Spec.Replicas, int32(1))
300+
deployment, err = kubeClient.Client().KubeClient().AppsV1().Deployments(ns).Get(context.TODO(), "replace-deployment", metav1.GetOptions{})
301+
framework.ExpectNoError(err)
302+
framework.ExpectEqual(*deployment.Spec.Replicas, int32(0))
303+
272304
// now purge the deployment and make sure the replica set is deleted as well
273305
purgeCmd := &cmd.RunPipelineCmd{
274306
GlobalFlags: &flags.GlobalFlags{

e2e/tests/replacepods/testdata/deployment/devspace.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ vars:
33
- name: IMAGE
44
value: john/devbackend
55
deployments:
6-
- name: very-long-name-very-long-name-very-long-name
6+
- name: replace-deployment
77
helm:
88
componentChart: true
99
values:

pkg/devspace/services/podreplace/builder.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,21 @@ func buildDeployment(ctx devspacecontext.Context, name string, target runtime.Ob
6464
case *appsv1.ReplicaSet:
6565
deployment.Annotations[TargetNameAnnotation] = t.Name
6666
deployment.Annotations[TargetKindAnnotation] = "ReplicaSet"
67+
deployment.Spec.Selector = t.Spec.Selector
6768
podTemplate.Labels = t.Spec.Template.Labels
6869
podTemplate.Annotations = t.Spec.Template.Annotations
6970
podTemplate.Spec = *t.Spec.Template.Spec.DeepCopy()
7071
case *appsv1.Deployment:
7172
deployment.Annotations[TargetNameAnnotation] = t.Name
7273
deployment.Annotations[TargetKindAnnotation] = "Deployment"
74+
deployment.Spec.Selector = t.Spec.Selector
7375
podTemplate.Labels = t.Spec.Template.Labels
7476
podTemplate.Annotations = t.Spec.Template.Annotations
7577
podTemplate.Spec = *t.Spec.Template.Spec.DeepCopy()
7678
case *appsv1.StatefulSet:
7779
deployment.Annotations[TargetNameAnnotation] = t.Name
7880
deployment.Annotations[TargetKindAnnotation] = "StatefulSet"
81+
deployment.Spec.Selector = t.Spec.Selector
7982
podTemplate.Labels = t.Spec.Template.Labels
8083
podTemplate.Annotations = t.Spec.Template.Annotations
8184
podTemplate.Spec = *t.Spec.Template.Spec.DeepCopy()
@@ -148,12 +151,15 @@ func buildDeployment(ctx devspacecontext.Context, name string, target runtime.Ob
148151
podTemplate.Annotations[selector.MatchedContainerAnnotation] = strings.Join(containers, ";")
149152
}
150153

151-
deployment.Spec = appsv1.DeploymentSpec{
152-
Selector: &metav1.LabelSelector{
153-
MatchLabels: podTemplate.ObjectMeta.Labels,
154-
},
155-
Template: *podTemplate,
154+
deployment.Spec.Template = *podTemplate
155+
if deployment.Spec.Selector == nil {
156+
deployment.Spec.Selector = &metav1.LabelSelector{}
157+
}
158+
if deployment.Spec.Selector.MatchLabels == nil {
159+
deployment.Spec.Selector.MatchLabels = podTemplate.Labels
160+
deployment.Spec.Selector.MatchExpressions = nil
156161
}
162+
deployment.Spec.Selector.MatchLabels[selector.ReplacedLabel] = "true"
157163

158164
// make sure labels etc are there
159165
if ctx.Log().GetLevel() == logrus.DebugLevel {

pkg/devspace/services/podreplace/replace.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"github.com/loft-sh/devspace/pkg/devspace/deploy"
99
patch2 "github.com/loft-sh/devspace/pkg/util/patch"
1010
"github.com/loft-sh/devspace/pkg/util/stringutil"
11-
apiequality "k8s.io/apimachinery/pkg/api/equality"
1211
"k8s.io/apimachinery/pkg/api/resource"
1312
"strconv"
1413
"time"
@@ -70,7 +69,7 @@ func (p *replacer) ReplacePod(ctx devspacecontext.Context, devPod *latest.DevPod
7069
// check if there is a replaced pod in the target namespace
7170
ctx.Log().Debug("Try to find replaced deployment...")
7271

73-
// find the replaced replica set
72+
// find the replaced deployment
7473
deployment, err := ctx.KubeClient().KubeClient().AppsV1().Deployments(devPodCache.Namespace).Get(ctx.Context(), devPodCache.Deployment, metav1.GetOptions{})
7574
if err != nil {
7675
if !kerrors.IsNotFound(err) {
@@ -154,17 +153,14 @@ func updateNeeded(ctx devspacecontext.Context, deployment *appsv1.Deployment, de
154153
ctx.Log().Warnf("Error scaling down target: %v", err)
155154
}
156155

157-
// don't update if pod spec & config hash are the same
158-
if apiequality.Semantic.DeepEqual(newDeployment.Spec.Template, deployment.Spec.Template) && configHash == deployment.Annotations[DevPodConfigHashAnnotation] {
159-
// make sure target is downscaled
160-
ctx.Log().Debugf("No changes required in replaced deployment %s", deployment.Name)
161-
return false, nil
162-
}
163-
164-
// update deployment´
156+
// update deployment
165157
originalDeployment := deployment.DeepCopy()
158+
deployment.Spec.Replicas = ptr.Int32(1)
159+
deployment.Spec.Selector = newDeployment.Spec.Selector
166160
deployment.Spec.Template = newDeployment.Spec.Template
161+
deployment.Annotations = newDeployment.Annotations
167162
deployment.Annotations[DevPodConfigHashAnnotation] = configHash
163+
deployment.Labels = newDeployment.Labels
168164
patch := patch2.MergeFrom(originalDeployment)
169165
patchBytes, err := patch.Data(deployment)
170166
if err != nil {

0 commit comments

Comments
 (0)