Skip to content

Commit faffc2f

Browse files
Merge pull request #17004 from juanvallejo/jvallejo/parse-rsrs-arg-when-removing-deleted-secret
Automatic merge from submit-queue. parse resource name before removing deleted secret Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1457602 Although unlinking deleted secrets from a serviceaccount is currently supported, `oc secret unlink` fails to unlink a deleted secret if its name is specified as `secrets/deleted-secret-name`. This patch parses each secret's name, removing the `secrets/` segment before appending it to a string set of removed secret names. cc @openshift/cli-review
2 parents ce78d7a + b00c5d1 commit faffc2f

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

pkg/oc/cli/secrets/options.go

+23-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io"
77
"io/ioutil"
88
"os"
9+
"strings"
910

1011
kerrors "k8s.io/apimachinery/pkg/api/errors"
1112
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -68,6 +69,16 @@ func (o SecretOptions) Validate() error {
6869
return errors.New("KubeCoreClient must be present")
6970
}
7071

72+
// if any secret names are of the form <resource>/<name>,
73+
// ensure <resource> is a secret.
74+
for _, secretName := range o.SecretNames {
75+
if segs := strings.Split(secretName, "/"); len(segs) > 1 {
76+
if segs[0] != "secret" && segs[0] != "secrets" {
77+
return errors.New(fmt.Sprintf("expected resource of type secret, got %q", secretName))
78+
}
79+
}
80+
}
81+
7182
return nil
7283
}
7384

@@ -98,11 +109,22 @@ func (o SecretOptions) GetServiceAccount() (*kapi.ServiceAccount, error) {
98109
func (o SecretOptions) GetSecretNames(secrets []*kapi.Secret) sets.String {
99110
names := sets.String{}
100111
for _, secret := range secrets {
101-
names.Insert(secret.Name)
112+
names.Insert(parseSecretName(secret.Name))
102113
}
103114
return names
104115
}
105116

117+
// parseSecretName receives a resource name as either
118+
// <resource type> / <name> or <name> and returns only the resource <name>.
119+
func parseSecretName(name string) string {
120+
segs := strings.Split(name, "/")
121+
if len(segs) < 2 {
122+
return name
123+
}
124+
125+
return segs[1]
126+
}
127+
106128
// GetMountSecretNames Get a list of the names of the mount secrets associated
107129
// with a service account
108130
func (o SecretOptions) GetMountSecretNames(serviceaccount *kapi.ServiceAccount) sets.String {

test/cmd/secrets.sh

+13
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,19 @@ os::cmd::expect_success 'oc secrets add deployer basicauth sshauth --for=pull'
8484
# make sure we can add as as pull secret and mount secret at once
8585
os::cmd::expect_success 'oc secrets add deployer basicauth sshauth --for=pull,mount'
8686

87+
# attach secrets to service account
88+
# test that those secrets can be unlinked
89+
# after they have been deleted.
90+
os::cmd::expect_success 'oc create secret generic deleted-secret'
91+
os::cmd::expect_success 'oc secrets link deployer deleted-secret'
92+
# confirm our soon-to-be-deleted secret has been linked
93+
os::cmd::expect_success_and_text "oc get serviceaccount deployer -o jsonpath='{.secrets[?(@.name==\"deleted-secret\")]}'" 'deleted\-secret'
94+
# delete "deleted-secret" and attempt to unlink from service account
95+
os::cmd::expect_success 'oc delete secret deleted-secret'
96+
os::cmd::expect_failure_and_text 'oc secrets unlink deployer secrets/deleted-secret' 'Unlinked deleted secrets'
97+
# ensure already-deleted secret has been unlinked
98+
os::cmd::expect_success_and_not_text "oc get serviceaccount deployer -o jsonpath='{.secrets[?(@.name==\"deleted-secret\")]}'" 'deleted\-secret'
99+
87100
# attach secrets to service account
88101
# single secret with prefix
89102
os::cmd::expect_success 'oc secrets link deployer basicauth'

0 commit comments

Comments
 (0)