Repository: apache/camel-k
Pull request #1787 (2020-10-26 14:06:07)

Create PodDisruptionBudget for every integration
<!-- Description -->
Closes: #1760

This is what I have so far. PDB is created for every integration and deleted with integration. I decided to go with new trait for the PDB but I can refactor if necessary. 

I still need to create test for the trait and also I'm not sure if `IntegrationRunning` phase is the best here.  Any feedback appreciated.

<!--
Enter your extended release note in the below block. If the PR requires
additional action from users switching to the new release, include the string
"action required". If no release note is required, write "NONE". 

You can (optionally) mark this PR with labels "kind/bug" or "kind/feature" to make sure
the text is added to the right section of the release notes. 
-->

**Release Note**
```release-note
feat: Configure PodDisruptionBudget for integrations
```


mmelko: @astefanutti @lburgazzoli @nicolaferraro FYI
astefanutti: I think permissions to get, create, update the PDB resources must be added to the operator RBAC.
mmelko: Should that be in operator-role-kubernetes/openshift,yaml file ?
astefanutti: > Should that be in operator-role-kubernetes/openshift,yaml file ?

Exactly, and the generated resources, like the OLM CSV updated accordingly.
mmelko: I've tested this also with knative and cron-job deployment strategies and it works as expected. 
astefanutti: @lburgazzoli @nicolaferraro 👋,

that PR introduces the _pod_ trait, whose purpose is to be responsible for all the aspects that directly relate to the integration pods configuration. That includes upcoming work to support:
- Tolerations
- Pod topology spread
- Pod template, either inlined or by referencing a ConfigMap, addressing #1685.

Technically, the _affinity_ trait should be merged into that new trait, yet we may want to keep that concern separated, at least to maintain compatibility for the 1.x lifespan.

It turns out we already have traits responsible for the container and deployment aspects, but none for those of the pods. The _deployment_ trait could have been a candidate to meet that need. However it's specific to the _Deployment_ strategy, while the pod aspects can be shared across deployment strategies.

WDYT?
lburgazzoli: I guess this also relates to: https://github.com/apache/camel-k/issues/1657
astefanutti: > I guess this also relates to: #1657

Damn auto-complete, that's the one I wanted to type. Corrected my previous comment.
lburgazzoli: I'm thinking if after we'll have https://github.com/apache/camel-k/issues/1657, we should reduce the number of traits to the bare minimum and with a very opinionated list of what can be configured via traits and leave everything else to pod templates & co

lburgazzoli: maybe also have a flag to use a pod tamplate from a local yaml
astefanutti: After thinking a bit based on this discussion, I'd suggest we introduce a `pdb` trait for the sole scope of that PR, and start working on the new `pod` trait to address #1657, and see what other options it could be responsible for.
mmelko: I refactored it back to `pdb` trait. 

Patch:
diff --git a/deploy/operator-role-kubernetes.yaml b/deploy/operator-role-kubernetes.yaml
index 26c4c48c7..f194602e6 100644
--- a/deploy/operator-role-kubernetes.yaml
+++ b/deploy/operator-role-kubernetes.yaml
@@ -47,6 +47,17 @@ rules:
   - patch
   - update
   - watch
+- apiGroups:
+  - policy
+  resources:
+  - poddisruptionbudgets
+  verbs:
+  - create
+  - delete
+  - get
+  - update
+  - list
+  - patch
 - apiGroups:
   - rbac.authorization.k8s.io
   resources:
diff --git a/deploy/operator-role-olm.yaml b/deploy/operator-role-olm.yaml
index 53fa59fd1..d488dd173 100644
--- a/deploy/operator-role-olm.yaml
+++ b/deploy/operator-role-olm.yaml
@@ -47,6 +47,17 @@ rules:
   - patch
   - update
   - watch
+- apiGroups:
+  - policy
+  resources:
+  - poddisruptionbudgets
+  verbs:
+  - create
+  - delete
+  - get
+  - update
+  - patch
+  - list
 - apiGroups:
   - rbac.authorization.k8s.io
   resources:
diff --git a/deploy/operator-role-openshift.yaml b/deploy/operator-role-openshift.yaml
index 31696bce6..8b2030305 100644
--- a/deploy/operator-role-openshift.yaml
+++ b/deploy/operator-role-openshift.yaml
@@ -47,6 +47,17 @@ rules:
   - patch
   - update
   - watch
+- apiGroups:
+  - policy
+  resources:
+  - poddisruptionbudgets
+  verbs:
+  - create
+  - delete
+  - get
+  - update
+  - list
+  - patch
 - apiGroups:
   - rbac.authorization.k8s.io
   resources:
