mirror of https://github.com/kubernetes/kops.git
Refactor kubeconfig into its own package
Splitting up the coreos PR
This commit is contained in:
parent
357a2e8f76
commit
e1e9dd3c4c
|
@ -34,6 +34,7 @@ import (
|
|||
|
||||
// Register our APIs
|
||||
_ "k8s.io/kops/pkg/apis/kops/install"
|
||||
"k8s.io/kops/pkg/kubeconfig"
|
||||
)
|
||||
|
||||
type Factory interface {
|
||||
|
@ -183,7 +184,7 @@ func (c *RootCmd) ClusterName() string {
|
|||
return c.clusterName
|
||||
}
|
||||
|
||||
func readKubectlClusterConfig() (*kutil.KubectlClusterWithName, error) {
|
||||
func readKubectlClusterConfig() (*kubeconfig.KubectlClusterWithName, error) {
|
||||
kubectl := &kutil.Kubectl{}
|
||||
context, err := kubectl.GetCurrentContext()
|
||||
if err != nil {
|
||||
|
|
|
@ -21,6 +21,7 @@ import (
|
|||
"github.com/golang/glog"
|
||||
kopsapi "k8s.io/kops/pkg/apis/kops"
|
||||
"k8s.io/kops/pkg/apis/kops/registry"
|
||||
"k8s.io/kops/pkg/kubeconfig"
|
||||
"k8s.io/kops/upup/pkg/kutil"
|
||||
"k8s.io/kubernetes/federation/apis/federation/v1beta1"
|
||||
"k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset"
|
||||
|
@ -59,25 +60,25 @@ func (o *FederationCluster) Run(cluster *kopsapi.Cluster) error {
|
|||
KubeMasterIP: cluster.Spec.MasterPublicName,
|
||||
}
|
||||
|
||||
kubeconfig, err := k.ExtractKubeconfig()
|
||||
conf, err := k.ExtractKubeconfig()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error building connection information for cluster %q: %v", cluster.ObjectMeta.Name, err)
|
||||
}
|
||||
|
||||
user := kutil.KubectlUser{
|
||||
ClientCertificateData: kubeconfig.ClientCert,
|
||||
ClientKeyData: kubeconfig.ClientKey,
|
||||
user := kubeconfig.KubectlUser{
|
||||
ClientCertificateData: conf.ClientCert,
|
||||
ClientKeyData: conf.ClientKey,
|
||||
}
|
||||
// username/password or bearer token may be set, but not both
|
||||
if kubeconfig.KubeBearerToken != "" {
|
||||
user.Token = kubeconfig.KubeBearerToken
|
||||
if conf.KubeBearerToken != "" {
|
||||
user.Token = conf.KubeBearerToken
|
||||
} else {
|
||||
user.Username = kubeconfig.KubeUser
|
||||
user.Password = kubeconfig.KubePassword
|
||||
user.Username = conf.KubeUser
|
||||
user.Password = conf.KubePassword
|
||||
}
|
||||
|
||||
for _, k8s := range o.ControllerKubernetesClients {
|
||||
if err := o.ensureFederationSecret(k8s, kubeconfig.CACert, user); err != nil {
|
||||
if err := o.ensureFederationSecret(k8s, conf.CACert, user); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -89,20 +90,20 @@ func (o *FederationCluster) Run(cluster *kopsapi.Cluster) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (o *FederationCluster) ensureFederationSecret(k8s k8s_clientset.Interface, caCertData []byte, user kutil.KubectlUser) error {
|
||||
func (o *FederationCluster) ensureFederationSecret(k8s k8s_clientset.Interface, caCertData []byte, user kubeconfig.KubectlUser) error {
|
||||
_, err := mutateSecret(k8s, o.FederationNamespace, o.ClusterSecretName, func(s *v1.Secret) (*v1.Secret, error) {
|
||||
var kubeconfigData []byte
|
||||
var err error
|
||||
|
||||
{
|
||||
kubeconfig := &kutil.KubectlConfig{
|
||||
conf := &kubeconfig.KubectlConfig{
|
||||
ApiVersion: "v1",
|
||||
Kind: "Config",
|
||||
}
|
||||
|
||||
cluster := &kutil.KubectlClusterWithName{
|
||||
cluster := &kubeconfig.KubectlClusterWithName{
|
||||
Name: o.ClusterName,
|
||||
Cluster: kutil.KubectlCluster{
|
||||
Cluster: kubeconfig.KubectlCluster{
|
||||
Server: "https://" + o.ApiserverHostname,
|
||||
},
|
||||
}
|
||||
|
@ -111,25 +112,25 @@ func (o *FederationCluster) ensureFederationSecret(k8s k8s_clientset.Interface,
|
|||
cluster.Cluster.CertificateAuthorityData = caCertData
|
||||
}
|
||||
|
||||
kubeconfig.Clusters = append(kubeconfig.Clusters, cluster)
|
||||
conf.Clusters = append(conf.Clusters, cluster)
|
||||
|
||||
user := &kutil.KubectlUserWithName{
|
||||
user := &kubeconfig.KubectlUserWithName{
|
||||
Name: o.ClusterName,
|
||||
User: user,
|
||||
}
|
||||
kubeconfig.Users = append(kubeconfig.Users, user)
|
||||
conf.Users = append(conf.Users, user)
|
||||
|
||||
context := &kutil.KubectlContextWithName{
|
||||
context := &kubeconfig.KubectlContextWithName{
|
||||
Name: o.ClusterName,
|
||||
Context: kutil.KubectlContext{
|
||||
Context: kubeconfig.KubectlContext{
|
||||
Cluster: cluster.Name,
|
||||
User: user.Name,
|
||||
},
|
||||
}
|
||||
kubeconfig.CurrentContext = o.ClusterName
|
||||
kubeconfig.Contexts = append(kubeconfig.Contexts, context)
|
||||
conf.CurrentContext = o.ClusterName
|
||||
conf.Contexts = append(conf.Contexts, context)
|
||||
|
||||
kubeconfigData, err = kopsapi.ToRawYaml(kubeconfig)
|
||||
kubeconfigData, err = kopsapi.ToRawYaml(conf)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error building kubeconfig: %v", err)
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ import (
|
|||
"github.com/golang/glog"
|
||||
"k8s.io/kops/federation/targets/kubernetes"
|
||||
kopsapi "k8s.io/kops/pkg/apis/kops"
|
||||
"k8s.io/kops/pkg/kubeconfig"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/fitasks"
|
||||
"k8s.io/kops/upup/pkg/kutil"
|
||||
|
@ -260,7 +261,7 @@ func (o *FederationConfiguration) EnsureConfiguration(c *fi.Context) error {
|
|||
})
|
||||
|
||||
// TODO: Prefer username / password or token?
|
||||
user := kutil.KubectlUser{
|
||||
user := kubeconfig.KubectlUser{
|
||||
Username: UserAdmin,
|
||||
Password: adminPassword,
|
||||
//Token: adminToken,
|
||||
|
@ -273,7 +274,7 @@ func (o *FederationConfiguration) EnsureConfiguration(c *fi.Context) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (o *FederationConfiguration) ensureSecretKubeconfig(c *fi.Context, caCert *fi.Certificate, user kutil.KubectlUser) error {
|
||||
func (o *FederationConfiguration) ensureSecretKubeconfig(c *fi.Context, caCert *fi.Certificate, user kubeconfig.KubectlUser) error {
|
||||
k8s := c.Target.(*kubernetes.KubernetesTarget).KubernetesClient
|
||||
|
||||
_, err := mutateSecret(k8s, o.Namespace, o.KubeconfigSecretName, func(s *v1.Secret) (*v1.Secret, error) {
|
||||
|
@ -281,14 +282,14 @@ func (o *FederationConfiguration) ensureSecretKubeconfig(c *fi.Context, caCert *
|
|||
var err error
|
||||
|
||||
{
|
||||
kubeconfig := &kutil.KubectlConfig{
|
||||
conf := &kubeconfig.KubectlConfig{
|
||||
ApiVersion: "v1",
|
||||
Kind: "Config",
|
||||
}
|
||||
|
||||
cluster := &kutil.KubectlClusterWithName{
|
||||
cluster := &kubeconfig.KubectlClusterWithName{
|
||||
Name: o.ApiserverServiceName,
|
||||
Cluster: kutil.KubectlCluster{
|
||||
Cluster: kubeconfig.KubectlCluster{
|
||||
Server: "https://" + o.ApiserverServiceName,
|
||||
},
|
||||
}
|
||||
|
@ -301,25 +302,25 @@ func (o *FederationConfiguration) ensureSecretKubeconfig(c *fi.Context, caCert *
|
|||
cluster.Cluster.CertificateAuthorityData = caCertData
|
||||
}
|
||||
|
||||
kubeconfig.Clusters = append(kubeconfig.Clusters, cluster)
|
||||
conf.Clusters = append(conf.Clusters, cluster)
|
||||
|
||||
user := &kutil.KubectlUserWithName{
|
||||
user := &kubeconfig.KubectlUserWithName{
|
||||
Name: o.ApiserverServiceName,
|
||||
User: user,
|
||||
}
|
||||
kubeconfig.Users = append(kubeconfig.Users, user)
|
||||
conf.Users = append(conf.Users, user)
|
||||
|
||||
context := &kutil.KubectlContextWithName{
|
||||
context := &kubeconfig.KubectlContextWithName{
|
||||
Name: o.ApiserverServiceName,
|
||||
Context: kutil.KubectlContext{
|
||||
Context: kubeconfig.KubectlContext{
|
||||
Cluster: cluster.Name,
|
||||
User: user.Name,
|
||||
},
|
||||
}
|
||||
kubeconfig.CurrentContext = o.ApiserverServiceName
|
||||
kubeconfig.Contexts = append(kubeconfig.Contexts, context)
|
||||
conf.CurrentContext = o.ApiserverServiceName
|
||||
conf.Contexts = append(conf.Contexts, context)
|
||||
|
||||
kubeconfigData, err = kopsapi.ToRawYaml(kubeconfig)
|
||||
kubeconfigData, err = kopsapi.ToRawYaml(conf)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error building kubeconfig: %v", err)
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ k8s.io/kops/pkg/client/simple
|
|||
k8s.io/kops/pkg/client/simple/vfsclientset
|
||||
k8s.io/kops/pkg/diff
|
||||
k8s.io/kops/pkg/featureflag
|
||||
k8s.io/kops/pkg/kubeconfig
|
||||
k8s.io/kops/pkg/model
|
||||
k8s.io/kops/pkg/model/components
|
||||
k8s.io/kops/pkg/model/iam
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
Copyright 2016 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package kubeconfig
|
||||
|
||||
type KubectlConfig struct {
|
||||
Kind string `json:"kind"`
|
||||
ApiVersion string `json:"apiVersion"`
|
||||
CurrentContext string `json:"current-context"`
|
||||
Clusters []*KubectlClusterWithName `json:"clusters"`
|
||||
Contexts []*KubectlContextWithName `json:"contexts"`
|
||||
Users []*KubectlUserWithName `json:"users"`
|
||||
}
|
||||
|
||||
type KubectlClusterWithName struct {
|
||||
Name string `json:"name"`
|
||||
Cluster KubectlCluster `json:"cluster"`
|
||||
}
|
||||
|
||||
type KubectlCluster struct {
|
||||
Server string `json:"server,omitempty"`
|
||||
CertificateAuthorityData []byte `json:"certificate-authority-data,omitempty"`
|
||||
}
|
||||
|
||||
type KubectlContextWithName struct {
|
||||
Name string `json:"name"`
|
||||
Context KubectlContext `json:"context"`
|
||||
}
|
||||
|
||||
type KubectlContext struct {
|
||||
Cluster string `json:"cluster"`
|
||||
User string `json:"user"`
|
||||
}
|
||||
|
||||
type KubectlUserWithName struct {
|
||||
Name string `json:"name"`
|
||||
User KubectlUser `json:"user"`
|
||||
}
|
||||
|
||||
type KubectlUser struct {
|
||||
ClientCertificateData []byte `json:"client-certificate-data,omitempty"`
|
||||
ClientKeyData []byte `json:"client-key-data,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
Username string `json:"username,omitempty"`
|
||||
Token string `json:"token,omitempty"`
|
||||
}
|
|
@ -22,6 +22,7 @@ import (
|
|||
"fmt"
|
||||
"github.com/golang/glog"
|
||||
"io/ioutil"
|
||||
"k8s.io/kops/pkg/kubeconfig"
|
||||
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
||||
"os"
|
||||
"os/exec"
|
||||
|
@ -59,7 +60,7 @@ func (k *Kubectl) GetCurrentContext() (string, error) {
|
|||
//return s, nil
|
||||
}
|
||||
|
||||
func (k *Kubectl) GetConfig(minify bool) (*KubectlConfig, error) {
|
||||
func (k *Kubectl) GetConfig(minify bool) (*kubeconfig.KubectlConfig, error) {
|
||||
output := "json"
|
||||
// TODO: --context doesn't seem to work
|
||||
args := []string{"config", "view"}
|
||||
|
@ -80,7 +81,7 @@ func (k *Kubectl) GetConfig(minify bool) (*KubectlConfig, error) {
|
|||
|
||||
glog.V(8).Infof("config = %q", configString)
|
||||
|
||||
config := &KubectlConfig{}
|
||||
config := &kubeconfig.KubectlConfig{}
|
||||
err = json.Unmarshal([]byte(configString), config)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot parse current config from kubectl: %v", err)
|
||||
|
@ -137,45 +138,3 @@ func (k *Kubectl) execKubectl(args ...string) (string, string, error) {
|
|||
|
||||
return stdout.String(), stderr.String(), err
|
||||
}
|
||||
|
||||
type KubectlConfig struct {
|
||||
Kind string `json:"kind"`
|
||||
ApiVersion string `json:"apiVersion"`
|
||||
CurrentContext string `json:"current-context"`
|
||||
Clusters []*KubectlClusterWithName `json:"clusters"`
|
||||
Contexts []*KubectlContextWithName `json:"contexts"`
|
||||
Users []*KubectlUserWithName `json:"users"`
|
||||
}
|
||||
|
||||
type KubectlClusterWithName struct {
|
||||
Name string `json:"name"`
|
||||
Cluster KubectlCluster `json:"cluster"`
|
||||
}
|
||||
|
||||
type KubectlCluster struct {
|
||||
Server string `json:"server"`
|
||||
CertificateAuthorityData []byte `json:"certificate-authority-data,omitempty"`
|
||||
}
|
||||
|
||||
type KubectlContextWithName struct {
|
||||
Name string `json:"name"`
|
||||
Context KubectlContext `json:"context"`
|
||||
}
|
||||
|
||||
type KubectlContext struct {
|
||||
Cluster string `json:"cluster"`
|
||||
User string `json:"user"`
|
||||
}
|
||||
|
||||
type KubectlUserWithName struct {
|
||||
Name string `json:"name"`
|
||||
User KubectlUser `json:"user"`
|
||||
}
|
||||
|
||||
type KubectlUser struct {
|
||||
ClientCertificateData []byte `json:"client-certificate-data,omitempty"`
|
||||
ClientKeyData []byte `json:"client-key-data,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
Username string `json:"username,omitempty"`
|
||||
Token string `json:"token,omitempty"`
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue