Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
jenting committed Dec 18, 2024
1 parent 335e893 commit 634932b
Show file tree
Hide file tree
Showing 7 changed files with 195 additions and 316 deletions.
16 changes: 6 additions & 10 deletions cmd/server/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,7 @@ import (
)

type PluginParameters struct {
ClusterName *string `json:"clusterName,omitempty"`
ClusterEndpoint *string `json:"clusterEndpoint,omitempty"`
ClusterCA *string `json:"clusterCA,omitempty"`
LabelSelector metav1.LabelSelector `json:"labelSelector,omitempty"`
LabelSelector metav1.LabelSelector `json:"labelSelector,omitempty"`
}

type PluginInput struct {
Expand Down Expand Up @@ -83,9 +80,9 @@ func (c *ServerConfig) secretsHandler(ctx context.Context) func(http.ResponseWri

slog.Debug("Received input", "input", input.Input.Parameters, "address", r.RemoteAddr)

_, k8s, err := c.GetClient(input.Input.Parameters)
k8sClient, err := c.GetClient(input.Input.Parameters)
if err != nil {
slog.Error("Failed to get k8s client", "address", r.RemoteAddr, "clusterName", input.Input.Parameters.ClusterName, "clusterEndpoint", input.Input.Parameters.ClusterEndpoint, "error", err)
slog.Error("Failed to get k8s client", "address", r.RemoteAddr, "error", err)
w.WriteHeader(http.StatusInternalServerError)
_, _ = w.Write([]byte("Internal server error"))
return
Expand All @@ -102,14 +99,13 @@ func (c *ServerConfig) secretsHandler(ctx context.Context) func(http.ResponseWri

if input.Input.Parameters != nil &&
(input.Input.Parameters.LabelSelector.MatchLabels != nil || input.Input.Parameters.LabelSelector.MatchExpressions != nil) {

listOptions.LabelSelector = metav1.FormatLabelSelector(&input.Input.Parameters.LabelSelector)
slog.Debug("Using label selector", "labelSelector", listOptions.LabelSelector, "address", r.RemoteAddr)
}

namespaces, err := k8s.CoreV1().Namespaces().List(ctx, listOptions)
namespaces, err := k8sClient.CoreV1().Namespaces().List(ctx, listOptions)
if err != nil {
slog.Error("Failed to list namespaces", "address", r.RemoteAddr, "clusterName", input.Input.Parameters.ClusterName, "clusterEndpoint", input.Input.Parameters.ClusterEndpoint, "error", err)
slog.Error("Failed to list namespaces", "address", r.RemoteAddr, "error", err)
w.WriteHeader(http.StatusInternalServerError)
_, _ = w.Write([]byte("Internal server error"))
return
Expand All @@ -127,7 +123,7 @@ func (c *ServerConfig) secretsHandler(ctx context.Context) func(http.ResponseWri
})
}

slog.Debug("Returning response", "address", r.RemoteAddr, "clusterName", input.Input.Parameters.ClusterName, "clusterEndpoint", input.Input.Parameters.ClusterEndpoint, "output", output)
slog.Debug("Returning response", "address", r.RemoteAddr, "output", output)
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(output); err != nil {
slog.Error("Failed to encode response", "address", r.RemoteAddr, "error", err)
Expand Down
58 changes: 6 additions & 52 deletions cmd/server/k8s.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package server

import (
"encoding/base64"
"errors"
"log/slog"
"net/url"
"os"
"path/filepath"

Expand All @@ -13,9 +11,10 @@ import (
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
ctrl "sigs.k8s.io/controller-runtime"
)

func (c *ServerConfig) GetClient(req *PluginParameters) (*rest.Config, kubernetes.Interface, error) {
func (c *ServerConfig) GetClient(req *PluginParameters) (kubernetes.Interface, error) {
var config *rest.Config
var err error

Expand All @@ -31,61 +30,16 @@ func (c *ServerConfig) GetClient(req *PluginParameters) (*rest.Config, kubernete
}

if kubeconfigPath == "" {
return nil, nil, errors.New("Cannot find KUBECONFIG or default kubeconfig file")
return nil, errors.New("Cannot find KUBECONFIG or default kubeconfig file")
}

config, err = clientcmd.BuildConfigFromFlags("", kubeconfigPath)
if err != nil {
return nil, nil, err
return nil, err
}
} else {
var serviceAccountTokenPath string
if tokenPath, ok := c.ServiceAccountTokenPathsAsMap[*req.ClusterName]; ok {
slog.Debug("Found token path for cluster", "cluster", req.ClusterName, "token-path", tokenPath)
serviceAccountTokenPath = tokenPath
} else {
slog.Debug("Using default token path", "cluster", req.ClusterName, "token-path", c.ServiceAccountTokenPathsAsMap["*"])
serviceAccountTokenPath = c.ServiceAccountTokenPathsAsMap["*"]
}

url, err := url.Parse(*req.ClusterEndpoint)
if err != nil {
slog.Error("Failed to parse cluster endpoint", "cluster", req.ClusterName, "endpoint", req.ClusterEndpoint, "error", err)
return nil, nil, err
}
config = &rest.Config{
Host: *req.ClusterEndpoint,
BearerTokenFile: serviceAccountTokenPath,
}
tls := rest.TLSClientConfig{
ServerName: url.Hostname(),
}
if req.ClusterCA != nil && *req.ClusterCA != "" {
slog.Debug("Using cluster CA from the request", "cluster", req.ClusterName, "clusterEndpoint", req.ClusterEndpoint)
ca := *req.ClusterCA
caData, err := base64.StdEncoding.DecodeString(ca)
if err != nil {
slog.Error("Failed to decode cluster CA from the request", "error", err)
return nil, nil, err
}
tls.CAData = caData
} else {
slog.Debug("Using cluster CA from the config", "cluster", req.ClusterName, "clusterEndpoint", req.ClusterEndpoint)
ca := c.ServiceAccountTlsCa
caData, err := base64.StdEncoding.DecodeString(ca)
if err == nil {
tls.CAData = caData
} else {
tls.CAFile = c.ServiceAccountTlsCa
}
}
config.TLSClientConfig = tls
}

clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return config, nil, err
config = ctrl.GetConfigOrDie()
}

return config, clientset, nil
return kubernetes.NewForConfig(config)
}
121 changes: 47 additions & 74 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,106 +1,79 @@
module github.com/hsiaoairplane/argocd-applicationset-namespaces-generator-plugin

go 1.22.0
go 1.23.0

toolchain go1.23.2

require (
github.com/spf13/cobra v1.8.0
github.com/spf13/viper v1.18.2
k8s.io/apimachinery v0.26.11
k8s.io/client-go v0.0.0-00010101000000-000000000000
github.com/spf13/cobra v1.8.1
github.com/spf13/viper v1.19.0
k8s.io/apimachinery v0.32.0
k8s.io/client-go v0.32.0
sigs.k8s.io/controller-runtime v0.19.3
)

require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/emicklei/go-restful/v3 v3.9.0 // indirect
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
github.com/evanphx/json-patch/v5 v5.9.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-logr/logr v1.2.3 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.20.0 // indirect
github.com/go-openapi/swag v0.19.14 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.20.2 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/gnostic-models v0.6.8 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/imdario/mergo v0.3.6 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_golang v1.19.1 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.9.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/net v0.19.0 // indirect
golang.org/x/oauth2 v0.15.0 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/term v0.15.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.5.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.31.0 // indirect
golang.org/x/net v0.30.0 // indirect
golang.org/x/oauth2 v0.23.0 // indirect
golang.org/x/sys v0.26.0 // indirect
golang.org/x/term v0.25.0 // indirect
golang.org/x/text v0.19.0 // indirect
golang.org/x/time v0.7.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
google.golang.org/protobuf v1.35.1 // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/api v0.26.11 // indirect
k8s.io/klog/v2 v2.80.1 // indirect
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect
k8s.io/utils v0.0.0-20221107191617-1a15be271d1d // indirect
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)

// https://argo-cd.readthedocs.io/en/stable/user-guide/import/
// Match it to k8s.io/apimachinery from the above
// https://github.com/kubernetes/kubernetes/issues/79384#issuecomment-505627280
replace k8s.io/kubernetes => k8s.io/kubernetes v1.26.11

replace (
k8s.io/api => k8s.io/api v0.26.11
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.26.11
k8s.io/apimachinery => k8s.io/apimachinery v0.26.11
k8s.io/apiserver => k8s.io/apiserver v0.26.11
k8s.io/cli-runtime => k8s.io/cli-runtime v0.26.11
k8s.io/client-go => k8s.io/client-go v0.26.11
k8s.io/cloud-provider => k8s.io/cloud-provider v0.26.11
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.26.11
k8s.io/code-generator => k8s.io/code-generator v0.26.11
k8s.io/component-base => k8s.io/component-base v0.26.11
k8s.io/component-helpers => k8s.io/component-helpers v0.26.11
k8s.io/controller-manager => k8s.io/controller-manager v0.26.11
k8s.io/cri-api => k8s.io/cri-api v0.26.11
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.26.11
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.26.11
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.26.11
k8s.io/kube-proxy => k8s.io/kube-proxy v0.26.11
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.26.11
k8s.io/kubectl => k8s.io/kubectl v0.26.11
k8s.io/kubelet => k8s.io/kubelet v0.26.11
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.26.11
k8s.io/metrics => k8s.io/metrics v0.26.11
k8s.io/mount-utils => k8s.io/mount-utils v0.26.11
k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.26.11
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.26.11
)

// https://github.com/kubernetes/kubernetes/blob/v1.26.11/go.mod
replace (
k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280
sigs.k8s.io/kustomize/api => sigs.k8s.io/kustomize/api v0.12.1
sigs.k8s.io/kustomize/kyaml => sigs.k8s.io/kustomize/kyaml v0.13.9
k8s.io/api v0.32.0 // indirect
k8s.io/apiextensions-apiserver v0.31.0 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect
sigs.k8s.io/yaml v1.4.0 // indirect
)
Loading

0 comments on commit 634932b

Please sign in to comment.