diff --git a/deploy/resources.go b/deploy/resources.go
index a47f1d444..f432da137 100644
--- a/deploy/resources.go
+++ b/deploy/resources.go
@@ -231,9 +231,9 @@ var assets = func() http.FileSystem {
 		"/operator-role-kubernetes.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "operator-role-kubernetes.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 2244,
+			uncompressedSize: 2375,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x54\xc1\x6e\x1b\x37\x10\xbd\xf3\x2b\x1e\xb4\x97\xa4\xb0\xe4\xb6\xa7\x42\x3d\xa9\x8e\xdd\x0a\x0d\x24\xc0\xab\x34\xc8\x91\xe2\x8e\x56\x53\x73\x39\x2c\xc9\x95\xec\x7e\x7d\x41\xee\x2a\x91\xa3\x04\xe8\x21\x88\xf7\xa2\x21\x77\xf6\xcd\x9b\xf7\x46\x53\x61\xfa\xed\x1e\x55\xe1\x2d\x1b\x72\x91\x1a\x24\x41\xda\x13\x16\x5e\x9b\x3d\xa1\x96\x5d\x3a\xea\x40\xb8\x93\xde\x35\x3a\xb1\x38\xbc\x5a\xd4\x77\xaf\xd1\xbb\x86\x02\xc4\x11\x24\xa0\x93\x40\xaa\x82\x11\x97\x02\x6f\xfb\x24\x01\x76\x00\x84\x6e\x03\x51\x47\x2e\xc5\x19\x50\x13\x15\xf4\xd5\x7a\xb3\xbc\xb9\xc5\x8e\x2d\xa1\xe1\x38\x7c\x44\x0d\x8e\x9c\xf6\xaa\x42\xda\x73\xc4\x51\xc2\x03\x76\x12\xa0\x9b\x86\x73\x61\x6d\xc1\x6e\x27\xa1\x1b\x68\x04\x6a\x75\x68\xd8\xb5\x30\xe2\x9f\x02\xb7\xfb\x04\x39\x3a\x0a\x71\xcf\x7e\xa6\x2a\x6c\x72\x1b\xf5\xdd\x89\x49\x1c\x60\x4b\xcd\x24\xf8\x20\xfd\xd8\xc3\x59\xbb\xa3\x0a\x57\xf8\x8b\x42\xcc\x45\x7e\x9e\xfd\xa8\x2a\xbc\xca\x29\x93\xf1\xe5\xe4\xf5\xaf\x78\x92\x1e\x9d\x7e\x82\x93\x84\x3e\xd2\x19\x32\x3d\x1a\xf2\x09\xec\x60\xa4\xf3\x96\xb5\x33\xf4\xa9\xad\x8f\x15\x66\x28\x04\x32\x86\x6c\x93\x66\x07\x5d\xda\x80\xec\xce\xd3\xa0\x93\xaa\x54\x85\xf2\xec\x53\xf2\xf3\xeb\xeb\xe3\xf1\x38\xd3\x85\xee\x4c\x42\x7b\x7d\xea\xee\xfa\xed\xf2\xe6\x76\x55\xdf\x4e\x0b\x65\x55\xe1\x9d\xb3\x14\x23\x02\xfd\xd3\x73\xa0\x06\xdb\x27\x68\xef\x2d\x1b\xbd\xb5\x04\xab\x8f\xd9\xb8\xe2\x4e\x31\x9d\x1d\x8e\x81\x13\xbb\xf6\x0a\x71\x74\x5d\x55\xcf\xdc\xf9\x24\xd7\x89\x1e\xc7\x67\x09\xe2\xa0\x1d\x26\x8b\x1a\xcb\x7a\x82\xdf\x16\xf5\xb2\xbe\x52\x15\xde\x2f\x37\x7f\xac\xdf\x6d\xf0\x7e\x71\x7f\xbf\x58\x6d\x96\xb7\x35\xd6\xf7\xb8\x59\xaf\xde\x2c\x37\xcb\xf5\xaa\xc6\xfa\x0e\x8b\xd5\x07\xfc\xb9\x5c\xbd\xb9\x02\x71\xda\x53\x00\x3d\xfa\x90\xf9\x4b\x00\x67\x21\xa9\xc9\x9e\x9e\x06\xe8\x44\x20\xcf\x47\x3e\x47\x4f\x86\x77\x6c\x60\xb5\x6b\x7b\xdd\x12\x5a\x39\x50\x70\x79\x3c\x3c\x85\x8e\x63\xb6\x33\x42\xbb\x46\x55\xb0\xdc\x71\x2a\x53\x14\x2f\x9b\xca\x65\xbe\xe5\x7f\x4b\x3d\xb0\x6b\xe6\xb8\x17\x4b\x4a\x7b\x1e\x27\x6b\x8e\xb0\xd5\x66\xa6\xfb\xb4\x97\xc0\xff\x16\x32\xb3\x87\x5f\xe2\x8c\xe5\xfa\xf0\x93\xea\x28\xe9\x46\x27\x3d\x57\x80\xd3\x1d\xcd\x61\x74\x47\x76\xfa\x30\x15\x4f\x41\x27\x09\x0a\xb0\x7a\x4b\x36\xe6\x14\x64\x6b\xe7\x98\x8c\x49\x13\x15\x7a\x4b\x71\xae\xa6\xd0\x9e\x7f\x0f\xd2\xfb\x92\x36\x1d\x50\xce\xc6\x47\x01\x81\xa2\xf4\xc1\xd0\x98\x31\xf9\x61\xa2\x80\x03\x85\xed\xd9\xc5\x05\xce\x64\x72\xf9\xa5\x97\x26\x96\x20\x52\x38\xb0\xa1\xe1\x40\xae\xf1\xc2\x2e\x0d\x27\x9f\xbb\x8f\x89\x5c\x3a\x88\xed\x3b\x32\x56\x73\x37\xbc\x32\xe2\x76\xdc\x76\xda\x9f\x40\x4c\xa0\xf4\x0c\x50\x1b\x23\xfd\x80\x74\xc6\xcf\x04\xd2\x89\x4a\xd8\x90\xa5\x67\xa1\x11\x6b\xc9\x64\x6d\xcb\x65\x4b\xa9\xfc\x5a\x8e\x43\xe0\x75\x32\xfb\x12\xf5\xbe\x39\xa1\x1c\xcb\xe5\x45\xcb\x5f\xf5\xeb\x52\x89\x20\x76\xec\x3e\x47\x5b\x76\x79\x4d\xbd\x10\xed\x2f\x39\x45\x07\xba\x90\xf1\xa2\xc8\x57\xf0\xb4\x2f\x06\x7d\x86\xd8\x90\xb7\xf2\xd4\xd1\xc9\xe7\x40\x65\xd3\xc4\x8f\x0e\x26\x9d\x68\xd7\xdb\xf1\xe2\x05\x74\xd8\x8e\xb9\x9f\x11\x37\x41\xdc\xdf\xb2\x7d\x21\x52\xa3\x98\x3a\x8d\x2b\xf4\x9e\xf2\x32\x2d\xe0\x71\x0e\xd7\x5b\xfb\x05\xa9\x35\x75\xe2\x2e\x85\xfc\xbf\x06\xd2\x63\x22\x57\xb6\xe1\x25\x36\xbb\x36\x2f\x5d\xfa\x3e\x72\xfc\x17\x00\x00\xff\xff\xc5\x56\x8d\x6d\xc4\x08\x00\x00"),
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x54\xc1\x72\xdb\x36\x10\xbd\xf3\x2b\xde\x88\x97\xa4\x63\xc9\x6d\x4f\x1d\xf5\xa4\x26\x76\xab\x69\x46\x9a\x31\x95\x66\x72\x04\xc1\x15\xb5\x35\x88\x45\x01\x50\xb2\xfa\xf5\x1d\x40\x54\x22\x9b\xce\x8c\x0f\x9e\x86\x17\x2d\xc0\xe5\xdb\xb7\xfb\x9e\xb6\xc4\xf4\xf5\x9e\xa2\xc4\x07\xd6\x64\x03\x35\x88\x82\xb8\x23\x2c\x9c\xd2\x3b\x42\x25\xdb\x78\x50\x9e\x70\x2b\xbd\x6d\x54\x64\xb1\x78\xb3\xa8\x6e\xdf\xa2\xb7\x0d\x79\x88\x25\x88\x47\x27\x9e\x8a\x12\x5a\x6c\xf4\x5c\xf7\x51\x3c\xcc\x09\x10\xaa\xf5\x44\x1d\xd9\x18\x66\x40\x45\x94\xd1\x57\xeb\xcd\xf2\xdd\x0d\xb6\x6c\x08\x0d\x87\xd3\x47\xd4\xe0\xc0\x71\x57\x94\x88\x3b\x0e\x38\x88\xbf\xc7\x56\x3c\x54\xd3\x70\x2a\xac\x0c\xd8\x6e\xc5\x77\x27\x1a\x9e\x5a\xe5\x1b\xb6\x2d\xb4\xb8\xa3\xe7\x76\x17\x21\x07\x4b\x3e\xec\xd8\xcd\x8a\x12\x9b\xd4\x46\x75\x7b\x66\x12\x4e\xb0\xb9\x66\x14\x7c\x96\x7e\xe8\xe1\xa2\xdd\x61\x0a\x57\xf8\x8b\x7c\x48\x45\x7e\x9e\xfd\x58\x94\x78\x93\x52\x26\xc3\xcb\xc9\xdb\x5f\x71\x94\x1e\x9d\x3a\xc2\x4a\x44\x1f\xe8\x02\x99\x1e\x34\xb9\x08\xb6\xd0\xd2\x39\xc3\xca\x6a\xfa\xda\xd6\x97\x0a\x33\x64\x02\x09\x43\xea\xa8\xd8\x42\xe5\x36\x20\xdb\xcb\x34\xa8\x58\x94\x45\x89\xfc\xec\x62\x74\xf3\xeb\xeb\xc3\xe1\x30\x53\x99\xee\x4c\x7c\x7b\x7d\xee\xee\xfa\xc3\xf2\xdd\xcd\xaa\xba\x99\x66\xca\x45\x89\x8f\xd6\x50\x08\xf0\xf4\x4f\xcf\x9e\x1a\xd4\x47\x28\xe7\x0c\x6b\x55\x1b\x82\x51\x87\x24\x5c\x56\x27\x8b\xce\x16\x07\xcf\x91\x6d\x7b\x85\x30\xa8\x5e\x94\x8f\xd4\xf9\x3a\xae\x33\x3d\x0e\x8f\x12\xc4\x42\x59\x4c\x16\x15\x96\xd5\x04\xbf\x2d\xaa\x65\x75\x55\x94\xf8\xb4\xdc\xfc\xb1\xfe\xb8\xc1\xa7\xc5\xdd\xdd\x62\xb5\x59\xde\x54\x58\xdf\xe1\xdd\x7a\xf5\x7e\xb9\x59\xae\x57\x15\xd6\xb7\x58\xac\x3e\xe3\xcf\xe5\xea\xfd\x15\x88\xe3\x8e\x3c\xe8\xc1\xf9\xc4\x5f\x3c\x38\x0d\x92\x9a\xa4\xe9\xd9\x40\x67\x02\xc9\x1f\xe9\x1c\x1c\x69\xde\xb2\x86\x51\xb6\xed\x55\x4b\x68\x65\x4f\xde\x26\x7b\x38\xf2\x1d\x87\x24\x67\x80\xb2\x4d\x51\xc2\x70\xc7\x31\xbb\x28\x8c\x9b\x4a\x65\x5e\xf3\xbf\x55\xdc\xb3\x6d\xe6\xb8\x13\x43\x85\x72\x3c\x38\x6b\x0e\x5f\x2b\x3d\x53\x7d\xdc\x89\xe7\x7f\x33\x99\xd9\xfd\x2f\x61\xc6\x72\xbd\xff\xa9\xe8\x28\xaa\x46\x45\x35\x2f\x00\xab\x3a\x9a\x43\xab\x8e\xcc\xf4\x7e\x2a\x8e\xbc\x8a\xe2\x0b\xc0\xa8\x9a\x4c\x48\x29\x48\xd2\xce\x31\x19\x92\x26\x85\xef\x0d\x85\x79\x31\x85\x72\xfc\xbb\x97\xde\xe5\xb4\xe9\x09\xe5\xc2\x3e\x05\xe0\x29\x48\xef\x35\x0d\x19\x93\x1f\x26\x05\xb0\x27\x5f\x5f\x5c\x8c\x70\x26\x93\xf1\x97\x4e\x9a\x90\x83\x40\x7e\xcf\x9a\x4e\x07\xb2\x8d\x13\xb6\xf1\x74\x72\xa9\xfb\x10\xc9\xc6\xbd\x98\xbe\x23\x6d\x14\x77\xa7\x57\x5a\xec\x96\xdb\x4e\xb9\x33\x88\xf6\x14\x1f\x01\x2a\xad\xa5\x3f\x21\x5d\xf0\xd3\x9e\x54\xa4\x1c\x36\x64\xe8\x51\xa8\xc5\x18\xd2\x69\xb6\xf9\xb2\xa5\x98\x7f\x0d\x87\x53\xe0\x54\xd4\xbb\x1c\xf5\xae\x39\xa3\x1c\xf2\xe5\xa8\x65\x27\x86\xf5\xf1\xd9\xb6\x1b\x0e\xbe\x77\xa9\x4c\xdd\x37\x2d\xbd\x8c\xe1\x99\xcc\x45\xe5\x27\xbc\x46\x14\xbe\x69\x99\x31\x2b\x2f\x66\x10\x20\x45\x35\xdb\xb4\x29\xbf\xd3\xe4\x9e\x33\x0b\xed\x69\xa4\xe4\xa8\xc8\x37\xf0\x94\xcb\x1e\x79\x82\xd8\x90\x33\x72\xec\xe8\x6c\x35\x4f\x79\xd9\x85\x2f\x26\x8a\x2a\xd2\xb6\x37\xe1\x85\xfa\xbc\xfe\x1c\xea\x21\xf7\x09\x71\xed\xc5\xfe\x2d\xf5\x77\x22\x35\x0c\x53\xc5\x61\x8b\xdf\x51\xda\xe7\x19\x3c\xcc\x61\x7b\x63\x9e\x19\xb5\xa2\x4e\xec\x78\x90\x2f\x15\x90\x1e\x22\xd9\xbc\x90\xc7\xd8\x6c\xdb\xb4\xf7\xe9\xff\x19\xc7\x7f\x01\x00\x00\xff\xff\x48\x73\x53\xa6\x47\x09\x00\x00"),
 		},
 		"/operator-role-olm-cluster.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "operator-role-olm-cluster.yaml",
