Repository: kubernetes-sigs/node-feature-discovery
Pull request #463 (2021-03-02 20:57:07)

Support for additional cpu features
This adds additional cpu features:
- pstate enable from status of intel_pstate driver
- pstate performance and powersave settings from scaling_governor
- cstate enable from max_cstates in intel_idle driver

Closes: #439

k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) or hashtag(#) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [1d712fe](https://github.com/kubernetes-sigs/node-feature-discovery/commits/1d712fe362322734748a065824db892d55dc3405) Support for additional cpu features

<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>

k8s-ci-robot: Thanks for your pull request. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

:memo: **Please follow instructions at <https://git.k8s.io/community/CLA.md#the-contributor-license-agreement> to sign the CLA.**

It may take a couple minutes for the CLA signature to be fully registered; after that, please reply here with a new comment and we'll verify.  Thanks.

---

- If you've already signed a CLA, it's possible we don't have your GitHub username or you're using a different email address.  Check your existing CLA data and verify that your [email is set on your git commits](https://help.github.com/articles/setting-your-email-in-git/).
- If you signed the CLA as a corporation, please sign in with your organization's credentials at <https://identity.linuxfoundation.org/projects/cncf> to be authorized.
- If you have done the above and are still having issues with the CLA being reported as unsigned, please log a ticket with the Linux Foundation Helpdesk: <https://support.linuxfoundation.org/>
- Should you encounter any issues with the Linux Foundation Helpdesk, send a message to the backup e-mail support address at: login-issues@jira.linuxfoundation.org

<!-- need_sender_cla -->

<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>
	
k8s-ci-robot: Welcome @bfournie! <br><br>It looks like this is your first PR to <a href='https://github.com/kubernetes-sigs/node-feature-discovery'>kubernetes-sigs/node-feature-discovery</a> 🎉. Please refer to our [pull request process documentation](https://git.k8s.io/community/contributors/guide/pull-requests.md) to help your PR have a smooth ride to approval. <br><br>You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. [Here is the bot commands documentation](https://go.k8s.io/bot-commands). <br><br>You can also check if kubernetes-sigs/node-feature-discovery has [its own contribution guidelines](https://github.com/kubernetes-sigs/node-feature-discovery/tree/master/CONTRIBUTING.md). <br><br>You may want to refer to our [testing guide](https://git.k8s.io/community/contributors/devel/sig-testing/testing.md) if you run into trouble with your tests not passing. <br><br>If you are having difficulty getting your pull request seen, please follow the [recommended escalation practices](https://github.com/kubernetes/community/blob/master/contributors/guide/pull-requests.md#why-is-my-pull-request-not-getting-reviewed). Also, for tips and tricks in the contribution process you may want to read the [Kubernetes contributor cheat sheet](https://git.k8s.io/community/contributors/guide/contributor-cheatsheet/README.md). We want to make sure your contribution gets all the attention it needs! <br><br>Thank you, and welcome to Kubernetes. :smiley:
k8s-ci-robot: Hi @bfournie. Thanks for your PR.

I'm waiting for a [kubernetes-sigs](https://github.com/orgs/kubernetes-sigs/people) member to verify that this patch is reasonable to test. If it is, they should reply with `/ok-to-test` on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should [join the org](https://git.k8s.io/community/community-membership.md#member) to skip this step.

Once the patch is verified, the new status will be reflected by the `ok-to-test` label.

I understand the commands that are listed [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fnode-feature-discovery).

<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.
</details>

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

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/node-feature-discovery/pull/463#" title="Author self-approved">bfournie</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **marquiz** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @marquiz` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fnode-feature-discovery).

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

- **[OWNERS](https://github.com/kubernetes-sigs/node-feature-discovery/blob/master/OWNERS)**

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":["marquiz"]} -->
k8s-ci-robot: [Keywords](https://help.github.com/articles/closing-issues-using-keywords) which can automatically close issues and at(@) or hashtag(#) mentions are not allowed in commit messages.

**The list of commits with invalid commit messages**:

- [38719f3](https://github.com/kubernetes-sigs/node-feature-discovery/commits/38719f3397b9dc4876b6f5775c88e8d14dba8c6a) Support for additional cpu features

<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>

k8s-ci-robot: @bfournie: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-node-feature-discovery-verify | 87261ad63f368f51c54f711839120a12a7c41083 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-verify/1367030964001181696) | `/test pull-node-feature-discovery-verify`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=node-feature-discovery&pr=463). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Abfournie). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/node-feature-discovery/issues?q=is:issue+is:open) when you hit one in your PR.

<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 -->
k8s-ci-robot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-node-feature-discovery-verify | 87261ad63f368f51c54f711839120a12a7c41083 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-verify/1367030964001181696) | `/test pull-node-feature-discovery-verify`
pull-node-feature-discovery-build | 87261ad63f368f51c54f711839120a12a7c41083 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-build/1367030964089262080) | `/test pull-node-feature-discovery-build`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=node-feature-discovery&pr=463). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Abfournie). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/node-feature-discovery/issues?q=is:issue+is:open) when you hit one in your PR.

