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
|
// Register our APIs
|
||||||
_ "k8s.io/kops/pkg/apis/kops/install"
|
_ "k8s.io/kops/pkg/apis/kops/install"
|
||||||
|
"k8s.io/kops/pkg/kubeconfig"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Factory interface {
|
type Factory interface {
|
||||||
|
@ -183,7 +184,7 @@ func (c *RootCmd) ClusterName() string {
|
||||||
return c.clusterName
|
return c.clusterName
|
||||||
}
|
}
|
||||||
|
|
||||||
func readKubectlClusterConfig() (*kutil.KubectlClusterWithName, error) {
|
func readKubectlClusterConfig() (*kubeconfig.KubectlClusterWithName, error) {
|
||||||
kubectl := &kutil.Kubectl{}
|
kubectl := &kutil.Kubectl{}
|
||||||
context, err := kubectl.GetCurrentContext()
|
context, err := kubectl.GetCurrentContext()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -21,6 +21,7 @@ import (
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
kopsapi "k8s.io/kops/pkg/apis/kops"
|
kopsapi "k8s.io/kops/pkg/apis/kops"
|
||||||
"k8s.io/kops/pkg/apis/kops/registry"
|
"k8s.io/kops/pkg/apis/kops/registry"
|
||||||
|
"k8s.io/kops/pkg/kubeconfig"
|
||||||
"k8s.io/kops/upup/pkg/kutil"
|
"k8s.io/kops/upup/pkg/kutil"
|
||||||
"k8s.io/kubernetes/federation/apis/federation/v1beta1"
|
"k8s.io/kubernetes/federation/apis/federation/v1beta1"
|
||||||
"k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset"
|
"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,
|
KubeMasterIP: cluster.Spec.MasterPublicName,
|
||||||
}
|
}
|
||||||
|
|
||||||
kubeconfig, err := k.ExtractKubeconfig()
|
conf, err := k.ExtractKubeconfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error building connection information for cluster %q: %v", cluster.ObjectMeta.Name, err)
|
return fmt.Errorf("error building connection information for cluster %q: %v", cluster.ObjectMeta.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
user := kutil.KubectlUser{
|
user := kubeconfig.KubectlUser{
|
||||||
ClientCertificateData: kubeconfig.ClientCert,
|
ClientCertificateData: conf.ClientCert,
|
||||||
ClientKeyData: kubeconfig.ClientKey,
|
ClientKeyData: conf.ClientKey,
|
||||||
}
|
}
|
||||||
// username/password or bearer token may be set, but not both
|
// username/password or bearer token may be set, but not both
|
||||||
if kubeconfig.KubeBearerToken != "" {
|
if conf.KubeBearerToken != "" {
|
||||||
user.Token = kubeconfig.KubeBearerToken
|
user.Token = conf.KubeBearerToken
|
||||||
} else {
|
} else {
|
||||||
user.Username = kubeconfig.KubeUser
|
user.Username = conf.KubeUser
|
||||||
user.Password = kubeconfig.KubePassword
|
user.Password = conf.KubePassword
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, k8s := range o.ControllerKubernetesClients {
|
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
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,20 +90,20 @@ func (o *FederationCluster) Run(cluster *kopsapi.Cluster) error {
|
||||||
return nil
|
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) {
|
_, err := mutateSecret(k8s, o.FederationNamespace, o.ClusterSecretName, func(s *v1.Secret) (*v1.Secret, error) {
|
||||||
var kubeconfigData []byte
|
var kubeconfigData []byte
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
{
|
{
|
||||||
kubeconfig := &kutil.KubectlConfig{
|
conf := &kubeconfig.KubectlConfig{
|
||||||
ApiVersion: "v1",
|
ApiVersion: "v1",
|
||||||
Kind: "Config",
|
Kind: "Config",
|
||||||
}
|
}
|
||||||
|
|
||||||
cluster := &kutil.KubectlClusterWithName{
|
cluster := &kubeconfig.KubectlClusterWithName{
|
||||||
Name: o.ClusterName,
|
Name: o.ClusterName,
|
||||||
Cluster: kutil.KubectlCluster{
|
Cluster: kubeconfig.KubectlCluster{
|
||||||
Server: "https://" + o.ApiserverHostname,
|
Server: "https://" + o.ApiserverHostname,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -111,25 +112,25 @@ func (o *FederationCluster) ensureFederationSecret(k8s k8s_clientset.Interface,
|
||||||
cluster.Cluster.CertificateAuthorityData = caCertData
|
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,
|
Name: o.ClusterName,
|
||||||
User: user,
|
User: user,
|
||||||
}
|
}
|
||||||
kubeconfig.Users = append(kubeconfig.Users, user)
|
conf.Users = append(conf.Users, user)
|
||||||
|
|
||||||
context := &kutil.KubectlContextWithName{
|
context := &kubeconfig.KubectlContextWithName{
|
||||||
Name: o.ClusterName,
|
Name: o.ClusterName,
|
||||||
Context: kutil.KubectlContext{
|
Context: kubeconfig.KubectlContext{
|
||||||
Cluster: cluster.Name,
|
Cluster: cluster.Name,
|
||||||
User: user.Name,
|
User: user.Name,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
kubeconfig.CurrentContext = o.ClusterName
|
conf.CurrentContext = o.ClusterName
|
||||||
kubeconfig.Contexts = append(kubeconfig.Contexts, context)
|
conf.Contexts = append(conf.Contexts, context)
|
||||||
|
|
||||||
kubeconfigData, err = kopsapi.ToRawYaml(kubeconfig)
|
kubeconfigData, err = kopsapi.ToRawYaml(conf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error building kubeconfig: %v", err)
|
return nil, fmt.Errorf("error building kubeconfig: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import (
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"k8s.io/kops/federation/targets/kubernetes"
|
"k8s.io/kops/federation/targets/kubernetes"
|
||||||
kopsapi "k8s.io/kops/pkg/apis/kops"
|
kopsapi "k8s.io/kops/pkg/apis/kops"
|
||||||
|
"k8s.io/kops/pkg/kubeconfig"
|
||||||
"k8s.io/kops/upup/pkg/fi"
|
"k8s.io/kops/upup/pkg/fi"
|
||||||
"k8s.io/kops/upup/pkg/fi/fitasks"
|
"k8s.io/kops/upup/pkg/fi/fitasks"
|
||||||
"k8s.io/kops/upup/pkg/kutil"
|
"k8s.io/kops/upup/pkg/kutil"
|
||||||
|
@ -260,7 +261,7 @@ func (o *FederationConfiguration) EnsureConfiguration(c *fi.Context) error {
|
||||||
})
|
})
|
||||||
|
|
||||||
// TODO: Prefer username / password or token?
|
// TODO: Prefer username / password or token?
|
||||||
user := kutil.KubectlUser{
|
user := kubeconfig.KubectlUser{
|
||||||
Username: UserAdmin,
|
Username: UserAdmin,
|
||||||
Password: adminPassword,
|
Password: adminPassword,
|
||||||
//Token: adminToken,
|
//Token: adminToken,
|
||||||
|
@ -273,7 +274,7 @@ func (o *FederationConfiguration) EnsureConfiguration(c *fi.Context) error {
|
||||||
return nil
|
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
|
k8s := c.Target.(*kubernetes.KubernetesTarget).KubernetesClient
|
||||||
|
|
||||||
_, err := mutateSecret(k8s, o.Namespace, o.KubeconfigSecretName, func(s *v1.Secret) (*v1.Secret, error) {
|
_, 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
|
var err error
|
||||||
|
|
||||||
{
|
{
|
||||||
kubeconfig := &kutil.KubectlConfig{
|
conf := &kubeconfig.KubectlConfig{
|
||||||
ApiVersion: "v1",
|
ApiVersion: "v1",
|
||||||
Kind: "Config",
|
Kind: "Config",
|
||||||
}
|
}
|
||||||
|
|
||||||
cluster := &kutil.KubectlClusterWithName{
|
cluster := &kubeconfig.KubectlClusterWithName{
|
||||||
Name: o.ApiserverServiceName,
|
Name: o.ApiserverServiceName,
|
||||||
Cluster: kutil.KubectlCluster{
|
Cluster: kubeconfig.KubectlCluster{
|
||||||
Server: "https://" + o.ApiserverServiceName,
|
Server: "https://" + o.ApiserverServiceName,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -301,25 +302,25 @@ func (o *FederationConfiguration) ensureSecretKubeconfig(c *fi.Context, caCert *
|
||||||
cluster.Cluster.CertificateAuthorityData = caCertData
|
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,
|
Name: o.ApiserverServiceName,
|
||||||
User: user,
|
User: user,
|
||||||
}
|
}
|
||||||
kubeconfig.Users = append(kubeconfig.Users, user)
|
conf.Users = append(conf.Users, user)
|
||||||
|
|
||||||
context := &kutil.KubectlContextWithName{
|
context := &kubeconfig.KubectlContextWithName{
|
||||||
Name: o.ApiserverServiceName,
|
Name: o.ApiserverServiceName,
|
||||||
Context: kutil.KubectlContext{
|
Context: kubeconfig.KubectlContext{
|
||||||
Cluster: cluster.Name,
|
Cluster: cluster.Name,
|
||||||
User: user.Name,
|
User: user.Name,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
kubeconfig.CurrentContext = o.ApiserverServiceName
|
conf.CurrentContext = o.ApiserverServiceName
|
||||||
kubeconfig.Contexts = append(kubeconfig.Contexts, context)
|
conf.Contexts = append(conf.Contexts, context)
|
||||||
|
|
||||||
kubeconfigData, err = kopsapi.ToRawYaml(kubeconfig)
|
kubeconfigData, err = kopsapi.ToRawYaml(conf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error building kubeconfig: %v", err)
|
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/client/simple/vfsclientset
|
||||||
k8s.io/kops/pkg/diff
|
k8s.io/kops/pkg/diff
|
||||||
k8s.io/kops/pkg/featureflag
|
k8s.io/kops/pkg/featureflag
|
||||||
|
k8s.io/kops/pkg/kubeconfig
|
||||||
k8s.io/kops/pkg/model
|
k8s.io/kops/pkg/model
|
||||||
k8s.io/kops/pkg/model/components
|
k8s.io/kops/pkg/model/components
|
||||||
k8s.io/kops/pkg/model/iam
|
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"
|
"fmt"
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"k8s.io/kops/pkg/kubeconfig"
|
||||||
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
@ -59,7 +60,7 @@ func (k *Kubectl) GetCurrentContext() (string, error) {
|
||||||
//return s, nil
|
//return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *Kubectl) GetConfig(minify bool) (*KubectlConfig, error) {
|
func (k *Kubectl) GetConfig(minify bool) (*kubeconfig.KubectlConfig, error) {
|
||||||
output := "json"
|
output := "json"
|
||||||
// TODO: --context doesn't seem to work
|
// TODO: --context doesn't seem to work
|
||||||
args := []string{"config", "view"}
|
args := []string{"config", "view"}
|
||||||
|
@ -80,7 +81,7 @@ func (k *Kubectl) GetConfig(minify bool) (*KubectlConfig, error) {
|
||||||
|
|
||||||
glog.V(8).Infof("config = %q", configString)
|
glog.V(8).Infof("config = %q", configString)
|
||||||
|
|
||||||
config := &KubectlConfig{}
|
config := &kubeconfig.KubectlConfig{}
|
||||||
err = json.Unmarshal([]byte(configString), config)
|
err = json.Unmarshal([]byte(configString), config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot parse current config from kubectl: %v", err)
|
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
|
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