Skip to content

Commit 616f6e7

Browse files
authored
Merge pull request #273 from replicatedhq/divolgin/preflight
Allow preflight spec to be loaded from a secret
2 parents c023a81 + 6e86cdc commit 616f6e7

File tree

8 files changed

+86
-50
lines changed

8 files changed

+86
-50
lines changed

cmd/analyze/cli/root.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,10 @@ import (
44
"os"
55
"strings"
66

7+
"github.com/replicatedhq/troubleshoot/pkg/k8sutil"
78
"github.com/replicatedhq/troubleshoot/pkg/logger"
89
"github.com/spf13/cobra"
910
"github.com/spf13/viper"
10-
"k8s.io/cli-runtime/pkg/genericclioptions"
11-
)
12-
13-
var (
14-
KubernetesConfigFlags *genericclioptions.ConfigFlags
1511
)
1612

1713
func RootCmd() *cobra.Command {
@@ -41,8 +37,7 @@ func RootCmd() *cobra.Command {
4137

4238
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
4339

44-
KubernetesConfigFlags = genericclioptions.NewConfigFlags(false)
45-
KubernetesConfigFlags.AddFlags(cmd.Flags())
40+
k8sutil.AddFlags(cmd.Flags())
4641

4742
return cmd
4843
}

cmd/preflight/cli/root.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,9 @@ import (
44
"os"
55
"strings"
66

7+
"github.com/replicatedhq/troubleshoot/pkg/k8sutil"
78
"github.com/spf13/cobra"
89
"github.com/spf13/viper"
9-
"k8s.io/cli-runtime/pkg/genericclioptions"
10-
)
11-
12-
var (
13-
KubernetesConfigFlags *genericclioptions.ConfigFlags
1410
)
1511

1612
func RootCmd() *cobra.Command {
@@ -42,8 +38,7 @@ that a cluster meets the requirements to run an application.`,
4238

4339
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
4440

45-
KubernetesConfigFlags = genericclioptions.NewConfigFlags(false)
46-
KubernetesConfigFlags.AddFlags(cmd.Flags())
41+
k8sutil.AddFlags(cmd.Flags())
4742

4843
return cmd
4944
}

cmd/preflight/cli/run.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"io/ioutil"
66
"net/http"
77
"os"
8+
"strings"
89
"time"
910

1011
cursor "github.com/ahmetalpbalkan/go-cursor"
@@ -14,7 +15,9 @@ import (
1415
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
1516
troubleshootclientsetscheme "github.com/replicatedhq/troubleshoot/pkg/client/troubleshootclientset/scheme"
1617
"github.com/replicatedhq/troubleshoot/pkg/docrewrite"
18+
"github.com/replicatedhq/troubleshoot/pkg/k8sutil"
1719
"github.com/replicatedhq/troubleshoot/pkg/preflight"
20+
"github.com/replicatedhq/troubleshoot/pkg/specs"
1821
"github.com/spf13/viper"
1922
spin "github.com/tj/go-spin"
2023
"k8s.io/client-go/kubernetes/scheme"
@@ -26,7 +29,20 @@ func runPreflights(v *viper.Viper, arg string) error {
2629

2730
var preflightContent []byte
2831
var err error
29-
if _, err = os.Stat(arg); err == nil {
32+
if strings.HasPrefix(arg, "secret/") {
33+
// format secret/namespace-name/secret-name
34+
pathParts := strings.Split(arg, "/")
35+
if len(pathParts) != 3 {
36+
return errors.Errorf("path %s must have 3 components", arg)
37+
}
38+
39+
spec, err := specs.LoadFromSecret(pathParts[1], pathParts[2], "preflight-spec")
40+
if err != nil {
41+
return errors.Wrap(err, "failed to get spec from secret")
42+
}
43+
44+
preflightContent = spec
45+
} else if _, err = os.Stat(arg); err == nil {
3046
b, err := ioutil.ReadFile(arg)
3147
if err != nil {
3248
return err
@@ -101,7 +117,7 @@ func runPreflights(v *viper.Viper, arg string) error {
101117
close(finishedCh)
102118
}()
103119

104-
restConfig, err := KubernetesConfigFlags.ToRESTConfig()
120+
restConfig, err := k8sutil.GetRESTConfig()
105121
if err != nil {
106122
return errors.Wrap(err, "failed to convert kube flags to rest config")
107123
}

cmd/troubleshoot/cli/root.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,10 @@ import (
66
"strings"
77

88
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
9+
"github.com/replicatedhq/troubleshoot/pkg/k8sutil"
910
"github.com/replicatedhq/troubleshoot/pkg/logger"
1011
"github.com/spf13/cobra"
1112
"github.com/spf13/viper"
12-
"k8s.io/cli-runtime/pkg/genericclioptions"
13-
)
14-
15-
var (
16-
KubernetesConfigFlags *genericclioptions.ConfigFlags
1713
)
1814

1915
func RootCmd() *cobra.Command {
@@ -52,8 +48,7 @@ from a server that can be used to assist when troubleshooting a Kubernetes clust
5248

5349
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
5450

55-
KubernetesConfigFlags = genericclioptions.NewConfigFlags(false)
56-
KubernetesConfigFlags.AddFlags(cmd.Flags())
51+
k8sutil.AddFlags(cmd.Flags())
5752

5853
return cmd
5954
}

cmd/troubleshoot/cli/run.go

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@ import (
3131
"github.com/replicatedhq/troubleshoot/pkg/collect"
3232
"github.com/replicatedhq/troubleshoot/pkg/convert"
3333
"github.com/replicatedhq/troubleshoot/pkg/docrewrite"
34+
"github.com/replicatedhq/troubleshoot/pkg/k8sutil"
3435
"github.com/replicatedhq/troubleshoot/pkg/redact"
36+
"github.com/replicatedhq/troubleshoot/pkg/specs"
3537
"github.com/spf13/viper"
3638
spin "github.com/tj/go-spin"
3739
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
38-
"k8s.io/client-go/kubernetes"
3940
)
4041

4142
var (
@@ -255,7 +256,7 @@ func loadSpec(v *viper.Viper, arg string) ([]byte, error) {
255256
return nil, errors.Errorf("path %s must have 3 components", arg)
256257
}
257258

258-
spec, err := loadSpecFromSecret(pathParts[1], pathParts[2])
259+
spec, err := specs.LoadFromSecret(pathParts[1], pathParts[2], "support-bundle-spec")
259260
if err != nil {
260261
return nil, errors.Wrap(err, "failed to get spec from secret")
261262
}
@@ -281,30 +282,6 @@ func loadSpec(v *viper.Viper, arg string) ([]byte, error) {
281282
return spec, nil
282283
}
283284

284-
func loadSpecFromSecret(namespace string, secretName string) ([]byte, error) {
285-
config, err := KubernetesConfigFlags.ToRESTConfig()
286-
if err != nil {
287-
return nil, errors.Wrap(err, "failed to convert kube flags to rest config")
288-
}
289-
290-
client, err := kubernetes.NewForConfig(config)
291-
if err != nil {
292-
return nil, errors.Wrap(err, "failed to convert create k8s client")
293-
}
294-
295-
foundSecret, err := client.CoreV1().Secrets(namespace).Get(context.TODO(), secretName, metav1.GetOptions{})
296-
if err != nil {
297-
return nil, errors.Wrap(err, "failed to get secret")
298-
}
299-
300-
spec, ok := foundSecret.Data["support-bundle-spec"]
301-
if !ok {
302-
return nil, errors.Errorf("spec not found in secret %s", secretName)
303-
}
304-
305-
return spec, nil
306-
}
307-
308285
func loadSpecFromURL(v *viper.Viper, arg string) ([]byte, error) {
309286
for {
310287
req, err := http.NewRequest("GET", arg, nil)
@@ -407,7 +384,7 @@ func runCollectors(v *viper.Viper, collectors []*troubleshootv1beta2.Collect, ad
407384
collectSpecs = ensureCollectorInList(collectSpecs, troubleshootv1beta2.Collect{ClusterInfo: &troubleshootv1beta2.ClusterInfo{}})
408385
collectSpecs = ensureCollectorInList(collectSpecs, troubleshootv1beta2.Collect{ClusterResources: &troubleshootv1beta2.ClusterResources{}})
409386

410-
config, err := KubernetesConfigFlags.ToRESTConfig()
387+
config, err := k8sutil.GetRESTConfig()
411388
if err != nil {
412389
return "", errors.Wrap(err, "failed to convert kube flags to rest config")
413390
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ require (
3737
github.com/prometheus/procfs v0.0.5 // indirect
3838
github.com/replicatedhq/termui/v3 v3.1.1-0.20200811145416-f40076d26851
3939
github.com/spf13/cobra v0.0.5
40+
github.com/spf13/pflag v1.0.5
4041
github.com/spf13/viper v1.4.0
4142
github.com/stretchr/testify v1.5.1
4243
github.com/tj/go-spin v1.1.0

pkg/k8sutil/config.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package k8sutil
2+
3+
import (
4+
flag "github.com/spf13/pflag"
5+
"k8s.io/cli-runtime/pkg/genericclioptions"
6+
"k8s.io/client-go/rest"
7+
)
8+
9+
var (
10+
kubernetesConfigFlags *genericclioptions.ConfigFlags
11+
)
12+
13+
func init() {
14+
kubernetesConfigFlags = genericclioptions.NewConfigFlags(false)
15+
}
16+
17+
func AddFlags(flags *flag.FlagSet) {
18+
kubernetesConfigFlags.AddFlags(flags)
19+
}
20+
21+
func GetRESTConfig() (*rest.Config, error) {
22+
return kubernetesConfigFlags.ToRESTConfig()
23+
}

pkg/specs/secrets.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package specs
2+
3+
import (
4+
"context"
5+
6+
"github.com/pkg/errors"
7+
"github.com/replicatedhq/troubleshoot/pkg/k8sutil"
8+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
"k8s.io/client-go/kubernetes"
10+
)
11+
12+
func LoadFromSecret(namespace string, secretName string, key string) ([]byte, error) {
13+
config, err := k8sutil.GetRESTConfig()
14+
if err != nil {
15+
return nil, errors.Wrap(err, "failed to convert kube flags to rest config")
16+
}
17+
18+
client, err := kubernetes.NewForConfig(config)
19+
if err != nil {
20+
return nil, errors.Wrap(err, "failed to convert create k8s client")
21+
}
22+
23+
foundSecret, err := client.CoreV1().Secrets(namespace).Get(context.TODO(), secretName, metav1.GetOptions{})
24+
if err != nil {
25+
return nil, errors.Wrap(err, "failed to get secret")
26+
}
27+
28+
spec, ok := foundSecret.Data[key]
29+
if !ok {
30+
return nil, errors.Errorf("spec not found in secret %s", secretName)
31+
}
32+
33+
return spec, nil
34+
}

0 commit comments

Comments
 (0)