Skip to content
This repository was archived by the owner on Nov 14, 2024. It is now read-only.

Commit abfc91e

Browse files
committed
add flags to control kubernetes settings
1 parent 6da92ff commit abfc91e

File tree

9 files changed

+161
-12
lines changed

9 files changed

+161
-12
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
cdr.dev/slog v1.4.1
77
github.com/Masterminds/semver/v3 v3.1.1
88
github.com/spf13/cobra v1.2.1
9+
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
910
k8s.io/apimachinery v0.19.13
1011
k8s.io/client-go v0.19.13
1112
k8s.io/klog/v2 v2.10.0 // indirect

internal/api/types.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,22 @@ type Checker interface {
2222
type CheckState int
2323

2424
const (
25+
// StatePassed indicates that the check passed successfully.
2526
StatePassed CheckState = iota
27+
28+
// StateWarning indicates a condition where Coder will gracefully degrade,
29+
// but the user will not have an optimal experience.
2630
StateWarning
31+
32+
// StateFailed indicates a condition where Coder will not be able to install
33+
// successfully.
2734
StateFailed
35+
36+
// StateInfo indicates a result for informational or diagnostic purposes
37+
// only, with no bearing on the ability to install Coder.
2838
StateInfo
39+
40+
// StateSkipped indicates an indeterminate result due to a skipped check.
2941
StateSkipped
3042
)
3143

internal/api/util.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,31 @@ func ErrorResult(name string, summary string, err error) *CheckResult {
1616
}
1717
}
1818