<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 -->
k8s-ci-robot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-node-feature-discovery-verify | 87261ad63f368f51c54f711839120a12a7c41083 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-verify/1367030964001181696) | `/test pull-node-feature-discovery-verify`
pull-node-feature-discovery-build | 87261ad63f368f51c54f711839120a12a7c41083 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-build/1367030964089262080) | `/test pull-node-feature-discovery-build`
pull-node-feature-discovery-build-image | 87261ad63f368f51c54f711839120a12a7c41083 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-build-image/1367030964135399424) | `/test pull-node-feature-discovery-build-image`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=node-feature-discovery&pr=463). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Abfournie). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/node-feature-discovery/issues?q=is:issue+is:open) when you hit one in your PR.

<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 -->
k8s-ci-robot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-node-feature-discovery-build | 87261ad63f368f51c54f711839120a12a7c41083 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-build/1367030964089262080) | `/test pull-node-feature-discovery-build`
pull-node-feature-discovery-build-image | 87261ad63f368f51c54f711839120a12a7c41083 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-build-image/1367030964135399424) | `/test pull-node-feature-discovery-build-image`
pull-node-feature-discovery-verify | ed195a4a5116aae3f30456f335a2ab93e2793303 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-verify/1367203905481478144) | `/test pull-node-feature-discovery-verify`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=node-feature-discovery&pr=463). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Abfournie). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/node-feature-discovery/issues?q=is:issue+is:open) when you hit one in your PR.

<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 -->
k8s-ci-robot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-node-feature-discovery-build-image | 87261ad63f368f51c54f711839120a12a7c41083 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-build-image/1367030964135399424) | `/test pull-node-feature-discovery-build-image`
pull-node-feature-discovery-verify | ed195a4a5116aae3f30456f335a2ab93e2793303 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-verify/1367203905481478144) | `/test pull-node-feature-discovery-verify`
pull-node-feature-discovery-build | ed195a4a5116aae3f30456f335a2ab93e2793303 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-build/1367203905556975616) | `/test pull-node-feature-discovery-build`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=node-feature-discovery&pr=463). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Abfournie). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/node-feature-discovery/issues?q=is:issue+is:open) when you hit one in your PR.

<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 -->
k8s-ci-robot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-node-feature-discovery-verify | ed195a4a5116aae3f30456f335a2ab93e2793303 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-verify/1367203905481478144) | `/test pull-node-feature-discovery-verify`
pull-node-feature-discovery-build | ed195a4a5116aae3f30456f335a2ab93e2793303 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-build/1367203905556975616) | `/test pull-node-feature-discovery-build`
pull-node-feature-discovery-build-image | ed195a4a5116aae3f30456f335a2ab93e2793303 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-build-image/1367203905598918656) | `/test pull-node-feature-discovery-build-image`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=node-feature-discovery&pr=463). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Abfournie). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/node-feature-discovery/issues?q=is:issue+is:open) when you hit one in your PR.

<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 -->
k8s-ci-robot: @bfournie: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-node-feature-discovery-build | ed195a4a5116aae3f30456f335a2ab93e2793303 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-build/1367203905556975616) | `/test pull-node-feature-discovery-build`
pull-node-feature-discovery-build-image | ed195a4a5116aae3f30456f335a2ab93e2793303 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-build-image/1367203905598918656) | `/test pull-node-feature-discovery-build-image`
pull-node-feature-discovery-verify | 8456b0e714562559334c5f9d9aa32b7144822327 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-verify/1367208494788251648) | `/test pull-node-feature-discovery-verify`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=node-feature-discovery&pr=463). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Abfournie). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/node-feature-discovery/issues?q=is:issue+is:open) when you hit one in your PR.

<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 -->
k8s-ci-robot: @bfournie: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-node-feature-discovery-verify | d36e0fe63bed58ecb9b94a582223e4942cb3395a | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_node-feature-discovery/463/pull-node-feature-discovery-verify/1367606146906460160) | `/test pull-node-feature-discovery-verify`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=node-feature-discovery&pr=463). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Abfournie). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/node-feature-discovery/issues?q=is:issue+is:open) when you hit one in your PR.

