Repository: code-ready/crc
Pull request #2001 (2021-02-15 09:51:54)

Update bundle from 4.6.16 to 4.7.0

openshift-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/code-ready/crc/pull/2001#" title="Author self-approved">praveenkumar</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=code-ready%2Fcrc).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/code-ready/crc/blob/master/OWNERS)~~ [praveenkumar]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
openshift-ci[bot]: @praveenkumar: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | bf9c141e88c53b90dbd0b4f99f363aaf9c15482e | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2001/pull-ci-code-ready-crc-master-e2e-crc/1361251886673432576) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2001). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:praveenkumar).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
praveenkumar: /retest
praveenkumar: ok to test
openshift-ci[bot]: @praveenkumar: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | bf9c141e88c53b90dbd0b4f99f363aaf9c15482e | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2001/pull-ci-code-ready-crc-master-e2e-crc/1361320627977326592) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2001). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:praveenkumar).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
praveenkumar: /retest
openshift-ci[bot]: @praveenkumar: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | bf9c141e88c53b90dbd0b4f99f363aaf9c15482e | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2001/pull-ci-code-ready-crc-master-e2e-crc/1361323133813919744) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2001). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:praveenkumar).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
praveenkumar: /retest
openshift-ci[bot]: @praveenkumar: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | bf9c141e88c53b90dbd0b4f99f363aaf9c15482e | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2001/pull-ci-code-ready-crc-master-e2e-crc/1361349107825774592) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2001). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:praveenkumar).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
guillaumerose: For enabling the monitoring stack, there is now 2 objects to activate: the CO object and the deployment. 
openshift-ci[bot]: @praveenkumar: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | 0d1bd93d60f180b1b32f252fa8d2e7997c07c510 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2001/pull-ci-code-ready-crc-master-e2e-crc/1361613590938783744) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2001). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:praveenkumar).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
praveenkumar: /retest
openshift-ci[bot]: @praveenkumar: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | 0d1bd93d60f180b1b32f252fa8d2e7997c07c510 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2001/pull-ci-code-ready-crc-master-e2e-crc/1361621014684897280) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2001). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:praveenkumar).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
praveenkumar: /test e2e-crc
openshift-ci[bot]: @praveenkumar: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | 4ce51ed3c301cba106822a28e058e5f7919d5c5d | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2001/pull-ci-code-ready-crc-master-e2e-crc/1362697839158759424) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2001). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:praveenkumar).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
praveenkumar: /retest
openshift-ci[bot]: @praveenkumar: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e-crc | 92e93c1e3a7121584a2c8142bbcab841ec456c73 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/code-ready_crc/2001/pull-ci-code-ready-crc-master-e2e-crc/1364140100547514368) | `/test e2e-crc`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=code-ready&repo=crc&pr=2001). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:praveenkumar).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->

Patch:
diff --git a/Makefile b/Makefile
index f34270079..3578d47bc 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 SHELL := /bin/bash
 
-BUNDLE_VERSION = 4.6.16
+BUNDLE_VERSION = 4.7.0
 BUNDLE_EXTENSION = crcbundle
 CRC_VERSION = 1.22.0
 COMMIT_SHA=$(shell git rev-parse --short HEAD)
diff --git a/README.adoc b/README.adoc
index d764d73c9..00b43110b 100644
--- a/README.adoc
+++ b/README.adoc
@@ -17,6 +17,18 @@ This project is focused on bringing a minimal http://github.com/openshift/origin
 
 If you are looking for a solution for running OpenShift 3.x, you will need tools such as `oc cluster up`, http://github.com/minishift/minishift[Minishift] or https://developers.redhat.com/products/cdk/overview/[CDK].
 
+[[usage-data]]
+== Usage data
+
+The first time CodeReady Containers is run, you will be asked to opt-in to Red Hat's telemetry collection program.
+
+With your approval, CodeReady Containers collects pseudonymized usage data and sends it to Red Hat servers to help improve our products and services. Read our https://developers.redhat.com/article/tool-data-collection[privacy statement] to learn more about it. For the specific data points being collected, see xref:usage-data.adoc#data-table[Usage data].
+
+=== Manually configuring usage data collection
+
+You can manually change your preference about usage data collection by running `crc config set consent-telemetry <yes/no>` before the next `crc start`. 
+
+
 [[documentation]]
 == Documentation
 
