Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@ import (
routeApi "github.com/openshift/api/route/v1"
tektonpipelineApi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
tektonTriggersApi "github.com/tektoncd/triggers/pkg/apis/triggers/v1beta1"
corev1 "k8s.io/api/core/v1"
networkingV1 "k8s.io/api/networking/v1"
k8sruntime "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/cache"
"sigs.k8s.io/controller-runtime/pkg/certwatcher"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/healthz"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
Expand Down Expand Up @@ -67,6 +69,26 @@ const (
branchStaleCheckDefaultInterval = time.Hour * 24
)

// No list/watch in the Role for these types. Secret is dual-listed: watched via the
// cache ByObject below, read live here.
//
// client.MatchingFields is served by the cache only. Never field-index a type listed
// here (pkg/codebase/index.go), and never list an indexed type here.
var uncachedTypes = []client.Object{
&corev1.Secret{},
&corev1.ConfigMap{},
&codebaseApiV1.QuickLink{},
&cdPipeApi.CDPipeline{},
&cdPipeApi.Stage{},
&tektonTriggersApi.TriggerTemplate{},
&networkingV1.Ingress{},
&gatewayv1.HTTPRoute{},
&routeApi.Route{},
}

// Verbs track resourcelock.LeasesLock; revisit if LeaderElectionResourceLock changes.
// +kubebuilder:rbac:groups=coordination.k8s.io,namespace=placeholder,resources=leases,verbs=get;create;update

func main() {
var (
metricsAddr string
Expand Down Expand Up @@ -224,6 +246,13 @@ func main() {
os.Exit(1)
}

secretCacheSelector := integrationsecret.CacheSelector()

setupLog.Info("Restricting the cache",
"namespace", ns,
"secretLabelSelector", secretCacheSelector.String(),
)

cfg := ctrl.GetConfigOrDie()

mgr, err := ctrl.NewManager(cfg, ctrl.Options{
Expand All @@ -235,6 +264,14 @@ func main() {
LeaderElectionID: codebaseOperatorLock,
Cache: cache.Options{
DefaultNamespaces: map[string]cache.Config{ns: {}},
DefaultTransform: cache.TransformStripManagedFields(),
ByObject: map[client.Object]cache.ByObject{
// Widen this if a second controller starts watching Secrets.
&corev1.Secret{}: {Label: secretCacheSelector},
},
},
Client: client.Options{
Cache: &client.CacheOptions{DisableFor: uncachedTypes},
},
})
if err != nil {
Expand Down
2 changes: 0 additions & 2 deletions config/rbac/kustomization.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ resources:
- service_account.yaml
- role.yaml
- role_binding.yaml
- leader_election_role.yaml
- leader_election_role_binding.yaml
# The following RBAC configurations are used to protect
# the metrics endpoint with authn/authz. These configurations
# ensure that only authorized users and service accounts
Expand Down
44 changes: 0 additions & 44 deletions config/rbac/leader_election_role.yaml

This file was deleted.

19 changes: 0 additions & 19 deletions config/rbac/leader_election_role_binding.yaml

This file was deleted.

83 changes: 43 additions & 40 deletions config/rbac/role.yaml
Original file line number Diff line number Diff line change
@@ -1,101 +1,92 @@
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
kind: Role
metadata:
name: manager-role
namespace: placeholder
rules:
- apiGroups:
- v2.edp.epam.com
- ""
resources:
- jiraissuemetadatas
- jiraservers
- configmaps
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
- apiGroups:
- v2.edp.epam.com
resources:
- jiraissuemetadatas/finalizers
- jiraservers/finalizers
verbs:
- update
- apiGroups:
- v2.edp.epam.com
- ""
resources:
- jiraissuemetadatas/status
- jiraservers/status
- events
verbs:
- get
- create
- patch
- update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: manager-role
namespace: placeholder
rules:
- apiGroups:
- ""
resources:
- secrets
verbs:
- delete
- get
- list
- patch
- update
- watch
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- create
- get
- update
- apiGroups:
- gateway.networking.k8s.io
resources:
- httproutes
verbs:
- create
- get
- list
- watch
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- create
- get
- list
- watch
- apiGroups:
- route.openshift.io
resources:
- routes
verbs:
- create
- get
- list
- watch
- apiGroups:
- tekton.dev
resources:
- pipelineruns
verbs:
- create
- get
- list
- patch
- update
- watch
- apiGroups:
- triggers.tekton.dev
resources:
- eventlisteners
verbs:
- create
- get
- patch
- apiGroups:
- triggers.tekton.dev
resources:
- triggertemplates
verbs:
- get
- apiGroups:
- v2.edp.epam.com
resources:
- cdpipelines
- stages
verbs:
- get
- list
- watch
- apiGroups:
- v2.edp.epam.com
resources:
Expand All @@ -104,6 +95,8 @@ rules:
- codebaseimagestreams
- codebases
- gitservers
- jiraissuemetadatas
- jiraservers
verbs:
- create
- delete
Expand All @@ -120,6 +113,8 @@ rules:
- codebaseimagestreams/finalizers
- codebases/finalizers
- gitservers/finalizers
- jiraissuemetadatas/finalizers
- jiraservers/finalizers
verbs:
- update
- apiGroups:
Expand All @@ -130,7 +125,15 @@ rules:
- codebaseimagestreams/status
- codebases/status
- gitservers/status
- jiraissuemetadatas/status
- jiraservers/status
verbs:
- get
- patch
- update
- apiGroups:
- v2.edp.epam.com
resources:
- quicklinks
verbs:
- get
6 changes: 3 additions & 3 deletions config/rbac/role_binding.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
kind: RoleBinding
metadata:
labels:
app.kubernetes.io/name: clusterrolebinding
app.kubernetes.io/name: rolebinding
app.kubernetes.io/instance: manager-rolebinding
app.kubernetes.io/component: rbac
app.kubernetes.io/created-by: edp-codebase-operator
Expand All @@ -11,7 +11,7 @@ metadata:
name: manager-rolebinding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
kind: Role
name: manager-role
subjects:
- kind: ServiceAccount
Expand Down
6 changes: 4 additions & 2 deletions controllers/cdstagedeploy/cdstagedeploy_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,10 @@ func (r *ReconcileCDStageDeploy) SetupWithManager(mgr ctrl.Manager) error {
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=cdstagedeployments,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=cdstagedeployments/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=cdstagedeployments/finalizers,verbs=update
// +kubebuilder:rbac:groups=triggers.tekton.dev,namespace=placeholder,resources=triggertemplates,verbs=get;list;watch;
// +kubebuilder:rbac:groups=tekton.dev,namespace=placeholder,resources=pipelineruns,verbs=get;list;watch;create;update;patch
// +kubebuilder:rbac:groups=triggers.tekton.dev,namespace=placeholder,resources=triggertemplates,verbs=get
// Cached List, hence list+watch.
// +kubebuilder:rbac:groups=tekton.dev,namespace=placeholder,resources=pipelineruns,verbs=list;watch;create
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=cdpipelines;stages,verbs=get;list

// Reconcile reads that state of the cluster for a CDStageDeploy object and makes changes based on the state.
func (r *ReconcileCDStageDeploy) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
Expand Down
8 changes: 7 additions & 1 deletion controllers/codebase/codebase_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,13 @@ func (r *ReconcileCodebase) SetupWithManager(mgr ctrl.Manager) error {
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=codebases,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=codebases/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=codebases/finalizers,verbs=update
// +kubebuilder:rbac:groups=route.openshift.io,namespace=placeholder,resources=routes,verbs=get;list;watch
// +kubebuilder:rbac:groups=route.openshift.io,namespace=placeholder,resources=routes,verbs=get
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=quicklinks,verbs=get
// +kubebuilder:rbac:groups="",namespace=placeholder,resources=configmaps,verbs=get
// update: webhook secret written into the GitServer Secret.
// delete: clone credentials, when Codebase.spec.cloneRepositoryCredentials
// .clearSecretAfterUse is set.
// +kubebuilder:rbac:groups="",namespace=placeholder,resources=secrets,verbs=get;update;delete

// Reconcile reads that state of the cluster for a Codebase object and makes changes based on the state.
func (r *ReconcileCodebase) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
Expand Down
3 changes: 3 additions & 0 deletions controllers/codebasebranch/codebasebranch_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ func (r *ReconcileCodebaseBranch) SetupWithManager(mgr ctrl.Manager, maxConcurre
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=codebasebranches,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=codebasebranches/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=codebasebranches/finalizers,verbs=update
// +kubebuilder:rbac:groups="",namespace=placeholder,resources=secrets,verbs=get
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=cdpipelines;stages,verbs=get;list
// +kubebuilder:rbac:groups="",namespace=placeholder,resources=events,verbs=create;patch

// Reconcile reads that state of the cluster for a CodebaseBranch object and makes changes based on the state.
func (r *ReconcileCodebaseBranch) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ func (r *ReconcileCodebaseImageStream) SetupWithManager(mgr ctrl.Manager) error
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=codebaseimagestreams,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=codebaseimagestreams/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=codebaseimagestreams/finalizers,verbs=update
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=cdpipelines;stages,verbs=get;list

// Reconcile reads that state of the cluster for a CodebaseImageStream object and makes changes based on the state.
func (r *ReconcileCodebaseImageStream) Reconcile(
Expand Down
11 changes: 7 additions & 4 deletions controllers/gitserver/gitserver_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,13 @@ func (r *ReconcileGitServer) SetupWithManager(mgr ctrl.Manager) error {
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=gitservers,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=gitservers/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=v2.edp.epam.com,namespace=placeholder,resources=gitservers/finalizers,verbs=update
// +kubebuilder:rbac:groups="",namespace=placeholder,resources=secrets,verbs=get;list;watch;update;patch
// +kubebuilder:rbac:groups="networking.k8s.io",namespace=placeholder,resources=ingresses,verbs=get;list;watch;create
// +kubebuilder:rbac:groups="gateway.networking.k8s.io",namespace=placeholder,resources=httproutes,verbs=get;list;watch;create
// +kubebuilder:rbac:groups="route.openshift.io",namespace=placeholder,resources=routes,verbs=get;list;watch;create
// update sets the GitServer ownerReference on its credential Secret.
// +kubebuilder:rbac:groups="",namespace=placeholder,resources=secrets,verbs=get;update
// +kubebuilder:rbac:groups="networking.k8s.io",namespace=placeholder,resources=ingresses,verbs=get;create
// +kubebuilder:rbac:groups="gateway.networking.k8s.io",namespace=placeholder,resources=httproutes,verbs=get;create
// +kubebuilder:rbac:groups="route.openshift.io",namespace=placeholder,resources=routes,verbs=get;create
// EventListener is unstructured, hence uncached.
// +kubebuilder:rbac:groups="triggers.tekton.dev",namespace=placeholder,resources=eventlisteners,verbs=get;create;patch

// Reconcile reads that state of the cluster for a GitServer object and makes changes based on the state.
func (r *ReconcileGitServer) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
Expand Down
Loading
Loading