Skip to content

Commit

Permalink
k8s: reverse entity order when tearing down (#3828)
Browse files Browse the repository at this point in the history
* k8s: reverse entity order when tearing down

* k8s: reverse teardown order on force update

* k8s: base down order on kind priority
  • Loading branch information
mKeRix committed Oct 6, 2020
1 parent cb2dc8b commit 0249a7e
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 0 deletions.
2 changes: 2 additions & 0 deletions internal/cli/down.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ func (c *downCmd) down(ctx context.Context, downDeps DownDeps, args []string) er
return errors.Wrap(err, "Parsing manifest YAML")
}

entities = k8s.ReverseSortedEntities(entities)

entities, _, err = k8s.Filter(entities, func(e k8s.K8sEntity) (b bool, err error) {
downPolicy, exists := e.Annotations()["tilt.dev/down-policy"]
return !exists || downPolicy != "keep", nil
Expand Down
14 changes: 14 additions & 0 deletions internal/cli/down_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,20 @@ func TestDownDeletesNamespacesIfSpecified(t *testing.T) {
}
}

func TestDownDeletesInReverseOrder(t *testing.T) {
f := newDownFixture(t)
defer f.TearDown()

manifests := append([]model.Manifest{}, newK8sNamespaceManifest("foo"))
manifests = append(manifests, newK8sManifest()...)

f.tfl.Result = tiltfile.TiltfileLoadResult{Manifests: manifests}
f.cmd.deleteNamespaces = true
err := f.cmd.down(f.ctx, f.deps, nil)
require.NoError(t, err)
require.Regexp(t, "(?s)name: sancho.*name: foo", f.kCli.DeletedYaml) // namespace comes after deployment
}

func TestDownK8sFails(t *testing.T) {
f := newDownFixture(t)
defer f.TearDown()
Expand Down
2 changes: 2 additions & 0 deletions internal/engine/image_build_and_deployer.go
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,8 @@ func (ibd *ImageBuildAndDeployer) delete(ctx context.Context, k8sTarget model.K8
return err
}

entities = k8s.ReverseSortedEntities(entities)

return ibd.k8sClient.Delete(ctx, entities)
}

Expand Down
32 changes: 32 additions & 0 deletions internal/engine/image_build_and_deployer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,18 @@ func TestForceUpdate(t *testing.T) {
assert.Equal(t, 1, strings.Count(f.k8s.DeletedYaml, "Deployment"))
}

func TestDeleteShouldHappenInReverseOrder(t *testing.T) {
f := newIBDFixture(t, k8s.EnvGKE)
defer f.TearDown()

m := newK8sMultiEntityManifest("sancho")

err := f.ibd.delete(f.ctx, m.K8sTarget())
require.NoError(t, err)

assert.Regexp(t, "(?s)name: sancho-deployment.*name: sancho-pvc", f.k8s.DeletedYaml) // pvc comes after deployment
}

func TestDeployPodWithMultipleImages(t *testing.T) {
f := newIBDFixture(t, k8s.EnvGKE)
defer f.TearDown()
Expand Down Expand Up @@ -971,6 +983,26 @@ func (f *ibdFixture) replaceRegistry(defaultReg string, sel container.RefSelecto
return named
}

func newK8sMultiEntityManifest(name string) model.Manifest {
yaml := fmt.Sprintf(`
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: %s-pvc
spec: {}
status: {}
---
apiVersion: v1
kind: Deployment
metadata:
name: %s-deployment
spec: {}
status: {}`, name, name)
return model.Manifest{Name: model.ManifestName(name)}.WithDeployTarget(model.K8sTarget{YAML: yaml})
}

type fakeKINDLoader struct {
loadCount int
}
Expand Down
6 changes: 6 additions & 0 deletions internal/k8s/entity.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ func SortedEntities(entities []K8sEntity) []K8sEntity {
return []K8sEntity(entList)
}

func ReverseSortedEntities(entities []K8sEntity) []K8sEntity {
entList := entityList(CopyEntities(entities))
sort.Sort(sort.Reverse(entList))
return entList
}

func (e K8sEntity) ToObjectReference() v1.ObjectReference {
meta := e.meta()
apiVersion, kind := e.GVK().ToAPIVersionAndKind()
Expand Down

0 comments on commit 0249a7e

Please sign in to comment.