diff --git a/centos_ci.sh b/centos_ci.sh
index f65412fdb..b9faf3ac3 100644
--- a/centos_ci.sh
+++ b/centos_ci.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 # bundle location
-BUNDLE_VERSION=4.6.16
+BUNDLE_VERSION=4.7.0
 BUNDLE=crc_libvirt_$BUNDLE_VERSION.crcbundle
 GO_VERSION=1.14.13
 
diff --git a/cmd/crc/cmd/config/config.go b/cmd/crc/cmd/config/config.go
index 249b323a1..8c9bbe5fb 100644
--- a/cmd/crc/cmd/config/config.go
+++ b/cmd/crc/cmd/config/config.go
@@ -23,6 +23,7 @@ const (
 	DisableUpdateCheck      = "disable-update-check"
 	ExperimentalFeatures    = "enable-experimental-features"
 	NetworkMode             = "network-mode"
+	HostNetworkAccess       = "host-network-access"
 	HTTPProxy               = "http-proxy"
 	HTTPSProxy              = "https-proxy"
 	NoProxy                 = "no-proxy"
@@ -32,6 +33,15 @@ const (
 )
 
 func RegisterSettings(cfg *config.Config) {
+	validateHostNetworkAccess := func(value interface{}) (bool, string) {
+		mode := network.ParseMode(cfg.Get(NetworkMode).AsString())
+		if mode != network.VSockMode {
+			return false, fmt.Sprintf("%s can only be used with %s set to '%s'",
+				HostNetworkAccess, NetworkMode, network.VSockMode)
+		}
+		return config.ValidateBool(value)
+	}
+
 	// Start command settings in config
 	cfg.AddSetting(Bundle, constants.DefaultBundlePath, config.ValidateBundlePath, config.SuccessfullyApplied,
 		fmt.Sprintf("Bundle path (string, default '%s')", constants.DefaultBundlePath))
@@ -51,6 +61,8 @@ func RegisterSettings(cfg *config.Config) {
 		"Enable experimental features (true/false, default: false)")
 	cfg.AddSetting(NetworkMode, string(network.DefaultMode), network.ValidateMode, network.SuccessfullyAppliedMode,
 		"Network mode (default or vsock)")
+	cfg.AddSetting(HostNetworkAccess, false, validateHostNetworkAccess, config.SuccessfullyApplied,
+		"Allow TCP/IP connections from the CodeReday Containers VM to services running on the host (true/false, default: false)")
 	// Proxy Configuration
 	cfg.AddSetting(HTTPProxy, "", config.ValidateURI, config.SuccessfullyApplied,
 		"HTTP proxy URL (string, like 'http://my-proxy.com:8443')")
diff --git a/cmd/crc/cmd/daemon.go b/cmd/crc/cmd/daemon.go
index 0b656cd45..110c4ea7c 100644
--- a/cmd/crc/cmd/daemon.go
+++ b/cmd/crc/cmd/daemon.go
@@ -12,6 +12,7 @@ import (
 	"syscall"
 	"time"
 
+	cmdConfig "github.com/code-ready/crc/cmd/crc/cmd/config"
 	"github.com/code-ready/crc/pkg/crc/api"
 	"github.com/code-ready/crc/pkg/crc/constants"
 	"github.com/code-ready/gvisor-tap-vsock/pkg/transport"
@@ -45,8 +46,7 @@ var daemonCmd = &cobra.Command{
 				endpoints = append(endpoints, transport.DefaultURL)
 			}
 		}
-
-		err := run(&types.Configuration{
+		virtualNetworkConfig := types.Configuration{
 			Debug:             false, // never log packets
 			CaptureFile:       captureFile(),
 			MTU:               4000, // Large packets slightly improve the performance. Less small packets.
@@ -77,10 +77,6 @@ var daemonCmd = &cobra.Command{
 							Regexp: regexp.MustCompile("crc-(.*?)-master-0"),
 							IP:     net.ParseIP("192.168.126.11"),
 						},
-						{
-							Name: "host",
-							IP:   net.ParseIP(hostVirtualIP),
-						},
 					},
 				},
 			},
@@ -89,10 +85,25 @@ var daemonCmd = &cobra.Command{
 				":6443": "192.168.127.2:6443",
 				":443":  "192.168.127.2:443",
 			},
-			NAT: map[string]string{
-				hostVirtualIP: "127.0.0.1",
-			},
-		}, endpoints)
+		}
+		if config.Get(cmdConfig.HostNetworkAccess).AsBool() {
+			log.Debugf("Enabling host network access")
+			for i := range virtualNetworkConfig.DNS {
+				zone := &virtualNetworkConfig.DNS[i]
+				if zone.Name != "crc.testing." {
+					continue
+				}
+				log.Debugf("Adding \"host\" -> %s DNS record to crc.testing. zone", hostVirtualIP)
+
+				zone.Records = append(zone.Records, types.Record{Name: "host", IP: net.ParseIP(hostVirtualIP)})
+			}
+
+			if virtualNetworkConfig.NAT == nil {
+				virtualNetworkConfig.NAT = make(map[string]string)
+			}
+			virtualNetworkConfig.NAT[hostVirtualIP] = "127.0.0.1"
+		}
+		err := run(&virtualNetworkConfig, endpoints)
 		return err
 	},
 }