@@ -245,16 +245,16 @@ var assets = func() http.FileSystem {
 		"/operator-role-olm.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "operator-role-olm.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 3958,
+			uncompressedSize: 4089,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x56\x41\x8f\xdb\x36\x13\xbd\xeb\x57\x0c\xec\x4b\xf2\x61\x2d\x7f\xed\xa9\x70\x4f\x6e\xb2\xdb\x1a\x0d\xbc\xc0\x7a\xd3\x20\xc7\x31\x35\x96\xa6\x26\x39\x2c\x49\xd9\x71\x7e\x7d\x41\x4a\x4e\xe4\x68\xb7\x49\x81\x00\xae\x2f\xa6\x86\xa3\x99\x37\xef\x0d\x47\x9c\xc2\xec\xfb\xfd\x8a\x29\xbc\x61\x45\x36\x50\x05\x51\x20\x36\x04\x4b\x87\xaa\x21\xd8\xc8\x2e\x1e\xd1\x13\xdc\x49\x6b\x2b\x8c\x2c\x16\x5e\x2c\x37\x77\x2f\xa1\xb5\x15\x79\x10\x4b\x20\x1e\x8c\x78\x2a\xa6\xa0\xc4\x46\xcf\xdb\x36\x8a\x07\xdd\x05\x04\xac\x3d\x91\x21\x1b\x43\x09\xb0\x21\xca\xd1\xd7\xf7\x8f\xab\x57\xb7\xb0\x63\x4d\x50\x71\xe8\x5e\xa2\x0a\x8e\x1c\x9b\x62\x0a\xb1\xe1\x00\x47\xf1\x7b\xd8\x89\x07\xac\x2a\x4e\x89\x51\x03\xdb\x9d\x78\xd3\xc1\xf0\x54\xa3\xaf\xd8\xd6\xa0\xc4\x9d\x3c\xd7\x4d\x04\x39\x5a\xf2\xa1\x61\x57\x16\x53\x78\x4c\x65\x6c\xee\xce\x48\x42\x17\x36\xe7\x8c\x02\xef\xa5\xed\x6b\x18\x94\xdb\xb3\x70\x03\x7f\x90\x0f\x29\xc9\x8f\xe5\xff\x8b\x29\xbc\x48\x2e\x93\x7e\x73\xf2\xf2\x67\x38\x49\x0b\x06\x4f\x60\x25\x42\x1b\x68\x10\x99\x3e\x28\x72\x11\xd8\x82\x12\xe3\x34\xa3\x55\xf4\xb9\xac\x4f\x19\x4a\xc8\x00\x52\x0c\xd9\x46\x64\x0b\x98\xcb\x00\xd9\x0d\xdd\x00\x63\x31\x2d\xa6\x90\x7f\x4d\x8c\x6e\x31\x9f\x1f\x8f\xc7\x12\x33\xdc\x52\x7c\x3d\x3f\x57\x37\x7f\xb3\x7a\x75\xbb\xde\xdc\xce\x32\xe4\x62\x0a\x6f\xad\xa6\x10\xc0\xd3\x5f\x2d\x7b\xaa\x60\x7b\x02\x74\x4e\xb3\xc2\xad\x26\xd0\x78\x4c\xc2\x65\x75\xb2\xe8\x6c\xe1\xe8\x39\xb2\xad\x6f\x20\xf4\xaa\x17\xd3\x0b\x75\x3e\xd3\x75\x86\xc7\xe1\xc2\x41\x2c\xa0\x85\xc9\x72\x03\xab\xcd\x04\x7e\x59\x6e\x56\x9b\x9b\x62\x0a\xef\x56\x8f\xbf\xdd\xbf\x7d\x84\x77\xcb\x87\x87\xe5\xfa\x71\x75\xbb\x81\xfb\x07\x78\x75\xbf\x7e\xbd\x7a\x5c\xdd\xaf\x37\x70\x7f\x07\xcb\xf5\x7b\xf8\x7d\xb5\x7e\x7d\x03\xc4\xb1\x21\x0f\xf4\xc1\xf9\x84\x5f\x3c\x70\x22\x92\xaa\xa4\xe9\xb9\x81\xce\x00\x52\x7f\xa4\xe7\xe0\x48\xf1\x8e\x15\x68\xb4\x75\x8b\x35\x41\x2d\x07\xf2\x36\xb5\x87\x23\x6f\x38\x24\x39\x03\xa0\xad\x8a\x29\x68\x36\x1c\x73\x17\x85\x71\x51\x29\xcd\xf7\x3c\x5b\xc5\x9e\x6d\xb5\x80\x07\xd1\x54\xa0\xe3\xbe\xb3\x16\xe0\xb7\xa8\x4a\x6c\x63\x23\x9e\x3f\x66\x30\xe5\xfe\xa7\x50\xb2\xcc\x0f\x3f\x14\x86\x22\x56\x18\x71\x51\x00\x58\x34\xb4\x00\x85\x86\xf4\x6c\x3f\x13\x47\x1e\xa3\xf8\x02\x40\xe3\x96\x74\x48\x2e\x90\xa4\x5d\xc0\xa4\x77\x9a\x14\xbe\xd5\x14\x16\xc5\x0c\xd0\xf1\xaf\x5e\x5a\x97\xdd\x66\x5d\x94\x41\xfb\x14\x00\x9e\x82\xb4\x5e\x51\xef\x31\xf9\xdf\xa4\x00\x38\x90\xdf\x0e\x0c\xa3\x38\x93\xc9\xf8\x4d\x27\x55\xc8\x8b\x40\xfe\xc0\x8a\xba\x07\xb2\x95\x13\xb6\xb1\x7b\x72\xa9\xfa\x10\xc9\xc6\x83\xe8\xd6\x90\xd2\xc8\xa6\xdb\x52\x62\x77\x5c\x1b\x74\xe7\x20\xca\x53\xbc\x08\x88\x4a\x49\xdb\x45\x1a\xe0\x53\x9e\x30\x52\x5e\x56\xa4\xe9\x62\xa9\x44\x6b\x52\x89\xdb\x6c\xac\x29\xe6\x7f\xcd\xa1\x5b\x38\x8c\xaa\xc9\xab\xd6\x55\xe7\x28\xc7\x6c\x1c\x95\xfc\xac\x5e\x63\x26\xbc\xe8\xbe\xfa\xb4\xda\xb2\x4d\x63\xea\x4a\xb0\x9f\x52\x8a\x0e\xf4\x4f\x34\x7e\x0e\x3f\xca\xfc\x4c\x12\x74\x59\xb5\x2f\xd2\x54\xe4\xb4\x9c\x0c\x9d\xc5\xf7\x94\xc7\x4f\xf8\x24\x6b\xc4\x48\xbb\x56\xf7\x86\x2b\x90\xb3\xed\x7d\xbf\x00\xae\xbc\xd8\x3f\x65\x7b\x25\x50\x3d\x99\x18\xfb\xb9\xfa\x40\x69\xc2\xe6\xe0\x61\x01\xb6\xd5\xfa\x09\xaa\x91\x8c\xd8\x31\x91\xdf\x2a\x20\x7d\x88\x64\xf3\x88\x1c\xc7\x66\x5b\xa7\x49\x4c\xd7\x6c\xe0\x19\x4c\xb6\x2d\xeb\xaa\x14\x47\x36\x34\xbc\x8b\x25\xcb\x13\x9d\x9d\x9d\xba\x49\x12\x46\x86\xf9\x91\xb6\x8d\xc8\x7e\xb0\x73\xe5\x9a\xd8\x60\x4d\x5f\xab\x29\x3b\x85\xe8\x09\x4d\xb7\xfc\xd2\x6a\xd0\xb9\x7e\xc0\x5c\xd8\xc7\x86\xf9\x70\xaa\x0e\x36\x22\x5e\x75\x3c\xf5\x62\x5c\x10\xf1\x6f\x4f\xc0\x85\xd0\x6c\x43\x44\x1b\xf9\x9c\xfc\xb9\xcd\x2d\x5b\xf4\xa7\x41\x3b\xcc\x95\x16\x4b\x4f\x52\xf1\xac\x88\x5e\xda\xf8\x55\x11\xb3\xd3\x75\x39\x1e\xe3\x7c\x0e\xe6\x5c\xb5\x21\x8a\x99\x35\x92\xb3\x7d\x03\x17\xf9\x0b\x6d\xeb\x72\x6f\x31\xf2\x81\xca\x8a\x0e\xe3\xe0\x83\x7b\xc1\x15\x58\xc8\x1f\xbd\x31\xc6\x19\x18\x0a\x01\xeb\xaf\xa2\x1f\x5d\x8c\xfe\x83\x17\x0f\xa5\xdb\x10\xc9\x9f\xef\x1f\x03\xb0\xe9\x12\x32\xf0\x5f\xa3\xf9\xa4\xca\x29\x44\x32\x8b\x3c\x0d\x66\xf9\x14\x90\x1f\x83\x30\x62\x39\x8a\x4f\x2c\x29\xf1\x24\xa1\x54\x62\x9e\x95\xb8\xf7\xbe\x56\xbf\xef\x71\xb7\xc7\x32\xcd\x0c\xf3\x91\x9f\x3e\x8f\x51\x1c\xab\x6e\x0e\x66\xef\x6f\xfb\x6e\xfe\x1d\x00\x00\xff\xff\x14\x7a\xdf\x6c\x76\x0f\x00\x00"),
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x56\x51\x8f\xdb\x36\x0c\x7e\xf7\xaf\x20\x92\x97\x76\xb8\x38\xdb\x9e\x86\xec\x29\x6b\xef\xb6\x60\x45\x0e\xb8\x5c\x57\xf4\x91\x96\x19\x9b\x8b\x2c\x6a\x92\x9c\x34\xfd\xf5\x83\x64\xa7\xe7\xd4\x77\xeb\x15\x38\x2c\x79\x89\x4c\xd1\xe4\x47\x7e\x9f\x68\x4d\x61\xf6\x72\xbf\x6c\x0a\xef\x58\x91\xf1\x54\x42\x10\x08\x35\xc1\xd2\xa2\xaa\x09\x36\xb2\x0d\x07\x74\x04\x37\xd2\x9a\x12\x03\x8b\x81\x57\xcb\xcd\xcd\x6b\x68\x4d\x49\x0e\xc4\x10\x88\x83\x46\x1c\x65\x53\x50\x62\x82\xe3\xa2\x0d\xe2\x40\x77\x01\x01\x2b\x47\xd4\x90\x09\x3e\x07\xd8\x10\xa5\xe8\xeb\xdb\xfb\xd5\x9b\x6b\xd8\xb2\x26\x28\xd9\x77\x2f\x51\x09\x07\x0e\x75\x36\x85\x50\xb3\x87\x83\xb8\x1d\x6c\xc5\x01\x96\x25\xc7\xc4\xa8\x81\xcd\x56\x5c\xd3\xc1\x70\x54\xa1\x2b\xd9\x54\xa0\xc4\x1e\x1d\x57\x75\x00\x39\x18\x72\xbe\x66\x9b\x67\x53\xb8\x8f\x65\x6c\x6e\x4e\x48\x7c\x17\x36\xe5\x0c\x02\x1f\xa5\xed\x6b\x18\x94\xdb\x77\xe1\x0a\xfe\x22\xe7\x63\x92\x9f\xf3\x1f\xb3\x29\xbc\x8a\x2e\x93\x7e\x73\xf2\xfa\x57\x38\x4a\x0b\x0d\x1e\xc1\x48\x80\xd6\xd3\x20\x32\x7d\x52\x64\x03\xb0\x01\x25\x8d\xd5\x8c\x46\xd1\x43\x59\x5f\x32\xe4\x90\x00\xc4\x18\x52\x04\x64\x03\x98\xca\x00\xd9\x0e\xdd\x00\x43\x36\xcd\xa6\x90\x7e\x75\x08\x76\x31\x9f\x1f\x0e\x87\x1c\x13\xdc\x5c\x5c\x35\x3f\x55\x37\x7f\xb7\x7a\x73\xbd\xde\x5c\xcf\x12\xe4\x6c\x0a\xef\x8d\x26\xef\xc1\xd1\x3f\x2d\x3b\x2a\xa1\x38\x02\x5a\xab\x59\x61\xa1\x09\x34\x1e\x22\x71\x89\x9d\x44\x3a\x1b\x38\x38\x0e\x6c\xaa\x2b\xf0\x3d\xeb\xd9\xf4\x8c\x9d\x87\x76\x9d\xe0\xb1\x3f\x73\x10\x03\x68\x60\xb2\xdc\xc0\x6a\x33\x81\xdf\x96\x9b\xd5\xe6\x2a\x9b\xc2\x87\xd5\xfd\x1f\xb7\xef\xef\xe1\xc3\xf2\xee\x6e\xb9\xbe\x5f\x5d\x6f\xe0\xf6\x0e\xde\xdc\xae\xdf\xae\xee\x57\xb7\xeb\x0d\xdc\xde\xc0\x72\xfd\x11\xfe\x5c\xad\xdf\x5e\x01\x71\xa8\xc9\x01\x7d\xb2\x2e\xe2\x17\x07\x1c\x1b\x49\x65\xe4\xf4\x24\xa0\x13\x80\xa8\x8f\xf8\xec\x2d\x29\xde\xb2\x02\x8d\xa6\x6a\xb1\x22\xa8\x64\x4f\xce\x44\x79\x58\x72\x0d\xfb\x48\xa7\x07\x34\x65\x36\x05\xcd\x0d\x87\xa4\x22\x3f\x2e\x2a\xa6\x79\xc9\xb3\x95\xed\xd8\x94\x0b\xb8\x13\x4d\x19\x5a\xee\x95\xb5\x00\x57\xa0\xca\xb1\x0d\xb5\x38\xfe\x9c\xc0\xe4\xbb\x5f\x7c\xce\x32\xdf\xff\x94\x35\x14\xb0\xc4\x80\x8b\x0c\xc0\x60\x43\x0b\x50\xd8\x90\x9e\xed\x66\x62\xc9\x61\x10\x97\x01\x68\x2c\x48\xfb\xe8\x02\x91\xda\x05\x4c\x7a\xa7\x49\xe6\x5a\x4d\x7e\x91\xcd\x00\x2d\xff\xee\xa4\xb5\xc9\x6d\xd6\x45\x19\xc8\x27\x03\x70\xe4\xa5\x75\x8a\x7a\x8f\xc9\x0f\x93\x0c\x60\x4f\xae\x18\x18\x46\x71\x26\x93\xf1\x9b\x56\x4a\x9f\x16\x9e\xdc\x9e\x15\x75\x0f\x64\x4a\x2b\x6c\x42\xf7\x64\x63\xf5\x3e\x90\x09\x7b\xd1\x6d\x43\x4a\x23\x37\xdd\x96\x12\xb3\xe5\xaa\x41\x7b\x0a\xa2\x1c\x85\xb3\x80\xa8\x94\xb4\x5d\xa4\x01\x3e\xe5\x08\x03\xa5\x65\x49\x9a\xce\x96\x4a\xb4\x26\x15\x7b\x9b\x8c\x15\x85\xf4\xaf\xd9\x77\x0b\x8b\x41\xd5\x69\xd5\xda\xf2\x14\xe5\x90\x8c\xa3\x92\xad\x68\x56\xc7\x47\xcb\x2e\xd9\xbb\xd6\xc6\x34\x45\x5b\x56\xf4\x3c\x84\x27\x30\x83\xcc\x0f\x70\x12\xc2\x11\x84\x27\x25\x33\x46\xe5\x44\xf7\x04\xc4\x55\xc1\x26\x4e\xca\x0b\x75\xee\x31\xb1\xd0\x9e\xfe\x8b\xc9\x87\xf0\xa3\xcc\x4f\x24\x41\x9b\x84\xf3\x55\x9a\x92\xac\x96\x63\x43\x27\xfd\x39\x4a\x13\xd0\x7f\x51\x56\xc0\x40\xdb\x56\xfb\x67\x92\xf6\xf2\xcd\x29\x7a\xdf\xaf\x80\x2b\x27\xe6\x6f\x29\x2e\x04\xaa\x6f\x26\x86\x7e\xb4\xdf\x51\x1c\xf2\x29\xb8\x5f\x80\x69\xb5\x7e\xa4\xd5\x48\x8d\x98\x71\x23\x9f\x4b\x20\x7d\x0a\x64\xd2\x94\x1e\xc7\x66\x53\xc5\x8f\x01\x5d\x52\xc0\x33\x98\x14\x2d\xeb\x32\x17\x4b\xc6\xd7\xbc\x0d\x39\xcb\x23\xca\x4e\x4e\xdd\x30\xf3\x23\xc3\xfc\x40\x45\x2d\xb2\x1b\xec\x5c\xb8\x26\x6e\xb0\xa2\x6f\xd5\x94\x9c\x7c\x70\x84\x4d\xb7\xfc\xda\xda\xa0\xb5\xfd\x80\x39\xb3\x8f\x0d\xf3\xe1\x60\x1f\x6c\x04\xbc\xe8\x78\xea\xc9\x38\x6b\xc4\xf7\x9e\x80\x33\xa2\xd9\xf8\x80\x26\xf0\x29\xf9\x53\x9b\x05\x1b\x74\xc7\x81\x1c\xe6\x4a\x8b\xa1\x47\x5b\xf1\x24\x89\x4e\xda\xf0\x4d\x12\x93\xd3\x65\x7b\x3c\xc6\xf9\x14\xcc\xb9\x6a\x7d\x90\x66\x56\x4b\xca\xf6\x8c\x5e\xa4\x4b\x82\xa9\xf2\x9d\xc1\xc0\x7b\xca\x4b\xda\x8f\x83\x0f\xae\x26\x17\xe8\x42\xfa\xe8\x8d\x31\xce\xa0\x21\xef\xb1\xfa\x26\xfa\xd1\xdd\xec\xff\x02\xfe\x1d\x17\x0f\xa5\x5b\x1f\xc8\x9d\xee\x1f\x03\xb0\xf1\x12\x32\xf0\x5f\x63\xf3\x85\x95\xa3\x0f\xd4\x2c\xd2\x34\x98\xa5\x53\x40\x6e\x0c\xa2\x11\xc3\x41\x5c\xec\x92\x12\x47\xe2\x73\x25\xcd\x93\x14\xf7\xde\x97\xd2\xfb\x0e\xb7\x3b\xcc\xe3\xcc\x68\x3e\xf3\xe3\xe7\x31\x88\x65\xd5\xcd\xc1\xe4\xfd\xbc\xef\xe6\xbf\x01\x00\x00\xff\xff\x6e\xe7\x2c\x91\xf9\x0f\x00\x00"),
 		},
 		"/operator-role-openshift.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "operator-role-openshift.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 3022,
