diff --git a/docs/user/reconciliation.md b/docs/user/reconciliation.md
new file mode 100644
index 0000000000..c765c6f32a
--- /dev/null
+++ b/docs/user/reconciliation.md
@@ -0,0 +1,166 @@
+# Reconciliation
+
+This document describes the cluster-version operator's reconciliation logic and explains how the operator applies a release image to the cluster.
+
+## Release image content
+
+```console
+$ mkdir /tmp/release
+$ oc image extract quay.io/openshift-release-dev/ocp-release:4.1.0[-1] --path /:/tmp/release
+$ ls /tmp/release/release-manifests
+0000_03_authorization-openshift_01_rolebindingrestriction.crd.yaml
+0000_03_quota-openshift_01_clusterresourcequota.crd.yaml
+0000_03_security-openshift_01_scc.crd.yaml
+0000_05_config-operator_02_apiserver.cr.yaml
+0000_05_config-operator_02_authentication.cr.yaml
+...
+0000_90_openshift-controller-manager-operator_02_servicemonitor.yaml
+0000_90_openshift-controller-manager-operator_03_operand-servicemonitor.yaml
+image-references
+release-metadata
+$ cat /tmp/release/release-manifests/release-metadata
+{
+ "kind": "cincinnati-metadata-v0",
+ "version": "4.1.0",
+ "previous": [],
+ "metadata": {
+ "description": "",
+ "url": "https://access.redhat.com/errata/RHBA-2019:0758"
+ }
+}
+$ cat /tmp/release/release-manifests/image-references
+{
+ "kind": "ImageStream",
+ "apiVersion": "image.openshift.io/v1",
+ "metadata": {
+ "name": "4.1.0",
+ "creationTimestamp": "2019-06-03T14:49:14Z",
+ "annotations": {
+ "release.openshift.io/from-image-stream": "ocp/4.1-art-latest-2019-05-31-174150",
+ "release.openshift.io/from-release": "registry.svc.ci.openshift.org/ocp/release:4.1.0-0.nightly-2019-05-31-174150"
+ }
+ },
+ "spec": {
+ "lookupPolicy": {
+ "local": false
+ },
+ "tags": [
+ {
+ "name": "aws-machine-controllers",
+ "annotations": {
+ "io.openshift.build.commit.id": "d8d8e285fc19920c3311e791f4fe22db7003588f",
+ "io.openshift.build.commit.ref": "",
+ "io.openshift.build.source-location": "https://github.com/openshift/cluster-api-provider-aws"
+ },
+ "from": {
+ "kind": "DockerImage",
+ "name": "quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:7483248489c918e0c65a6b391bd171da0565cb9995b2acc61a1e517b6551e037"
+ },
+ "generation": 2,
+ "importPolicy": {},
+ "referencePolicy": {
+ "type": "Source"
+ }
+ },
+ ...
+ ]
+ },
+ "status": {
+ "dockerImageRepository": ""
+ }
+}
+```
+
+## Manifest graph
+
+The cluster-version operator unpacks the release image, ingests manifests, loads them into a graph.
+For upgrades, the graph is ordered by the number and component of the manifest file:
+
+
+
+
+
+The `0000_03_authorization-openshift_*` manifest gets its own node, the `0000_03_quota-openshift_01_*` manifest gets its own node, and the `0000_03_security-openshift_*` manifest gets its own node.
+The next group of manifests are under `0000_05_config-operator_*`.
+Because the number is bumped, the graph blocks until the previous `0000_03_*` are all complete before beginning the `0000_05_*` block.
+
+We are more relaxed for the initial install, because there is not yet any user data in the cluster to be worried about.
+So the graph nodes are all parallelized with the by-number ordering flattened out:
+
+
+
+
+
+For the usual reconciliation loop (neither an upgrade between releases nor a fresh install), the flattened graph is also randomly permuted to avoid hanging on ordering bugs.
+
+## Synchronizing the graph
+
+The cluster-version operator spawns worker goroutines that walk the graph, pushing manifests in their queue.
+For each manifest in the node, the worker synchronizes the cluster with the manifest using a resource builder.
+On error (or timeout), the worker abandons the manifest, graph node, and any dependencies of that graph node.
+On success, the worker proceeds to the next manifest in the graph node.
+
+## Resource builders
+
+Resource builders synchronize the cluster with a manifest from the release image.
+The general approach is to generates a merged manifest combining critical spec properties from the release-image manifest with data from a preexisting in-cluster object, if any.
+If the merged manifest differs from the in-cluster object, the merged manifest is pushed back into the cluster.
+
+Some types have additional logic, as described in the following subsections.
+Note that this logic only applies to manifests included in the release image itself.
+For example, only [ClusterOperator](../dev/clusteroperator.md) from the release image will have the blocking logic described [below](#clusteroperator); if an admin or secondary operator pushed a ClusterOperator object, it would not impact the cluster-version operator's graph synchronization.
+
+### ClusterOperator
+
+The cluster-version operator does not push [ClusterOperator](../dev/clusteroperator.md) into the cluster.
+Instead, the operators create ClusterOperator themselves.
+The ClusterOperator builder only monitors the in-cluster object and blocks until it is:
+
+* Available
+* Either not progressing or, when the release image manifest has `status.versions` entries, listing at least the versions given in that manifest.
+ For example, an OpenShift API server ClusterOperator entry in the release image like:
+
+ ```yaml
+ apiVersion: config.openshift.io/v1
+ kind: ClusterOperator
+ metadata:
+ name: openshift-apiserver
+ spec: {}
+ status:
+ versions:
+ - name: operator
+ version: "4.1.0"
+ ```
+
+ would block until the in-cluster ClusterOperator reported `operator` at version 4.1.0.
+
+ The progressing check is deprecated and will be removed once all operators are reporting versions.
+* Not degraded (except during initialization, where we ignore the degraded status)
+
+### CustomResourceDefinition
+
+After pushing the merged CustomResourceDefinition into the cluster, the builder monitors the in-cluster object and blocks until it is established.
+
+### DaemonSet
+
+The builder does not block after an initial DaemonSet push (when the in-cluster object has generation 1).
+
+For subsequent updates, the builder blocks until:
+
+* The in-cluster object's observed generation catches up with the specified generation.
+* Pods with the release-image-specified configuration are scheduled on each node.
+* There are no nodes without available, ready pods.
+
+### Deployment
+
+The builder does not block after an initial Deployment push (when the in-cluster object has generation 1).
+
+For subsequent updates, the builder blocks until:
+
+* The in-cluster object's observed generation catches up with the specified generation.
+* Sufficient pods with the release-image-specified configuration are scheduled to fulfill the requested `replicas`.
+* There are no unavailable replicas.
+
+### Job
+
+After pushing the merged Job into the cluster, the builder blocks until the Job succeeds.
diff --git a/docs/user/tasks-by-number-and-component.svg b/docs/user/tasks-by-number-and-component.svg
new file mode 100644
index 0000000000..8edb76fb0f
--- /dev/null
+++ b/docs/user/tasks-by-number-and-component.svg
@@ -0,0 +1,871 @@
+
+
+
+
+
+
+tasks
+
+
+0
+
+no manifests
+
+
+1
+
+customresourcedefinition rolebindingrestrictions.authorization.openshift.io (1 of 344)
+
+
+0->1
+
+
+
+
+2
+
+customresourcedefinition clusterresourcequotas.quota.openshift.io (2 of 344)
+
+
+0->2
+
+
+
+
+3
+
+customresourcedefinition securitycontextconstraints.security.openshift.io (3 of 344)
+
+
+0->3
+
+
+
+
+4
+
+apiserver cluster (4 of 344)
+authentication cluster (5 of 344)
+build cluster (6 of 344)
+console cluster (7 of 344)
+dns cluster (8 of 344)
+featuregate cluster (9 of 344)
+image cluster (10 of 344)
+infrastructure cluster (11 of 344)
+ingress cluster (12 of 344)
+network cluster (13 of 344)
+oauth cluster (14 of 344)
+project cluster (15 of 344)
+scheduler cluster (16 of 344)
+
+
+1->4
+
+
+
+
+2->4
+
+
+
+
+3->4
+
+
+
+
+5
+
+customresourcedefinition apiservers.config.openshift.io (17 of 344)
+customresourcedefinition authentications.config.openshift.io (18 of 344)
+customresourcedefinition builds.config.openshift.io (19 of 344)
+customresourcedefinition consoles.config.openshift.io (20 of 344)
+customresourcedefinition dnses.config.openshift.io (21 of 344)
+customresourcedefinition featuregates.config.openshift.io (22 of 344)
+customresourcedefinition images.config.openshift.io (23 of 344)
+customresourcedefinition infrastructures.config.openshift.io (24 of 344)
+customresourcedefinition ingresses.config.openshift.io (25 of 344)
+customresourcedefinition networks.config.openshift.io (26 of 344)
+customresourcedefinition oauths.config.openshift.io (27 of 344)
+namespace openshift-config-managed (28 of 344)
+namespace openshift-config (29 of 344)
+customresourcedefinition projects.config.openshift.io (30 of 344)
+customresourcedefinition schedulers.config.openshift.io (31 of 344)
+clusterrole system:openshift:cluster-config-operator:cluster-reader (32 of 344)
+
+
+4->5
+
+
+
+
+6
+
+customresourcedefinition clusterresourcequotas.quota.openshift.io (33 of 344)
+
+
+4->6
+
+
+
+
+7
+
+namespace openshift-kube-apiserver-operator (34 of 344)
+customresourcedefinition kubeapiservers.operator.openshift.io (35 of 344)
+kubeapiserver cluster (36 of 344)
+service openshift-kube-apiserver-operator/metrics (37 of 344)
+configmap openshift-kube-apiserver-operator/kube-apiserver-operator-config (38 of 344)
+clusterrolebinding system:openshift:operator:kube-apiserver-operator (39 of 344)
+serviceaccount openshift-kube-apiserver-operator/kube-apiserver-operator (40 of 344)
+deployment openshift-kube-apiserver-operator/kube-apiserver-operator (41 of 344)
+clusteroperator kube-apiserver (42 of 344)
+
+
+5->7
+
+
+
+
+6->7
+
+
+
+
+8
+
+namespace openshift-kube-controller-manager-operator (43 of 344)
+customresourcedefinition kubecontrollermanagers.operator.openshift.io (44 of 344)
+kubecontrollermanager cluster (45 of 344)
+service openshift-kube-controller-manager-operator/metrics (46 of 344)
+configmap openshift-kube-controller-manager-operator/kube-controller-manager-operator-config (47 of 344)
+clusterrolebinding system:openshift:operator:kube-controller-manager-operator (48 of 344)
+serviceaccount openshift-kube-controller-manager-operator/kube-controller-manager-operator (49 of 344)
+deployment openshift-kube-controller-manager-operator/kube-controller-manager-operator (50 of 344)
+clusteroperator kube-controller-manager (51 of 344)
+
+
+7->8
+
+
+
+
+9
+
+namespace openshift-kube-scheduler-operator (52 of 344)
+customresourcedefinition kubeschedulers.operator.openshift.io (53 of 344)
+kubescheduler cluster (54 of 344)
+service openshift-kube-scheduler-operator/metrics (55 of 344)
+configmap openshift-kube-scheduler-operator/openshift-kube-scheduler-operator-config (56 of 344)
+clusterrolebinding system:openshift:operator:cluster-kube-scheduler-operator (57 of 344)
+serviceaccount openshift-kube-scheduler-operator/openshift-kube-scheduler-operator (58 of 344)
+deployment openshift-kube-scheduler-operator/openshift-kube-scheduler-operator (59 of 344)
+clusteroperator kube-scheduler (60 of 344)
+
+
+7->9
+
+
+
+
+10
+
+no manifests
+
+
+8->10
+
+
+
+
+9->10
+
+
+
+
+11
+
+credentialsrequest openshift-cloud-credential-operator/openshift-machine-api (61 of 344)
+namespace openshift-machine-api (62 of 344)
+configmap openshift-machine-api/machine-api-operator-images (63 of 344)
+customresourcedefinition machines.machine.openshift.io (64 of 344)
+customresourcedefinition machinesets.machine.openshift.io (65 of 344)
+customresourcedefinition machinehealthchecks.healthchecking.openshift.io (66 of 344)
+serviceaccount openshift-machine-api/machine-api-operator (67 of 344)
+clusterrole machine-api-manager (68 of 344)
+clusterrolebinding machine-api-manager-rolebinding (69 of 344)
+deployment openshift-machine-api/machine-api-operator (70 of 344)
+clusteroperator machine-api (71 of 344)
+
+
+10->11
+
+
+
+
+12
+
+namespace openshift-apiserver-operator (72 of 344)
+customresourcedefinition openshiftapiservers.operator.openshift.io (73 of 344)
+openshiftapiserver cluster (74 of 344)
+configmap openshift-apiserver-operator/openshift-apiserver-operator-config (75 of 344)
+clusterrolebinding system:openshift:operator:openshift-apiserver-operator (76 of 344)
+serviceaccount openshift-apiserver-operator/openshift-apiserver-operator (77 of 344)
+service openshift-apiserver-operator/metrics (78 of 344)
+deployment openshift-apiserver-operator/openshift-apiserver-operator (79 of 344)
+clusteroperator openshift-apiserver (80 of 344)
+
+
+10->12
+
+
+
+
+13
+
+no manifests
+
+
+11->13
+
+
+
+
+12->13
+
+
+
+
+14
+
+clusterrole system:openshift:cloud-credential-operator:cluster-reader (81 of 344)
+customresourcedefinition credentialsrequests.cloudcredential.openshift.io (82 of 344)
+namespace openshift-cloud-credential-operator (83 of 344)
+clusterrole cloud-credential-operator-role (84 of 344)
+clusterrolebinding cloud-credential-operator-rolebinding (85 of 344)
+service openshift-cloud-credential-operator/controller-manager-service (86 of 344)
+deployment openshift-cloud-credential-operator/cloud-credential-operator (87 of 344)
+credentialsrequest openshift-cloud-credential-operator/cloud-credential-operator-iam-ro (88 of 344)
+clusteroperator cloud-credential (89 of 344)
+
+
+13->14
+
+
+
+
+15
+
+namespace openshift-authentication-operator (90 of 344)
+namespace openshift-authentication (91 of 344)
+customresourcedefinition authentications.operator.openshift.io (92 of 344)
+authentication cluster (93 of 344)
+service openshift-authentication-operator/metrics (94 of 344)
+configmap openshift-authentication-operator/authentication-operator-config (95 of 344)
+clusterrolebinding system:openshift:operator:authentication (96 of 344)
+serviceaccount openshift-authentication-operator/authentication-operator (97 of 344)
+serviceaccount openshift-authentication/oauth-openshift (98 of 344)
+secret openshift-authentication/v4-0-config-system-ocp-branding-template (99 of 344)
+deployment openshift-authentication-operator/authentication-operator (100 of 344)
+clusteroperator authentication (101 of 344)
+
+
+13->15
+
+
+
+
+16
+
+namespace openshift-machine-api (102 of 344)
+customresourcedefinition clusterautoscalers.autoscaling.openshift.io (103 of 344)
+customresourcedefinition machineautoscalers.autoscaling.openshift.io (104 of 344)
+clusterrole cluster-autoscaler-operator (105 of 344)
+role openshift-machine-api/cluster-autoscaler-operator (106 of 344)
+rolebinding openshift-machine-api/cluster-autoscaler-operator (107 of 344)
+clusterrolebinding cluster-autoscaler-operator (108 of 344)
+serviceaccount openshift-machine-api/cluster-autoscaler-operator (109 of 344)
+serviceaccount openshift-machine-api/cluster-autoscaler (110 of 344)
+clusterrole cluster-autoscaler (111 of 344)
+role openshift-machine-api/cluster-autoscaler (112 of 344)
+clusterrolebinding cluster-autoscaler (113 of 344)
+rolebinding openshift-machine-api/cluster-autoscaler (114 of 344)
+deployment openshift-machine-api/cluster-autoscaler-operator (115 of 344)
+clusteroperator cluster-autoscaler (116 of 344)
+
+
+13->16
+
+
+
+
+17
+
+customresourcedefinition configs.imageregistry.operator.openshift.io (117 of 344)
+namespace openshift-image-registry (118 of 344)
+credentialsrequest openshift-cloud-credential-operator/openshift-image-registry (119 of 344)
+clusterrole cluster-image-registry-operator (120 of 344)
+clusterrolebinding default-account-cluster-image-registry-operator (121 of 344)
+serviceaccount openshift-image-registry/cluster-image-registry-operator (122 of 344)
+configmap openshift-image-registry/serviceca (123 of 344)
+role openshift-image-registry/node-ca (124 of 344)
+rolebinding openshift-image-registry/node-ca (125 of 344)
+serviceaccount openshift-image-registry/node-ca (126 of 344)
+deployment openshift-image-registry/cluster-image-registry-operator (127 of 344)
+clusteroperator image-registry (128 of 344)
+
+
+13->17
+
+
+
+
+18
+
+clusterrole openshift-ingress-operator (129 of 344)
+customresourcedefinition ingresscontrollers.operator.openshift.io (130 of 344)
+credentialsrequest openshift-cloud-credential-operator/openshift-ingress (131 of 344)
+namespace openshift-ingress-operator (132 of 344)
+clusterrolebinding openshift-ingress-operator (133 of 344)
+rolebinding openshift-ingress-operator/ingress-operator (134 of 344)
+role openshift-ingress-operator/ingress-operator (135 of 344)
+serviceaccount openshift-ingress-operator/ingress-operator (136 of 344)
+deployment openshift-ingress-operator/ingress-operator (137 of 344)
+clusteroperator ingress (138 of 344)
+
+
+13->18
+
+
+
+
+19
+
+namespace openshift-cluster-machine-approver (139 of 344)
+serviceaccount openshift-cluster-machine-approver/machine-approver-sa (140 of 344)
+clusterrole system:openshift:controller:machine-approver (141 of 344)
+clusterrolebinding system:openshift:controller:machine-approver (142 of 344)
+deployment openshift-cluster-machine-approver/machine-approver (143 of 344)
+
+
+13->19
+
+
+
+
+20
+
+namespace openshift-monitoring (144 of 344)
+clusterrole cluster-monitoring-operator (145 of 344)
+serviceaccount openshift-monitoring/cluster-monitoring-operator (146 of 344)
+clusterrolebinding cluster-monitoring-operator (147 of 344)
+deployment openshift-monitoring/cluster-monitoring-operator (148 of 344)
+clusteroperator monitoring (149 of 344)
+operatorgroup openshift-monitoring/openshift-cluster-monitoring (150 of 344)
+
+
+13->20
+
+
+
+
+21
+
+namespace openshift-cluster-node-tuning-operator (151 of 344)
+customresourcedefinition tuneds.tuned.openshift.io (152 of 344)
+serviceaccount openshift-cluster-node-tuning-operator/cluster-node-tuning-operator (153 of 344)
+clusterrole cluster-node-tuning-operator (154 of 344)
+clusterrolebinding cluster-node-tuning-operator (155 of 344)
+deployment openshift-cluster-node-tuning-operator/cluster-node-tuning-operator (156 of 344)
+clusteroperator node-tuning (157 of 344)
+
+
+13->21
+
+
+
+
+22
+
+namespace openshift-controller-manager-operator (158 of 344)
+namespace openshift-controller-manager (159 of 344)
+customresourcedefinition openshiftcontrollermanagers.operator.openshift.io (160 of 344)
+openshiftcontrollermanager cluster (161 of 344)
+configmap openshift-controller-manager-operator/openshift-controller-manager-operator-config (162 of 344)
+service openshift-controller-manager-operator/metrics (163 of 344)
+configmap openshift-controller-manager-operator/openshift-controller-manager-images (164 of 344)
+clusterrolebinding system:openshift:operator:openshift-controller-manager-operator (165 of 344)
+serviceaccount openshift-controller-manager-operator/openshift-controller-manager-operator (166 of 344)
+deployment openshift-controller-manager-operator/openshift-controller-manager-operator (167 of 344)
+clusteroperator openshift-controller-manager (168 of 344)
+
+
+13->22
+
+
+
+
+23
+
+customresourcedefinition configs.samples.operator.openshift.io (169 of 344)
+namespace openshift-cluster-samples-operator (170 of 344)
+serviceaccount openshift-cluster-samples-operator/cluster-samples-operator (171 of 344)
+role openshift-cluster-samples-operator/cluster-samples-operator (172 of 344)
+clusterrole cluster-samples-operator (173 of 344)
+rolebinding openshift-cluster-samples-operator/cluster-samples-operator (174 of 344)
+clusterrolebinding cluster-samples-operator (175 of 344)
+rolebinding openshift/cluster-samples-operator-openshift-edit (176 of 344)
+role openshift-config/coreos-pull-secret-reader (177 of 344)
+rolebinding openshift-config/cluster-samples-operator-openshift-config-secret-reader (178 of 344)
+deployment openshift-cluster-samples-operator/cluster-samples-operator (179 of 344)
+clusteroperator openshift-samples (180 of 344)
+imagestream openshift/cli (181 of 344)
+imagestream openshift/cli-artifacts (182 of 344)
+imagestream openshift/installer (183 of 344)
+imagestream openshift/installer-artifacts (184 of 344)
+imagestream openshift/tests (185 of 344)
+imagestream openshift/must-gather (186 of 344)
+
+
+13->23
+
+
+
+
+24
+
+namespace openshift-cluster-storage-operator (187 of 344)
+clusterrolebinding cluster-storage-operator (188 of 344)
+clusterrole cluster-storage-operator (189 of 344)
+rolebinding openshift-cluster-storage-operator/cluster-storage-operator (190 of 344)
+role openshift-cluster-storage-operator/cluster-storage-operator (191 of 344)
+serviceaccount openshift-cluster-storage-operator/cluster-storage-operator (192 of 344)
+deployment openshift-cluster-storage-operator/cluster-storage-operator (193 of 344)
+clusteroperator storage (194 of 344)
+
+
+13->24
+
+
+
+
+25
+
+namespace openshift-service-catalog-apiserver-operator (195 of 344)
+customresourcedefinition servicecatalogapiservers.operator.openshift.io (196 of 344)
+servicecatalogapiserver cluster (197 of 344)
+configmap openshift-service-catalog-apiserver-operator/openshift-service-catalog-apiserver-operator-config (198 of 344)
+configmap openshift-service-catalog-apiserver-operator/version-mapping (199 of 344)
+clusterrolebinding system:openshift:operator:openshift-service-catalog-apiserver-operator (200 of 344)
+serviceaccount openshift-service-catalog-apiserver-operator/openshift-service-catalog-apiserver-operator (201 of 344)
+service openshift-service-catalog-apiserver-operator/metrics (202 of 344)
+deployment openshift-service-catalog-apiserver-operator/openshift-service-catalog-apiserver-operator (203 of 344)
+clusteroperator service-catalog-apiserver (204 of 344)
+
+
+13->25
+
+
+
+
+26
+
+namespace openshift-service-catalog-controller-manager-operator (205 of 344)
+customresourcedefinition servicecatalogcontrollermanagers.operator.openshift.io (206 of 344)
+configmap openshift-service-catalog-controller-manager-operator/openshift-service-catalog-controller-manager-operator-config (207 of 344)
+service openshift-service-catalog-controller-manager-operator/metrics (208 of 344)
+clusterrolebinding system:openshift:operator:openshift-service-catalog-controller-manager-operator (209 of 344)
+serviceaccount openshift-service-catalog-controller-manager-operator/openshift-service-catalog-controller-manager-operator (210 of 344)
+deployment openshift-service-catalog-controller-manager-operator/openshift-service-catalog-controller-manager-operator (211 of 344)
+clusteroperator service-catalog-controller-manager (212 of 344)
+
+
+13->26
+
+
+
+
+27
+
+customresourcedefinition consoles.operator.openshift.io (213 of 344)
+oauthclient console (214 of 344)
+console cluster (215 of 344)
+namespace openshift-console (216 of 344)
+namespace openshift-console-operator (217 of 344)
+clusterrole console-operator (218 of 344)
+role openshift-console/console-operator (219 of 344)
+role openshift-config-managed/console-operator (220 of 344)
+role openshift-config-managed/console-public (221 of 344)
+role openshift-console-operator/console-operator (222 of 344)
+rolebinding openshift-console/console-operator (223 of 344)
+rolebinding openshift-console-operator/console-operator (224 of 344)
+clusterrolebinding console-operator (225 of 344)
+rolebinding openshift-config-managed/console-operator (226 of 344)
+rolebinding openshift-config-managed/console-public (227 of 344)
+configmap openshift-config-managed/console-public (228 of 344)
+configmap openshift-console-operator/console-operator-config (229 of 344)
+serviceaccount openshift-console-operator/console-operator (230 of 344)
+deployment openshift-console/downloads (231 of 344)
+route openshift-console/downloads (232 of 344)
+service openshift-console/downloads (233 of 344)
+deployment openshift-console-operator/console-operator (234 of 344)
+clusteroperator console (235 of 344)
+
+
+13->27
+
+
+
+
+28
+
+namespace openshift-operator-lifecycle-manager (236 of 344)
+namespace openshift-operators (237 of 344)
+clusterrole system:controller:operator-lifecycle-manager (238 of 344)
+serviceaccount openshift-operator-lifecycle-manager/olm-operator-serviceaccount (239 of 344)
+clusterrolebinding olm-operator-binding-openshift-operator-lifecycle-manager (240 of 344)
+service openshift-operator-lifecycle-manager/olm-operator-metrics (241 of 344)
+service openshift-operator-lifecycle-manager/catalog-operator-metrics (242 of 344)
+customresourcedefinition clusterserviceversions.operators.coreos.com (243 of 344)
+customresourcedefinition installplans.operators.coreos.com (244 of 344)
+customresourcedefinition subscriptions.operators.coreos.com (245 of 344)
+customresourcedefinition catalogsources.operators.coreos.com (246 of 344)
+deployment openshift-operator-lifecycle-manager/olm-operator (247 of 344)
+deployment openshift-operator-lifecycle-manager/catalog-operator (248 of 344)
+clusterrole aggregate-olm-edit (249 of 344)
+clusterrole aggregate-olm-view (250 of 344)
+customresourcedefinition operatorgroups.operators.coreos.com (251 of 344)
+configmap openshift-operator-lifecycle-manager/olm-operators (252 of 344)
+catalogsource openshift-operator-lifecycle-manager/olm-operators (253 of 344)
+operatorgroup openshift-operators/global-operators (254 of 344)
+operatorgroup openshift-operator-lifecycle-manager/olm-operators (255 of 344)
+subscription openshift-operator-lifecycle-manager/packageserver (256 of 344)
+clusteroperator operator-lifecycle-manager (257 of 344)
+clusteroperator operator-lifecycle-manager-catalog (258 of 344)
+clusterserviceversion openshift-operator-lifecycle-manager/packageserver.v0.9.0 (259 of 344)
+deployment openshift-operator-lifecycle-manager/packageserver (260 of 344)
+servicemonitor openshift-operator-lifecycle-manager/olm-operator (261 of 344)
+servicemonitor openshift-operator-lifecycle-manager/catalog-operator (262 of 344)
+rolebinding openshift-operator-lifecycle-manager/operator-lifecycle-manager-metrics (263 of 344)
+role openshift-operator-lifecycle-manager/operator-lifecycle-manager-metrics (264 of 344)
+
+
+13->28
+
+
+
+
+29
+
+namespace openshift-marketplace (265 of 344)
+customresourcedefinition catalogsourceconfigs.operators.coreos.com (266 of 344)
+customresourcedefinition operatorsources.operators.coreos.com (267 of 344)
+serviceaccount openshift-marketplace/marketplace-operator (268 of 344)
+clusterrole marketplace-operator (269 of 344)
+role openshift-marketplace/marketplace-operator (270 of 344)
+clusterrolebinding marketplace-operator (271 of 344)
+rolebinding openshift-marketplace/marketplace-operator (272 of 344)
+operatorsource openshift-marketplace/redhat-operators (273 of 344)
+operatorsource openshift-marketplace/certified-operators (274 of 344)
+operatorsource openshift-marketplace/community-operators (275 of 344)
+deployment openshift-marketplace/marketplace-operator (276 of 344)
+clusteroperator openshift-marketplace/marketplace (277 of 344)
+
+
+13->29
+
+
+
+
+30
+
+clusterrolebinding system:openshift:operator:service-ca-operator (278 of 344)
+namespace openshift-service-ca-operator (279 of 344)
+customresourcedefinition servicecas.operator.openshift.io (280 of 344)
+configmap openshift-service-ca-operator/service-ca-operator-config (281 of 344)
+serviceca cluster (282 of 344)
+serviceaccount openshift-service-ca-operator/service-ca-operator (283 of 344)
+deployment openshift-service-ca-operator/service-ca-operator (284 of 344)
+serviceca cluster (285 of 344)
+clusteroperator service-ca (286 of 344)
+
+
+13->30
+
+
+
+
+31
+
+no manifests
+
+
+14->31
+
+
+
+
+15->31
+
+
+
+
+16->31
+
+
+
+
+17->31
+
+
+
+
+18->31
+
+
+
+
+19->31
+
+
+
+
+20->31
+
+
+
+
+21->31
+
+
+
+
+22->31
+
+
+
+
+23->31
+
+
+
+
+24->31
+
+
+
+
+25->31
+
+
+
+
+26->31
+
+
+
+
+27->31
+
+
+
+
+28->31
+
+
+
+
+29->31
+
+
+
+
+30->31
+
+
+
+
+32
+
+namespace openshift-network-operator (287 of 344)
+customresourcedefinition networks.operator.openshift.io (288 of 344)
+clusterrolebinding default-account-cluster-network-operator (289 of 344)
+deployment openshift-network-operator/network-operator (290 of 344)
+clusteroperator network (291 of 344)
+
+
+31->32
+
+
+
+
+33
+
+clusterrole openshift-dns-operator (292 of 344)
+customresourcedefinition dnses.operator.openshift.io (293 of 344)
+namespace openshift-dns-operator (294 of 344)
+clusterrolebinding openshift-dns-operator (295 of 344)
+rolebinding openshift-dns-operator/dns-operator (296 of 344)
+role openshift-dns-operator/dns-operator (297 of 344)
+serviceaccount openshift-dns-operator/dns-operator (298 of 344)
+deployment openshift-dns-operator/dns-operator (299 of 344)
+clusteroperator dns (300 of 344)
+
+
+31->33
+
+
+
+
+34
+
+clusterrole system:openshift:machine-config-operator:cluster-reader (301 of 344)
+namespace openshift-machine-config-operator (302 of 344)
+customresourcedefinition mcoconfigs.machineconfiguration.openshift.io (303 of 344)
+configmap openshift-machine-config-operator/machine-config-operator-images (304 of 344)
+clusterrolebinding default-account-openshift-machine-config-operator (305 of 344)
+deployment openshift-machine-config-operator/machine-config-operator (306 of 344)
+configmap openshift-machine-config-operator/machine-config-osimageurl (307 of 344)
+clusteroperator machine-config (308 of 344)
+deployment openshift-machine-config-operator/etcd-quorum-guard (309 of 344)
+poddisruptionbudget openshift-machine-config-operator/etcd-quorum-guard (310 of 344)
+
+
+32->34
+
+
+
+
+33->34
+
+
+
+
+35
+
+role openshift-authentication-operator/prometheus-k8s (311 of 344)
+role openshift-authentication/prometheus-k8s (312 of 344)
+rolebinding openshift-authentication-operator/prometheus-k8s (313 of 344)
+rolebinding openshift-authentication/prometheus-k8s (314 of 344)
+servicemonitor openshift-authentication-operator/authentication-operator (315 of 344)
+servicemonitor openshift-authentication/oauth-openshift (316 of 344)
+
+
+34->35
+
+
+
+
+36
+
+clusterrole registry-monitoring (317 of 344)
+clusterrolebinding registry-monitoring (318 of 344)
+role openshift-image-registry/prometheus-k8s (319 of 344)
+rolebinding openshift-image-registry/prometheus-k8s (320 of 344)
+servicemonitor openshift-image-registry/image-registry (321 of 344)
+
+
+34->36
+
+
+
+
+37
+
+role openshift-service-catalog-apiserver-operator/prometheus-k8s (322 of 344)
+rolebinding openshift-service-catalog-apiserver-operator/prometheus-k8s (323 of 344)
+servicemonitor openshift-service-catalog-apiserver-operator/openshift-service-catalog-apiserver-operator (324 of 344)
+
+
+34->37
+
+
+
+
+38
+
+role openshift-service-catalog-controller-manager-operator/prometheus-k8s (325 of 344)
+rolebinding openshift-service-catalog-controller-manager-operator/prometheus-k8s (326 of 344)
+servicemonitor openshift-service-catalog-controller-manager-operator/openshift-service-catalog-controller-manager-operator (327 of 344)
+
+
+34->38
+
+
+
+
+39
+
+configmap openshift-config-managed/release-verification (328 of 344)
+
+
+34->39
+
+
+
+
+40
+
+role openshift-kube-apiserver-operator/prometheus-k8s (329 of 344)
+rolebinding openshift-kube-apiserver-operator/prometheus-k8s (330 of 344)
+servicemonitor openshift-kube-apiserver-operator/kube-apiserver-operator (331 of 344)
+
+
+34->40
+
+
+
+
+41
+
+role openshift-kube-controller-manager-operator/prometheus-k8s (332 of 344)
+rolebinding openshift-kube-controller-manager-operator/prometheus-k8s (333 of 344)
+servicemonitor openshift-kube-controller-manager-operator/kube-controller-manager-operator (334 of 344)
+
+
+34->41
+
+
+
+
+42
+
+role openshift-kube-scheduler-operator/prometheus-k8s (335 of 344)
+rolebinding openshift-kube-scheduler-operator/prometheus-k8s (336 of 344)
+servicemonitor openshift-kube-scheduler-operator/kube-scheduler-operator (337 of 344)
+
+
+34->42
+
+
+
+
+43
+
+role openshift-apiserver-operator/prometheus-k8s (338 of 344)
+rolebinding openshift-apiserver-operator/prometheus-k8s (339 of 344)
+servicemonitor openshift-apiserver-operator/openshift-apiserver-operator (340 of 344)
+
+
+34->43
+
+
+
+
+44
+
+role openshift-controller-manager-operator/prometheus-k8s (341 of 344)
+rolebinding openshift-controller-manager-operator/prometheus-k8s (342 of 344)
+servicemonitor openshift-controller-manager-operator/openshift-controller-manager-operator (343 of 344)
+servicemonitor openshift-controller-manager/openshift-controller-manager (344 of 344)
+
+
+34->44
+
+
+
+
+
diff --git a/docs/user/tasks-flatten-by-number-and-component.svg b/docs/user/tasks-flatten-by-number-and-component.svg
new file mode 100644
index 0000000000..e2f385373f
--- /dev/null
+++ b/docs/user/tasks-flatten-by-number-and-component.svg
@@ -0,0 +1,731 @@
+
+
+
+
+
+
+tasks
+
+
+0
+
+no manifests
+
+
+1
+
+customresourcedefinition rolebindingrestrictions.authorization.openshift.io (1 of 344)
+
+
+0->1
+
+
+
+
+2
+
+customresourcedefinition clusterresourcequotas.quota.openshift.io (2 of 344)
+
+
+0->2
+
+
+
+
+3
+
+customresourcedefinition securitycontextconstraints.security.openshift.io (3 of 344)
+
+
+0->3
+
+
+
+
+4
+
+apiserver cluster (4 of 344)
+authentication cluster (5 of 344)
+build cluster (6 of 344)
+console cluster (7 of 344)
+dns cluster (8 of 344)
+featuregate cluster (9 of 344)
+image cluster (10 of 344)
+infrastructure cluster (11 of 344)
+ingress cluster (12 of 344)
+network cluster (13 of 344)
+oauth cluster (14 of 344)
+project cluster (15 of 344)
+scheduler cluster (16 of 344)
+
+
+0->4
+
+
+
+
+5
+
+customresourcedefinition apiservers.config.openshift.io (17 of 344)
+customresourcedefinition authentications.config.openshift.io (18 of 344)
+customresourcedefinition builds.config.openshift.io (19 of 344)
+customresourcedefinition consoles.config.openshift.io (20 of 344)
+customresourcedefinition dnses.config.openshift.io (21 of 344)
+customresourcedefinition featuregates.config.openshift.io (22 of 344)
+customresourcedefinition images.config.openshift.io (23 of 344)
+customresourcedefinition infrastructures.config.openshift.io (24 of 344)
+customresourcedefinition ingresses.config.openshift.io (25 of 344)
+customresourcedefinition networks.config.openshift.io (26 of 344)
+customresourcedefinition oauths.config.openshift.io (27 of 344)
+namespace openshift-config-managed (28 of 344)
+namespace openshift-config (29 of 344)
+customresourcedefinition projects.config.openshift.io (30 of 344)
+customresourcedefinition schedulers.config.openshift.io (31 of 344)
+clusterrole system:openshift:cluster-config-operator:cluster-reader (32 of 344)
+
+
+0->5
+
+
+
+
+6
+
+customresourcedefinition clusterresourcequotas.quota.openshift.io (33 of 344)
+
+
+0->6
+
+
+
+
+7
+
+namespace openshift-kube-apiserver-operator (34 of 344)
+customresourcedefinition kubeapiservers.operator.openshift.io (35 of 344)
+kubeapiserver cluster (36 of 344)
+service openshift-kube-apiserver-operator/metrics (37 of 344)
+configmap openshift-kube-apiserver-operator/kube-apiserver-operator-config (38 of 344)
+clusterrolebinding system:openshift:operator:kube-apiserver-operator (39 of 344)
+serviceaccount openshift-kube-apiserver-operator/kube-apiserver-operator (40 of 344)
+deployment openshift-kube-apiserver-operator/kube-apiserver-operator (41 of 344)
+clusteroperator kube-apiserver (42 of 344)
+
+
+0->7
+
+
+
+
+8
+
+namespace openshift-kube-controller-manager-operator (43 of 344)
+customresourcedefinition kubecontrollermanagers.operator.openshift.io (44 of 344)
+kubecontrollermanager cluster (45 of 344)
+service openshift-kube-controller-manager-operator/metrics (46 of 344)
+configmap openshift-kube-controller-manager-operator/kube-controller-manager-operator-config (47 of 344)
+clusterrolebinding system:openshift:operator:kube-controller-manager-operator (48 of 344)
+serviceaccount openshift-kube-controller-manager-operator/kube-controller-manager-operator (49 of 344)
+deployment openshift-kube-controller-manager-operator/kube-controller-manager-operator (50 of 344)
+clusteroperator kube-controller-manager (51 of 344)
+
+
+0->8
+
+
+
+
+9
+
+namespace openshift-kube-scheduler-operator (52 of 344)
+customresourcedefinition kubeschedulers.operator.openshift.io (53 of 344)
+kubescheduler cluster (54 of 344)
+service openshift-kube-scheduler-operator/metrics (55 of 344)
+configmap openshift-kube-scheduler-operator/openshift-kube-scheduler-operator-config (56 of 344)
+clusterrolebinding system:openshift:operator:cluster-kube-scheduler-operator (57 of 344)
+serviceaccount openshift-kube-scheduler-operator/openshift-kube-scheduler-operator (58 of 344)
+deployment openshift-kube-scheduler-operator/openshift-kube-scheduler-operator (59 of 344)
+clusteroperator kube-scheduler (60 of 344)
+
+
+0->9
+
+
+
+
+10
+
+credentialsrequest openshift-cloud-credential-operator/openshift-machine-api (61 of 344)
+namespace openshift-machine-api (62 of 344)
+configmap openshift-machine-api/machine-api-operator-images (63 of 344)
+customresourcedefinition machines.machine.openshift.io (64 of 344)
+customresourcedefinition machinesets.machine.openshift.io (65 of 344)
+customresourcedefinition machinehealthchecks.healthchecking.openshift.io (66 of 344)
+serviceaccount openshift-machine-api/machine-api-operator (67 of 344)
+clusterrole machine-api-manager (68 of 344)
+clusterrolebinding machine-api-manager-rolebinding (69 of 344)
+deployment openshift-machine-api/machine-api-operator (70 of 344)
+clusteroperator machine-api (71 of 344)
+
+
+0->10
+
+
+
+
+11
+
+namespace openshift-apiserver-operator (72 of 344)
+customresourcedefinition openshiftapiservers.operator.openshift.io (73 of 344)
+openshiftapiserver cluster (74 of 344)
+configmap openshift-apiserver-operator/openshift-apiserver-operator-config (75 of 344)
+clusterrolebinding system:openshift:operator:openshift-apiserver-operator (76 of 344)
+serviceaccount openshift-apiserver-operator/openshift-apiserver-operator (77 of 344)
+service openshift-apiserver-operator/metrics (78 of 344)
+deployment openshift-apiserver-operator/openshift-apiserver-operator (79 of 344)
+clusteroperator openshift-apiserver (80 of 344)
+
+
+0->11
+
+
+
+
+12
+
+clusterrole system:openshift:cloud-credential-operator:cluster-reader (81 of 344)
+customresourcedefinition credentialsrequests.cloudcredential.openshift.io (82 of 344)
+namespace openshift-cloud-credential-operator (83 of 344)
+clusterrole cloud-credential-operator-role (84 of 344)
+clusterrolebinding cloud-credential-operator-rolebinding (85 of 344)
+service openshift-cloud-credential-operator/controller-manager-service (86 of 344)
+deployment openshift-cloud-credential-operator/cloud-credential-operator (87 of 344)
+credentialsrequest openshift-cloud-credential-operator/cloud-credential-operator-iam-ro (88 of 344)
+clusteroperator cloud-credential (89 of 344)
+
+
+0->12
+
+
+
+
+13
+
+namespace openshift-authentication-operator (90 of 344)
+namespace openshift-authentication (91 of 344)
+customresourcedefinition authentications.operator.openshift.io (92 of 344)
+authentication cluster (93 of 344)
+service openshift-authentication-operator/metrics (94 of 344)
+configmap openshift-authentication-operator/authentication-operator-config (95 of 344)
+clusterrolebinding system:openshift:operator:authentication (96 of 344)
+serviceaccount openshift-authentication-operator/authentication-operator (97 of 344)
+serviceaccount openshift-authentication/oauth-openshift (98 of 344)
+secret openshift-authentication/v4-0-config-system-ocp-branding-template (99 of 344)
+deployment openshift-authentication-operator/authentication-operator (100 of 344)
+clusteroperator authentication (101 of 344)
+
+
+0->13
+
+
+
+
+14
+
+namespace openshift-machine-api (102 of 344)
+customresourcedefinition clusterautoscalers.autoscaling.openshift.io (103 of 344)
+customresourcedefinition machineautoscalers.autoscaling.openshift.io (104 of 344)
+clusterrole cluster-autoscaler-operator (105 of 344)
+role openshift-machine-api/cluster-autoscaler-operator (106 of 344)
+rolebinding openshift-machine-api/cluster-autoscaler-operator (107 of 344)
+clusterrolebinding cluster-autoscaler-operator (108 of 344)
+serviceaccount openshift-machine-api/cluster-autoscaler-operator (109 of 344)
+serviceaccount openshift-machine-api/cluster-autoscaler (110 of 344)
+clusterrole cluster-autoscaler (111 of 344)
+role openshift-machine-api/cluster-autoscaler (112 of 344)
+clusterrolebinding cluster-autoscaler (113 of 344)
+rolebinding openshift-machine-api/cluster-autoscaler (114 of 344)
+deployment openshift-machine-api/cluster-autoscaler-operator (115 of 344)
+clusteroperator cluster-autoscaler (116 of 344)
+
+
+0->14
+
+
+
+
+15
+
+customresourcedefinition configs.imageregistry.operator.openshift.io (117 of 344)
+namespace openshift-image-registry (118 of 344)
+credentialsrequest openshift-cloud-credential-operator/openshift-image-registry (119 of 344)
+clusterrole cluster-image-registry-operator (120 of 344)
+clusterrolebinding default-account-cluster-image-registry-operator (121 of 344)
+serviceaccount openshift-image-registry/cluster-image-registry-operator (122 of 344)
+configmap openshift-image-registry/serviceca (123 of 344)
+role openshift-image-registry/node-ca (124 of 344)
+rolebinding openshift-image-registry/node-ca (125 of 344)
+serviceaccount openshift-image-registry/node-ca (126 of 344)
+deployment openshift-image-registry/cluster-image-registry-operator (127 of 344)
+clusteroperator image-registry (128 of 344)
+
+
+0->15
+
+
+
+
+16
+
+clusterrole openshift-ingress-operator (129 of 344)
+customresourcedefinition ingresscontrollers.operator.openshift.io (130 of 344)
+credentialsrequest openshift-cloud-credential-operator/openshift-ingress (131 of 344)
+namespace openshift-ingress-operator (132 of 344)
+clusterrolebinding openshift-ingress-operator (133 of 344)
+rolebinding openshift-ingress-operator/ingress-operator (134 of 344)
+role openshift-ingress-operator/ingress-operator (135 of 344)
+serviceaccount openshift-ingress-operator/ingress-operator (136 of 344)
+deployment openshift-ingress-operator/ingress-operator (137 of 344)
+clusteroperator ingress (138 of 344)
+
+
+0->16
+
+
+
+
+17
+
+namespace openshift-cluster-machine-approver (139 of 344)
+serviceaccount openshift-cluster-machine-approver/machine-approver-sa (140 of 344)
+clusterrole system:openshift:controller:machine-approver (141 of 344)
+clusterrolebinding system:openshift:controller:machine-approver (142 of 344)
+deployment openshift-cluster-machine-approver/machine-approver (143 of 344)
+
+
+0->17
+
+
+
+
+18
+
+namespace openshift-monitoring (144 of 344)
+clusterrole cluster-monitoring-operator (145 of 344)
+serviceaccount openshift-monitoring/cluster-monitoring-operator (146 of 344)
+clusterrolebinding cluster-monitoring-operator (147 of 344)
+deployment openshift-monitoring/cluster-monitoring-operator (148 of 344)
+clusteroperator monitoring (149 of 344)
+operatorgroup openshift-monitoring/openshift-cluster-monitoring (150 of 344)
+
+
+0->18
+
+
+
+
+19
+
+namespace openshift-cluster-node-tuning-operator (151 of 344)
+customresourcedefinition tuneds.tuned.openshift.io (152 of 344)
+serviceaccount openshift-cluster-node-tuning-operator/cluster-node-tuning-operator (153 of 344)
+clusterrole cluster-node-tuning-operator (154 of 344)
+clusterrolebinding cluster-node-tuning-operator (155 of 344)
+deployment openshift-cluster-node-tuning-operator/cluster-node-tuning-operator (156 of 344)
+clusteroperator node-tuning (157 of 344)
+
+
+0->19
+
+
+
+
+20
+
+namespace openshift-controller-manager-operator (158 of 344)
+namespace openshift-controller-manager (159 of 344)
+customresourcedefinition openshiftcontrollermanagers.operator.openshift.io (160 of 344)
+openshiftcontrollermanager cluster (161 of 344)
+configmap openshift-controller-manager-operator/openshift-controller-manager-operator-config (162 of 344)
+service openshift-controller-manager-operator/metrics (163 of 344)
+configmap openshift-controller-manager-operator/openshift-controller-manager-images (164 of 344)
+clusterrolebinding system:openshift:operator:openshift-controller-manager-operator (165 of 344)
+serviceaccount openshift-controller-manager-operator/openshift-controller-manager-operator (166 of 344)
+deployment openshift-controller-manager-operator/openshift-controller-manager-operator (167 of 344)
+clusteroperator openshift-controller-manager (168 of 344)
+
+
+0->20
+
+
+
+
+21
+
+customresourcedefinition configs.samples.operator.openshift.io (169 of 344)
+namespace openshift-cluster-samples-operator (170 of 344)
+serviceaccount openshift-cluster-samples-operator/cluster-samples-operator (171 of 344)
+role openshift-cluster-samples-operator/cluster-samples-operator (172 of 344)
+clusterrole cluster-samples-operator (173 of 344)
+rolebinding openshift-cluster-samples-operator/cluster-samples-operator (174 of 344)
+clusterrolebinding cluster-samples-operator (175 of 344)
+rolebinding openshift/cluster-samples-operator-openshift-edit (176 of 344)
+role openshift-config/coreos-pull-secret-reader (177 of 344)
+rolebinding openshift-config/cluster-samples-operator-openshift-config-secret-reader (178 of 344)
+deployment openshift-cluster-samples-operator/cluster-samples-operator (179 of 344)
+clusteroperator openshift-samples (180 of 344)
+imagestream openshift/cli (181 of 344)
+imagestream openshift/cli-artifacts (182 of 344)
+imagestream openshift/installer (183 of 344)
+imagestream openshift/installer-artifacts (184 of 344)
+imagestream openshift/tests (185 of 344)
+imagestream openshift/must-gather (186 of 344)
+
+
+0->21
+
+
+
+
+22
+
+namespace openshift-cluster-storage-operator (187 of 344)
+clusterrolebinding cluster-storage-operator (188 of 344)
+clusterrole cluster-storage-operator (189 of 344)
+rolebinding openshift-cluster-storage-operator/cluster-storage-operator (190 of 344)
+role openshift-cluster-storage-operator/cluster-storage-operator (191 of 344)
+serviceaccount openshift-cluster-storage-operator/cluster-storage-operator (192 of 344)
+deployment openshift-cluster-storage-operator/cluster-storage-operator (193 of 344)
+clusteroperator storage (194 of 344)
+
+
+0->22
+
+
+
+
+23
+
+namespace openshift-service-catalog-apiserver-operator (195 of 344)
+customresourcedefinition servicecatalogapiservers.operator.openshift.io (196 of 344)
+servicecatalogapiserver cluster (197 of 344)
+configmap openshift-service-catalog-apiserver-operator/openshift-service-catalog-apiserver-operator-config (198 of 344)
+configmap openshift-service-catalog-apiserver-operator/version-mapping (199 of 344)
+clusterrolebinding system:openshift:operator:openshift-service-catalog-apiserver-operator (200 of 344)
+serviceaccount openshift-service-catalog-apiserver-operator/openshift-service-catalog-apiserver-operator (201 of 344)
+service openshift-service-catalog-apiserver-operator/metrics (202 of 344)
+deployment openshift-service-catalog-apiserver-operator/openshift-service-catalog-apiserver-operator (203 of 344)
+clusteroperator service-catalog-apiserver (204 of 344)
+
+
+0->23
+
+
+
+
+24
+
+namespace openshift-service-catalog-controller-manager-operator (205 of 344)
+customresourcedefinition servicecatalogcontrollermanagers.operator.openshift.io (206 of 344)
+configmap openshift-service-catalog-controller-manager-operator/openshift-service-catalog-controller-manager-operator-config (207 of 344)
+service openshift-service-catalog-controller-manager-operator/metrics (208 of 344)
+clusterrolebinding system:openshift:operator:openshift-service-catalog-controller-manager-operator (209 of 344)
+serviceaccount openshift-service-catalog-controller-manager-operator/openshift-service-catalog-controller-manager-operator (210 of 344)
+deployment openshift-service-catalog-controller-manager-operator/openshift-service-catalog-controller-manager-operator (211 of 344)
+clusteroperator service-catalog-controller-manager (212 of 344)
+
+
+0->24
+
+
+
+
+25
+
+customresourcedefinition consoles.operator.openshift.io (213 of 344)
+oauthclient console (214 of 344)
+console cluster (215 of 344)
+namespace openshift-console (216 of 344)
+namespace openshift-console-operator (217 of 344)
+clusterrole console-operator (218 of 344)
+role openshift-console/console-operator (219 of 344)
+role openshift-config-managed/console-operator (220 of 344)
+role openshift-config-managed/console-public (221 of 344)
+role openshift-console-operator/console-operator (222 of 344)
+rolebinding openshift-console/console-operator (223 of 344)
+rolebinding openshift-console-operator/console-operator (224 of 344)
+clusterrolebinding console-operator (225 of 344)
+rolebinding openshift-config-managed/console-operator (226 of 344)
+rolebinding openshift-config-managed/console-public (227 of 344)
+configmap openshift-config-managed/console-public (228 of 344)
+configmap openshift-console-operator/console-operator-config (229 of 344)
+serviceaccount openshift-console-operator/console-operator (230 of 344)
+deployment openshift-console/downloads (231 of 344)
+route openshift-console/downloads (232 of 344)
+service openshift-console/downloads (233 of 344)
+deployment openshift-console-operator/console-operator (234 of 344)
+clusteroperator console (235 of 344)
+
+
+0->25
+
+
+
+
+26
+
+namespace openshift-operator-lifecycle-manager (236 of 344)
+namespace openshift-operators (237 of 344)
+clusterrole system:controller:operator-lifecycle-manager (238 of 344)
+serviceaccount openshift-operator-lifecycle-manager/olm-operator-serviceaccount (239 of 344)
+clusterrolebinding olm-operator-binding-openshift-operator-lifecycle-manager (240 of 344)
+service openshift-operator-lifecycle-manager/olm-operator-metrics (241 of 344)
+service openshift-operator-lifecycle-manager/catalog-operator-metrics (242 of 344)
+customresourcedefinition clusterserviceversions.operators.coreos.com (243 of 344)
+customresourcedefinition installplans.operators.coreos.com (244 of 344)
+customresourcedefinition subscriptions.operators.coreos.com (245 of 344)
+customresourcedefinition catalogsources.operators.coreos.com (246 of 344)
+deployment openshift-operator-lifecycle-manager/olm-operator (247 of 344)
+deployment openshift-operator-lifecycle-manager/catalog-operator (248 of 344)
+clusterrole aggregate-olm-edit (249 of 344)
+clusterrole aggregate-olm-view (250 of 344)
+customresourcedefinition operatorgroups.operators.coreos.com (251 of 344)
+configmap openshift-operator-lifecycle-manager/olm-operators (252 of 344)
+catalogsource openshift-operator-lifecycle-manager/olm-operators (253 of 344)
+operatorgroup openshift-operators/global-operators (254 of 344)
+operatorgroup openshift-operator-lifecycle-manager/olm-operators (255 of 344)
+subscription openshift-operator-lifecycle-manager/packageserver (256 of 344)
+clusteroperator operator-lifecycle-manager (257 of 344)
+clusteroperator operator-lifecycle-manager-catalog (258 of 344)
+clusterserviceversion openshift-operator-lifecycle-manager/packageserver.v0.9.0 (259 of 344)
+deployment openshift-operator-lifecycle-manager/packageserver (260 of 344)
+servicemonitor openshift-operator-lifecycle-manager/olm-operator (261 of 344)
+servicemonitor openshift-operator-lifecycle-manager/catalog-operator (262 of 344)
+rolebinding openshift-operator-lifecycle-manager/operator-lifecycle-manager-metrics (263 of 344)
+role openshift-operator-lifecycle-manager/operator-lifecycle-manager-metrics (264 of 344)
+
+
+0->26
+
+
+
+
+27
+
+namespace openshift-marketplace (265 of 344)
+customresourcedefinition catalogsourceconfigs.operators.coreos.com (266 of 344)
+customresourcedefinition operatorsources.operators.coreos.com (267 of 344)
+serviceaccount openshift-marketplace/marketplace-operator (268 of 344)
+clusterrole marketplace-operator (269 of 344)
+role openshift-marketplace/marketplace-operator (270 of 344)
+clusterrolebinding marketplace-operator (271 of 344)
+rolebinding openshift-marketplace/marketplace-operator (272 of 344)
+operatorsource openshift-marketplace/redhat-operators (273 of 344)
+operatorsource openshift-marketplace/certified-operators (274 of 344)
+operatorsource openshift-marketplace/community-operators (275 of 344)
+deployment openshift-marketplace/marketplace-operator (276 of 344)
+clusteroperator openshift-marketplace/marketplace (277 of 344)
+
+
+0->27
+
+
+
+
+28
+
+clusterrolebinding system:openshift:operator:service-ca-operator (278 of 344)
+namespace openshift-service-ca-operator (279 of 344)
+customresourcedefinition servicecas.operator.openshift.io (280 of 344)
+configmap openshift-service-ca-operator/service-ca-operator-config (281 of 344)
+serviceca cluster (282 of 344)
+serviceaccount openshift-service-ca-operator/service-ca-operator (283 of 344)
+deployment openshift-service-ca-operator/service-ca-operator (284 of 344)
+serviceca cluster (285 of 344)
+clusteroperator service-ca (286 of 344)
+
+
+0->28
+
+
+
+
+29
+
+namespace openshift-network-operator (287 of 344)
+customresourcedefinition networks.operator.openshift.io (288 of 344)
+clusterrolebinding default-account-cluster-network-operator (289 of 344)
+deployment openshift-network-operator/network-operator (290 of 344)
+clusteroperator network (291 of 344)
+
+
+0->29
+
+
+
+
+30
+
+clusterrole openshift-dns-operator (292 of 344)
+customresourcedefinition dnses.operator.openshift.io (293 of 344)
+namespace openshift-dns-operator (294 of 344)
+clusterrolebinding openshift-dns-operator (295 of 344)
+rolebinding openshift-dns-operator/dns-operator (296 of 344)
+role openshift-dns-operator/dns-operator (297 of 344)
+serviceaccount openshift-dns-operator/dns-operator (298 of 344)
+deployment openshift-dns-operator/dns-operator (299 of 344)
+clusteroperator dns (300 of 344)
+
+
+0->30
+
+
+
+
+31
+
+clusterrole system:openshift:machine-config-operator:cluster-reader (301 of 344)
+namespace openshift-machine-config-operator (302 of 344)
+customresourcedefinition mcoconfigs.machineconfiguration.openshift.io (303 of 344)
+configmap openshift-machine-config-operator/machine-config-operator-images (304 of 344)
+clusterrolebinding default-account-openshift-machine-config-operator (305 of 344)
+deployment openshift-machine-config-operator/machine-config-operator (306 of 344)
+configmap openshift-machine-config-operator/machine-config-osimageurl (307 of 344)
+clusteroperator machine-config (308 of 344)
+deployment openshift-machine-config-operator/etcd-quorum-guard (309 of 344)
+poddisruptionbudget openshift-machine-config-operator/etcd-quorum-guard (310 of 344)
+
+
+0->31
+
+
+
+
+32
+
+role openshift-authentication-operator/prometheus-k8s (311 of 344)
+role openshift-authentication/prometheus-k8s (312 of 344)
+rolebinding openshift-authentication-operator/prometheus-k8s (313 of 344)
+rolebinding openshift-authentication/prometheus-k8s (314 of 344)
+servicemonitor openshift-authentication-operator/authentication-operator (315 of 344)
+servicemonitor openshift-authentication/oauth-openshift (316 of 344)
+
+
+0->32
+
+
+
+
+33
+
+clusterrole registry-monitoring (317 of 344)
+clusterrolebinding registry-monitoring (318 of 344)
+role openshift-image-registry/prometheus-k8s (319 of 344)
+rolebinding openshift-image-registry/prometheus-k8s (320 of 344)
+servicemonitor openshift-image-registry/image-registry (321 of 344)
+
+
+0->33
+
+
+
+
+34
+
+role openshift-service-catalog-apiserver-operator/prometheus-k8s (322 of 344)
+rolebinding openshift-service-catalog-apiserver-operator/prometheus-k8s (323 of 344)
+servicemonitor openshift-service-catalog-apiserver-operator/openshift-service-catalog-apiserver-operator (324 of 344)
+
+
+0->34
+
+
+
+
+35
+
+role openshift-service-catalog-controller-manager-operator/prometheus-k8s (325 of 344)
+rolebinding openshift-service-catalog-controller-manager-operator/prometheus-k8s (326 of 344)
+servicemonitor openshift-service-catalog-controller-manager-operator/openshift-service-catalog-controller-manager-operator (327 of 344)
+
+
+0->35
+
+
+
+
+36
+
+configmap openshift-config-managed/release-verification (328 of 344)
+
+
+0->36
+
+
+
+
+37
+
+role openshift-kube-apiserver-operator/prometheus-k8s (329 of 344)
+rolebinding openshift-kube-apiserver-operator/prometheus-k8s (330 of 344)
+servicemonitor openshift-kube-apiserver-operator/kube-apiserver-operator (331 of 344)
+
+
+0->37
+
+
+
+
+38
+
+role openshift-kube-controller-manager-operator/prometheus-k8s (332 of 344)
+rolebinding openshift-kube-controller-manager-operator/prometheus-k8s (333 of 344)
+servicemonitor openshift-kube-controller-manager-operator/kube-controller-manager-operator (334 of 344)
+
+
+0->38
+
+
+
+
+39
+
+role openshift-kube-scheduler-operator/prometheus-k8s (335 of 344)
+rolebinding openshift-kube-scheduler-operator/prometheus-k8s (336 of 344)
+servicemonitor openshift-kube-scheduler-operator/kube-scheduler-operator (337 of 344)
+
+
+0->39
+
+
+
+
+40
+
+role openshift-apiserver-operator/prometheus-k8s (338 of 344)
+rolebinding openshift-apiserver-operator/prometheus-k8s (339 of 344)
+servicemonitor openshift-apiserver-operator/openshift-apiserver-operator (340 of 344)
+
+
+0->40
+
+
+
+
+41
+
+role openshift-controller-manager-operator/prometheus-k8s (341 of 344)
+rolebinding openshift-controller-manager-operator/prometheus-k8s (342 of 344)
+servicemonitor openshift-controller-manager-operator/openshift-controller-manager-operator (343 of 344)
+servicemonitor openshift-controller-manager/openshift-controller-manager (344 of 344)
+
+
+0->41
+
+
+
+
+
diff --git a/hack/cluster-version-util/main.go b/hack/cluster-version-util/main.go
new file mode 100644
index 0000000000..b7c28bf0f0
--- /dev/null
+++ b/hack/cluster-version-util/main.go
@@ -0,0 +1,20 @@
+package main
+
+import (
+ "log"
+
+ "github.com/spf13/cobra"
+)
+
+func main() {
+ rootCmd := &cobra.Command{
+ Use: "cluster-version-util",
+ Short: "Utilities for understanding cluster-version operator functionality. Not for production use.",
+ }
+
+ rootCmd.AddCommand(newTaskGraphCmd())
+
+ if err := rootCmd.Execute(); err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/hack/cluster-version-util/task_graph.go b/hack/cluster-version-util/task_graph.go
new file mode 100644
index 0000000000..a0f8e304a3
--- /dev/null
+++ b/hack/cluster-version-util/task_graph.go
@@ -0,0 +1,65 @@
+package main
+
+import (
+ "fmt"
+ "math/rand"
+ "time"
+
+ "github.com/spf13/cobra"
+
+ "github.com/openshift/cluster-version-operator/pkg/payload"
+)
+
+var (
+ taskGraphOpts struct {
+ parallel string
+ }
+)
+
+func newTaskGraphCmd() *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "task-graph PATH",
+ Short: "Render a task graph for a release image extracted into PATH",
+ Args: cobra.ExactArgs(1),
+ RunE: runTaskGraphCmd,
+ }
+
+ cmd.Flags().StringVar(&taskGraphOpts.parallel, "parallel", "by-number-and-component", "The output directory where the manifests will be rendered.")
+ return cmd
+}
+
+func runTaskGraphCmd(cmd *cobra.Command, args []string) error {
+ manifestDir := args[0]
+ release, err := payload.LoadUpdate(manifestDir, "")
+ if err != nil {
+ return err
+ }
+
+ total := len(release.Manifests)
+ var tasks []*payload.Task
+ for i := range release.Manifests {
+ tasks = append(tasks, &payload.Task{
+ Index: i + 1,
+ Total: total,
+ Manifest: &release.Manifests[i],
+ })
+ }
+ graph := payload.NewTaskGraph(tasks)
+ graph.Split(payload.SplitOnJobs)
+
+ switch taskGraphOpts.parallel {
+ case "by-number-and-component":
+ graph.Parallelize(payload.ByNumberAndComponent)
+ case "flatten-by-number-and-component":
+ graph.Parallelize(payload.FlattenByNumberAndComponent)
+ case "permute-flatten-by-number-and-component":
+ r := rand.New(rand.NewSource(time.Now().UnixNano()))
+ graph.Parallelize(payload.PermuteOrder(payload.FlattenByNumberAndComponent, r))
+ default:
+ return fmt.Errorf("unrecognized parallel strategy %q", taskGraphOpts.parallel)
+ }
+
+ fmt.Println(graph.Tree())
+
+ return nil
+}
diff --git a/pkg/payload/task_graph.go b/pkg/payload/task_graph.go
index da114a19f4..785754bb25 100644
--- a/pkg/payload/task_graph.go
+++ b/pkg/payload/task_graph.go
@@ -6,7 +6,6 @@ import (
"math/rand"
"regexp"
"sort"
- "strconv"
"strings"
"sync"
@@ -340,43 +339,29 @@ func (g *TaskGraph) Roots() []int {
return roots
}
+// Tree renders the task graph in Graphviz DOT.
func (g *TaskGraph) Tree() string {
- roots := g.Roots()
- visited := make([]int, len(g.Nodes))
- stage := 0
- var out []string
- var depth []int
- for len(roots) > 0 {
- depth = append(depth, 0)
- for _, i := range roots {
- visited[i] = 1
- if d := len(g.Nodes[i].Tasks); d > depth[len(depth)-1] {
- depth[len(depth)-1] = d
- }
- out = append(out, fmt.Sprintf("%d: %d %s in=%v out=%v", stage, i, g.Nodes[i], g.Nodes[i].In, g.Nodes[i].Out))
+ out := []string{
+ "digraph tasks {",
+ " labelloc=t;",
+ " rankdir=TB;",
+ }
+ for i, node := range g.Nodes {
+ label := make([]string, 0, len(node.Tasks))
+ for _, task := range node.Tasks {
+ label = append(label, strings.Replace(task.String(), "\"", "", -1))
}
- roots = roots[0:0]
- for i, b := range visited {
- if b == 1 || !covers(visited, g.Nodes[i].In) {
- continue
- }
- roots = append(roots, i)
+ if len(label) == 0 {
+ label = append(label, "no manifests")
}
- stage++
+ out = append(out, fmt.Sprintf(" %d [ label=\"%s\" shape=\"box\" ];", i, strings.Join(label, "\\n")))
}
- for i, b := range visited {
- if b == 1 {
- continue
+ for i, node := range g.Nodes {
+ for _, j := range node.Out {
+ out = append(out, fmt.Sprintf(" %d -> %d;", i, j))
}
- out = append(out, fmt.Sprintf("unreachable: %d %s in=%v out=%v", i, g.Nodes[i], g.Nodes[i].In, g.Nodes[i].Out))
- }
- var totalDepth int
- var levels []string
- for _, d := range depth {
- levels = append(levels, strconv.Itoa(d))
- totalDepth += d
}
- out = append(out, fmt.Sprintf("summary: depth=%d, levels=%s", totalDepth, strings.Join(levels, ",")))
+ out = append(out, "}")
return strings.Join(out, "\n")
}