Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automated cherry pick of #114863: Use label selector for filtering out resources when pruning. #115571: Add integration test for diff --prune --selector #116150

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion staging/src/k8s.io/kubectl/pkg/cmd/diff/diff.go
Expand Up @@ -649,7 +649,7 @@ func (o *DiffOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) error {
if err != nil {
return err
}
o.pruner = newPruner(o.DynamicClient, mapper, resources)
o.pruner = newPruner(o.DynamicClient, mapper, resources, o.Selector)
}

o.Builder = f.NewBuilder()
Expand Down
3 changes: 2 additions & 1 deletion staging/src/k8s.io/kubectl/pkg/cmd/diff/prune.go
Expand Up @@ -40,13 +40,14 @@ type pruner struct {
resources []prune.Resource
}

func newPruner(dc dynamic.Interface, m meta.RESTMapper, r []prune.Resource) *pruner {
func newPruner(dc dynamic.Interface, m meta.RESTMapper, r []prune.Resource, selector string) *pruner {
return &pruner{
visitedUids: sets.NewString(),
visitedNamespaces: sets.NewString(),
dynamicClient: dc,
mapper: m,
resources: r,
labelSelector: selector,
}
}

Expand Down
83 changes: 83 additions & 0 deletions test/cmd/diff.sh
Expand Up @@ -111,6 +111,89 @@ run_kubectl_diff_tests() {
# Cleanup
kubectl delete -f hack/testdata/pod.yaml
kubectl delete -f hack/testdata/prune/b.yaml
kubectl delete namespace nsb

## kubectl diff --prune with label selector
kubectl create ns nsbprune
kubectl apply --namespace nsbprune -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: a
namespace: nsbprune
labels:
prune-group: "true"
spec:
containers:
- name: kubernetes-pause
image: registry.k8s.io/pause:3.9
---
apiVersion: v1
kind: Pod
metadata:
name: b
namespace: nsbprune
labels:
prune-group: "true"
spec:
containers:
- name: kubernetes-pause
image: registry.k8s.io/pause:3.9
---
apiVersion: v1
kind: Pod
metadata:
name: c
namespace: nsbprune
labels:
prune-group: "false"
spec:
containers:
- name: kubernetes-pause
image: registry.k8s.io/pause:3.9
EOF
kube::test::get_object_assert 'pods a -n nsbprune' "{{${id_field:?}}}" 'a'
kube::test::get_object_assert 'pods b -n nsbprune' "{{${id_field:?}}}" 'b'
kube::test::get_object_assert 'pods c -n nsbprune' "{{${id_field:?}}}" 'c'
# Make sure that kubectl diff does not return either pod 'b' or pod 'c' without prune flag
PRUNE=$(cat <<EOF
apiVersion: v1
kind: Pod
metadata:
name: a
namespace: nsbprune
labels:
prune-group: "true"
spec:
containers:
- name: kubernetes-pause
image: registry.k8s.io/pause:3.9
---
apiVersion: v1
kind: Pod
metadata:
name: c
namespace: nsbprune
labels:
prune-group: "false"
spec:
containers:
- name: kubernetes-pause
image: registry.k8s.io/pause:3.9
EOF
)
output_message=$(echo "${PRUNE}" | kubectl diff -l prune-group=true -f -)
kube::test::if_has_not_string "${output_message}" "name: b"
kube::test::if_has_not_string "${output_message}" "name: c"
# the exit code for diff is 1 because pod 'b' is found in the given label selector but not 'c'
output_message=$(echo "${PRUNE}" | kubectl diff --prune -l prune-group=true -f - || test $? -eq 1)
# pod 'b' should be in output, it is pruned. On the other hand, 'c' should not be, it's label selector is different
kube::test::if_has_string "${output_message}" 'name: b'
kube::test::if_has_not_string "${output_message}" "name: c"

# Cleanup
kubectl delete namespace nsbprune


set +o nounset
set +o errexit
Expand Down