@@ -3,26 +3,24 @@ package analyzer
33import (
44 "archive/tar"
55 "compress/gzip"
6- "context"
7- "fmt"
86 "io"
97 "io/ioutil"
10- "net/http"
118 "os"
129 "path/filepath"
1310
1411 getter "github.com/hashicorp/go-getter"
1512 "github.com/pkg/errors"
1613 troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1"
14+ troubleshootscheme "github.com/replicatedhq/troubleshoot/pkg/client/troubleshootclientset/scheme"
1715 "github.com/replicatedhq/troubleshoot/pkg/logger"
18- "gopkg.in/yaml.v2 "
16+ "k8s.io/client-go/kubernetes/scheme "
1917)
2018
2119type fileContentProvider struct {
2220 rootDir string
2321}
2422
25- func DownloadAndAnalyze (ctx context. Context , bundleURL string ) ([]* AnalyzeResult , error ) {
23+ func DownloadAndAnalyze (analyzersSpec string , bundleURL string ) ([]* AnalyzeResult , error ) {
2624 tmpDir , err := ioutil .TempDir ("" , "troubleshoot-k8s" )
2725 if err != nil {
2826 return nil , errors .Wrap (err , "failed to create temp dir" )
@@ -38,9 +36,20 @@ func DownloadAndAnalyze(ctx context.Context, bundleURL string) ([]*AnalyzeResult
3836 return nil , errors .Wrap (err , "failed to read version.yaml" )
3937 }
4038
41- analyzers , err := getTroubleshootAnalyzers ()
42- if err != nil {
43- return nil , errors .Wrap (err , "failed to get analyzers" )
39+ analyzers := []* troubleshootv1beta1.Analyze {}
40+
41+ if analyzersSpec == "" {
42+ defaultAnalyzers , err := getDefaultAnalyzers ()
43+ if err != nil {
44+ return nil , errors .Wrap (err , "failed to get default analyzers" )
45+ }
46+ analyzers = defaultAnalyzers
47+ } else {
48+ parsedAnalyzers , err := parseAnalyzers (analyzersSpec )
49+ if err != nil {
50+ return nil , errors .Wrap (err , "failed to parse analyzers" )
51+ }
52+ analyzers = parsedAnalyzers
4453 }
4554
4655 fcp := fileContentProvider {rootDir : tmpDir }
@@ -138,29 +147,41 @@ func extractTroubleshootBundle(reader io.Reader, destDir string) error {
138147 return nil
139148}
140149
141- func getTroubleshootAnalyzers () ([]* troubleshootv1beta1.Analyze , error ) {
142- specURL := `https://troubleshoot.replicated.com/`
143- resp , err := http .Get (specURL )
144- if err != nil {
145- return nil , err
146- }
147- defer resp .Body .Close ()
148-
149- if resp .StatusCode != http .StatusOK {
150- return nil , fmt .Errorf ("could not download analyzer spec, status code: %v" , resp .StatusCode )
151- }
150+ func parseAnalyzers (spec string ) ([]* troubleshootv1beta1.Analyze , error ) {
151+ troubleshootscheme .AddToScheme (scheme .Scheme )
152+ decode := scheme .Codecs .UniversalDeserializer ().Decode
152153
153- spec , err := ioutil . ReadAll ( resp . Body )
154+ obj , _ , err := decode ([] byte ( spec ), nil , nil )
154155 if err != nil {
155- return nil , err
156+ return nil , errors . Wrap ( err , "failed to decode analyzers" )
156157 }
157158
158- preflight := troubleshootv1beta1.Preflight {}
159- if err := yaml .Unmarshal ([]byte (spec ), & preflight ); err != nil {
160- return nil , err
161- }
159+ analyzer := obj .(* troubleshootv1beta1.Analyzer )
160+ return analyzer .Spec .Analyzers , nil
161+ }
162162
163- return preflight .Spec .Analyzers , nil
163+ func getDefaultAnalyzers () ([]* troubleshootv1beta1.Analyze , error ) {
164+ spec := `apiVersion: troubleshoot.replicated.com/v1beta1
165+ kind: Analyzer
166+ metadata:
167+ name: defaultAnalyzers
168+ spec:
169+ analyzers:
170+ - clusterVersion:
171+ outcomes:
172+ - fail:
173+ when: "< 1.13.0"
174+ message: The application requires at Kubernetes 1.13.0 or later, and recommends 1.15.0.
175+ uri: https://www.kubernetes.io
176+ - warn:
177+ when: "< 1.15.0"
178+ message: Your cluster meets the minimum version of Kubernetes, but we recommend you update to 1.15.0 or later.
179+ uri: https://kubernetes.io
180+ - pass:
181+ when: ">= 1.15.0"
182+ message: Your cluster meets the recommended and required versions of Kubernetes.`
183+
184+ return parseAnalyzers (spec )
164185}
165186
166187func (f fileContentProvider ) getFileContents (fileName string ) ([]byte , error ) {
0 commit comments