Skip to content

Commit 1244f38

Browse files
Shivam Mukhadechmouel
authored andcommitted
Updates basic auth secret owner reference with pipelinerun
this updates the created basic auth secret owner ref with pipelinerun so that they get cleanedup with pipelinerun also removes the secret deletion logic from reconciler and lets ownerref do its magic. Signed-off-by: Shivam Mukhade <[email protected]> a
1 parent 8288716 commit 1244f38

File tree

12 files changed

+137
-31
lines changed

12 files changed

+137
-31
lines changed

config/201-controller-role.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ rules:
6767
verbs: ["create"]
6868
- apiGroups: [""]
6969
resources: ["secrets"]
70-
verbs: ["get", "create"]
70+
verbs: ["get", "create", "update"]
7171
- apiGroups: ["pipelinesascode.tekton.dev"]
7272
resources: ["repositories"]
7373
verbs: ["create", "list"]

pkg/kubeinteraction/kubeinteraction.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
type Interface interface {
1616
CleanupPipelines(context.Context, *zap.SugaredLogger, *v1alpha1.Repository, *v1beta1.PipelineRun, int) error
1717
CreateSecret(ctx context.Context, ns string, secret *corev1.Secret) error
18-
DeleteSecret(context.Context, *zap.SugaredLogger, string, string) error
18+
UpdateSecretWithOwnerRef(context.Context, *zap.SugaredLogger, string, string, *v1beta1.PipelineRun) error
1919
GetSecret(context.Context, ktypes.GetSecretOpt) (string, error)
2020
GetPodLogs(context.Context, string, string, string, int64) (string, error)
2121
}

pkg/kubeinteraction/secrets.go

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ package kubeinteraction
22

33
import (
44
"context"
5+
"fmt"
56

67
ktypes "github.com/openshift-pipelines/pipelines-as-code/pkg/secrets/types"
8+
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
79
"go.uber.org/zap"
810
corev1 "k8s.io/api/core/v1"
911
"k8s.io/apimachinery/pkg/api/errors"
1012
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13+
"k8s.io/client-go/util/retry"
1114
)
1215

1316
func (k Interaction) GetSecret(ctx context.Context, secretopt ktypes.GetSecretOpt) (string, error) {
@@ -25,8 +28,38 @@ func (k Interaction) DeleteSecret(ctx context.Context, logger *zap.SugaredLogger
2528
if err != nil && !errors.IsNotFound(err) {
2629
return err
2730
}
31+
return nil
32+
}
33+
34+
// UpdateSecretWithOwnerRef updates the secret with ownerReference
35+
func (k Interaction) UpdateSecretWithOwnerRef(ctx context.Context, logger *zap.SugaredLogger, targetNamespace, secretName string, pr *v1beta1.PipelineRun) error {
36+
controllerOwned := false
37+
ownerRef := &metav1.OwnerReference{
38+
APIVersion: pr.GetGroupVersionKind().GroupVersion().String(),
39+
Kind: pr.GetGroupVersionKind().Kind,
40+
Name: pr.GetName(),
41+
UID: pr.GetUID(),
42+
BlockOwnerDeletion: &controllerOwned,
43+
Controller: &controllerOwned,
44+
}
45+
err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
46+
secret, err := k.Run.Clients.Kube.CoreV1().Secrets(targetNamespace).Get(ctx, secretName, metav1.GetOptions{})
47+
if err != nil {
48+
return err
49+
}
2850

29-
logger.Infof("Secret %s has been deleted in namespace %s", secretName, targetNamespace)
51+
secret.OwnerReferences = []metav1.OwnerReference{*ownerRef}
52+
53+
_, err = k.Run.Clients.Kube.CoreV1().Secrets(targetNamespace).Update(ctx, secret, metav1.UpdateOptions{})
54+
if err != nil {
55+
logger.Infof("failed to update secret, retrying %v/%v: %v", targetNamespace, secretName, err)
56+
return err
57+
}
58+
return nil
59+
})
60+
if err != nil {
61+
return fmt.Errorf("failed to update secret with ownerRef %v/%v: %w", targetNamespace, secretName, err)
62+
}
3063
return nil
3164
}
3265