+			uncompressedSize: 3153,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x54\x41\x8f\xdb\x46\x0f\xbd\xeb\x57\x10\xd2\x25\xf9\xb0\x96\xbf\xf6\x54\xb8\x27\x37\xd9\x6d\x8d\x06\x36\xb0\x72\x1a\xe4\x48\x8d\x68\x89\xdd\xd1\x70\x3a\x33\xb2\xe2\xfe\xfa\x42\x23\x39\xb1\xa3\x5d\xa4\x05\x02\xd8\x17\x53\x1c\xea\xf1\xf1\x3d\x6a\x32\x58\x7c\xbf\x5f\x92\xc1\x3b\x56\x64\x3c\x55\x10\x04\x42\x43\xb0\xb6\xa8\x1a\x82\x42\x0e\xa1\x47\x47\xf0\x20\x9d\xa9\x30\xb0\x18\x78\xb5\x2e\x1e\x5e\x43\x67\x2a\x72\x20\x86\x40\x1c\xb4\xe2\x28\xc9\x40\x89\x09\x8e\xcb\x2e\x88\x03\x3d\x02\x02\xd6\x8e\xa8\x25\x13\x7c\x0e\x50\x10\x45\xf4\xed\x6e\xbf\x79\x73\x0f\x07\xd6\x04\x15\xfb\xf1\x25\xaa\xa0\xe7\xd0\x24\x19\x84\x86\x3d\xf4\xe2\x9e\xe0\x20\x0e\xb0\xaa\x78\x68\x8c\x1a\xd8\x1c\xc4\xb5\x23\x0d\x47\x35\xba\x8a\x4d\x0d\x4a\xec\xc9\x71\xdd\x04\x90\xde\x90\xf3\x0d\xdb\x3c\xc9\x60\x3f\x8c\x51\x3c\x9c\x99\xf8\x11\x36\xf6\x0c\x02\x1f\xa5\x9b\x66\xb8\x18\x77\x52\xe1\x0e\xfe\x20\xe7\x87\x26\x3f\xe6\xff\x4f\x32\x78\x35\x94\xa4\xd3\x61\xfa\xfa\x67\x38\x49\x07\x2d\x9e\xc0\x48\x80\xce\xd3\x05\x32\x7d\x52\x64\x03\xb0\x01\x25\xad\xd5\x8c\x46\xd1\x97\xb1\x3e\x77\xc8\x21\x12\x18\x30\xa4\x0c\xc8\x06\x30\x8e\x01\x72\xb8\x2c\x03\x0c\x49\x96\x64\x10\x7f\x4d\x08\x76\xb5\x5c\xf6\x7d\x9f\x63\xa4\x9b\x8b\xab\x97\xe7\xe9\x96\xef\x36\x6f\xee\xb7\xc5\xfd\x22\x52\x4e\x32\x78\x6f\x34\x79\x0f\x8e\xfe\xea\xd8\x51\x05\xe5\x09\xd0\x5a\xcd\x0a\x4b\x4d\xa0\xb1\x1f\x8c\x8b\xee\x44\xd3\xd9\x40\xef\x38\xb0\xa9\xef\xc0\x4f\xae\x27\xd9\x95\x3b\x5f\xe4\x3a\xd3\x63\x7f\x55\x20\x06\xd0\x40\xba\x2e\x60\x53\xa4\xf0\xcb\xba\xd8\x14\x77\x49\x06\x1f\x36\xfb\xdf\x76\xef\xf7\xf0\x61\xfd\xf8\xb8\xde\xee\x37\xf7\x05\xec\x1e\xe1\xcd\x6e\xfb\x76\xb3\xdf\xec\xb6\x05\xec\x1e\x60\xbd\xfd\x08\xbf\x6f\xb6\x6f\xef\x80\x38\x34\xe4\x80\x3e\x59\x37\xf0\x17\x07\x3c\x08\x49\xd5\xe0\xe9\x79\x81\xce\x04\x86\xfd\x18\x9e\xbd\x25\xc5\x07\x56\xa0\xd1\xd4\x1d\xd6\x04\xb5\x1c\xc9\x99\x61\x3d\x2c\xb9\x96\xfd\x60\xa7\x07\x34\x55\x92\x81\xe6\x96\x43\xdc\x22\x3f\x1f\x6a\x68\xf3\x3d\xbf\xad\xe4\x89\x4d\xb5\x82\x47\xd1\x94\xa0\xe5\x69\xb3\x56\xe0\x4a\x54\x39\x76\xa1\x11\xc7\x7f\x47\x32\xf9\xd3\x4f\x3e\x67\x59\x1e\x7f\x48\x5a\x0a\x58\x61\xc0\x55\x02\x60\xb0\xa5\x15\x28\x6c\x49\x2f\x9e\x16\x62\xc9\x61\x10\x97\x00\x68\x2c\x49\xfb\xa1\x04\x06\x6b\x57\x90\x4e\x45\x69\xe2\x3a\x4d\x7e\x95\x2c\x00\x2d\xff\xea\xa4\xb3\xb1\x6c\x31\xa2\x5c\xac\x4f\x02\xe0\xc8\x4b\xe7\x14\x4d\x15\xe9\xff\xd2\x04\xe0\x48\xae\xbc\x48\xcc\x70\xd2\x74\xfe\xa6\x95\xca\xc7\xc0\x93\x3b\xb2\xa2\xf1\x81\x4c\x65\x85\x4d\x18\x9f\xec\x30\xbd\x0f\x64\xc2\x51\x74\xd7\x92\xd2\xc8\xed\x78\xa4\xc4\x1c\xb8\x6e\xd1\x9e\x41\x94\xa3\x70\x05\x88\x4a\x49\x37\x22\x5d\xf0\x53\x8e\x30\x50\x0c\x2b\xd2\x74\x15\x2a\xd1\x9a\xd4\xa0\x6d\x4c\xd6\x14\xe2\xbf\x66\x3f\x06\x16\x83\x6a\x62\xd4\xd9\xea\x8c\xd2\xc7\xe4\x6c\xe4\x17\xfd\x9a\x2b\xe1\x44\x4f\xd3\x0f\x51\xc9\x66\xb8\xa6\x6e\x44\xfb\x39\xa7\xe8\x48\x33\x19\x67\x4d\x5e\xc0\x43\x1b\x0d\xfa\x0a\xb1\x22\xab\xe5\xd4\xd2\xd9\x67\x47\xf1\xa6\xf1\x9f\x1d\x0c\x18\xe8\xd0\xe9\x29\x71\x03\x1d\xca\xa9\xf6\x2b\xe2\xca\x89\xf9\x53\xca\x1b\x91\x9a\xc4\xc4\x30\x5d\xa1\x8f\x34\x5c\xa6\x11\xdc\xaf\xc0\x74\x5a\x3f\x23\x35\x52\x2b\x66\x2e\xe4\xbf\x35\x30\x2e\xc4\x02\xd2\xb2\x63\x5d\xe5\x62\xc9\xf8\x86\x0f\x21\x67\x79\x66\x53\x62\xd1\xf8\x65\xfa\x59\x62\xd9\x53\xd9\x88\x3c\x5d\x9c\xdc\x72\xc9\x17\x90\x72\x8b\x35\x7d\x6b\xa6\x58\xe4\x83\x23\x6c\xc7\xf0\xeb\x6c\x8b\xd6\x4e\x1f\xec\x55\x7e\x9e\x58\x5e\xde\x52\x17\x07\x01\x6f\xfa\xb9\x4f\x66\x5c\x09\xf1\x5f\xd7\xec\xca\x68\x36\x3e\xa0\x09\x7c\x6e\xfe\xd2\x61\xc9\x06\xdd\xe9\x62\x1d\x96\x4a\x8b\xa1\x67\xa5\x78\xd1\x44\x27\x5d\xf8\xa6\x89\xb1\xe8\xb6\x1a\xcf\x79\xbe\x44\x73\xa9\x3a\x1f\xa4\x5d\x34\x12\xbb\xcd\x29\xff\x13\x00\x00\xff\xff\x6e\xa3\x9a\x29\xce\x0b\x00\x00"),
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x54\xc1\x8e\xdb\x36\x10\xbd\xeb\x2b\x06\xd2\x25\x29\xd6\x76\xdb\x53\xe1\x9e\xdc\x64\xb7\x35\x1a\xd8\xc0\xda\x69\x90\xe3\x88\x1a\x4b\xd3\xa5\x38\x2c\x49\xd9\x71\xbf\xbe\x20\x25\x27\xf2\x6a\x17\x49\x81\x00\xeb\x8b\x47\xc3\xd1\x9b\x37\xf3\x9e\x58\xc0\xec\xfb\xfd\xb2\x02\xde\xb1\x22\xe3\xa9\x82\x20\x10\x1a\x82\x95\x45\xd5\x10\xec\xe4\x10\x4e\xe8\x08\xee\xa4\x33\x15\x06\x16\x03\xaf\x56\xbb\xbb\xd7\xd0\x99\x8a\x1c\x88\x21\x10\x07\xad\x38\xca\x0a\x50\x62\x82\xe3\xb2\x0b\xe2\x40\xf7\x80\x80\xb5\x23\x6a\xc9\x04\x3f\x07\xd8\x11\x25\xf4\xcd\x76\xbf\x7e\x73\x0b\x07\xd6\x04\x15\xfb\xfe\x25\xaa\xe0\xc4\xa1\xc9\x0a\x08\x0d\x7b\x38\x89\x7b\x80\x83\x38\xc0\xaa\xe2\xd8\x18\x35\xb0\x39\x88\x6b\x7b\x1a\x8e\x6a\x74\x15\x9b\x1a\x94\xd8\xb3\xe3\xba\x09\x20\x27\x43\xce\x37\x6c\xe7\x59\x01\xfb\x38\xc6\xee\xee\xc2\xc4\xf7\xb0\xa9\x67\x10\xf8\x28\xdd\x30\xc3\x68\xdc\x61\x0b\x37\xf0\x17\x39\x1f\x9b\xfc\x3c\xff\x31\x2b\xe0\x55\x2c\xc9\x87\xc3\xfc\xf5\xaf\x70\x96\x0e\x5a\x3c\x83\x91\x00\x9d\xa7\x11\x32\x7d\x52\x64\x03\xb0\x01\x25\xad\xd5\x8c\x46\xd1\x97\xb1\x3e\x77\x98\x43\x22\x10\x31\xa4\x0c\xc8\x06\x30\x8d\x01\x72\x18\x97\x01\x86\xac\xc8\x0a\x48\xbf\x26\x04\xbb\x5c\x2c\x4e\xa7\xd3\x1c\x13\xdd\xb9\xb8\x7a\x71\x99\x6e\xf1\x6e\xfd\xe6\x76\xb3\xbb\x9d\x25\xca\x59\x01\xef\x8d\x26\xef\xc1\xd1\x3f\x1d\x3b\xaa\xa0\x3c\x03\x5a\xab\x59\x61\xa9\x09\x34\x9e\xa2\x70\x49\x9d\x24\x3a\x1b\x38\x39\x0e\x6c\xea\x1b\xf0\x83\xea\x59\x71\xa5\xce\x97\x75\x5d\xe8\xb1\xbf\x2a\x10\x03\x68\x20\x5f\xed\x60\xbd\xcb\xe1\xb7\xd5\x6e\xbd\xbb\xc9\x0a\xf8\xb0\xde\xff\xb1\x7d\xbf\x87\x0f\xab\xfb\xfb\xd5\x66\xbf\xbe\xdd\xc1\xf6\x1e\xde\x6c\x37\x6f\xd7\xfb\xf5\x76\xb3\x83\xed\x1d\xac\x36\x1f\xe1\xcf\xf5\xe6\xed\x0d\x10\x87\x86\x1c\xd0\x27\xeb\x22\x7f\x71\xc0\x71\x91\x54\x45\x4d\x2f\x06\xba\x10\x88\xfe\x88\xcf\xde\x92\xe2\x03\x2b\xd0\x68\xea\x0e\x6b\x82\x5a\x8e\xe4\x4c\xb4\x87\x25\xd7\xb2\x8f\x72\x7a\x40\x53\x65\x05\x68\x6e\x39\x24\x17\xf9\xe9\x50\xb1\xcd\xf7\xfc\xb6\xb2\x07\x36\xd5\x12\xee\x45\x53\x86\x96\x07\x67\x2d\xc1\x95\xa8\xe6\xd8\x85\x46\x1c\xff\x9b\xc8\xcc\x1f\x7e\xf1\x73\x96\xc5\xf1\xa7\xac\xa5\x80\x15\x06\x5c\x66\x00\x06\x5b\x5a\x82\xc2\x96\xf4\xec\x61\x26\x96\x1c\x06\x71\x19\x80\xc6\x92\xb4\x8f\x25\x10\xa5\x5d\x42\x3e\x14\xe5\x99\xeb\x34\xf9\x65\x36\x03\xb4\xfc\xbb\x93\xce\xa6\xb2\x59\x8f\x32\xb2\x4f\x06\xe0\xc8\x4b\xe7\x14\x0d\x15\xf9\x0f\x79\x06\x70\x24\x57\x8e\x12\x13\x9c\x3c\x9f\xbe\x69\xa5\xf2\x29\xf0\xe4\x8e\xac\xa8\x7f\x20\x53\x59\x61\x13\xfa\x27\x1b\xa7\xf7\x81\x4c\x38\x8a\xee\x5a\x52\x1a\xb9\xed\x8f\x94\x98\x03\xd7\x2d\xda\x0b\x88\x72\x14\xae\x00\x51\x29\xe9\x7a\xa4\x11\x3f\xe5\x08\x03\xa5\xb0\x22\x4d\x57\xa1\x12\xad\x49\xc5\xdd\xa6\x64\x4d\x21\xfd\x6b\xf6\x7d\x60\x31\xa8\x26\x45\x9d\xad\x2e\x28\xa7\x94\x9c\x8c\x6c\x45\xb3\x3a\x3f\x39\x76\xc5\xde\x75\x36\xb6\x29\xbb\xaa\xa6\x6f\x63\x78\x21\x33\xea\xfc\x88\xd7\x84\xc2\xb3\x96\x99\xb2\x72\xa2\x07\x01\x62\x54\xb2\x89\x37\xe5\x0b\x6d\xee\x29\xb3\xd0\x91\x26\x4a\x4e\x9a\x3c\x83\x87\x36\x79\xe4\x11\x62\x45\x56\xcb\xb9\xa5\x8b\xd5\x1c\xa5\xcb\xce\x7f\x36\x51\xc0\x40\x87\x4e\xfb\x6f\xd4\xe7\xfb\xef\xa1\x1c\x6a\x1f\x11\x57\x4e\xcc\xdf\x52\xbe\x10\xa9\x61\x99\x18\x86\x5b\xfc\x9e\xe2\x7d\x9e\xc0\xfd\x12\x4c\xa7\xf5\x13\xab\x46\x6a\xc5\x4c\x17\xf9\xad\x02\x26\x43\xcc\x20\x2f\x3b\xd6\xd5\x5c\x2c\x19\xdf\xf0\x21\xcc\x59\x9e\x70\x4a\x2a\xea\x2f\x07\x3f\x49\x2c\x4e\x54\x36\x22\x0f\xa3\x93\x97\x34\xf9\x0c\x72\x6e\xb1\xa6\xaf\xcd\x94\x8a\x7c\x70\x84\x6d\x1f\x3e\xce\xb6\x68\xed\xf0\xc1\x5e\xe5\xa7\x89\xc5\xf8\xa2\x1c\x1d\x04\x7c\xd1\xcf\x7d\x10\xe3\x6a\x11\xff\xd7\x66\x57\x42\xb3\xf1\x01\x4d\xe0\x4b\xf3\xe7\x0e\x4b\x36\xe8\xce\x23\x3b\x2c\x94\x16\x43\x4f\xae\xe2\x59\x11\x9d\x74\xe1\xab\x22\xa6\xa2\x97\xdd\xf1\x94\xe7\x73\x34\x17\xaa\xf3\x41\xda\x59\x23\xa9\xdb\x94\xf2\x7f\x01\x00\x00\xff\xff\xff\x05\xa8\x96\x51\x0c\x00\x00"),
 		},
 		"/operator-role-servicemonitors.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "operator-role-servicemonitors.yaml",
