Skip to content

Commit 1453703

Browse files
authored
Merge pull request #36 from replicatedhq/preflight-example
Some more error wrapping
2 parents f7109f3 + e6416d7 commit 1453703

File tree

7 files changed

+74
-45
lines changed

7 files changed

+74
-45
lines changed

cmd/preflight/cli/interactive_results.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
ui "github.com/gizak/termui/v3"
1212
"github.com/gizak/termui/v3/widgets"
13+
"github.com/pkg/errors"
1314
analyzerunner "github.com/replicatedhq/troubleshoot/pkg/analyze"
1415
)
1516

@@ -20,7 +21,7 @@ var (
2021

2122
func showInteractiveResults(preflightName string, analyzeResults []*analyzerunner.AnalyzeResult) error {
2223
if err := ui.Init(); err != nil {
23-
return err
24+
return errors.Wrap(err, "failed to create terminal ui")
2425
}
2526
defer ui.Close()
2627

@@ -244,7 +245,7 @@ func save(preflightName string, analyzeResults []*analyzerunner.AnalyzeResult) (
244245
}
245246

246247
if err := ioutil.WriteFile(filename, []byte(results), 0644); err != nil {
247-
return "", err
248+
return "", errors.Wrap(err, "failed to save preflight results")
248249
}
249250

250251
return filename, nil

cmd/preflight/cli/run_nocrd.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"strings"
1515
"time"
1616

17+
"github.com/pkg/errors"
1718
analyzerunner "github.com/replicatedhq/troubleshoot/pkg/analyze"
1819
troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1"
1920
collectrunner "github.com/replicatedhq/troubleshoot/pkg/collect"
@@ -22,10 +23,12 @@ import (
2223
"github.com/tj/go-spin"
2324
"gopkg.in/yaml.v2"
2425
corev1 "k8s.io/api/core/v1"
26+
kuberneteserrors "k8s.io/apimachinery/pkg/api/errors"
2527
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2628
"k8s.io/apimachinery/pkg/fields"
2729
"k8s.io/apimachinery/pkg/runtime"
2830
"k8s.io/apimachinery/pkg/runtime/schema"
31+
types "k8s.io/apimachinery/pkg/types"
2932
"k8s.io/client-go/kubernetes"
3033
"k8s.io/client-go/tools/cache"
3134
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -76,6 +79,7 @@ func runPreflightsNoCRD(v *viper.Viper, arg string) error {
7679
for {
7780
select {
7881
case <-finishedCh:
82+
fmt.Printf("\r")
7983
return
8084
case <-time.After(time.Millisecond * 100):
8185
fmt.Printf("\r \033[36mRunning Preflight checks\033[m %s ", s.Next())
@@ -162,10 +166,20 @@ func runCollectors(v *viper.Viper, preflight troubleshootv1beta1.Preflight) (map
162166
}
163167

164168
// deploy an object that "owns" everything to aid in cleanup
169+
configMapNamespacedName := types.NamespacedName{
170+
Name: fmt.Sprintf("preflight-%s-owner", preflight.Name),
171+
Namespace: v.GetString("namespace"),
172+
}
173+
174+
foundConfigMap := &corev1.ConfigMap{}
175+
err = client.Get(context.Background(), configMapNamespacedName, foundConfigMap)
176+
if err == nil || !kuberneteserrors.IsNotFound(err) {
177+
return nil, errors.Wrap(err, "failed to get existing config map")
178+
}
165179
owner := corev1.ConfigMap{
166180
ObjectMeta: metav1.ObjectMeta{
167-
Name: fmt.Sprintf("preflight-%s-owner", preflight.Name),
168-
Namespace: v.GetString("namespace"),
181+
Name: configMapNamespacedName.Name,
182+
Namespace: configMapNamespacedName.Namespace,
169183
},
170184
TypeMeta: metav1.TypeMeta{
171185
APIVersion: "v1",
@@ -174,7 +188,7 @@ func runCollectors(v *viper.Viper, preflight troubleshootv1beta1.Preflight) (map
174188
Data: make(map[string]string),
175189
}
176190
if err := client.Create(context.Background(), &owner); err != nil {
177-
return nil, err
191+
return nil, errors.Wrap(err, "failed to create config map")
178192
}
179193
defer func() {
180194
if err := client.Delete(context.Background(), &owner); err != nil {
@@ -272,7 +286,7 @@ func runCollectors(v *viper.Viper, preflight troubleshootv1beta1.Preflight) (map
272286
for _, collector := range desiredCollectors {
273287
_, pod, err := collectrunner.CreateCollector(client, s, &owner, preflight.Name, v.GetString("namespace"), serviceAccountName, "preflight", collector, v.GetString("image"), v.GetString("pullpolicy"))
274288
if err != nil {
275-
return nil, err
289+
return nil, errors.Wrap(err, "failed to create collector")
276290
}
277291
podsCreated = append(podsCreated, pod)
278292
}

cmd/preflight/cli/serviceaccount.go

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package cli
33
import (
44
"fmt"
55

6+
"github.com/pkg/errors"
67
troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1"
78
corev1 "k8s.io/api/core/v1"
89
rbacv1 "k8s.io/api/rbac/v1"
10+
kuberneteserrors "k8s.io/apimachinery/pkg/api/errors"
911
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1012
"k8s.io/client-go/kubernetes"
1113
)
@@ -31,9 +33,16 @@ func createServiceAccount(preflight troubleshootv1beta1.Preflight, namespace str
3133
},
3234
},
3335
}
34-
_, err := clientset.CoreV1().ServiceAccounts(namespace).Create(&serviceAccount)
35-
if err != nil {
36-
return "", err
36+
37+
_, err := clientset.CoreV1().ServiceAccounts(namespace).Get(serviceAccount.Name, metav1.GetOptions{})
38+
if err != nil && !kuberneteserrors.IsNotFound(err) {
39+
return "", errors.Wrap(err, "failed to get existing service account")
40+
}
41+
if kuberneteserrors.IsNotFound(err) {
42+
_, err := clientset.CoreV1().ServiceAccounts(namespace).Create(&serviceAccount)
43+
if err != nil {
44+
return "", errors.Wrap(err, "failed to create service account")
45+
}
3746
}
3847

3948
role := rbacv1.ClusterRole{
@@ -78,9 +87,15 @@ func createServiceAccount(preflight troubleshootv1beta1.Preflight, namespace str
7887
},
7988
},
8089
}
81-
_, err = clientset.RbacV1().ClusterRoles().Create(&role)
82-
if err != nil {
83-
return "", err
90+
_, err = clientset.RbacV1().ClusterRoles().Get(role.Name, metav1.GetOptions{})
91+
if err != nil && !kuberneteserrors.IsNotFound(err) {
92+
return "", errors.Wrap(err, "failed to get eisting cluster role")
93+
}
94+
if kuberneteserrors.IsNotFound(err) {
95+
_, err = clientset.RbacV1().ClusterRoles().Create(&role)
96+
if err != nil {
97+
return "", errors.Wrap(err, "failed to create cluster role")
98+
}
8499
}
85100

86101
roleBinding := rbacv1.ClusterRoleBinding{
@@ -105,25 +120,31 @@ func createServiceAccount(preflight troubleshootv1beta1.Preflight, namespace str
105120
Name: name,
106121
},
107122
}
108-
_, err = clientset.RbacV1().ClusterRoleBindings().Create(&roleBinding)
109-
if err != nil {
110-
return "", err
123+
_, err = clientset.RbacV1().ClusterRoleBindings().Get(roleBinding.Name, metav1.GetOptions{})
124+
if err != nil && !kuberneteserrors.IsNotFound(err) {
125+
return "", errors.Wrap(err, "failed to get existing cluster role binding")
126+
}
127+
if kuberneteserrors.IsNotFound(err) {
128+
_, err = clientset.RbacV1().ClusterRoleBindings().Create(&roleBinding)
129+
if err != nil {
130+
return "", errors.Wrap(err, "failed to create cluster role binding")
131+
}
111132
}
112133

113134
return name, nil
114135
}
115136

116137
func removeServiceAccount(name string, namespace string, clientset *kubernetes.Clientset) error {
117138
if err := clientset.RbacV1().ClusterRoleBindings().Delete(name, &metav1.DeleteOptions{}); err != nil {
118-
return err
139+
return errors.Wrap(err, "failed to delete cluster role binding")
119140
}
120141

121142
if err := clientset.RbacV1().ClusterRoles().Delete(name, &metav1.DeleteOptions{}); err != nil {
122-
return err
143+
return errors.Wrap(err, "failed to delete cluster role")
123144
}
124145

125146
if err := clientset.CoreV1().ServiceAccounts(namespace).Delete(name, &metav1.DeleteOptions{}); err != nil {
126-
return err
147+
return errors.Wrap(err, "failed to delete service account")
127148
}
128149

129150
return nil
Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,35 @@
11
apiVersion: troubleshoot.replicated.com/v1beta1
22
kind: Preflight
33
metadata:
4-
name: check-kubernetes-version
4+
name: example-preflight-checks
55
spec:
66
analyzers:
77
- clusterVersion:
88
outcomes:
99
- fail:
10-
when: "< 1.14.0"
11-
message: The application requires at Kubernetes 1.14.0 or later, and recommends 1.15.0.
10+
when: "< 1.13.0"
11+
message: The application requires at Kubernetes 1.13.0 or later, and recommends 1.15.0.
1212
uri: https://www.kubernetes.io
1313
- warn:
1414
when: "< 1.15.0"
1515
message: Your cluster meets the minimum version of Kubernetes, but we recommend you update to 1.15.0 or later.
1616
uri: https://kubernetes.io
1717
- pass:
1818
message: Your cluster meets the recommended and required versions of Kubernetes.
19-
- customResourceDefinitionName:
20-
customResourceDefinitionName: rook
19+
- customResourceDefinition:
20+
customResourceDefinitionName: constrainttemplates.templates.gatekeeper.sh
21+
checkName: Gatekeeper policy runtime is installed
2122
outcomes:
2223
- fail:
23-
message: Rook is required for the application. Rook was not found in the cluster.
24+
message: Gatekeeper is required for the application, but not found in the cluster.
2425
- pass:
25-
message: Found a supported version of Rook installed and running in the cluster.
26+
message: Found a supported version of Gatekeeper installed and running in the cluster.
2627
- imagePullSecret:
27-
checkName: Registry credneitlas for Quay.io
28+
checkName: Registry credentials for Quay.io
2829
registryName: quay.io
2930
outcomes:
3031
- fail:
31-
message: Cannot pull from quay.io
32+
message: |
33+
Cannot pull from quay.io. An image pull secret should be deployed to the cluster that has credentials to pull the images. To obtain this secret, please contact your support rep.
3234
- pass:
3335
message: Found credentials to pull from quay.io
34-
- storageClass:
35-
checkName: Required storage classes
36-
storageClassName: "expected-storage-class-name"
37-
outcomes:
38-
- fail:
39-
message: The required storage class was not found in the cluster.
40-
- pass:
41-
message: The required storage class was found in the cluster.

pkg/analyze/analyzer.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package analyzer
22

33
import (
4-
"errors"
5-
4+
"github.com/pkg/errors"
65
troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1"
76
)
87

pkg/analyze/cluster_version.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,28 @@ package analyzer
22

33
import (
44
"encoding/json"
5-
"errors"
65
"strings"
76

87
"github.com/blang/semver"
8+
"github.com/pkg/errors"
99
troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1"
1010
"github.com/replicatedhq/troubleshoot/pkg/collect"
1111
)
1212

1313
func analyzeClusterVersion(analyzer *troubleshootv1beta1.ClusterVersion, getCollectedFileContents func(string) ([]byte, error)) (*AnalyzeResult, error) {
14-
// TODO: ++++++++
1514
clusterInfo, err := getCollectedFileContents("cluster-info/cluster_version.json")
1615
if err != nil {
17-
return nil, err
16+
return nil, errors.Wrap(err, "failed top get contents of cluster_version.json")
1817
}
1918

2019
collectorClusterVersion := collect.ClusterVersion{}
2120
if err := json.Unmarshal(clusterInfo, &collectorClusterVersion); err != nil {
22-
return nil, err
21+
return nil, errors.Wrap(err, "failed to parse cluster_version.json")
2322
}
2423

2524
k8sVersion, err := semver.Make(strings.TrimLeft(collectorClusterVersion.String, "v"))
2625
if err != nil {
27-
return nil, err
26+
return nil, errors.Wrap(err, "failed to parse semver from cluster_version.json")
2827
}
2928

3029
result := AnalyzeResult{}
@@ -63,7 +62,7 @@ func analyzeClusterVersion(analyzer *troubleshootv1beta1.ClusterVersion, getColl
6362

6463
whenRange, err := semver.ParseRange(when)
6564
if err != nil {
66-
return nil, err
65+
return nil, errors.Wrap(err, "failed to parse semver range")
6766
}
6867

6968
if whenRange(k8sVersion) {

pkg/analyze/image_pull_secret.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ package analyzer
33
import (
44
"encoding/json"
55

6+
"github.com/pkg/errors"
67
troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1"
78
)
89

910
func analyzeImagePullSecret(analyzer *troubleshootv1beta1.ImagePullSecret, getChildCollectedFileContents func(string) (map[string][]byte, error)) (*AnalyzeResult, error) {
1011
imagePullSecrets, err := getChildCollectedFileContents("cluster-resources/image-pull-secrets")
1112
if err != nil {
12-
return nil, err
13+
return nil, errors.Wrap(err, "failed to get file contents for image pull secrets")
1314
}
1415

1516
var failOutcome *troubleshootv1beta1.Outcome
@@ -32,7 +33,7 @@ func analyzeImagePullSecret(analyzer *troubleshootv1beta1.ImagePullSecret, getCh
3233
for _, v := range imagePullSecrets {
3334
registryAndUsername := make(map[string]string)
3435
if err := json.Unmarshal(v, &registryAndUsername); err != nil {
35-
return nil, err
36+
return nil, errors.Wrap(err, "failed to parse registry secret")
3637
}
3738

3839
for registry, _ := range registryAndUsername {

0 commit comments

Comments
 (0)