pkg/kubeinteraction/secrets_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/openshift-pipelines/pipelines-as-code/pkg/params"
77
"github.com/openshift-pipelines/pipelines-as-code/pkg/params/clients"
88
testclient "github.com/openshift-pipelines/pipelines-as-code/pkg/test/clients"
9+
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
910
"go.uber.org/zap"
1011
zapobserver "go.uber.org/zap/zaptest/observer"
1112
"gotest.tools/v3/assert"
@@ -66,3 +67,44 @@ func TestDeleteSecret(t *testing.T) {
6667
})
6768
}
6869
}
70+
71+
func TestUpdateSecretWithOwnerRef(t *testing.T) {
72+
testNs := "there"
73+
secrete := "dont-tell-anyone-its-a-secrete"
74+
tdata := testclient.Data{
75+
Secret: []*corev1.Secret{
76+
{
77+
ObjectMeta: metav1.ObjectMeta{
78+
Namespace: testNs,
79+
Name: secrete,
80+
},
81+
},
82+
},
83+
}
84+
ctx, _ := rtesting.SetupFakeContext(t)
85+
stdata, _ := testclient.SeedTestData(t, ctx, tdata)
86+
observer, _ := zapobserver.New(zap.InfoLevel)
87+
fakelogger := zap.New(observer).Sugar()
88+
kint := Interaction{
89+
Run: &params.Run{
90+
Clients: clients.Clients{
91+
Kube: stdata.Kube,
92+
},
93+
},
94+
}
95+
pr := &v1beta1.PipelineRun{
96+
ObjectMeta: metav1.ObjectMeta{
97+
Name: "test",
98+
UID: "uid",
99+
},
100+
}
101+
102+
err := kint.UpdateSecretWithOwnerRef(ctx, fakelogger, testNs, secrete, pr)
103+
assert.NilError(t, err)
104+
105+
updatedSecret, err := stdata.Kube.CoreV1().Secrets(testNs).Get(ctx, secrete, metav1.GetOptions{})
106+
assert.NilError(t, err)
107+
assert.Assert(t, len(updatedSecret.OwnerReferences) != 0)
108+
assert.Equal(t, updatedSecret.OwnerReferences[0].Kind, "PipelineRun")
109+
assert.Equal(t, updatedSecret.OwnerReferences[0].Name, pr.Name)
110+
}

pkg/pipelineascode/pipelineascode.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,14 @@ func (p *PacRun) startPR(ctx context.Context, match matcher.Match) error {
146146

147147
// Patch pipelineRun with logURL annotation, skips for GitHub App as we patch logURL while patching checkrunID
148148
if _, ok := pr.Annotations[keys.InstallationID]; !ok {
149-
return patchPipelineRunWithLogURL(ctx, p.logger, p.run.Clients, pr)
149+
if err := patchPipelineRunWithLogURL(ctx, p.logger, p.run.Clients, pr); err != nil {
150+
return err
151+
}
152+
}
153+
154+
// update ownerRef of secret with pipelineRun, so that it gets cleanedUp with pipelineRun
155+
if p.run.Info.Pac.SecretAutoCreation {
156+
return p.k8int.UpdateSecretWithOwnerRef(ctx, p.logger, pr.Namespace, gitAuthSecretName, pr)
150157
}
151158
return nil
152159
}

pkg/pipelineascode/pipelinesascode_github_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/google/go-github/v48/github"
1616
apipac "github.com/openshift-pipelines/pipelines-as-code/pkg/apis/pipelinesascode"
17+
"github.com/openshift-pipelines/pipelines-as-code/pkg/apis/pipelinesascode/keys"
1718
"github.com/openshift-pipelines/pipelines-as-code/pkg/apis/pipelinesascode/v1alpha1"
1819
"github.com/openshift-pipelines/pipelines-as-code/pkg/consoleui"
1920
"github.com/openshift-pipelines/pipelines-as-code/pkg/params"
@@ -496,6 +497,13 @@ func TestRun(t *testing.T) {
496497
logger.Fatalf("failed to find log-url label on pipelinerun: %v/%v", pr.GetNamespace(), pr.GetName())
497498
}
498499
assert.Equal(t, logURL, cs.Clients.ConsoleUI.DetailURL(pr.Namespace, pr.Name))
500+
501+
if cs.Info.Pac.SecretAutoCreation {
502+
secretName := pr.GetAnnotations()[keys.GitAuthSecret]
503+
secret, err := cs.Clients.Kube.CoreV1().Secrets(pr.Namespace).Get(ctx, secretName, metav1.GetOptions{})
504+
assert.NilError(t, err)
505+
assert.Assert(t, len(secret.OwnerReferences) != 0)
506+
}
499507
}
500508
}
501509
})