diff --git a/pkg/trait/pdb.go b/pkg/trait/pdb.go
new file mode 100644
index 000000000..7b273ce6f
--- /dev/null
+++ b/pkg/trait/pdb.go
@@ -0,0 +1,109 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package trait
+
+import (
+	"fmt"
+	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+	"k8s.io/api/policy/v1beta1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/intstr"
+)
+
+// The Pdb trait allows to configure the PodDisruptionBudget resource.
+//
+// +camel-k:trait=pdb
+type pdbTrait struct {
+	BaseTrait      `property:",squash"`
+	MaxUnavailable string `property:"max-unavailable" json:"maxUnavailable,omitempty"`
+	MinAvailable   string `property:"min-available" json:"minAvailable,omitempty"`
+}
+
+func newPdbTrait() Trait {
+	return &pdbTrait{
+		BaseTrait: NewBaseTrait("pdb", 900),
+	}
+}
+
+func (t *pdbTrait) Configure(e *Environment) (bool, error) {
+	if t.Enabled == nil || !*t.Enabled {
+		return false, nil
+	}
+
+	strategy, err := e.DetermineControllerStrategy()
+	if err != nil {
+		return false, fmt.Errorf("unable to determine the controller stratedy")
+	}
+
+	if strategy == ControllerStrategyCronJob {
+		return false, fmt.Errorf("poddisruptionbudget isn't supported with cron-job controller strategy")
+	}
+
+	if t.MaxUnavailable != "" && t.MinAvailable != "" {
+		return false, fmt.Errorf("both minAvailable and maxUnavailable can't be set simultaneously")
+	}
+
+	return e.IntegrationInPhase(
+		v1.IntegrationPhaseDeploying,
+		v1.IntegrationPhaseRunning,
+	), nil
+}
+
+func (t *pdbTrait) Apply(e *Environment) error {
+	if pdb, err := t.generatePodDisruptionBudget(e); err == nil {
+		e.Resources.Add(pdb)
+	} else {
+		return err
+	}
+	return nil
+}
+
+func (t *pdbTrait) generatePodDisruptionBudget(e *Environment) (*v1beta1.PodDisruptionBudget, error) {
+	if t.MaxUnavailable == "" && t.MinAvailable == "" {
+		t.MaxUnavailable = "1"
+	}
+
+	integration := e.Integration
+	spec := v1beta1.PodDisruptionBudgetSpec{
+		Selector: &metav1.LabelSelector{
+			MatchLabels: map[string]string{
+				v1.IntegrationLabel: integration.Name,
+			},
+		},
+	}
+
+	var min, max intstr.IntOrString
+
+	if t.MaxUnavailable != "" {
+		max = intstr.Parse(t.MaxUnavailable)
+		spec.MaxUnavailable = &max
+
+	} else {
+		min = intstr.Parse(t.MinAvailable)
+		spec.MinAvailable = &min
+	}
+
+	return &v1beta1.PodDisruptionBudget{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      integration.Name,
+			Namespace: integration.Namespace,
+			Labels:    integration.Labels,
+		},
+		Spec: spec,
+	}, nil
+}
diff --git a/pkg/trait/trait_register.go b/pkg/trait/trait_register.go
index 30c4356e5..ef171c74f 100644
--- a/pkg/trait/trait_register.go
+++ b/pkg/trait/trait_register.go
@@ -46,4 +46,5 @@ func init() {
 	AddToTraits(newIstioTrait)
 	AddToTraits(newIngressTrait)
 	AddToTraits(newOwnerTrait)
+	AddToTraits(newPdbTrait)
 }