diff --git a/docs/source/topics/proc_accessing-the-openshift-cluster-with-oc.adoc b/docs/source/topics/proc_accessing-the-openshift-cluster-with-oc.adoc
index 187008285..2d08ad406 100644
--- a/docs/source/topics/proc_accessing-the-openshift-cluster-with-oc.adoc
+++ b/docs/source/topics/proc_accessing-the-openshift-cluster-with-oc.adoc
@@ -33,11 +33,11 @@ You can also view it by running the [command]`{bin} console --credentials` comma
 ====
 
 . You can now use [command]`oc` to interact with your OpenShift cluster.
-For example, to verify that the OpenShift cluster Operators are available:
+For example, to verify that the OpenShift cluster Operators are available, run the following command with administrator privileges:
 +
 [subs="+quotes,attributes",options="nowrap"]
 ----
-$ oc get co
+$ oc get co --as system:admin
 ----
 +
 [NOTE]
diff --git a/pkg/crc/cluster/cluster.go b/pkg/crc/cluster/cluster.go
index 6ca8654a8..b023344f3 100644
--- a/pkg/crc/cluster/cluster.go
+++ b/pkg/crc/cluster/cluster.go
@@ -320,7 +320,7 @@ func WaitForAPIServer(ocConfig oc.Config) error {
 		logging.Debug(stdout)
 		return nil
 	}