19-
func WriteResults(out io.Writer, results CheckResults) {
19+
func WriteResults(out io.Writer, results CheckResults) error {
20+
var err error
2021
for _, result := range results {
2122
switch result.State {
2223
case StatePassed:
23-
io.WriteString(out, "PASS ")
24+
_, err = io.WriteString(out, "PASS ")
2425
case StateWarning:
25-
io.WriteString(out, "WARN ")
26+
_, err = io.WriteString(out, "WARN ")
2627
case StateFailed:
27-
io.WriteString(out, "FAIL ")
28+
_, err = io.WriteString(out, "FAIL ")
2829
case StateInfo:
29-
io.WriteString(out, "INFO ")
30+
_, err = io.WriteString(out, "INFO ")
3031
case StateSkipped:
31-
io.WriteString(out, "SKIP ")
32+
_, err = io.WriteString(out, "SKIP ")
3233
}
3334

34-
fmt.Fprintln(out, result.Summary)
35+
if err != nil {
36+
return err
37+
}
38+
39+
_, err = fmt.Fprintln(out, result.Summary)
40+
if err != nil {
41+
return err
42+
}
3543
}
44+
45+
return nil
3646
}

internal/checks/kube/kubernetes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func NewKubernetesChecker(opts ...KubernetesCheckOption) *KubernetesChecker {
3434
return checker
3535
}
3636

37-
func (k *KubernetesChecker) Validate() error {
37+
func (*KubernetesChecker) Validate() error {
3838
return nil
3939
}
4040

internal/checks/kube/version.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ func findNearestVersion(coderVersion *semver.Version) *CoderVersionRequirement {
3434
var selectedVersion *CoderVersionRequirement
3535

3636
for _, v := range versionRequirements {
37+
v := v
3738
if !v.CoderVersion.GreaterThan(coderVersion) {
3839
selectedVersion = &v
3940
break

internal/cmd/check/check.go

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

33
import (
4-
"github.com/cdr/coder-doctor/internal/cmd/check/kube"
4+
"github.com/cdr/coder-doctor/internal/cmd/check/kubernetes"
55
"github.com/spf13/cobra"
66
)
77

@@ -16,7 +16,7 @@ func NewCommand() *cobra.Command {
1616
checkCmd.PersistentFlags().String("coder-version", "1.21", "version of Coder")
1717

1818
checkCmd.AddCommand(
19-
kube.NewCommand(),
19+
kubernetes.NewCommand(),
2020
)
2121

2222
return checkCmd
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package kubernetes
2+
3+
import (
4+
"github.com/Masterminds/semver/v3"
5+
"github.com/spf13/cobra"
6+
"golang.org/x/xerrors"
7+
8+
"cdr.dev/slog"
9+
"cdr.dev/slog/sloggers/sloghuman"
10+
11+
kclient "k8s.io/client-go/kubernetes"
12+
// Kubernetes authentication plugins
13+
_ "k8s.io/client-go/plugin/pkg/client/auth/azure"
14+
_ "k8s.io/client-go/plugin/pkg/client/auth/exec"
15+
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
16+
_ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
17+
_ "k8s.io/client-go/plugin/pkg/client/auth/openstack"
18+
"k8s.io/client-go/tools/clientcmd"
19+
20+
"github.com/cdr/coder-doctor/internal/api"
21+
"github.com/cdr/coder-doctor/internal/checks/kube"
22+
)
23+
24+
func NewCommand() *cobra.Command {
25+
kubernetesCmd := &cobra.Command{
26+
Use: "kubernetes",
27+
Short: "scan the Kubernetes cluster for compatibility",
28+
RunE: run,
29+
}
30+
31+
kubernetesCmd.PersistentFlags().String(clientcmd.FlagClusterName, "", "the name of the Kubernetes cluster to use")
32+
kubernetesCmd.PersistentFlags().String(clientcmd.FlagContext, "", "the name of the Kubernetes context to use")
33+
kubernetesCmd.PersistentFlags().String(clientcmd.RecommendedConfigPathFlag, "", "path to the Kubernetes configuration file")
34+
kubernetesCmd.PersistentFlags().StringP(clientcmd.FlagNamespace, "n", "", "the name of the Kubernetes namespace to deploy into")
35+
36+
return kubernetesCmd
37+
}
38+
39+
func getConfigOverridesFromFlags(cmd *cobra.Command) (*clientcmd.ConfigOverrides, error) {
40+
var err error
41+
42+
overrides := &clientcmd.ConfigOverrides{}
43+
44+
overrides.CurrentContext, err = cmd.Flags().GetString(clientcmd.FlagContext)
45+
if err != nil {
46+
return nil, err
47+
}
48+
49+
overrides.Context.Namespace, err = cmd.Flags().GetString(clientcmd.FlagNamespace)
50+
if err != nil {
51+
return nil, err
52+
}
53+
54+
overrides.Context.Cluster, err = cmd.Flags().GetString(clientcmd.FlagClusterName)
55+
if err != nil {
56+
return nil, err
57+
}
58+
59+
return overrides, nil
60+
}
61+
62+
func run(cmd *cobra.Command, _ []string) error {
63+
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
64+
65+
var err error
66+
loadingRules.ExplicitPath, err = cmd.Flags().GetString(clientcmd.RecommendedConfigPathFlag)
67+
if err != nil {
68+
return err
69+
}
70+
71+
overrides, err := getConfigOverridesFromFlags(cmd)
72+
if err != nil {
73+
return err
74+
}
75+
76+
config, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, overrides).ClientConfig()
77+
if err != nil {
78+
return err
79+
}
80+
81+
clientset, err := kclient.NewForConfig(config)
82+
if err != nil {
83+
return err
84+
}
85+
86+
coderVersion, err := cmd.Flags().GetString("coder-version")
87+
if err != nil {
88+
return err
89+
}
90+
91+
cv, err := semver.NewVersion(coderVersion)
92+
if err != nil {
93+
return err
94+
}
95+
96+
log := slog.Make(sloghuman.Sink(cmd.OutOrStdout()))
97+
verbosity, err := cmd.Flags().GetInt("verbosity")
98+
if err != nil {
99+
return err
100+
}
101+
102+
if verbosity > 5 {
103+
log = log.Leveled(slog.LevelDebug)
104+
}
105+
106+
checker := kube.NewKubernetesChecker(
107+
kube.WithClient(clientset),
108+
kube.WithCoderVersion(cv),
109+
kube.WithLogger(log),
110+
)
111+
112+
results := checker.Run(cmd.Context())
113+
err = api.WriteResults(cmd.OutOrStdout(), results)
114+
if err != nil {
115+
return xerrors.Errorf("failed to write results to stdout: %w", err)
116+
}
117+
118+
return nil
119+
}

internal/cmd/version/version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ func NewCommand() *cobra.Command {
1111
}
1212
}
1313

14-
func run(cmd *cobra.Command, args []string) error {
14+
func run(cmd *cobra.Command, _ []string) error {
1515
cmd.Println("tool version: 1234")
1616
return nil
1717
}

main.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@ package main
22

33
import (
44
"context"
5+
"os"
56

67
"github.com/cdr/coder-doctor/internal/cmd"
78
)
89

910
func main() {
1011
command := cmd.NewDefaultDoctorCommand()
11-
command.ExecuteContext(context.Background())
12+
err := command.ExecuteContext(context.Background())
13+
if err != nil {
14+
os.Exit(1)
15+
}
16+
17+
os.Exit(0)
1218
}

0 commit comments

Comments
 (0)