Test patch:
diff --git a/pkg/trait/pdb_test.go b/pkg/trait/pdb_test.go
new file mode 100644
index 000000000..d2e09aa22
--- /dev/null
+++ b/pkg/trait/pdb_test.go
@@ -0,0 +1,122 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package trait
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+
+	appsv1 "k8s.io/api/apps/v1"
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/api/policy/v1beta1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/pkg/util/kubernetes"
+)
+
+func TestConfigurePdbTraitDoesSucceed(t *testing.T) {
+	pdbTrait, environment, _ := createPdbTest()
+	configured, err := pdbTrait.Configure(environment)
+
+	assert.True(t, configured)
+	assert.Nil(t, err)
+}
+
+func TestConfigurePdbTraitDoesNotSucceed(t *testing.T) {
+	pdbTrait, environment, _ := createPdbTest()
+
+	pdbTrait.MinAvailable = "1"
+	pdbTrait.MaxUnavailable = "2"
+	configured, err := pdbTrait.Configure(environment)
+	assert.NotNil(t, err)
+	assert.False(t, configured)
+}
+func TestPdbIsCreatedWithoutParametersEnabled(t *testing.T) {
+	pdbTrait, environment, _ := createPdbTest()
+
+	pdb := pdbCreatedCheck(pdbTrait, environment, t)
+	assert.Equal(t, int32(1), pdb.Spec.MaxUnavailable.IntVal)
+}
+
+func TestPdbIsCreatedWithMaxUnavailable(t *testing.T) {
+	pdbTrait, environment, _ := createPdbTest()
+	pdbTrait.MaxUnavailable = "1"
+
+	pdb := pdbCreatedCheck(pdbTrait, environment, t)
+	assert.Equal(t, int32(1), pdb.Spec.MaxUnavailable.IntVal)
+}
+
+func TestPdbIsCreatedWithMinAvailable(t *testing.T) {
+	pdbTrait, environment, _ := createPdbTest()
+	pdbTrait.MinAvailable = "2"
+
+	pdb := pdbCreatedCheck(pdbTrait, environment, t)
+	assert.Equal(t, int32(2), pdb.Spec.MinAvailable.IntVal)
+}
+
+func pdbCreatedCheck(pdbTrait *pdbTrait, environment *Environment, t *testing.T) *v1beta1.PodDisruptionBudget {
+	err := pdbTrait.Apply(environment)
+	assert.Nil(t, err)
+	pdb := findPdb(environment.Resources)
+
+	assert.NotNil(t, pdb)
+	assert.Equal(t, environment.Integration.Name, pdb.Name)
+	assert.Equal(t, environment.Integration.Namespace, pdb.Namespace)
+	assert.Equal(t, environment.Integration.Labels, pdb.Labels)
+	return pdb
+}
+
+func findPdb(resources *kubernetes.Collection) *v1beta1.PodDisruptionBudget {
+	for _, a := range resources.Items() {
+		if _, ok := a.(*v1beta1.PodDisruptionBudget); ok {
+			return a.(*v1beta1.PodDisruptionBudget)
+		}
+	}
+	return nil
+}
+
+func createPdbTest() (*pdbTrait, *Environment, *appsv1.Deployment) {
+	trait := newPdbTrait().(*pdbTrait)
+	enabled := true
+	trait.Enabled = &enabled
+
+	deployment := &appsv1.Deployment{
+		ObjectMeta: metav1.ObjectMeta{
+			Name: "integration-name",
+		},
+		Spec: appsv1.DeploymentSpec{
+			Template: corev1.PodTemplateSpec{},
+		},
+	}
+
+	environment := &Environment{
+		Integration: &v1.Integration{
+			ObjectMeta: metav1.ObjectMeta{
+				Name: "integration-name",
+			},
+			Status: v1.IntegrationStatus{
+				Phase: v1.IntegrationPhaseDeploying,
+			},
+		},
+		Resources: kubernetes.NewCollection(deployment),
+	}
+
+	return trait, environment, deployment
+}