-	return errors.RetryAfter(3*time.Minute, waitForAPIServer, time.Second)
+	return errors.RetryAfter(4*time.Minute, waitForAPIServer, time.Second)
 }
 
 func DeleteOpenshiftAPIServerPods(ocConfig oc.Config) error {
diff --git a/pkg/crc/cluster/clusteroperator.go b/pkg/crc/cluster/clusteroperator.go
index 81a8927a4..f1ec234b7 100644
--- a/pkg/crc/cluster/clusteroperator.go
+++ b/pkg/crc/cluster/clusteroperator.go
@@ -3,10 +3,11 @@ package cluster
 import (
 	"encoding/json"
 	"errors"
+	"fmt"
+	"strings"
 
 	"github.com/code-ready/crc/pkg/crc/logging"
 	"github.com/code-ready/crc/pkg/crc/oc"
-
 	openshiftapi "github.com/openshift/api/config/v1"
 )
 
@@ -18,6 +19,39 @@ type Status struct {
 	Degraded    bool
 	Progressing bool
 	Disabled    bool
+
+	progressing []string
+	degraded    []string
+	unavailable []string
+}
+
+func (status *Status) String() string {
+	if len(status.progressing) == 1 {
+		return fmt.Sprintf("Operator %s is progressing", status.progressing[0])
+	} else if len(status.progressing) > 1 {
+		return fmt.Sprintf("%d operators are progressing: %s", len(status.progressing), strings.Join(status.progressing, ", "))
+	}
+
+	if len(status.degraded) == 1 {
+		return fmt.Sprintf("Operator %s is degraded", status.degraded[0])
+	} else if len(status.degraded) > 0 {
+		return fmt.Sprintf("%d operators are degraded: %s", len(status.degraded), strings.Join(status.degraded, ", "))
+	}
+
+	if len(status.unavailable) == 1 {
+		return fmt.Sprintf("Operator %s is not yet available", status.unavailable[0])
+	} else if len(status.unavailable) > 0 {
+		return fmt.Sprintf("%d operators are not available: %s", len(status.unavailable), strings.Join(status.unavailable, ", "))
+	}
+
+	if status.IsReady() {
+		return "All operators are ready"
+	}
+	return "Operators are not ready yet"
+}
+
+func (status *Status) IsReady() bool {
+	return status.Available && !status.Progressing && !status.Degraded && !status.Disabled
 }
 
 func GetClusterOperatorStatus(ocConfig oc.Config, operator string) (*Status, error) {
@@ -61,16 +95,19 @@ func getStatus(ocConfig oc.Config, ignoreClusterOperators, selector []string) (*
 			case "Available":
 				if con.Status != "True" {
 					logging.Debug(c.ObjectMeta.Name, " operator not available, Reason: ", con.Reason)
+					cs.unavailable = append(cs.unavailable, c.ObjectMeta.Name)
 					cs.Available = false
 				}
 			case "Degraded":
 				if con.Status == "True" {
 					logging.Debug(c.ObjectMeta.Name, " operator is degraded, Reason: ", con.Reason)
+					cs.degraded = append(cs.degraded, c.ObjectMeta.Name)
 					cs.Degraded = true
 				}
 			case "Progressing":
 				if con.Status == "True" {
 					logging.Debug(c.ObjectMeta.Name, " operator is still progressing, Reason: ", con.Reason)
+					cs.progressing = append(cs.progressing, c.ObjectMeta.Name)
 					cs.Progressing = true
 				}
 			case "Upgradeable":
diff --git a/pkg/crc/cluster/status.go b/pkg/crc/cluster/status.go
new file mode 100644
index 000000000..9e54c9ef5
--- /dev/null
+++ b/pkg/crc/cluster/status.go
@@ -0,0 +1,48 @@
+package cluster
+
+import (
+	"fmt"
+	"time"
+
+	"github.com/code-ready/crc/pkg/crc/logging"
+	"github.com/code-ready/crc/pkg/crc/oc"
+)
+
+// WaitForClusterStable checks that the cluster is running a number of consecutive times
+func WaitForClusterStable(ocConfig oc.Config, monitoringEnabled bool) error {
+	startTime := time.Now()
+
+	retryDuration := 30 * time.Second
+	retryCount := 20 // 10 minutes
+
+	numConsecutive := 3
+	var count int // holds num of consecutive matches
+
+	for i := 0; i < retryCount; i++ {
+		status, err := GetClusterOperatorsStatus(ocConfig, monitoringEnabled)
+		if err == nil {
+			// update counter for consecutive matches
+			if status.IsReady() {
+				count++
+				if count == 1 {
+					logging.Info("All operators are available. Ensuring stability ...")
+				} else {
+					logging.Infof("Operators are stable (%d/%d) ...", count, numConsecutive)
+				}
+			} else {
+				logging.Info(status.String())
+				count = 0
+			}
+			// break if done
+			if count == numConsecutive {
+				logging.Debugf("Cluster took %s to stabilize", time.Since(startTime))
+				return nil
+			}
+		} else {
+			count = 0
+		}
+		time.Sleep(retryDuration)
+	}
+
+	return fmt.Errorf("cluster operators are still not stable after %s", time.Since(startTime))
+}
diff --git a/pkg/crc/machine/kubeconfig.go b/pkg/crc/machine/kubeconfig.go
index bd7b54476..f026eab3a 100644
--- a/pkg/crc/machine/kubeconfig.go
+++ b/pkg/crc/machine/kubeconfig.go
@@ -36,7 +36,7 @@ func eventuallyWriteKubeconfig(ocConfig oc.Config, ip string, clusterConfig *Clu
 		if err != nil {
 			return &errors.RetriableError{Err: err}
 		}
-		if isReady(status) {
+		if status.IsReady() {
 			return nil
 		}
 		return &errors.RetriableError{Err: goerrors.New("cluster operator authentication not ready")}
@@ -48,10 +48,6 @@ func eventuallyWriteKubeconfig(ocConfig oc.Config, ip string, clusterConfig *Clu
 	return nil
 }
 
-func isReady(status *cluster.Status) bool {
-	return status.Available && !status.Progressing && !status.Degraded && !status.Disabled
-}
-
 func WriteKubeconfig(ip string, clusterConfig *ClusterConfig) error {
 	kubeconfig := getGlobalKubeConfigPath()
 	dir := filepath.Dir(kubeconfig)
diff --git a/pkg/crc/machine/start.go b/pkg/crc/machine/start.go
index bd08f6829..15455223b 100644
--- a/pkg/crc/machine/start.go
+++ b/pkg/crc/machine/start.go
@@ -378,9 +378,11 @@ func (client *client) Start(ctx context.Context, startConfig StartConfig) (*Star
 		}
 	}
 
-	logging.Info("Starting OpenShift cluster ... [waiting 3m]")
+	logging.Info("Starting OpenShift cluster ... [waiting for the cluster to stabilize]")
 
-	time.Sleep(time.Minute * 3)
+	if err := cluster.WaitForClusterStable(ocConfig, client.monitoringEnabled()); err != nil {
+		logging.Errorf("Cluster is not ready: %v", err)
+	}
 
 	waitForProxyPropagation(ocConfig, proxyConfig)
 
diff --git a/pkg/crc/preflight/preflight_checks_linux.go b/pkg/crc/preflight/preflight_checks_linux.go
index 649a1e59a..4e56f705e 100644
--- a/pkg/crc/preflight/preflight_checks_linux.go
+++ b/pkg/crc/preflight/preflight_checks_linux.go
@@ -349,7 +349,7 @@ func fixLibvirtCrcNetworkAvailable() error {
 	err = cmd.Run()
 	if err != nil {
 		logging.Debugf("%v : %s", err, buf.String())
-		return fmt.Errorf("Failed to create libvirt 'crc' network")
+		return fmt.Errorf("Failed to create libvirt 'crc' network: %v - %s", err, buf.String())
 	}
 	logging.Debug("libvirt 'crc' network created")
 	return nil
diff --git a/usage-data.adoc b/usage-data.adoc
new file mode 100644
index 000000000..ee751718b
--- /dev/null
+++ b/usage-data.adoc
@@ -0,0 +1,27 @@
+= Usage data
+
+The following table describes the opt-in usage data collected by CodeReady Containers.
+
+.Data points
+|===
+|Occasion          | Data                        | Type 
+
+|*Install*         |Host OS                      |
+|                  |Host OS version              |
+|                  |CodeReady Containers version |
+
+|*Setup*           | Error message               |
+|                  | Error type                  |
+|                  | First time run              | true/false
+|*Cluster startup* | Error message               |
+|                  | Proxy                       | true/false
+|                  | Network mode                | vsock/default
+|                  | Cluster monitoring          | true/false
+|                  | Experimental features       | true/false
+|                  | tty                         | true/false
+|                  | duration                    |
+
+|*Config*          | Num of CPUs                 | 
+|                  | Memory size                 |
+|                  | Disk size                   |
+|===
\ No newline at end of file


Test patch:
diff --git a/pkg/crc/cluster/clusteroperator_test.go b/pkg/crc/cluster/clusteroperator_test.go
index 93491a6cc..02ac9aff2 100644
--- a/pkg/crc/cluster/clusteroperator_test.go
+++ b/pkg/crc/cluster/clusteroperator_test.go
@@ -16,6 +16,7 @@ var (
 	progressing = &Status{
 		Available:   true,
 		Progressing: true,
+		progressing: []string{"authentication"},
 	}
 )
 
diff --git a/test/e2e/crcsuite/crcsuite.go b/test/e2e/crcsuite/crcsuite.go
index bf57677a9..1e13e030c 100644
--- a/test/e2e/crcsuite/crcsuite.go
+++ b/test/e2e/crcsuite/crcsuite.go
@@ -217,44 +217,18 @@ func CheckOutputMatchWithRetry(retryCount int, retryTime string, command string,
 }
 
 // CheckCRCStatus checks that output of status command
-// matches given regex number of consecutive times
+// matches given regex
 func CheckCRCStatus(state string) error {
-	retryDuration := 1 * time.Minute
-	retryCount := 15
-	cmd := "crc status --log-level debug"
-	expression := ""
-	var numConsecutive int
-
+	expression := `.*Running \(v\d+\.\d+\.\d+.*\).*`
 	if state == "stopped" {
-		numConsecutive = 1
 		expression = ".*Stopped.*"
-	} else {
-		numConsecutive = 3
-		expression = `.*Running \(v\d+\.\d+\.\d+.*\).*`
 	}
 
-	var matchErr error
-	var count int // holds num of consecutive matches
-
-	for i := 0; i < retryCount; i++ {
-		execErr := clicumber.ExecuteCommand(cmd)
-		if execErr == nil {
-			matchErr = clicumber.CommandReturnShouldMatch("stdout", expression)
-			// update counter for consecutive matches
-			if matchErr == nil {
-				count++
-			} else {
-				count = 0
-			}
-			// break if done
-			if count == numConsecutive {
-				return nil
-			}
-		}
-		time.Sleep(retryDuration)
+	err := clicumber.ExecuteCommand("crc status --log-level debug")
+	if err != nil {
+		return err
 	}
-
-	return fmt.Errorf("did not get enough consecutive matches: have %d but need %d", count, numConsecutive)
+	return clicumber.CommandReturnShouldMatch("stdout", expression)
 }
 
 func DeleteFileFromCRCHome(fileName string) error {