提交 706d02b9 编写于 作者: S Steve Sloka

Fix go-client / Refactor k8s util code

上级 60d9d1e1
......@@ -29,6 +29,7 @@ import (
"k8s.io/minikube/pkg/minikube/cluster"
"k8s.io/minikube/pkg/minikube/config"
"k8s.io/minikube/pkg/minikube/machine"
"k8s.io/minikube/pkg/minikube/service"
"k8s.io/minikube/pkg/minikube/sshutil"
)
......@@ -132,7 +133,7 @@ func EnableOrDisableAddon(name string, val string) error {
}
// Create ECR Secret
err = cluster.CreateSecret(
err = service.CreateSecret(
"kube-system",
"registry-creds-ecr",
map[string]string{
......@@ -152,7 +153,7 @@ func EnableOrDisableAddon(name string, val string) error {
}
// Create GCR Secret
err = cluster.CreateSecret(
err = service.CreateSecret(
"kube-system",
"registry-creds-gcr",
map[string]string{
......@@ -172,8 +173,8 @@ func EnableOrDisableAddon(name string, val string) error {
}
} else {
// Cleanup existing secrets
cluster.DeleteSecret("kube-system", "registry-creds-ecr")
cluster.DeleteSecret("kube-system", "registry-creds-gcr")
service.DeleteSecret("kube-system", "registry-creds-ecr")
service.DeleteSecret("kube-system", "registry-creds-gcr")
}
//TODO(r2d4): config package should not reference API, pull this out
......
......@@ -20,7 +20,6 @@ import (
"encoding/json"
"flag"
"fmt"
"html/template"
"net"
"os"
"path/filepath"
......@@ -34,11 +33,8 @@ import (
"github.com/docker/machine/libmachine/host"
"github.com/docker/machine/libmachine/state"
"github.com/golang/glog"
"github.com/pkg/browser"
"github.com/pkg/errors"
"k8s.io/client-go/pkg/api/v1"
"k8s.io/client-go/pkg/labels"
"k8s.io/minikube/pkg/minikube/assets"
"k8s.io/minikube/pkg/minikube/constants"
"k8s.io/minikube/pkg/minikube/sshutil"
......@@ -453,197 +449,3 @@ func EnsureMinikubeRunningOrExit(api libmachine.API, exitStatus int) {
os.Exit(exitStatus)
}
}
type ServiceURL struct {
Namespace string
Name string
URLs []string
}
type ServiceURLs []ServiceURL
func GetServiceURLs(api libmachine.API, namespace string, t *template.Template) (ServiceURLs, error) {
host, err := CheckIfApiExistsAndLoad(api)
if err != nil {
return nil, err
}
ip, err := host.Driver.GetIP()
if err != nil {
return nil, err
}
client, err := GetKubernetesClient()
if err != nil {
return nil, err
}
getter := client.Services(namespace)
svcs, err := getter.List(kubeapi.ListOptions{})
if err != nil {
return nil, err
}
var serviceURLs []ServiceURL
for _, svc := range svcs.Items {
urls, err := getServiceURLsWithClient(client, ip, svc.Namespace, svc.Name, t)
if err != nil {
if _, ok := err.(MissingNodePortError); ok {
serviceURLs = append(serviceURLs, ServiceURL{Namespace: svc.Namespace, Name: svc.Name})
continue
}
return nil, err
}
serviceURLs = append(serviceURLs, ServiceURL{Namespace: svc.Namespace, Name: svc.Name, URLs: urls})
}
return serviceURLs, nil
}
// CheckService waits for the specified service to be ready by returning an error until the service is up
// The check is done by polling the endpoint associated with the service and when the endpoint exists, returning no error->service-online
func CheckService(namespace string, service string) error {
client, err := GetKubernetesClient()
if err != nil {
return &util.RetriableError{Err: err}
}
endpoints := client.Endpoints(namespace)
if err != nil {
return &util.RetriableError{Err: err}
}
endpoint, err := endpoints.Get(service)
if err != nil {
return &util.RetriableError{Err: err}
}
return checkEndpointReady(endpoint)
}
func checkEndpointReady(endpoint *v1.Endpoints) error {
const notReadyMsg = "Waiting, endpoint for service is not ready yet...\n"
if len(endpoint.Subsets) == 0 {
fmt.Fprintf(os.Stderr, notReadyMsg)
return &util.RetriableError{Err: errors.New("Endpoint for service is not ready yet")}
}
for _, subset := range endpoint.Subsets {
if len(subset.Addresses) == 0 {
fmt.Fprintf(os.Stderr, notReadyMsg)
return &util.RetriableError{Err: errors.New("No endpoints for service are ready yet")}
}
}
return nil
}
func WaitAndMaybeOpenService(api libmachine.API, namespace string, service string, urlTemplate *template.Template, urlMode bool, https bool) {
if err := util.RetryAfter(20, func() error { return CheckService(namespace, service) }, 6*time.Second); err != nil {
fmt.Fprintf(os.Stderr, "Could not find finalized endpoint being pointed to by %s: %s\n", service, err)
os.Exit(1)
}
urls, err := GetServiceURLsForService(api, namespace, service, urlTemplate)
if err != nil {
fmt.Fprintln(os.Stderr, err)
fmt.Fprintln(os.Stderr, "Check that minikube is running and that you have specified the correct namespace (-n flag).")
os.Exit(1)
}
for _, url := range urls {
if https {
url = strings.Replace(url, "http", "https", 1)
}
if urlMode || !strings.HasPrefix(url, "http") {
fmt.Fprintln(os.Stdout, url)
} else {
fmt.Fprintln(os.Stdout, "Opening kubernetes service "+namespace+"/"+service+" in default browser...")
browser.OpenURL(url)
}
}
}
func GetServiceListByLabel(namespace string, key string, value string) (*v1.ServiceList, error) {
client, err := GetKubernetesClient()
if err != nil {
return &v1.ServiceList{}, &util.RetriableError{Err: err}
}
services := client.Services(namespace)
if err != nil {
return &v1.ServiceList{}, &util.RetriableError{Err: err}
}
return getServiceListFromServicesByLabel(services, key, value)
}
func getServiceListFromServicesByLabel(services corev1.ServiceInterface, key string, value string) (*v1.ServiceList, error) {
selector := labels.SelectorFromSet(labels.Set(map[string]string{key: value}))
serviceList, err := services.List(kubeapi.ListOptions{LabelSelector: selector})
if err != nil {
return &v1.ServiceList{}, &util.RetriableError{Err: err}
}
return serviceList, nil
}
// CreateSecret creates or modifies secrets
func CreateSecret(namespace, name string, dataValues map[string]string, labels map[string]string) error {
client, err := GetKubernetesClient()
if err != nil {
return &util.RetriableError{Err: err}
}
secrets := client.Secrets(namespace)
if err != nil {
return &util.RetriableError{Err: err}
}
secret, _ := secrets.Get(name)
// Delete existing secret
if len(secret.Name) > 0 {
err = DeleteSecret(namespace, name)
if err != nil {
return &util.RetriableError{Err: err}
}
}
// convert strings to data secrets
data := map[string][]byte{}
for key, value := range dataValues {
data[key] = []byte(value)
}
// Create Secret
secretObj := &v1.Secret{
ObjectMeta: v1.ObjectMeta{
Name: name,
Labels: labels,
},
Data: data,
Type: v1.SecretTypeOpaque,
}
_, err = secrets.Create(secretObj)
if err != nil {
fmt.Println("err: ", err)
return &util.RetriableError{Err: err}
}
return nil
}
// DeleteSecret deletes a secret from a namespace
func DeleteSecret(namespace, name string) error {
client, err := GetKubernetesClient()
if err != nil {
return &util.RetriableError{Err: err}
}
secrets := client.Secrets(namespace)
if err != nil {
return &util.RetriableError{Err: err}
}
err = secrets.Delete(name, &kubeapi.DeleteOptions{})
if err != nil {
return &util.RetriableError{Err: err}
}
return nil
}
......@@ -261,3 +261,69 @@ func getServiceListFromServicesByLabel(services corev1.ServiceInterface, key str
return serviceList, nil
}
// CreateSecret creates or modifies secrets
func CreateSecret(namespace, name string, dataValues map[string]string, labels map[string]string) error {
client, err := k8s.GetCoreClient()
if err != nil {
return &util.RetriableError{Err: err}
}
secrets := client.Secrets(namespace)
if err != nil {
return &util.RetriableError{Err: err}
}
secret, _ := secrets.Get(name)
// Delete existing secret
if len(secret.Name) > 0 {
err = DeleteSecret(namespace, name)
if err != nil {
return &util.RetriableError{Err: err}
}
}
// convert strings to data secrets
data := map[string][]byte{}
for key, value := range dataValues {
data[key] = []byte(value)
}
// Create Secret
secretObj := &v1.Secret{
ObjectMeta: v1.ObjectMeta{
Name: name,
Labels: labels,
},
Data: data,
Type: v1.SecretTypeOpaque,
}
_, err = secrets.Create(secretObj)
if err != nil {
fmt.Println("err: ", err)
return &util.RetriableError{Err: err}
}
return nil
}
// DeleteSecret deletes a secret from a namespace
func DeleteSecret(namespace, name string) error {
client, err := k8s.GetCoreClient()
if err != nil {
return &util.RetriableError{Err: err}
}
secrets := client.Secrets(namespace)
if err != nil {
return &util.RetriableError{Err: err}
}
err = secrets.Delete(name, &kubeapi.DeleteOptions{})
if err != nil {
return &util.RetriableError{Err: err}
}
return nil
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册