mirror of
https://github.com/gitpod-io/gitpod.git
synced 2025-12-08 17:36:30 +00:00
95 lines
2.7 KiB
Go
95 lines
2.7 KiB
Go
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
|
/// Licensed under the GNU Affero General Public License (AGPL).
|
|
// See License.AGPL.txt in the project root for license information.
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"context"
|
|
"path/filepath"
|
|
|
|
"github.com/gitpod-io/gitpod/common-go/log"
|
|
"github.com/spf13/cobra"
|
|
v1 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/api/errors"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/client-go/kubernetes"
|
|
"k8s.io/client-go/rest"
|
|
"k8s.io/client-go/tools/clientcmd"
|
|
"k8s.io/client-go/util/homedir"
|
|
)
|
|
|
|
var configClusterOpts struct {
|
|
Kube kubeConfig
|
|
Namespace string
|
|
EnsureNamespace bool
|
|
}
|
|
|
|
// configClusterCmd represents the validate command
|
|
var configClusterCmd = &cobra.Command{
|
|
Use: "cluster",
|
|
Short: "Perform configuration tasks against the cluster",
|
|
Long: `Perform configuration tasks against the cluster
|
|
|
|
These will be deployed and run as Kubernetes resources.`,
|
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
|
log.Debugf("EnsureNamespace: %t", configClusterOpts.EnsureNamespace)
|
|
|
|
if !configClusterOpts.EnsureNamespace {
|
|
return nil
|
|
}
|
|
|
|
log.Infof("Ensuring namespace exists %s", configClusterOpts.Namespace)
|
|
_, clientset, err := authClusterOrKubeconfig(configClusterOpts.Kube.Config)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = clientset.CoreV1().Namespaces().Create(
|
|
context.TODO(),
|
|
&v1.Namespace{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: configClusterOpts.Namespace,
|
|
},
|
|
},
|
|
metav1.CreateOptions{},
|
|
)
|
|
|
|
if errors.IsAlreadyExists(err) {
|
|
log.Debug("Namespace already exists")
|
|
return nil
|
|
}
|
|
|
|
return err
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
configCmd.AddCommand(configClusterCmd)
|
|
|
|
configClusterCmd.Flags().StringVar(&configClusterOpts.Kube.Config, "kubeconfig", filepath.Join(homedir.HomeDir(), ".kube", "config"), "path to the kubeconfig file")
|
|
configClusterCmd.PersistentFlags().StringVarP(&configClusterOpts.Namespace, "namespace", "n", getEnvvar("NAMESPACE", "default"), "namespace to deploy to")
|
|
configClusterCmd.PersistentFlags().BoolVar(&configClusterOpts.EnsureNamespace, "ensure-namespace", true, "ensure that the namespace exists")
|
|
}
|
|
|
|
func authClusterOrKubeconfig(kubeconfig string) (*rest.Config, *kubernetes.Clientset, error) {
|
|
// Try authenticating in-cluster with serviceaccount
|
|
log.Debug("Attempting to authenticate with ServiceAccount")
|
|
config, err := rest.InClusterConfig()
|
|
if err != nil {
|
|
// Try authenticating out-of-cluster with kubeconfig
|
|
log.Debug("ServiceAccount failed - using KubeConfig")
|
|
config, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
}
|
|
|
|
clientset, err := kubernetes.NewForConfig(config)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
return config, clientset, nil
|
|
}
|