pkg/reconciler/cleanup.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package reconciler
22

33
import (
44
"context"
5-
"fmt"
65
"strconv"
76

87
"github.com/openshift-pipelines/pipelines-as-code/pkg/apis/pipelinesascode/keys"
@@ -11,21 +10,6 @@ import (
1110
"go.uber.org/zap"
1211
)
1312

14-
func (r *Reconciler) cleanupSecrets(ctx context.Context, logger *zap.SugaredLogger, repo *v1alpha1.Repository, pr *v1beta1.PipelineRun) error {
15-
var gitAuthSecretName string
16-
if annotation, ok := pr.Annotations[keys.GitAuthSecret]; ok {
17-
gitAuthSecretName = annotation
18-
} else {
19-
return fmt.Errorf("cannot get annotation %s as set on PR", keys.GitAuthSecret)
20-
}
21-
22-
err := r.kinteract.DeleteSecret(ctx, logger, repo.GetNamespace(), gitAuthSecretName)
23-
if err != nil {
24-
return fmt.Errorf("deleting basic auth secret has failed: %w ", err)
25-
}
26-
return nil
27-
}
28-
2913
func (r *Reconciler) cleanupPipelineRuns(ctx context.Context, logger *zap.SugaredLogger, repo *v1alpha1.Repository, pr *v1beta1.PipelineRun) error {
3014
keepMaxPipeline, ok := pr.Annotations[keys.MaxKeepRuns]
3115
if ok {

pkg/reconciler/reconciler.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,6 @@ func (r *Reconciler) reportFinalStatus(ctx context.Context, logger *zap.SugaredL
151151
return repo, fmt.Errorf("cannot clean prs: %w", err)
152152
}
153153

154-
if r.run.Info.Pac.SecretAutoCreation {
155-
if err := r.cleanupSecrets(ctx, logger, repo, pr); err != nil {
156-
return repo, fmt.Errorf("cannot clean secret: %w", err)
157-
}
158-
}
159-
160154
newPr, err := r.postFinalStatus(ctx, logger, provider, event, pr)
161155
if err != nil {
162156
return repo, fmt.Errorf("cannot post final status: %w", err)

pkg/reconciler/reconciler_test.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,6 @@ func TestReconciler_ReconcileKind(t *testing.T) {
191191
got, err := stdata.Pipeline.TektonV1beta1().PipelineRuns(pr.Namespace).Get(ctx, pr.Name, metav1.GetOptions{})
192192
assert.NilError(t, err)
193193

194-
// make sure secret is deleted
195-
_, err = stdata.Kube.CoreV1().Secrets(testRepo.Namespace).Get(ctx, secretName, metav1.GetOptions{})
196-
assert.Error(t, err, fmt.Sprintf("secrets \"%s\" not found", secretName))
197-
198194
// state must be updated to completed
199195
assert.Equal(t, got.Labels[keys.State], kubeinteraction.StateCompleted)
200196
})

pkg/test/kubernetestint/kubernetesint.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ func (k *KinterfaceTest) GetPodLogs(_ context.Context, ns, pod, cont string, _ i
3636
return "", nil
3737
}
3838

39+
func (k *KinterfaceTest) UpdateSecretWithOwnerRef(_ context.Context, _ *zap.SugaredLogger, _, _ string, _ *v1beta1.PipelineRun) error {
40+
return nil
41+
}
42+
3943
func (k *KinterfaceTest) GetSecret(ctx context.Context, secret ktypes.GetSecretOpt) (string, error) {
4044
// check if secret exist in k.GetSecretResult
4145
if k.GetSecretResult[secret.Name] == "" {

0 commit comments

Comments
 (0)