Path: blob/main/dev/preview/previewctl/pkg/k8s/config.go
2501 views
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package k8s56import (7"context"8"strings"910"github.com/cockroachdb/errors"11"github.com/sirupsen/logrus"12authorizationv1 "k8s.io/api/authorization/v1"13metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"14"k8s.io/client-go/dynamic"15"k8s.io/client-go/kubernetes"16"k8s.io/client-go/rest"17"k8s.io/client-go/tools/clientcmd"18"k8s.io/client-go/tools/clientcmd/api"19)2021var (22ErrContextNotExists = errors.New("context doesn't exist")23)2425type Config struct {26CoreClient kubernetes.Interface27DynamicClient dynamic.Interface2829config *rest.Config30clientConfig *api.Config3132logger *logrus.Logger33}3435func NewWithConfig(logger *logrus.Logger, config *rest.Config) (*Config, error) {36coreClient := kubernetes.NewForConfigOrDie(config)37dynamicClient := dynamic.NewForConfigOrDie(config)3839return &Config{40CoreClient: coreClient,41DynamicClient: dynamicClient,42logger: logger,43config: config,44}, nil45}4647func NewFromDefaultConfigWithContext(logger *logrus.Logger, contextName string) (*Config, error) {48kconf, err := GetKubernetesConfigFromContext(contextName)49if err != nil {50return nil, errors.Wrapf(err, "couldn't get [%s] kube context", contextName)51}5253coreClient := kubernetes.NewForConfigOrDie(kconf)54dynamicClient := dynamic.NewForConfigOrDie(kconf)5556clientConfig, err := GetClientConfigFromContext(contextName)57if err != nil {58return nil, err59}6061return &Config{62CoreClient: coreClient,63DynamicClient: dynamicClient,64logger: logger,65config: kconf,66clientConfig: clientConfig,67}, nil68}6970func GetClientConfigFromContext(context string) (*api.Config, error) {71configLoadingRules := clientcmd.NewDefaultClientConfigLoadingRules()72configOverrides := &clientcmd.ConfigOverrides{CurrentContext: context}7374config, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(configLoadingRules, configOverrides).RawConfig()75if err != nil {76return nil, err77}7879if _, ok := config.Contexts[context]; !ok {80return nil, ErrContextNotExists81}8283return &config, err84}8586func GetKubernetesConfigFromContext(context string) (*rest.Config, error) {87configLoadingRules := clientcmd.NewDefaultClientConfigLoadingRules()88configOverrides := &clientcmd.ConfigOverrides{CurrentContext: context}8990kconf, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(configLoadingRules, configOverrides).ClientConfig()91if err != nil {92if strings.Contains(err.Error(), "does not exist") {93return nil, errors.Mark(err, ErrContextNotExists)94}95return nil, err96}9798return kconf, err99}100101func (c *Config) ClientConfig() *api.Config {102return c.clientConfig103}104105func (c *Config) HasAccess(ctx context.Context) bool {106sar := &authorizationv1.SelfSubjectAccessReview{107Spec: authorizationv1.SelfSubjectAccessReviewSpec{108ResourceAttributes: &authorizationv1.ResourceAttributes{109Namespace: "default",110Verb: "get",111Group: "secrets",112},113},114}115116_, err := c.CoreClient.AuthorizationV1().SelfSubjectAccessReviews().Create(ctx, sar, metav1.CreateOptions{})117if err != nil {118c.logger.Error(err)119return false120}121122return true123}124125126