<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 8f5e4e2e2..3810dfc7e 100644
--- a/Makefile
+++ b/Makefile
@@ -119,7 +119,7 @@ gofmt-verify:
 	fi
 
 ci-lint:
-	golangci-lint run --timeout 7m0s
+	golangci-lint run --timeout 5m0s
 
 mdlint:
 	find docs/ -path docs/vendor -prune -false -o -name '*.md' | xargs $(MDL) -s docs/mdl-style.rb
diff --git a/cmd/nfd-master/main.go b/cmd/nfd-master/main.go
index 39e834a85..96725be97 100644
--- a/cmd/nfd-master/main.go
+++ b/cmd/nfd-master/main.go
@@ -45,7 +45,7 @@ func main() {
 
 	_ = flags.Parse(os.Args[1:])
 	if len(flags.Args()) > 0 {
-		fmt.Fprintf(flags.Output(), "unknown command line argument: %s\n", flags.Args()[0])
+		fmt.Printf("unknown command line argument: %s\n", flags.Args()[0])
 		flags.Usage()
 		os.Exit(2)
 	}
@@ -63,7 +63,7 @@ func main() {
 	// Get new NfdMaster instance
 	instance, err := master.NewNfdMaster(args)
 	if err != nil {
-		klog.Exitf("failed to initialize NfdMaster instance: %v", err)
+		klog.Exitf("Failed to initialize NfdMaster instance: %v", err)
 	}
 
 	if err = instance.Run(); err != nil {
diff --git a/cmd/nfd-worker/main.go b/cmd/nfd-worker/main.go
index a60d8799d..bc3314455 100644
--- a/cmd/nfd-worker/main.go
+++ b/cmd/nfd-worker/main.go
@@ -54,7 +54,7 @@ func main() {
 	// Get new NfdWorker instance
 	instance, err := worker.NewNfdWorker(args)
 	if err != nil {
-		klog.Exitf("failed to initialize NfdWorker instance: %v", err)
+		klog.Exitf("Failed to initialize NfdWorker instance: %v", err)
 	}
 
 	if err = instance.Run(); err != nil {
@@ -67,7 +67,7 @@ func parseArgs(flags *flag.FlagSet, osArgs ...string) *worker.Args {
 
 	_ = flags.Parse(osArgs)
 	if len(flags.Args()) > 0 {
-		fmt.Fprintf(flags.Output(), "unknown command line argument: %s\n", flags.Args()[0])
+		fmt.Printf("unknown command line argument: %s\n", flags.Args()[0])
 		flags.Usage()
 		os.Exit(2)
 	}
diff --git a/docs/get-started/features.md b/docs/get-started/features.md
index cdd6bb9d3..61e0a6f8c 100644
--- a/docs/get-started/features.md
+++ b/docs/get-started/features.md
@@ -61,7 +61,10 @@ The **cpu** feature source supports the following labels:
 | cpuid                   | &lt;cpuid flag&gt; | CPU capability is supported
 | hardware_multithreading |                    | Hardware multithreading, such as Intel HTT, enabled (number of logical CPUs is greater than physical CPUs)
 | power                   | sst_bf.enabled     | Intel SST-BF ([Intel Speed Select Technology][intel-sst] - Base frequency) enabled
-| [pstate][intel-pstate]  | turbo              | Set to 'true' if turbo frequencies are enabled in Intel pstate driver, set to 'false' if they have been disabled.
+| [pstate][intel-pstate]  | status             | The status of the Intel pstate driver when in use and enabled, either 'active' or 'passive'.
+|                         | turbo              | Set to 'true' if turbo frequencies are enabled in Intel pstate driver, set to 'false' if they have been disabled.
+|                         | scaling_governor   | The value of the Intel pstate scaling_governor when in use, either 'powersave' or 'performance'.
+| cstate                  | enabled            | Set to 'true' if cstates are set in the intel_idle driver, otherwise set to 'false'.
 | [rdt][intel-rdt]        | RDTMON             | Intel RDT Monitoring Technology
 |                         | RDTCMT             | Intel Cache Monitoring (CMT)
 |                         | RDTMBM             | Intel Memory Bandwidth Monitoring (MBM)
diff --git a/pkg/nfd-worker/nfd-worker.go b/pkg/nfd-worker/nfd-worker.go
index 1f1349aa7..1ad42adde 100644
--- a/pkg/nfd-worker/nfd-worker.go
+++ b/pkg/nfd-worker/nfd-worker.go
@@ -48,6 +48,7 @@ import (
 	"sigs.k8s.io/node-feature-discovery/source/local"
 	"sigs.k8s.io/node-feature-discovery/source/memory"
 	"sigs.k8s.io/node-feature-discovery/source/network"
+	"sigs.k8s.io/node-feature-discovery/source/panic_fake"
 	"sigs.k8s.io/node-feature-discovery/source/pci"
 	"sigs.k8s.io/node-feature-discovery/source/storage"
 	"sigs.k8s.io/node-feature-discovery/source/system"
@@ -145,6 +146,7 @@ func NewNfdWorker(args *Args) (NfdWorker, error) {
 		},
 		testSources: []source.FeatureSource{
 			&fake.Source{},
+			&panicfake.Source{},
 		},
 		stop: make(chan struct{}, 1),
 	}
@@ -394,7 +396,7 @@ func (w *nfdWorker) configureCore(c coreConfig) error {
 				v = a.DefValue()
 			}
 			if err := a.SetFromConfig(v); err != nil {
-				return fmt.Errorf("failed to set logger option klog.%s = %v: %v", k, v, err)
+				return err
 			}
 		}
 	}
@@ -460,15 +462,15 @@ func (w *nfdWorker) configure(filepath string, overrides string) error {
 		} else {
 			err = yaml.Unmarshal(data, c)
 			if err != nil {
-				return fmt.Errorf("failed to parse config file: %s", err)
+				return fmt.Errorf("Failed to parse config file: %s", err)
 			}
-			klog.Infof("configuration file %q parsed", filepath)
+			klog.Infof("Configuration successfully loaded from %q", filepath)
 		}
 	}
 
 	// Parse config overrides
 	if err := yaml.Unmarshal([]byte(overrides), c); err != nil {
-		return fmt.Errorf("failed to parse --options: %s", err)
+		return fmt.Errorf("Failed to parse --options: %s", err)
 	}
 
 	if w.args.Overrides.LabelWhiteList != nil {
@@ -497,8 +499,6 @@ func (w *nfdWorker) configure(filepath string, overrides string) error {
 		s.SetConfig(c.Sources[s.Name()])
 	}
 
-	klog.Infof("worker (re-)configuration successfully completed")
-
 	return nil
 }
 
@@ -527,6 +527,13 @@ func createFeatureLabels(sources []source.FeatureSource, labelWhiteList regexp.R
 // getFeatureLabels returns node labels for features discovered by the
 // supplied source.
 func getFeatureLabels(source source.FeatureSource, labelWhiteList regexp.Regexp) (labels Labels, err error) {
+	defer func() {
+		if r := recover(); r != nil {
+			klog.Errorf("panic occurred during discovery of source [%s]: %v", source.Name(), r)
+			err = fmt.Errorf("%v", r)
+		}
+	}()
+
 	labels = Labels{}
 	features, err := source.Discover()
 	if err != nil {
@@ -560,7 +567,7 @@ func getFeatureLabels(source source.FeatureSource, labelWhiteList regexp.Regexp)
 		// Validate label name.
 		errs := validation.IsQualifiedName(nameForValidation)
 		if len(errs) > 0 {
-			klog.Warningf("ignoring invalid feature name '%s': %s", label, errs)
+			klog.Warningf("Ignoring invalid feature name '%s': %s", label, errs)
 			continue
 		}
 
@@ -568,7 +575,7 @@ func getFeatureLabels(source source.FeatureSource, labelWhiteList regexp.Regexp)
 		// Validate label value
 		errs = validation.IsValidLabelValue(value)
 		if len(errs) > 0 {
-			klog.Warningf("ignoring invalid feature value %s=%s: %s", label, value, errs)
+			klog.Warningf("Ignoring invalid feature value %s=%s: %s", label, value, errs)
 			continue
 		}
 
@@ -589,7 +596,7 @@ func advertiseFeatureLabels(client pb.LabelerClient, labels Labels) error {
 	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 	defer cancel()
 
-	klog.Infof("sending labeling request to nfd-master")
+	klog.Infof("Sending labeling request to nfd-master")
 
 	labelReq := pb.SetLabelsRequest{Labels: labels,
 		NfdVersion: version.Get(),
diff --git a/pkg/utils/flags.go b/pkg/utils/flags.go
index cfd23806e..c88a2e59a 100644
--- a/pkg/utils/flags.go
+++ b/pkg/utils/flags.go
@@ -33,9 +33,7 @@ type RegexpVal struct {
 // Set implements the flag.Value interface
 func (a *RegexpVal) Set(val string) error {
 	r, err := regexp.Compile(val)
-	if err == nil {
-		a.Regexp = *r
-	}
+	a.Regexp = *r
 	return err
 }
 
diff --git a/source/cpu/cpu.go b/source/cpu/cpu.go
index 1bc97ba62..22680d815 100644
--- a/source/cpu/cpu.go
+++ b/source/cpu/cpu.go
@@ -144,6 +144,14 @@ func (s *Source) Discover() (source.Features, error) {
 		features["rdt."+f] = true
 	}
 
+	// Detect cstate configuration
+	cstate, err := detectCstate()
+	if err != nil {
+		klog.Errorf("failed to detect cstate: %v", err)
+	} else {
+		features["cstate.enabled"] = cstate
+	}
+
 	return features, nil
 }
 
diff --git a/source/cpu/cstate.go b/source/cpu/cstate.go
new file mode 100644
index 000000000..a446925f5
--- /dev/null
+++ b/source/cpu/cstate.go
@@ -0,0 +1,51 @@
+/*
+Copyright 2021 The Kubernetes Authors.
+
+Licensed 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 cpu
+
+import (
+	"fmt"
+	"io/ioutil"
+	"strconv"
+	"strings"
+
+	"sigs.k8s.io/node-feature-discovery/source"
+)
+
+// Discover if c-states are enabled
+func detectCstate() (bool, error) {
+	// When the intel_idle driver is in use (default), check setting of max_cstates
+	driver, err := ioutil.ReadFile(source.SysfsDir.Path("devices/system/cpu/cpuidle/current_driver"))
+	if err != nil {
+		return false, fmt.Errorf("cannot get driver for cpuidle: %s", err.Error())
+	}
+
+	if strings.TrimSpace(string(driver)) != "intel_idle" {
+		// Currently only checking intel_idle driver for cstates
+		return false, fmt.Errorf("intel_idle driver is not in use: %s", string(driver))
+	}
+
+	data, err := ioutil.ReadFile(source.SysfsDir.Path("module/intel_idle/parameters/max_cstate"))
+	if err != nil {
+		return false, fmt.Errorf("cannot determine cstate from max_cstates: %s", err.Error())
+	}
+	cstates, err := strconv.Atoi(strings.TrimSpace(string(data)))
+	if err != nil {
+		return false, fmt.Errorf("non-integer value of cstates: %s", err.Error())
+	}
+
+	return cstates > 0, nil
+}
diff --git a/source/cpu/pstate.go b/source/cpu/pstate.go
index 9b8c1e023..c040df564 100644
--- a/source/cpu/pstate.go
+++ b/source/cpu/pstate.go
@@ -20,6 +20,9 @@ import (
 	"fmt"
 	"io/ioutil"
 	"runtime"
+	"strings"
+
+	"k8s.io/klog/v2"
 
 	"sigs.k8s.io/node-feature-discovery/source"
 )
@@ -32,14 +35,72 @@ func detectPstate() (map[string]string, error) {
 		return nil, nil
 	}
 
-	// Only looking for turbo boost for now...
+	// Get global pstate status
+	data, err := ioutil.ReadFile(source.SysfsDir.Path("devices/system/cpu/intel_pstate/status"))
+	if err != nil {
+		return nil, fmt.Errorf("could not read pstate status: %s", err.Error())
+	}
+	status := strings.TrimSpace(string(data))
+	if status == "off" {
+		// No need to check other pstate features
+		klog.Infof("intel_pstate driver is not in use")
+		return nil, nil
+	}
+	features := map[string]string{"status": status}
+
+	// Check turbo boost
 	bytes, err := ioutil.ReadFile(source.SysfsDir.Path("devices/system/cpu/intel_pstate/no_turbo"))
 	if err != nil {
-		return nil, fmt.Errorf("can't detect whether turbo boost is enabled: %s", err.Error())
+		klog.Errorf("can't detect whether turbo boost is enabled: %s", err.Error())
+	} else {
+		features["turbo"] = "false"
+		if bytes[0] == byte('0') {
+			features["turbo"] = "true"
+		}
+	}
+
+	if status != "active" {
+		// Don't check other features which depend on active state
+		return features, nil
 	}
-	features := map[string]string{"turbo": "false"}
-	if bytes[0] == byte('0') {
-		features["turbo"] = "true"
+
+	// Determine scaling governor that is being used
+	policies, err := ioutil.ReadDir(source.SysfsDir.Path("devices/system/cpu/cpufreq"))
+	if err != nil {
+		klog.Errorf("failed to read cpufreq directory: %s", err.Error())
+		return features, nil
+	}
+
+	scaling := ""
+	for _, policy := range policies {
+		// Ensure at least one cpu is using this policy
+		cpus, err := ioutil.ReadFile(source.SysfsDir.Path("devices/system/cpu/cpufreq", policy.Name(), "affected_cpus"))
+		if err != nil {
+			klog.Errorf("could not read cpufreq policy %s affected_cpus", policy.Name())
+			continue
+		}
+		if strings.TrimSpace(string(cpus)) == "" {
+			klog.Infof("policy %s has no associated cpus", policy.Name())
+			continue
+		}
+
+		data, err := ioutil.ReadFile(source.SysfsDir.Path("devices/system/cpu/cpufreq", policy.Name(), "scaling_governor"))
+		if err != nil {
+			klog.Errorf("could not read cpufreq policy %s scaling_governor", policy.Name())
+			continue
+		}
+		policy_scaling := strings.TrimSpace(string(data))
+		// Check that all of the policies have the same scaling governor, if not don't set feature
+		if scaling != "" && scaling != policy_scaling {
+			klog.Infof("scaling_governor for policy %s doesn't match prior policy", policy.Name())
+			scaling = ""
+			break
+		}
+		scaling = policy_scaling
+	}
+
+	if scaling != "" {
+		features["scaling_governor"] = scaling
 	}
 
 	return features, nil
diff --git a/source/internal/kernelutils/kernel_kconfig.go b/source/internal/kernelutils/kernel_kconfig.go
index b0f667c05..6b56f6f2a 100644
--- a/source/internal/kernelutils/kernel_kconfig.go
+++ b/source/internal/kernelutils/kernel_kconfig.go
@@ -51,7 +51,7 @@ func readKconfigGzip(filename string) ([]byte, error) {
 	return ioutil.ReadAll(r)
 }
 
-// ParseKconfig reads kconfig and return a map
+// Read kconfig into a map
 func ParseKconfig(configPath string) (map[string]string, error) {
 	kconfig := map[string]string{}
 	raw := []byte(nil)
@@ -95,7 +95,7 @@ func ParseKconfig(configPath string) (map[string]string, error) {
 	}
 
 	if raw == nil {
-		return nil, fmt.Errorf("failed to read kernel config from %+v", append([]string{configPath}, searchPaths...))
+		return nil, fmt.Errorf("Failed to read kernel config from %+v:", append([]string{configPath}, searchPaths...))
 	}
 
 	// Regexp for matching kconfig flags
diff --git a/source/internal/pci_utils.go b/source/internal/pci_utils.go
index 4358087f3..3440ad4bf 100644
--- a/source/internal/pci_utils.go
+++ b/source/internal/pci_utils.go
@@ -58,7 +58,7 @@ func readPciDevInfo(devPath string, deviceAttrSpec map[string]bool) (PciDeviceIn
 		attrVal, err := readSinglePciAttribute(devPath, attr)
 		if err != nil {
 			if must {
-				return info, fmt.Errorf("failed to read device %s: %s", attr, err)
+				return info, fmt.Errorf("Failed to read device %s: %s", attr, err)
 			}
 			continue
 
diff --git a/source/iommu/iommu.go b/source/iommu/iommu.go
index ae9f78b7e..8221c6b03 100644
--- a/source/iommu/iommu.go
+++ b/source/iommu/iommu.go
@@ -43,7 +43,7 @@ func (s Source) Discover() (source.Features, error) {
 	// Check if any iommu devices are available
 	devices, err := ioutil.ReadDir(source.SysfsDir.Path("class/iommu/"))
 	if err != nil {
-		return nil, fmt.Errorf("failed to check for IOMMU support: %v", err)
+		return nil, fmt.Errorf("Failed to check for IOMMU support: %v", err)
 	}
 
 	if len(devices) > 0 {
diff --git a/source/kernel/kernel.go b/source/kernel/kernel.go
index 16f1f73cb..394d84a4a 100644
--- a/source/kernel/kernel.go
+++ b/source/kernel/kernel.go
@@ -74,7 +74,7 @@ func (s *Source) Discover() (source.Features, error) {
 	// Read kernel version
 	version, err := parseVersion()
 	if err != nil {
-		klog.Errorf("failed to get kernel version: %s", err)
+		klog.Errorf("Failed to get kernel version: %s", err)
 	} else {
 		for key := range version {
 			features["version."+key] = version[key]
@@ -84,7 +84,7 @@ func (s *Source) Discover() (source.Features, error) {
 	// Read kconfig
 	kconfig, err := kernelutils.ParseKconfig(s.config.KconfigFile)
 	if err != nil {
-		klog.Errorf("failed to read kconfig: %s", err)
+		klog.Errorf("Failed to read kconfig: %s", err)
 	}
 
 	// Check flags
diff --git a/source/kernel/selinux.go b/source/kernel/selinux.go
index c5f32adc9..9a67d3b45 100644
--- a/source/kernel/selinux.go
+++ b/source/kernel/selinux.go
@@ -27,7 +27,7 @@ import (
 func SelinuxEnabled() (bool, error) {
 	status, err := ioutil.ReadFile(source.SysfsDir.Path("fs/selinux/enforce"))
 	if err != nil {
-		return false, fmt.Errorf("failed to detect the status of selinux, please check if the system supports selinux and make sure /sys on the host is mounted into the container: %s", err.Error())
+		return false, fmt.Errorf("Failed to detect the status of selinux, please check if the system supports selinux and make sure /sys on the host is mounted into the container: %s", err.Error())
 	}
 	if status[0] == byte('1') {
 		// selinux is enabled.
diff --git a/source/local/local.go b/source/local/local.go
index 3d1dee1fb..7241c9ad8 100644
--- a/source/local/local.go
+++ b/source/local/local.go
@@ -114,7 +114,7 @@ func getFeaturesFromHooks() (source.Features, error) {
 			klog.Infof("hook directory %v does not exist", hookDir)
 			return features, nil
 		}
-		return features, fmt.Errorf("unable to access %v: %v", hookDir, err)
+		return features, fmt.Errorf("Unable to access %v: %v", hookDir, err)
 	}
 
 	for _, file := range files {
@@ -189,7 +189,7 @@ func getFeaturesFromFiles() (source.Features, error) {
 			klog.Infof("features directory %v does not exist", featureFilesDir)
 			return features, nil
 		}
-		return features, fmt.Errorf("unable to access %v: %v", featureFilesDir, err)
+		return features, fmt.Errorf("Unable to access %v: %v", featureFilesDir, err)
 	}
 
 	for _, file := range files {
diff --git a/source/network/network.go b/source/network/network.go
index 25cd1a009..7baba5eea 100644
--- a/source/network/network.go
+++ b/source/network/network.go
@@ -80,7 +80,7 @@ func (s Source) Discover() (source.Features, error) {
 			total := bytes.TrimSpace(totalBytes)
 			t, err := strconv.Atoi(string(total))
 			if err != nil {
-				klog.Errorf("error in obtaining maximum supported number of virtual functions for network interface: %s: %v", name, err)
+				klog.Errorf("Error in obtaining maximum supported number of virtual functions for network interface: %s: %v", name, err)
 				continue
 			}
 			if t > 0 {
@@ -95,7 +95,7 @@ func (s Source) Discover() (source.Features, error) {
 				num := bytes.TrimSpace(numBytes)
 				n, err := strconv.Atoi(string(num))
 				if err != nil {
-					klog.Errorf("error in obtaining the configured number of virtual functions for network interface: %s: %v", name, err)
+					klog.Errorf("Error in obtaining the configured number of virtual functions for network interface: %s: %v", name, err)
 					continue
 				}
 				if n > 0 {
diff --git a/source/panic_fake/fake_panic.go b/source/panic_fake/fake_panic.go
new file mode 100644
index 000000000..741dd71b7
--- /dev/null
+++ b/source/panic_fake/fake_panic.go
@@ -0,0 +1,39 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+Licensed 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 panicfake
+
+import "sigs.k8s.io/node-feature-discovery/source"
+
+// Source implements FeatureSource.
+type Source struct{}
+
+// Name returns an identifier string for this feature source.
+func (s Source) Name() string { return "panic_fake" }
+
+// NewConfig method of the FeatureSource interface
+func (s *Source) NewConfig() source.Config { return nil }
+
+// GetConfig method of the FeatureSource interface
+func (s *Source) GetConfig() source.Config { return nil }
+
+// SetConfig method of the FeatureSource interface
+func (s *Source) SetConfig(source.Config) {}
+
+// Discover calls panic().
+func (s Source) Discover() (source.Features, error) {
+	panic("fake panic error")
+}
diff --git a/source/pci/pci.go b/source/pci/pci.go
index 12a5ea6d9..56b290f13 100644
--- a/source/pci/pci.go
+++ b/source/pci/pci.go
@@ -104,7 +104,7 @@ func (s Source) Discover() (source.Features, error) {
 
 	devs, err := pciutils.DetectPci(deviceAttrs)
 	if err != nil {
-		return nil, fmt.Errorf("failed to detect PCI devices: %s", err.Error())
+		return nil, fmt.Errorf("Failed to detect PCI devices: %s", err.Error())
 	}
 
 	// Iterate over all device classes
diff --git a/source/source.go b/source/source.go
index edd51449f..0daaffba5 100644
--- a/source/source.go
+++ b/source/source.go
@@ -17,7 +17,18 @@ limitations under the License.
 package source
 
 // Value of a feature
-type FeatureValue interface{}
+type FeatureValue interface {
+}
+
+// Boolean feature value
+type BoolFeatureValue bool
+
+func (b BoolFeatureValue) String() string {
+	if b {
+		return "true"
+	}
+	return "false"
+}
 
 type Features map[string]FeatureValue
 
diff --git a/source/usb/usb.go b/source/usb/usb.go
index bf082ef0b..2cafcffd0 100644
--- a/source/usb/usb.go
+++ b/source/usb/usb.go
@@ -103,7 +103,7 @@ func (s Source) Discover() (source.Features, error) {
 
 	devs, err := usbutils.DetectUsb(deviceAttrs)
 	if err != nil {
-		return nil, fmt.Errorf("failed to detect USB devices: %s", err.Error())
+		return nil, fmt.Errorf("Failed to detect USB devices: %s", err.Error())
 	}
 
 	// Iterate over all device classes


Test patch:
diff --git a/pkg/nfd-worker/nfd-worker-internal_test.go b/pkg/nfd-worker/nfd-worker-internal_test.go
index 2d2b13a6b..8b2943ad5 100644
--- a/pkg/nfd-worker/nfd-worker-internal_test.go
+++ b/pkg/nfd-worker/nfd-worker-internal_test.go
@@ -17,6 +17,7 @@ limitations under the License.
 package nfdworker
 
 import (
+	"fmt"
 	"io/ioutil"
 	"os"
 	"path/filepath"
@@ -35,6 +36,7 @@ import (
 	"sigs.k8s.io/node-feature-discovery/source/cpu"
 	"sigs.k8s.io/node-feature-discovery/source/fake"
 	"sigs.k8s.io/node-feature-discovery/source/kernel"
+	"sigs.k8s.io/node-feature-discovery/source/panic_fake"
 	"sigs.k8s.io/node-feature-discovery/source/pci"
 )
 
@@ -356,12 +358,12 @@ func TestNewNfdWorker(t *testing.T) {
 
 func TestCreateFeatureLabels(t *testing.T) {
 	Convey("When creating feature labels from the configured sources", t, func() {
-		fakeFeatureSource := source.FeatureSource(new(fake.Source))
-		fakeFeatureSource.SetConfig(fakeFeatureSource.NewConfig())
-		sources := []source.FeatureSource{fakeFeatureSource}
-
 		Convey("When fake feature source is configured", func() {
 			emptyLabelWL := regexp.MustCompile("")
+			fakeFeatureSource := source.FeatureSource(new(fake.Source))
+			fakeFeatureSource.SetConfig(fakeFeatureSource.NewConfig())
+			sources := []source.FeatureSource{}
+			sources = append(sources, fakeFeatureSource)
 			labels := createFeatureLabels(sources, *emptyLabelWL)
 
 			Convey("Proper fake labels are returned", func() {
@@ -372,6 +374,9 @@ func TestCreateFeatureLabels(t *testing.T) {
 			})
 		})
 		Convey("When fake feature source is configured with a whitelist that doesn't match", func() {
+			fakeFeatureSource := source.FeatureSource(new(fake.Source))
+			sources := []source.FeatureSource{}
+			sources = append(sources, fakeFeatureSource)
 			labels := createFeatureLabels(sources, *regexp.MustCompile(".*rdt.*"))
 
 			Convey("fake labels are not returned", func() {
@@ -384,6 +389,21 @@ func TestCreateFeatureLabels(t *testing.T) {
 	})
 }
 
+func TestGetFeatureLabels(t *testing.T) {
+	Convey("When I get feature labels and panic occurs during discovery of a feature source", t, func() {
+		fakePanicFeatureSource := source.FeatureSource(new(panicfake.Source))
+
+		returnedLabels, err := getFeatureLabels(fakePanicFeatureSource, *regexp.MustCompile(""))
+		Convey("No label is returned", func() {
+			So(len(returnedLabels), ShouldEqual, 0)
+		})
+		Convey("Error is produced and panic error is returned", func() {
+			So(err, ShouldResemble, fmt.Errorf("fake panic error"))
+		})
+
+	})
+}
+
 func TestAdvertiseFeatureLabels(t *testing.T) {
 	Convey("When advertising labels", t, func() {
 		mockClient := &labeler.MockLabelerClient{}