Skip to content

Instantly share code, notes, and snippets.

@mjudeikis
Created February 6, 2019 19:14
Show Gist options
  • Save mjudeikis/52ddb0cf2b68022be59c0a43898f0bdf to your computer and use it in GitHub Desktop.
Save mjudeikis/52ddb0cf2b68022be59c0a43898f0bdf to your computer and use it in GitHub Desktop.
package kubeclient
//go:generate go get github.com/golang/mock/gomock
//go:generate go install github.com/golang/mock/mockgen
//go:generate mockgen -destination=../../util/mocks/mock_$GOPACKAGE/types.go github.com/openshift/openshift-azure/pkg/cluster/$GOPACKAGE Kubeclient
//go:generate gofmt -s -l -w ../../util/mocks/mock_$GOPACKAGE/types.go
//go:generate goimports -local=github.com/openshift/openshift-azure -e -w ../../util/mocks/mock_$GOPACKAGE/types.go
import (
"context"
"net/http"
"strings"
"github.com/sirupsen/logrus"
corev1 "k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes"
v1 "k8s.io/client-go/tools/clientcmd/api/v1"
"github.com/openshift/openshift-azure/pkg/api"
"github.com/openshift/openshift-azure/pkg/util/managedcluster"
)
// Kubeclient interface to utility kubenetes functions
type Kubeclient interface {
DrainAndDeleteWorker(ctx context.Context, computerName ComputerName) error
DeleteMaster(computerName ComputerName) error
GetControlPlanePods(ctx context.Context) ([]corev1.Pod, error)
WaitForInfraServices(ctx context.Context) *api.PluginError
WaitForReadyMaster(ctx context.Context, computerName ComputerName) error
WaitForReadyWorker(ctx context.Context, computerName ComputerName) error
}
type kubeclient struct {
pluginConfig api.PluginConfig
client kubernetes.Interface
log *logrus.Entry
}
var _ Kubeclient = &kubeclient{}
// NewKubeclient creates a new kubelient instance
func NewKubeclient(log *logrus.Entry, config *v1.Config, pluginConfig *api.PluginConfig) (Kubeclient, error) {
restconfig, err := managedcluster.RestConfigFromV1Config(config)
if err != nil {
return nil, err
}
rt := NewCustomTransport(restconfig.Transport, log)
//transport, err := rest.HTTPWrappersForConfig(restconfig, rt)
//if err != nil {
// log.Error(err)
// return nil, err
//}
restconfig.Transport = rt
cli, err := kubernetes.NewForConfig(restconfig)
if err != nil {
return nil, err
}
return &kubeclient{
pluginConfig: *pluginConfig,
log: log,
client: cli,
}, nil
}
type ComputerName string
func (computerName ComputerName) toKubernetes() string {
return strings.ToLower(string(computerName))
}
func NewCustomTransport(rt http.RoundTripper, log *logrus.Entry) *CustomTransport {
return &CustomTransport{
log: log,
RoundTripper: rt,
}
}
type CustomTransport struct {
log *logrus.Entry
http.RoundTripper
}
// RoundTrip implements the RoundTripper interface.
func (t *CustomTransport) RoundTrip(req *http.Request) (*http.Response, error) {
t.log.Debug(req.RequestURI)
response, err := t.RoundTrip(req)
if err != nil {
t.log.Debug(response.Header)
}
return response, err
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment