From da3b509d3a95bcf24080bbd84d3ec75666939385 Mon Sep 17 00:00:00 2001 From: liz Date: Wed, 10 Jul 2019 12:16:18 -0400 Subject: [PATCH 01/14] Move creating kind control plane into public function --- cmd/capdctl/main.go | 30 ++++++--------------------- kind/controlplane/create.go | 41 +++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 kind/controlplane/create.go diff --git a/cmd/capdctl/main.go b/cmd/capdctl/main.go index 51db1e8..53246f1 100644 --- a/cmd/capdctl/main.go +++ b/cmd/capdctl/main.go @@ -28,14 +28,12 @@ import ( "net/http" "os" "strings" - "time" "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/cluster-api-provider-docker/kind/actions" + "sigs.k8s.io/cluster-api-provider-docker/kind/controlplane" + _ "sigs.k8s.io/cluster-api-provider-docker/objects" "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - "sigs.k8s.io/kind/pkg/cluster/nodes" - "sigs.k8s.io/kind/pkg/container/cri" "sigs.k8s.io/kind/pkg/exec" ) @@ -251,27 +249,11 @@ func makeManagementCluster(clusterName, capiVersion, capdImage, capiImageOverrid if capiImageOverride != "" { capiImage = capiImageOverride } - elb, err := actions.SetUpLoadBalancer(clusterName) - if err != nil { - panic(err) - } - lbipv4, _, err := elb.IP() - if err != nil { - panic(err) - } - cpMounts := []cri.Mount{ - { - ContainerPath: "/var/run/docker.sock", - HostPath: "/var/run/docker.sock", - }, - } - cp, err := actions.CreateControlPlane(clusterName, fmt.Sprintf("%s-control-plane", clusterName), lbipv4, "v1.14.2", cpMounts) - if err != nil { + + if err := controlplane.CreateKindCluster(capiImage, clusterName); err != nil { panic(err) } - if !nodes.WaitForReady(cp, time.Now().Add(5*time.Minute)) { - panic(errors.New("control plane was not ready in 5 minutes")) - } + f, err := ioutil.TempFile("", "crds") if err != nil { panic(err) @@ -500,5 +482,5 @@ roleRef: subjects: - kind: ServiceAccount name: default - namespace: docker-provider-system + namespace: docker-provider-syste ` diff --git a/kind/controlplane/create.go b/kind/controlplane/create.go new file mode 100644 index 0000000..c63db6a --- /dev/null +++ b/kind/controlplane/create.go @@ -0,0 +1,41 @@ +package controlplane + +import ( + "fmt" + "time" + + "github.com/pkg/errors" + "sigs.k8s.io/cluster-api-provider-docker/kind/actions" + "sigs.k8s.io/kind/pkg/cluster/nodes" + "sigs.k8s.io/kind/pkg/container/cri" +) + +func CreateKindCluster(image, clusterName string) error { + lb, err := actions.SetUpLoadBalancer(clusterName) + if err != nil { + return errors.Wrap(err, "failed to create load balancer") + } + + lbipv4, _, err := lb.IP() + if err != nil { + return errors.Wrap(err, "failed to get ELB IP") + } + + cpMounts := []cri.Mount{ + { + ContainerPath: "/var/run/docker.sock", + HostPath: "/var/run/docker.sock", + }, + } + + cp, err := actions.CreateControlPlane(clusterName, fmt.Sprintf("%s-control-plane", clusterName), lbipv4, "v1.14.2", cpMounts) + if err != nil { + return errors.Wrap(err, "couldn't create control plane") + } + + if !nodes.WaitForReady(cp, time.Now().Add(5*time.Minute)) { + return errors.New("control plane was not ready in 5 minutes") + } + + return nil +} From 0a418a54301f8c7a785cb186afebc42fada39cb4 Mon Sep 17 00:00:00 2001 From: liz Date: Wed, 10 Jul 2019 12:16:41 -0400 Subject: [PATCH 02/14] Struct-ize some YAML --- objects/all.go | 14 +++++ objects/control_plane.go | 113 +++++++++++++++++++++++++++++++++++++++ objects/rbac.go | 92 +++++++++++++++++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100644 objects/all.go create mode 100644 objects/control_plane.go create mode 100644 objects/rbac.go diff --git a/objects/all.go b/objects/all.go new file mode 100644 index 0000000..be83e6e --- /dev/null +++ b/objects/all.go @@ -0,0 +1,14 @@ +package objects + +import "k8s.io/apimachinery/pkg/runtime" + +func GetAll(capdImage string) []runtime.Object { + statefulSet := GetStatefulSet(capdImage) + + return []runtime.Object{ + &Namespace, + &statefulSet, + &ClusterRole, + &ClusterRoleBinding, + } +} diff --git a/objects/control_plane.go b/objects/control_plane.go new file mode 100644 index 0000000..a76eed4 --- /dev/null +++ b/objects/control_plane.go @@ -0,0 +1,113 @@ +package objects + +import ( + apps "k8s.io/api/apps/v1" + core "k8s.io/api/core/v1" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubernetes/cmd/kubeadm/app/constants" +) + +const namespace = "docker-provider-system" + +var Namespace = core.Namespace{ + ObjectMeta: meta.ObjectMeta{ + Labels: map[string]string{"controller-tools.k8s.io": "1.0"}, + Name: namespace, + }, +} + +var ( + controlPlaneLabel = map[string]string{"control-plane": "controller-manager"} + hostPathSocket = core.HostPathSocket + hostPathDirectory = core.HostPathDirectory +) + +const ( + dockerSockVolumeName = "dockersock" + dockerSockPath = "/var/run/docker.sock" + dockerLibVolumeName = "dockerlib" + dockerLibPath = "/var/lib/docker" +) + +func GetStatefulSet(image string) apps.StatefulSet { + return apps.StatefulSet{ + ObjectMeta: meta.ObjectMeta{ + Labels: controlPlaneLabel, + Name: "docker-provider-controller-manager", + Namespace: namespace, + }, + Spec: apps.StatefulSetSpec{ + Selector: &v1.LabelSelector{ + MatchLabels: controlPlaneLabel, + }, + ServiceName: "docker-provider-controller-manager-service", + Template: core.PodTemplateSpec{ + ObjectMeta: meta.ObjectMeta{ + Labels: controlPlaneLabel, + }, + Spec: core.PodSpec{ + Containers: []core.Container{ + { + Name: "capd-manager", + Image: image, + Command: []string{ + "capd-manager", + }, + VolumeMounts: []core.VolumeMount{ + { + MountPath: dockerSockPath, + Name: dockerSockVolumeName, + }, + { + MountPath: dockerLibPath, + Name: dockerLibVolumeName, + }, + }, + }, + }, + Volumes: []core.Volume{ + { + Name: dockerSockVolumeName, + VolumeSource: core.VolumeSource{ + HostPath: &core.HostPathVolumeSource{ + Path: dockerSockPath, + Type: &hostPathSocket, + }, + }, + }, + { + Name: dockerLibVolumeName, + VolumeSource: core.VolumeSource{ + HostPath: &core.HostPathVolumeSource{ + Path: dockerLibPath, + Type: &hostPathDirectory, + }, + }, + }, + }, + Tolerations: []core.Toleration{ + { + Key: constants.LabelNodeRoleMaster, + Effect: core.TaintEffectNoExecute, + }, + { + Key: "CriticalAddonsOnly", + Operator: core.TolerationOpExists, + }, + { + Key: "node.alpha.kubernetes.io/notReady", + Operator: core.TolerationOpExists, + Effect: core.TaintEffectNoExecute, + }, + { + Key: "node.alpha.kubernetes.io/unreachable", + Operator: core.TolerationOpExists, + Effect: core.TaintEffectNoExecute, + }, + }, + }, + }, + }, + } +} diff --git a/objects/rbac.go b/objects/rbac.go new file mode 100644 index 0000000..b3f55e2 --- /dev/null +++ b/objects/rbac.go @@ -0,0 +1,92 @@ +package objects + +import ( + core "k8s.io/api/core/v1" + rbac "k8s.io/api/rbac/v1" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + capi "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" +) + +var ClusterRole = rbac.ClusterRole{ + ObjectMeta: meta.ObjectMeta{ + Name: "docker-provider-manager-role", + }, + Rules: []rbac.PolicyRule{ + { + APIGroups: []string{ + capi.SchemeGroupVersion.Group, + }, + Resources: []string{ + "clusters", + "clusters/status", + }, + Verbs: []string{ + "get", + "list", + "watch", + "create", + "update", + "patch", + "delete", + }, + }, + { + APIGroups: []string{ + capi.SchemeGroupVersion.Group, + }, + Resources: []string{ + "machines", + "machines/status", + "machinedeployments", + "machinedeployments/status", + "machinesets", + "machinesets/status", + "machineclasses", + }, + Verbs: []string{ + "get", + "list", + "watch", + "create", + "update", + "patch", + "delete", + }, + }, + { + APIGroups: []string{ + core.GroupName, + }, + Resources: []string{ + "nodes", + "events", + "secrets", + }, + Verbs: []string{ + "get", + "list", + "watch", + "create", + "update", + "patch", + "delete", + }, + }, + }, +} + +var ClusterRoleBinding = rbac.ClusterRoleBinding{ + ObjectMeta: meta.ObjectMeta{ + Name: "docker-provider-manager-rolebinding", + }, + RoleRef: rbac.RoleRef{ + Kind: "ClusterRole", + Name: ClusterRole.ObjectMeta.Name, + APIGroup: rbac.GroupName, + }, + Subjects: []rbac.Subject{{ + Kind: rbac.ServiceAccountKind, + Name: "default", + Namespace: namespace, + }}, +} From 550cd6363adf295b5bbbb943a8e4f5635d14713b Mon Sep 17 00:00:00 2001 From: liz Date: Wed, 10 Jul 2019 12:30:24 -0400 Subject: [PATCH 03/14] Functions, not variables --- objects/all.go | 9 ++- objects/control_plane.go | 12 +-- objects/rbac.go | 156 ++++++++++++++++++++------------------- 3 files changed, 94 insertions(+), 83 deletions(-) diff --git a/objects/all.go b/objects/all.go index be83e6e..e020871 100644 --- a/objects/all.go +++ b/objects/all.go @@ -3,12 +3,15 @@ package objects import "k8s.io/apimachinery/pkg/runtime" func GetAll(capdImage string) []runtime.Object { + namespaceObj := GetNamespace() statefulSet := GetStatefulSet(capdImage) + clusterRole := GetClusterRole() + clusterRoleBinding := GetClusterRoleBinding() return []runtime.Object{ - &Namespace, + &namespaceObj, &statefulSet, - &ClusterRole, - &ClusterRoleBinding, + &clusterRole, + &clusterRoleBinding, } } diff --git a/objects/control_plane.go b/objects/control_plane.go index a76eed4..9831997 100644 --- a/objects/control_plane.go +++ b/objects/control_plane.go @@ -10,11 +10,13 @@ import ( const namespace = "docker-provider-system" -var Namespace = core.Namespace{ - ObjectMeta: meta.ObjectMeta{ - Labels: map[string]string{"controller-tools.k8s.io": "1.0"}, - Name: namespace, - }, +func GetNamespace() core.Namespace { + return core.Namespace{ + ObjectMeta: meta.ObjectMeta{ + Labels: map[string]string{"controller-tools.k8s.io": "1.0"}, + Name: namespace, + }, + } } var ( diff --git a/objects/rbac.go b/objects/rbac.go index b3f55e2..0eb5ee1 100644 --- a/objects/rbac.go +++ b/objects/rbac.go @@ -7,86 +7,92 @@ import ( capi "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" ) -var ClusterRole = rbac.ClusterRole{ - ObjectMeta: meta.ObjectMeta{ - Name: "docker-provider-manager-role", - }, - Rules: []rbac.PolicyRule{ - { - APIGroups: []string{ - capi.SchemeGroupVersion.Group, - }, - Resources: []string{ - "clusters", - "clusters/status", - }, - Verbs: []string{ - "get", - "list", - "watch", - "create", - "update", - "patch", - "delete", - }, - }, - { - APIGroups: []string{ - capi.SchemeGroupVersion.Group, - }, - Resources: []string{ - "machines", - "machines/status", - "machinedeployments", - "machinedeployments/status", - "machinesets", - "machinesets/status", - "machineclasses", - }, - Verbs: []string{ - "get", - "list", - "watch", - "create", - "update", - "patch", - "delete", - }, +const clusterRoleName = "docker-provider-manager-role" + +func GetClusterRole() rbac.ClusterRole { + return rbac.ClusterRole{ + ObjectMeta: meta.ObjectMeta{ + Name: clusterRoleName, }, - { - APIGroups: []string{ - core.GroupName, + Rules: []rbac.PolicyRule{ + { + APIGroups: []string{ + capi.SchemeGroupVersion.Group, + }, + Resources: []string{ + "clusters", + "clusters/status", + }, + Verbs: []string{ + "get", + "list", + "watch", + "create", + "update", + "patch", + "delete", + }, }, - Resources: []string{ - "nodes", - "events", - "secrets", + { + APIGroups: []string{ + capi.SchemeGroupVersion.Group, + }, + Resources: []string{ + "machines", + "machines/status", + "machinedeployments", + "machinedeployments/status", + "machinesets", + "machinesets/status", + "machineclasses", + }, + Verbs: []string{ + "get", + "list", + "watch", + "create", + "update", + "patch", + "delete", + }, }, - Verbs: []string{ - "get", - "list", - "watch", - "create", - "update", - "patch", - "delete", + { + APIGroups: []string{ + core.GroupName, + }, + Resources: []string{ + "nodes", + "events", + "secrets", + }, + Verbs: []string{ + "get", + "list", + "watch", + "create", + "update", + "patch", + "delete", + }, }, }, - }, + } } -var ClusterRoleBinding = rbac.ClusterRoleBinding{ - ObjectMeta: meta.ObjectMeta{ - Name: "docker-provider-manager-rolebinding", - }, - RoleRef: rbac.RoleRef{ - Kind: "ClusterRole", - Name: ClusterRole.ObjectMeta.Name, - APIGroup: rbac.GroupName, - }, - Subjects: []rbac.Subject{{ - Kind: rbac.ServiceAccountKind, - Name: "default", - Namespace: namespace, - }}, +func GetClusterRoleBinding() rbac.ClusterRoleBinding { + return rbac.ClusterRoleBinding{ + ObjectMeta: meta.ObjectMeta{ + Name: "docker-provider-manager-rolebinding", + }, + RoleRef: rbac.RoleRef{ + Kind: "ClusterRole", + Name: clusterRoleName, + APIGroup: rbac.GroupName, + }, + Subjects: []rbac.Subject{{ + Kind: rbac.ServiceAccountKind, + Name: "default", + Namespace: namespace, + }}, + } } From 76915f979f9de3353fff7852b65fd8b52a553d9a Mon Sep 17 00:00:00 2001 From: liz Date: Wed, 10 Jul 2019 17:49:30 -0400 Subject: [PATCH 04/14] Create objects without kubectl --- cmd/capdctl/main.go | 156 +++++++++++++------------------- go.mod | 6 +- go.sum | 77 ++++++++++++++++ kind/controlplane/kubeconfig.go | 22 +++++ objects/all.go | 15 ++- objects/capi | 70 ++++++++++++++ objects/capi.go | 116 ++++++++++++++++++++++++ 7 files changed, 364 insertions(+), 98 deletions(-) create mode 100644 kind/controlplane/kubeconfig.go create mode 100644 objects/capi create mode 100644 objects/capi.go diff --git a/cmd/capdctl/main.go b/cmd/capdctl/main.go index 53246f1..9b59bd9 100644 --- a/cmd/capdctl/main.go +++ b/cmd/capdctl/main.go @@ -17,24 +17,23 @@ limitations under the License. package main import ( - "archive/tar" - "bytes" - "compress/gzip" "encoding/json" "flag" "fmt" - "io" - "io/ioutil" - "net/http" "os" - "strings" "github.com/pkg/errors" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/cli-runtime/pkg/genericclioptions/resource" + "k8s.io/client-go/discovery" + "k8s.io/client-go/rest" + "k8s.io/client-go/restmapper" "sigs.k8s.io/cluster-api-provider-docker/kind/controlplane" + "sigs.k8s.io/cluster-api-provider-docker/objects" _ "sigs.k8s.io/cluster-api-provider-docker/objects" "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - "sigs.k8s.io/kind/pkg/exec" ) // TODO: Generate the RBAC stuff from somewhere instead of copy pasta @@ -254,31 +253,71 @@ func makeManagementCluster(clusterName, capiVersion, capdImage, capiImageOverrid panic(err) } - f, err := ioutil.TempFile("", "crds") + fmt.Println("Downloading the latest CRDs for CAPI version", capiVersion) + objects, err := objects.GetAll(capiVersion, capiImage, capdImage) if err != nil { panic(err) } - defer os.Remove(f.Name()) - fmt.Println("Downloading the latest CRDs for CAPI version", capiVersion) - crds, err := getCRDs(capiVersion, capiImage) + + fmt.Println("Applying the control plane") + + cfg, err := controlplane.GetKubeconfig(clusterName) if err != nil { panic(err) } - fmt.Fprintln(f, crds) - fmt.Fprintln(f, "---") - fmt.Fprintln(f, capdRBAC) - fmt.Fprintln(f, "---") - fmt.Fprintln(f, getCAPDPlane(capdImage)) - fmt.Println("Applying the control plane", f.Name()) - cmd := exec.Command("kubectl", "apply", "-f", f.Name()) - cmd.SetEnv(fmt.Sprintf("KUBECONFIG=%s/.kube/kind-config-%s", os.Getenv("HOME"), clusterName)) - cmd.SetStdout(os.Stdout) - cmd.SetStderr(os.Stderr) - if err := cmd.Run(); err != nil { - out, _ := ioutil.ReadFile(f.Name()) - fmt.Println(out) + + helper, err := NewAPIHelper(cfg) + if err != nil { panic(err) } + + for _, obj := range objects { + if helper.Create(obj); err != nil { + panic(err) + } + } +} + +type APIHelper struct { + client rest.Interface + mapper meta.RESTMapper +} + +func NewAPIHelper(cfg *rest.Config) (*APIHelper, error) { + discover, err := discovery.NewDiscoveryClientForConfig(cfg) + if err != nil { + return nil, errors.Wrap(err, "could not create discovery client") + } + groupResources, err := restmapper.GetAPIGroupResources(discover) + if err != nil { + return nil, errors.Wrap(err, "could not get api group resources") + } + mapper := restmapper.NewDiscoveryRESTMapper(groupResources) + + client, err := rest.RESTClientFor(cfg) + if err != nil { + return nil, errors.Wrap(err, "failed to create REST client") + } + + return &APIHelper{ + client, + mapper, + }, nil +} + +func (a *APIHelper) Create(obj runtime.Object) error { + accessor, err := meta.Accessor(obj) + if err != nil { + return errors.Wrap(err, "couldn't create accessor") + } + + mapping, err := a.mapper.RESTMapping( + obj.GetObjectKind().GroupVersionKind().GroupKind(), + obj.GetObjectKind().GroupVersionKind().Version, + ) + + _, err = resource.NewHelper(a.client, mapping).Create(accessor.GetNamespace(), true, obj, nil) + return errors.Wrapf(err, "failed to create object %q", accessor.GetName()) } func getCAPDPlane(capdImage string) string { @@ -343,73 +382,6 @@ spec: operator: Exists ` -// getCRDs should actually use kustomize to correctly build the manager yaml. -// HACK: this is a hacked function -func getCRDs(version, capiImage string) (string, error) { - crds := []string{"crds", "rbac", "manager"} - releaseCode := fmt.Sprintf("https://github.com/kubernetes-sigs/cluster-api/archive/%s.tar.gz", version) - - resp, err := http.Get(releaseCode) - if err != nil { - return "", errors.WithStack(err) - } - - gz, err := gzip.NewReader(resp.Body) - if err != nil { - return "", errors.WithStack(err) - } - - tgz := tar.NewReader(gz) - var buf bytes.Buffer - - for { - header, err := tgz.Next() - - if err == io.EOF { - break - } - - if err != nil { - return "", errors.WithStack(err) - } - - switch header.Typeflag { - case tar.TypeDir: - continue - case tar.TypeReg: - for _, crd := range crds { - // Skip the kustomization files for now. Would like to use kustomize in future - if strings.HasSuffix(header.Name, "kustomization.yaml") { - continue - } - - // This is a poor person's kustomize - if strings.HasSuffix(header.Name, "manager.yaml") { - var managerBuf bytes.Buffer - io.Copy(&managerBuf, tgz) - lines := strings.Split(managerBuf.String(), "\n") - for _, line := range lines { - if strings.Contains(line, "image:") { - buf.WriteString(strings.Replace(line, "image: controller:latest", fmt.Sprintf("image: %s", capiImage), 1)) - buf.WriteString("\n") - continue - } - buf.WriteString(line) - buf.WriteString("\n") - } - } - - // These files don't need kustomize at all. - if strings.Contains(header.Name, fmt.Sprintf("config/%s/", crd)) { - io.Copy(&buf, tgz) - fmt.Fprintln(&buf, "---") - } - } - } - } - return buf.String(), nil -} - var capdRBAC = `apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: diff --git a/go.mod b/go.mod index 4c600f8..1f4a874 100644 --- a/go.mod +++ b/go.mod @@ -21,9 +21,10 @@ require ( golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 // indirect golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect - k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b + k8s.io/api v0.0.0-20190703205437-39734b2a72fe k8s.io/apiextensions-apiserver v0.0.0-20181213153335-0fe22c71c476 // indirect - k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d + k8s.io/apimachinery v0.0.0-20190703205208-4cfb76a8bf76 + k8s.io/cli-runtime v0.0.0-20190704050804-7ea68ffa02c5 k8s.io/client-go v11.0.0+incompatible k8s.io/cluster-bootstrap v0.0.0-20181213155137-5f9271efc2e7 // indirect k8s.io/klog v0.3.0 @@ -37,6 +38,7 @@ require ( replace ( k8s.io/api => k8s.io/api v0.0.0-20181213150558-05914d821849 k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.0.0-20190704050804-bd8686edbd81 k8s.io/client-go => k8s.io/client-go v10.0.0+incompatible k8s.io/kubernetes => k8s.io/kubernetes v1.13.1 ) diff --git a/go.sum b/go.sum index c0030f2..598f7e6 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,11 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= @@ -10,19 +13,29 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/appscode/jsonpatch v0.0.0-20190108182946-7c0e3b262f30 h1:Kn3rqvbUFqSepE2OqVu0Pn1CbDw9IuMlONapol0zuwk= github.com/appscode/jsonpatch v0.0.0-20190108182946-7c0e3b262f30/go.mod h1:4AJxUpXUhv4N+ziTvIcWWXgeorXpxPZOfk9HdEVr96M= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -34,15 +47,30 @@ github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aA github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.0 h1:FTUMcX77w5rQkClIzDtTxvn6Bsa894CcrzNj2MMfeg8= +github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0 h1:yJW3HCkTHg7NOA+gZ83IPHzUSnUzGXhGmsdiCcMexbA= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk= +github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.0 h1:A4SZ6IWh3lnjH0rG0Z5lkxazMGBECtrZcbyYQi+64k4= github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.17.2 h1:K/ycE/XTUDFltNHSO32cGRUhrVGJD64o8WgAIZNyc3k= +github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= @@ -67,6 +95,7 @@ github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc h1:f8eY6cV/x1x github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= @@ -80,11 +109,20 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -98,6 +136,7 @@ github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c h1:eSfnfIuwhxZyULg1NNu github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= @@ -116,20 +155,32 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.0-20180319062004-c439c4fa0937/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.4 h1:S0tLZ3VOKl2Te0hpq8+ke0eSJPfCnNTPiDlsfwi1/NE= +github.com/spf13/cobra v0.0.4/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= @@ -137,48 +188,74 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190514140710-3ec191127204 h1:4yG6GqBtw9C+UrLp6s2wtSniayy/Vd/3F7ffLE427XI= golang.org/x/net v0.0.0-20190514140710-3ec191127204/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= k8s.io/api v0.0.0-20181213150558-05914d821849 h1:WZFcFPXmLR7g5CxQNmjWv0mg8qulJLxDghbzS4pQtzY= k8s.io/api v0.0.0-20181213150558-05914d821849/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/apiextensions-apiserver v0.0.0-20181213153335-0fe22c71c476 h1:Ws9zfxsgV19Durts9ftyTG7TO0A/QLhmu98VqNWLiH8= k8s.io/apiextensions-apiserver v0.0.0-20181213153335-0fe22c71c476/go.mod h1:IxkesAMoaCRoLrPJdZNZUQp9NfZnzqaVzLhb2VEQzXE= k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93 h1:tT6oQBi0qwLbbZSfDkdIsb23EwaLY85hoAV4SpXfdao= k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/cli-runtime v0.0.0-20181213153952-835b10687cb6 h1:VCcOQ34dGCCgCCJIXgYGeqvr+X3qaMdfC+EYCsQoTTU= +k8s.io/cli-runtime v0.0.0-20181213153952-835b10687cb6/go.mod h1:qWnH3/b8sp/l7EvlDh7ulDU3UWA4P4N1NFbEEP791tM= +k8s.io/cli-runtime v0.0.0-20190703205208-cbd7455f4bce h1:dpKc4TTECHtkmznbkHTTt04LvVdehEtRhcj+ua0XxOE= +k8s.io/cli-runtime v0.0.0-20190703205208-cbd7455f4bce/go.mod h1:fEQcbuYGh3C5QA/zvlTJKRMybd95KaEbTryQUUJkrpE= +k8s.io/cli-runtime v0.0.0-20190704050804-7ea68ffa02c5 h1:F/pAp9KvuqaKLwVb1uWPXiv2jdZ8fqyXR6+6xQRn700= +k8s.io/cli-runtime v0.0.0-20190704050804-7ea68ffa02c5/go.mod h1:HYxpxDR0QWcp5ciJglNRCgbtZ9hlQLFd61jzH0V6668= +k8s.io/cli-runtime v0.0.0-20190704050804-bd8686edbd81 h1:2dm1cW5BXLyYnvX98poUqE5a7j57+xvRi84/LvXoECg= +k8s.io/cli-runtime v0.0.0-20190704050804-bd8686edbd81/go.mod h1:qWnH3/b8sp/l7EvlDh7ulDU3UWA4P4N1NFbEEP791tM= k8s.io/client-go v10.0.0+incompatible h1:F1IqCqw7oMBzDkqlcBymRq1450wD0eNqLE9jzUrIi34= k8s.io/client-go v10.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/cluster-bootstrap v0.0.0-20181213155137-5f9271efc2e7 h1:OKcz0eE/wbdRmbu4CCgcbjJ1BUBoljqJiPL/4MAS04w= diff --git a/kind/controlplane/kubeconfig.go b/kind/controlplane/kubeconfig.go new file mode 100644 index 0000000..da69e1f --- /dev/null +++ b/kind/controlplane/kubeconfig.go @@ -0,0 +1,22 @@ +package controlplane + +import ( + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" + "sigs.k8s.io/kind/pkg/cluster" +) + +// TODO: Add version number? +const userAgent = "capdctl" + +func GetKubeconfig(clusterName string) (*rest.Config, error) { + ctx := cluster.NewContext(clusterName) + path := ctx.KubeConfigPath() + + cfg, err := clientcmd.BuildConfigFromFlags("", path) + if err != nil { + return nil, err + } + + return rest.AddUserAgent(cfg, userAgent), err +} diff --git a/objects/all.go b/objects/all.go index e020871..32cc15b 100644 --- a/objects/all.go +++ b/objects/all.go @@ -1,17 +1,24 @@ package objects -import "k8s.io/apimachinery/pkg/runtime" +import ( + "k8s.io/apimachinery/pkg/runtime" +) + +func GetAll(version, capiImage, capdImage string) ([]runtime.Object, error) { + capiObjects, err := GetCAPI(version, capiImage) + if err != nil { + return []runtime.Object{}, err + } -func GetAll(capdImage string) []runtime.Object { namespaceObj := GetNamespace() statefulSet := GetStatefulSet(capdImage) clusterRole := GetClusterRole() clusterRoleBinding := GetClusterRoleBinding() - return []runtime.Object{ + return append(capiObjects, &namespaceObj, &statefulSet, &clusterRole, &clusterRoleBinding, - } + ), nil } diff --git a/objects/capi b/objects/capi new file mode 100644 index 0000000..b05a432 --- /dev/null +++ b/objects/capi @@ -0,0 +1,70 @@ +package objects + +// getCRDs should actually use kustomize to correctly build the manager yaml. +// HACK: this is a hacked function +func getCAPIYAML(version, capiImage string) (string, error) { + crds := []string{"crds", "rbac", "manager"} + releaseCode := fmt.Sprintf("https://github.com/kubernetes-sigs/cluster-api/archive/%s.tar.gz", version) + + resp, err := http.Get(releaseCode) + if err != nil { + return "", errors.WithStack(err) + } + + gz, err := gzip.NewReader(resp.Body) + if err != nil { + return "", errors.WithStack(err) + } + + tgz := tar.NewReader(gz) + var buf bytes.Buffer + + for { + header, err := tgz.Next() + + if err == io.EOF { + break + } + + if err != nil { + return "", errors.WithStack(err) + } + + switch header.Typeflag { + case tar.TypeDir: + continue + case tar.TypeReg: + for _, crd := range crds { + // Skip the kustomization files for now. Would like to use kustomize in future + if strings.HasSuffix(header.Name, "kustomization.yaml") { + continue + } + + // This is a poor person's kustomize + if strings.HasSuffix(header.Name, "manager.yaml") { + var managerBuf bytes.Buffer + io.Copy(&managerBuf, tgz) + lines := strings.Split(managerBuf.String(), "\n") + for _, line := range lines { + if strings.Contains(line, "image:") { + buf.WriteString(strings.Replace(line, "image: controller:latest", fmt.Sprintf("image: %s", capiImage), 1)) + buf.WriteString("\n") + continue + } + buf.WriteString(line) + buf.WriteString("\n") + } + } + + // These files don't need kustomize at all. + if strings.Contains(header.Name, fmt.Sprintf("config/%s/", crd)) { + io.Copy(&buf, tgz) + fmt.Fprintln(&buf, "---") + } + } + } + } + return buf.String(), nil +} + +func getCAPIObjects \ No newline at end of file diff --git a/objects/capi.go b/objects/capi.go new file mode 100644 index 0000000..4b03c3b --- /dev/null +++ b/objects/capi.go @@ -0,0 +1,116 @@ +package objects + +import ( + "archive/tar" + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "net/http" + "strings" + + "github.com/pkg/errors" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer/streaming" + "k8s.io/kubernetes/pkg/kubectl/scheme" +) + +// getCRDs should actually use kustomize to correctly build the manager yaml. +// HACK: this is a hacked function +func getCAPIYAML(version, capiImage string) (io.Reader, error) { + crds := []string{"crds", "rbac", "manager"} + releaseCode := fmt.Sprintf("https://github.com/kubernetes-sigs/cluster-api/archive/%s.tar.gz", version) + + resp, err := http.Get(releaseCode) + if err != nil { + return nil, errors.WithStack(err) + } + + gz, err := gzip.NewReader(resp.Body) + if err != nil { + return nil, errors.WithStack(err) + } + + tgz := tar.NewReader(gz) + var buf bytes.Buffer + + for { + header, err := tgz.Next() + + if err == io.EOF { + break + } + + if err != nil { + return nil, errors.WithStack(err) + } + + switch header.Typeflag { + case tar.TypeDir: + continue + case tar.TypeReg: + for _, crd := range crds { + // Skip the kustomization files for now. Would like to use kustomize in future + if strings.HasSuffix(header.Name, "kustomization.yaml") { + continue + } + + // This is a poor person's kustomize + if strings.HasSuffix(header.Name, "manager.yaml") { + var managerBuf bytes.Buffer + io.Copy(&managerBuf, tgz) + lines := strings.Split(managerBuf.String(), "\n") + for _, line := range lines { + if strings.Contains(line, "image:") { + buf.WriteString(strings.Replace(line, "image: controller:latest", fmt.Sprintf("image: %s", capiImage), 1)) + buf.WriteString("\n") + continue + } + buf.WriteString(line) + buf.WriteString("\n") + } + } + + // These files don't need kustomize at all. + if strings.Contains(header.Name, fmt.Sprintf("config/%s/", crd)) { + io.Copy(&buf, tgz) + fmt.Fprintln(&buf, "---") + } + } + } + } + return &buf, nil +} + +func getCAPIObjects(yaml io.Reader) ([]runtime.Object, error) { + decoder := scheme.Codecs.UniversalDeserializer() + streamingDecoder := streaming.NewDecoder(ioutil.NopCloser(yaml), decoder) + + defer streamingDecoder.Close() + + objects := []runtime.Object{} + for { + obj, _, err := streamingDecoder.Decode(nil, nil) + if err == io.EOF { + break + } + + if err != nil { + return []runtime.Object{}, errors.Wrap(err, "couldn't decode CAPI object") + } + + objects = append(objects, obj) + } + + return objects, nil +} + +func GetCAPI(version, capiImage string) ([]runtime.Object, error) { + reader, err := getCAPIYAML(version, capiImage) + if err != nil { + return []runtime.Object{}, err + } + + return getCAPIObjects(reader) +} From b18543a9871ea55610cb04bbdd6101625107304b Mon Sep 17 00:00:00 2001 From: liz Date: Thu, 11 Jul 2019 11:09:35 -0400 Subject: [PATCH 05/14] Move runtime objects into objects --- cmd/capdctl/main.go | 239 ++++---------------------------------------- objects/all.go | 2 +- objects/cluster.go | 83 +++++++++++++++ 3 files changed, 101 insertions(+), 223 deletions(-) create mode 100644 objects/cluster.go diff --git a/cmd/capdctl/main.go b/cmd/capdctl/main.go index 9b59bd9..b16a703 100644 --- a/cmd/capdctl/main.go +++ b/cmd/capdctl/main.go @@ -24,7 +24,6 @@ import ( "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/cli-runtime/pkg/genericclioptions/resource" "k8s.io/client-go/discovery" @@ -33,7 +32,6 @@ import ( "sigs.k8s.io/cluster-api-provider-docker/kind/controlplane" "sigs.k8s.io/cluster-api-provider-docker/objects" _ "sigs.k8s.io/cluster-api-provider-docker/objects" - "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" ) // TODO: Generate the RBAC stuff from somewhere instead of copy pasta @@ -55,12 +53,12 @@ func (mo *machineOptions) initFlags(fs *flag.FlagSet) { mo.version = fs.String("version", "v1.14.2", "The Kubernetes version to run") } -type machineDeyploymentOptions struct { +type machineDeploymentOptions struct { name, namespace, clusterName, kubeletVersion *string replicas *int } -func (mo *machineDeyploymentOptions) initFlags(fs *flag.FlagSet) { +func (mo *machineDeploymentOptions) initFlags(fs *flag.FlagSet) { mo.name = fs.String("name", "my-machine-deployment", "The name of the machine deployment") mo.namespace = fs.String("namespace", "my-namespace", "The namespace of the machine deployment") mo.clusterName = fs.String("cluster-name", "my-cluster", "The name of the cluster the machine deployment creates machines for") @@ -90,7 +88,7 @@ func main() { clusterNamespace := cluster.String("namespace", "my-namespace", "The namespace the cluster belongs to") machineDeployment := flag.NewFlagSet("machine-deployment", flag.ExitOnError) - machineDeploymentOpts := new(machineDeyploymentOptions) + machineDeploymentOpts := new(machineDeploymentOptions) machineDeploymentOpts.initFlags(machineDeployment) if len(os.Args) < 2 { @@ -151,90 +149,24 @@ subcommands are: ` } -func clusterYAML(name, namespace string) string { - return fmt.Sprintf(`apiVersion: "cluster.k8s.io/v1alpha1" -kind: Cluster -metadata: - name: %s - namespace: %s -spec: - clusterNetwork: - services: - cidrBlocks: ["10.96.0.0/12"] - pods: - cidrBlocks: ["192.168.0.0/16"] - serviceDomain: "cluster.local" - providerSpec: {}`, name, namespace) +func clusterYAML(clusterName, namespace string) string { + cluster := objects.GetCluster(clusterName, namespace) + return marshal(&cluster) } -func machineDeploymentYAML(opts *machineDeyploymentOptions) string { - replicas := int32(*opts.replicas) - labels := map[string]string{ - "cluster.k8s.io/cluster-name": *opts.clusterName, - "set": "node", - } - deployment := v1alpha1.MachineDeployment{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineDeployment", - APIVersion: "cluster.k8s.io/v1alpha1", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: *opts.name, - Namespace: *opts.namespace, - Labels: labels, - }, - Spec: v1alpha1.MachineDeploymentSpec{ - Replicas: &replicas, - Selector: metav1.LabelSelector{ - MatchLabels: labels, - }, - Template: v1alpha1.MachineTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: labels, - }, - Spec: v1alpha1.MachineSpec{ - ProviderSpec: v1alpha1.ProviderSpec{}, - Versions: v1alpha1.MachineVersionInfo{ - Kubelet: *opts.kubeletVersion, - }, - }, - }, - }, - } +func machineYAML(opts *machineOptions) string { + machine := objects.GetMachine(*opts.name, *opts.namespace, *opts.clusterName, *opts.set, *opts.version) + return marshal(&machine) +} + +func machineDeploymentYAML(opts *machineDeploymentOptions) string { + machineDeploy := objects.GetMachineDeployment(*opts.name, *opts.namespace, *opts.clusterName, *opts.kubeletVersion, int32(*opts.replicas)) + return marshal(&machineDeploy) - b, err := json.Marshal(deployment) - // TODO don't panic on the error - if err != nil { - panic(err) - } - return string(b) } -func machineYAML(opts *machineOptions) string { - machine := v1alpha1.Machine{ - TypeMeta: metav1.TypeMeta{ - Kind: "Machine", - APIVersion: "cluster.k8s.io/v1alpha1", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: *opts.name, - Namespace: *opts.namespace, - Labels: map[string]string{ - "cluster.k8s.io/cluster-name": *opts.clusterName, - "set": *opts.set, - }, - }, - Spec: v1alpha1.MachineSpec{ - ProviderSpec: v1alpha1.ProviderSpec{}, - }, - } - if *opts.set == controlPlaneSet { - machine.Spec.Versions.ControlPlane = *opts.version - } - if *opts.set == "worker" { - machine.Spec.Versions.Kubelet = *opts.version - } - b, err := json.Marshal(machine) +func marshal(obj runtime.Object) string { + b, err := json.Marshal(obj) // TODO don't panic on the error if err != nil { panic(err) @@ -254,7 +186,7 @@ func makeManagementCluster(clusterName, capiVersion, capdImage, capiImageOverrid } fmt.Println("Downloading the latest CRDs for CAPI version", capiVersion) - objects, err := objects.GetAll(capiVersion, capiImage, capdImage) + objects, err := objects.GetManegementCluster(capiVersion, capiImage, capdImage) if err != nil { panic(err) } @@ -319,140 +251,3 @@ func (a *APIHelper) Create(obj runtime.Object) error { _, err = resource.NewHelper(a.client, mapping).Create(accessor.GetNamespace(), true, obj, nil) return errors.Wrapf(err, "failed to create object %q", accessor.GetName()) } - -func getCAPDPlane(capdImage string) string { - return fmt.Sprintf(capiPlane, capdImage) -} - -var capiPlane = ` -apiVersion: v1 -kind: Namespace -metadata: - labels: - controller-tools.k8s.io: "1.0" - name: docker-provider-system ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - labels: - control-plane: controller-manager - name: docker-provider-controller-manager - namespace: docker-provider-system -spec: - selector: - matchLabels: - control-plane: controller-manager - serviceName: docker-provider-controller-manager-service - template: - metadata: - labels: - control-plane: controller-manager - spec: - containers: - - name: capd-manager - image: %s - command: - - capd-manager - volumeMounts: - - mountPath: /var/run/docker.sock - name: dockersock - - mountPath: /var/lib/docker - name: dockerlib - securityContext: - privileged: true - volumes: - - name: dockersock - hostPath: - path: /var/run/docker.sock - type: Socket - - name: dockerlib - hostPath: - path: /var/lib/docker - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - key: CriticalAddonsOnly - operator: Exists - - effect: NoExecute - key: node.alpha.kubernetes.io/notReady - operator: Exists - - effect: NoExecute - key: node.alpha.kubernetes.io/unreachable - operator: Exists -` - -var capdRBAC = `apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: docker-provider-manager-role -rules: -- apiGroups: - - cluster.k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - cluster.k8s.io - resources: - - machines - - machines/status - - machinedeployments - - machinedeployments/status - - machinesets - - machinesets/status - - machineclasses - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - cluster.k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - nodes - - events - - secrets - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - creationTimestamp: null - name: docker-provider-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: docker-provider-manager-role -subjects: -- kind: ServiceAccount - name: default - namespace: docker-provider-syste -` diff --git a/objects/all.go b/objects/all.go index 32cc15b..f854d82 100644 --- a/objects/all.go +++ b/objects/all.go @@ -4,7 +4,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) -func GetAll(version, capiImage, capdImage string) ([]runtime.Object, error) { +func GetManegementCluster(version, capiImage, capdImage string) ([]runtime.Object, error) { capiObjects, err := GetCAPI(version, capiImage) if err != nil { return []runtime.Object{}, err diff --git a/objects/cluster.go b/objects/cluster.go new file mode 100644 index 0000000..dc372c2 --- /dev/null +++ b/objects/cluster.go @@ -0,0 +1,83 @@ +package objects + +import ( + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + capi "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" +) + +const controlPlaneSet = "controlplane" + +func GetMachineDeployment(name, namespace, clusterName, kubeletVersion string, replicas int32) capi.MachineDeployment { + labels := map[string]string{ + "cluster.k8s.io/cluster-name": clusterName, + "set": "node", + } + return capi.MachineDeployment{ + ObjectMeta: meta.ObjectMeta{ + Name: name, + Namespace: namespace, + Labels: labels, + }, + Spec: capi.MachineDeploymentSpec{ + Replicas: &replicas, + Selector: meta.LabelSelector{ + MatchLabels: labels, + }, + Template: capi.MachineTemplateSpec{ + ObjectMeta: meta.ObjectMeta{ + Labels: labels, + }, + Spec: capi.MachineSpec{ + ProviderSpec: capi.ProviderSpec{}, + Versions: capi.MachineVersionInfo{ + Kubelet: kubeletVersion, + }, + }, + }, + }, + } +} + +func GetCluster(clusterName, namespace string) capi.Cluster { + return capi.Cluster{ + ObjectMeta: meta.ObjectMeta{ + Name: clusterName, + Namespace: namespace, + }, + Spec: capi.ClusterSpec{ + ClusterNetwork: capi.ClusterNetworkingConfig{ + Services: capi.NetworkRanges{ + CIDRBlocks: []string{"10.96.0.0/12"}, + }, + Pods: capi.NetworkRanges{ + CIDRBlocks: []string{"192.168.0.0/16"}, + }, + ServiceDomain: "cluster.local", + }, + }, + } +} + +func GetMachine(name, namespace, clusterName, set, version string) capi.Machine { + machine := capi.Machine{ + ObjectMeta: meta.ObjectMeta{ + Name: name, + Namespace: namespace, + Labels: map[string]string{ + "cluster.k8s.io/cluster-name": clusterName, + "set": set, + }, + }, + Spec: capi.MachineSpec{ + ProviderSpec: capi.ProviderSpec{}, + }, + } + if set == controlPlaneSet { + machine.Spec.Versions.ControlPlane = version + } + if set == "worker" { + machine.Spec.Versions.Kubelet = version + } + + return machine +} From 0e7a0bf5967a903214071f80696b58a692aa5124 Mon Sep 17 00:00:00 2001 From: liz Date: Thu, 11 Jul 2019 13:02:25 -0400 Subject: [PATCH 06/14] Properly parse the capi documents --- go.mod | 7 ++++++- go.sum | 13 ++++++++++++ objects/capi.go | 53 +++++++++++++++++++++++++++++++++---------------- 3 files changed, 55 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 1f4a874..6d907fc 100644 --- a/go.mod +++ b/go.mod @@ -18,9 +18,14 @@ require ( go.uber.org/atomic v1.4.0 // indirect go.uber.org/multierr v1.1.0 // indirect go.uber.org/zap v1.10.0 // indirect + golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 // indirect + golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 // indirect - golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect + golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 // indirect + golang.org/x/text v0.3.2 // indirect golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect + golang.org/x/tools v0.0.0-20190710184609-286818132824 // indirect + golang.org/x/tools/gopls v0.1.3 // indirect k8s.io/api v0.0.0-20190703205437-39734b2a72fe k8s.io/apiextensions-apiserver v0.0.0-20181213153335-0fe22c71c476 // indirect k8s.io/apimachinery v0.0.0-20190703205208-4cfb76a8bf76 diff --git a/go.sum b/go.sum index 598f7e6..dd037ef 100644 --- a/go.sum +++ b/go.sum @@ -193,6 +193,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90Pveol golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -204,10 +206,14 @@ golang.org/x/net v0.0.0-20190514140710-3ec191127204 h1:4yG6GqBtw9C+UrLp6s2wtSnia golang.org/x/net v0.0.0-20190514140710-3ec191127204/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -219,6 +225,8 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 h1:6ZQFf1D2YYDDI7eSwW8adlkkavTB9sw5I24FVtEvNUQ= +golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -230,6 +238,11 @@ golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190710153321-831012c29e42/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190710184609-286818132824 h1:dOGf5KG5e5tnConXcTAnHv2YgmYJtrYjN9b1cMC21TY= +golang.org/x/tools v0.0.0-20190710184609-286818132824/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools/gopls v0.1.3 h1:CB5ECiPysqZrwxcyRjN+exyZpY0gODTZvNiqQi3lpeo= +golang.org/x/tools/gopls v0.1.3/go.mod h1:vrCQzOKxvuiZLjCKSmbbov04oeBQQOb4VQqwYK2PWIY= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/objects/capi.go b/objects/capi.go index 4b03c3b..6ff4e26 100644 --- a/objects/capi.go +++ b/objects/capi.go @@ -2,17 +2,17 @@ package objects import ( "archive/tar" + "bufio" "bytes" "compress/gzip" "fmt" "io" - "io/ioutil" "net/http" "strings" "github.com/pkg/errors" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/serializer/streaming" "k8s.io/kubernetes/pkg/kubectl/scheme" ) @@ -80,27 +80,46 @@ func getCAPIYAML(version, capiImage string) (io.Reader, error) { } } } - return &buf, nil + s := buf.String() + fmt.Printf("<<<<<<>>>>>>\n%s\n<<<<<<<<<>>>>>>>>\n", s) + + return strings.NewReader(s), nil } -func getCAPIObjects(yaml io.Reader) ([]runtime.Object, error) { +func decodeCAPIObjects(yaml io.Reader) ([]runtime.Object, error) { decoder := scheme.Codecs.UniversalDeserializer() - streamingDecoder := streaming.NewDecoder(ioutil.NopCloser(yaml), decoder) - - defer streamingDecoder.Close() - objects := []runtime.Object{} + readbuf := bufio.NewReader(yaml) + writebuf := &bytes.Buffer{} + for { - obj, _, err := streamingDecoder.Decode(nil, nil) - if err == io.EOF { - break - } + line, err := readbuf.ReadBytes('\n') + // End of an object, parse it + if err == io.EOF || bytes.Equal(line, []byte("---\n")) { + + // Use unstructured because scheme may not know about CRDs + if writebuf.Len() > 1 { + obj, _, err := decoder.Decode(writebuf.Bytes(), nil, &unstructured.Unstructured{}) + if err == nil { + objects = append(objects, obj) + } else { + return []runtime.Object{}, errors.Wrap(err, "couldn't decode CAPI object") + } + } - if err != nil { - return []runtime.Object{}, errors.Wrap(err, "couldn't decode CAPI object") - } + // previously we didn't care if this was EOF or ---, but now we need to break the loop + if err == io.EOF { + break + } - objects = append(objects, obj) + // No matter what happened, start over + writebuf.Reset() + } else if err != nil { + return []runtime.Object{}, errors.Wrap(err, "couldn't read YAML") + } else { + // Just an ordinary line + writebuf.Write(line) + } } return objects, nil @@ -112,5 +131,5 @@ func GetCAPI(version, capiImage string) ([]runtime.Object, error) { return []runtime.Object{}, err } - return getCAPIObjects(reader) + return decodeCAPIObjects(reader) } From d39da206647ee94e959ac58379f7e1d43e12edf0 Mon Sep 17 00:00:00 2001 From: liz Date: Thu, 11 Jul 2019 14:11:15 -0400 Subject: [PATCH 07/14] Fix not returning errors from mapping --- cmd/capdctl/main.go | 20 ++++++++++---------- objects/capi.go | 5 +---- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/cmd/capdctl/main.go b/cmd/capdctl/main.go index b16a703..9f4d6dc 100644 --- a/cmd/capdctl/main.go +++ b/cmd/capdctl/main.go @@ -226,13 +226,8 @@ func NewAPIHelper(cfg *rest.Config) (*APIHelper, error) { } mapper := restmapper.NewDiscoveryRESTMapper(groupResources) - client, err := rest.RESTClientFor(cfg) - if err != nil { - return nil, errors.Wrap(err, "failed to create REST client") - } - return &APIHelper{ - client, + discover.RESTClient(), mapper, }, nil } @@ -243,10 +238,15 @@ func (a *APIHelper) Create(obj runtime.Object) error { return errors.Wrap(err, "couldn't create accessor") } - mapping, err := a.mapper.RESTMapping( - obj.GetObjectKind().GroupVersionKind().GroupKind(), - obj.GetObjectKind().GroupVersionKind().Version, - ) + gvk := obj.GetObjectKind().GroupVersionKind() + + mapping, err := a.mapper.RESTMapping(gvk.GroupKind(), gvk.Version) + + if err != nil { + return errors.Wrapf(err, "failed to retrieve mapping for %s %s", gvk.String(), accessor.GetName()) + } + + fmt.Printf("Creating %s %s\n", gvk.String(), accessor.GetName()) _, err = resource.NewHelper(a.client, mapping).Create(accessor.GetNamespace(), true, obj, nil) return errors.Wrapf(err, "failed to create object %q", accessor.GetName()) diff --git a/objects/capi.go b/objects/capi.go index 6ff4e26..c4eaac9 100644 --- a/objects/capi.go +++ b/objects/capi.go @@ -80,10 +80,7 @@ func getCAPIYAML(version, capiImage string) (io.Reader, error) { } } } - s := buf.String() - fmt.Printf("<<<<<<>>>>>>\n%s\n<<<<<<<<<>>>>>>>>\n", s) - - return strings.NewReader(s), nil + return &buf, nil } func decodeCAPIObjects(yaml io.Reader) ([]runtime.Object, error) { From 4265d22e57321c8cad928253ea1eb340c38aa40f Mon Sep 17 00:00:00 2001 From: liz Date: Thu, 11 Jul 2019 14:41:29 -0400 Subject: [PATCH 08/14] Seperate apply step out --- cmd/capdctl/main.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/capdctl/main.go b/cmd/capdctl/main.go index 9f4d6dc..5d4ae35 100644 --- a/cmd/capdctl/main.go +++ b/cmd/capdctl/main.go @@ -101,6 +101,8 @@ func main() { case "setup": setup.Parse(os.Args[2:]) makeManagementCluster(*managementClusterName, *version, *capdImage, *capiImage) + case "apply": + applyControlPlane(*managementClusterName, *version, *capiImage, *capdImage) case "control-plane": controlPlane.Parse(os.Args[2:]) fmt.Fprintf(os.Stdout, machineYAML(controlPlaneOpts)) @@ -185,6 +187,10 @@ func makeManagementCluster(clusterName, capiVersion, capdImage, capiImageOverrid panic(err) } + applyControlPlane(clusterName, capiVersion, capiImage, capdImage) +} + +func applyControlPlane(clusterName, capiVersion, capiImage, capdImage string) { fmt.Println("Downloading the latest CRDs for CAPI version", capiVersion) objects, err := objects.GetManegementCluster(capiVersion, capiImage, capdImage) if err != nil { @@ -246,7 +252,7 @@ func (a *APIHelper) Create(obj runtime.Object) error { return errors.Wrapf(err, "failed to retrieve mapping for %s %s", gvk.String(), accessor.GetName()) } - fmt.Printf("Creating %s %s\n", gvk.String(), accessor.GetName()) + fmt.Printf("Creating %s %s in %s\n", gvk.String(), accessor.GetName(), accessor.GetNamespace()) _, err = resource.NewHelper(a.client, mapping).Create(accessor.GetNamespace(), true, obj, nil) return errors.Wrapf(err, "failed to create object %q", accessor.GetName()) From 0025dbbec365ef42a66b06d8fbd15e6f74c90f43 Mon Sep 17 00:00:00 2001 From: liz Date: Thu, 11 Jul 2019 17:17:10 -0400 Subject: [PATCH 09/14] Delete unneeded file --- objects/capi | 70 ---------------------------------------------------- 1 file changed, 70 deletions(-) delete mode 100644 objects/capi diff --git a/objects/capi b/objects/capi deleted file mode 100644 index b05a432..0000000 --- a/objects/capi +++ /dev/null @@ -1,70 +0,0 @@ -package objects - -// getCRDs should actually use kustomize to correctly build the manager yaml. -// HACK: this is a hacked function -func getCAPIYAML(version, capiImage string) (string, error) { - crds := []string{"crds", "rbac", "manager"} - releaseCode := fmt.Sprintf("https://github.com/kubernetes-sigs/cluster-api/archive/%s.tar.gz", version) - - resp, err := http.Get(releaseCode) - if err != nil { - return "", errors.WithStack(err) - } - - gz, err := gzip.NewReader(resp.Body) - if err != nil { - return "", errors.WithStack(err) - } - - tgz := tar.NewReader(gz) - var buf bytes.Buffer - - for { - header, err := tgz.Next() - - if err == io.EOF { - break - } - - if err != nil { - return "", errors.WithStack(err) - } - - switch header.Typeflag { - case tar.TypeDir: - continue - case tar.TypeReg: - for _, crd := range crds { - // Skip the kustomization files for now. Would like to use kustomize in future - if strings.HasSuffix(header.Name, "kustomization.yaml") { - continue - } - - // This is a poor person's kustomize - if strings.HasSuffix(header.Name, "manager.yaml") { - var managerBuf bytes.Buffer - io.Copy(&managerBuf, tgz) - lines := strings.Split(managerBuf.String(), "\n") - for _, line := range lines { - if strings.Contains(line, "image:") { - buf.WriteString(strings.Replace(line, "image: controller:latest", fmt.Sprintf("image: %s", capiImage), 1)) - buf.WriteString("\n") - continue - } - buf.WriteString(line) - buf.WriteString("\n") - } - } - - // These files don't need kustomize at all. - if strings.Contains(header.Name, fmt.Sprintf("config/%s/", crd)) { - io.Copy(&buf, tgz) - fmt.Fprintln(&buf, "---") - } - } - } - } - return buf.String(), nil -} - -func getCAPIObjects \ No newline at end of file From 1bca27d3710dac77cb777f9ac65f357eea2c75ba Mon Sep 17 00:00:00 2001 From: liz Date: Thu, 11 Jul 2019 17:44:11 -0400 Subject: [PATCH 10/14] POST resources, not by name --- cmd/capdctl/main.go | 56 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/cmd/capdctl/main.go b/cmd/capdctl/main.go index 5d4ae35..2f95b4d 100644 --- a/cmd/capdctl/main.go +++ b/cmd/capdctl/main.go @@ -25,10 +25,12 @@ import ( "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/cli-runtime/pkg/genericclioptions/resource" "k8s.io/client-go/discovery" "k8s.io/client-go/rest" "k8s.io/client-go/restmapper" + "k8s.io/klog" "sigs.k8s.io/cluster-api-provider-docker/kind/controlplane" "sigs.k8s.io/cluster-api-provider-docker/objects" _ "sigs.k8s.io/cluster-api-provider-docker/objects" @@ -91,6 +93,9 @@ func main() { machineDeploymentOpts := new(machineDeploymentOptions) machineDeploymentOpts.initFlags(machineDeployment) + kflags := flag.NewFlagSet("klog", flag.ExitOnError) + klog.InitFlags(kflags) + if len(os.Args) < 2 { fmt.Println("At least one subcommand is requied.") fmt.Println(usage()) @@ -102,6 +107,7 @@ func main() { setup.Parse(os.Args[2:]) makeManagementCluster(*managementClusterName, *version, *capdImage, *capiImage) case "apply": + kflags.Parse(os.Args[2:]) applyControlPlane(*managementClusterName, *version, *capiImage, *capdImage) case "control-plane": controlPlane.Parse(os.Args[2:]) @@ -121,6 +127,8 @@ func main() { fmt.Println(usage()) os.Exit(1) } + + klog.Flush() } func usage() string { @@ -217,7 +225,7 @@ func applyControlPlane(clusterName, capiVersion, capiImage, capdImage string) { } type APIHelper struct { - client rest.Interface + cfg *rest.Config mapper meta.RESTMapper } @@ -226,6 +234,7 @@ func NewAPIHelper(cfg *rest.Config) (*APIHelper, error) { if err != nil { return nil, errors.Wrap(err, "could not create discovery client") } + groupResources, err := restmapper.GetAPIGroupResources(discover) if err != nil { return nil, errors.Wrap(err, "could not get api group resources") @@ -233,27 +242,60 @@ func NewAPIHelper(cfg *rest.Config) (*APIHelper, error) { mapper := restmapper.NewDiscoveryRESTMapper(groupResources) return &APIHelper{ - discover.RESTClient(), + cfg, mapper, }, nil } func (a *APIHelper) Create(obj runtime.Object) error { + gvk := obj.GetObjectKind().GroupVersionKind() + + a.cfg.ContentConfig = resource.UnstructuredPlusDefaultContentConfig() + + client, err := rest.UnversionedRESTClientFor(a.cfg) + if err != nil { + return errors.Wrap(err, "couldn't create REST client") + } + accessor, err := meta.Accessor(obj) if err != nil { return errors.Wrap(err, "couldn't create accessor") } - gvk := obj.GetObjectKind().GroupVersionKind() - mapping, err := a.mapper.RESTMapping(gvk.GroupKind(), gvk.Version) if err != nil { return errors.Wrapf(err, "failed to retrieve mapping for %s %s", gvk.String(), accessor.GetName()) } - fmt.Printf("Creating %s %s in %s\n", gvk.String(), accessor.GetName(), accessor.GetNamespace()) + fmt.Printf("Creating %s %s in %q\n", gvk.String(), accessor.GetName(), accessor.GetNamespace()) + + result := client. + Post(). + AbsPath(makeURLSegments(mapping.Resource, "", accessor.GetNamespace())...). + Body(obj). + Do() + + return errors.Wrapf(result.Error(), "failed to create object %q", accessor.GetName()) +} + +func makeURLSegments(resource schema.GroupVersionResource, name, namespace string) []string { + url := []string{} + if len(resource.Group) == 0 { + url = append(url, "api") + } else { + url = append(url, "apis", resource.Group) + } + url = append(url, resource.Version) + + if len(namespace) > 0 { + url = append(url, "namespaces", namespace) + } + url = append(url, resource.Resource) + + if len(name) > 0 { + url = append(url, name) + } - _, err = resource.NewHelper(a.client, mapping).Create(accessor.GetNamespace(), true, obj, nil) - return errors.Wrapf(err, "failed to create object %q", accessor.GetName()) + return url } From bddd859fce50fd5feefbc314b7277a940ad0e208 Mon Sep 17 00:00:00 2001 From: liz Date: Mon, 15 Jul 2019 10:33:37 -0400 Subject: [PATCH 11/14] Use controller-runtime to create objects --- cmd/capdctl/main.go | 93 ++++--------------------------------- kind/controlplane/create.go | 5 ++ objects/control_plane.go | 2 +- 3 files changed, 15 insertions(+), 85 deletions(-) diff --git a/cmd/capdctl/main.go b/cmd/capdctl/main.go index 2f95b4d..6a8b282 100644 --- a/cmd/capdctl/main.go +++ b/cmd/capdctl/main.go @@ -17,23 +17,18 @@ limitations under the License. package main import ( + "context" "encoding/json" "flag" "fmt" "os" - "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/cli-runtime/pkg/genericclioptions/resource" - "k8s.io/client-go/discovery" - "k8s.io/client-go/rest" - "k8s.io/client-go/restmapper" "k8s.io/klog" "sigs.k8s.io/cluster-api-provider-docker/kind/controlplane" "sigs.k8s.io/cluster-api-provider-docker/objects" - _ "sigs.k8s.io/cluster-api-provider-docker/objects" + crclient "sigs.k8s.io/controller-runtime/pkg/client" ) // TODO: Generate the RBAC stuff from somewhere instead of copy pasta @@ -212,90 +207,20 @@ func applyControlPlane(clusterName, capiVersion, capiImage, capdImage string) { panic(err) } - helper, err := NewAPIHelper(cfg) + client, err := crclient.New(cfg, crclient.Options{}) if err != nil { panic(err) } for _, obj := range objects { - if helper.Create(obj); err != nil { + accessor, err := meta.Accessor(obj) + if err != nil { panic(err) } - } -} - -type APIHelper struct { - cfg *rest.Config - mapper meta.RESTMapper -} - -func NewAPIHelper(cfg *rest.Config) (*APIHelper, error) { - discover, err := discovery.NewDiscoveryClientForConfig(cfg) - if err != nil { - return nil, errors.Wrap(err, "could not create discovery client") - } - - groupResources, err := restmapper.GetAPIGroupResources(discover) - if err != nil { - return nil, errors.Wrap(err, "could not get api group resources") - } - mapper := restmapper.NewDiscoveryRESTMapper(groupResources) - - return &APIHelper{ - cfg, - mapper, - }, nil -} - -func (a *APIHelper) Create(obj runtime.Object) error { - gvk := obj.GetObjectKind().GroupVersionKind() - - a.cfg.ContentConfig = resource.UnstructuredPlusDefaultContentConfig() + fmt.Printf("creating %q %q\n", obj.GetObjectKind().GroupVersionKind().String(), accessor.GetName()) - client, err := rest.UnversionedRESTClientFor(a.cfg) - if err != nil { - return errors.Wrap(err, "couldn't create REST client") - } - - accessor, err := meta.Accessor(obj) - if err != nil { - return errors.Wrap(err, "couldn't create accessor") - } - - mapping, err := a.mapper.RESTMapping(gvk.GroupKind(), gvk.Version) - - if err != nil { - return errors.Wrapf(err, "failed to retrieve mapping for %s %s", gvk.String(), accessor.GetName()) - } - - fmt.Printf("Creating %s %s in %q\n", gvk.String(), accessor.GetName(), accessor.GetNamespace()) - - result := client. - Post(). - AbsPath(makeURLSegments(mapping.Resource, "", accessor.GetNamespace())...). - Body(obj). - Do() - - return errors.Wrapf(result.Error(), "failed to create object %q", accessor.GetName()) -} - -func makeURLSegments(resource schema.GroupVersionResource, name, namespace string) []string { - url := []string{} - if len(resource.Group) == 0 { - url = append(url, "api") - } else { - url = append(url, "apis", resource.Group) - } - url = append(url, resource.Version) - - if len(namespace) > 0 { - url = append(url, "namespaces", namespace) - } - url = append(url, resource.Resource) - - if len(name) > 0 { - url = append(url, name) + if client.Create(context.Background(), obj); err != nil { + panic(err) + } } - - return url } diff --git a/kind/controlplane/create.go b/kind/controlplane/create.go index c63db6a..c8f9655 100644 --- a/kind/controlplane/create.go +++ b/kind/controlplane/create.go @@ -26,6 +26,11 @@ func CreateKindCluster(image, clusterName string) error { ContainerPath: "/var/run/docker.sock", HostPath: "/var/run/docker.sock", }, + { + + ContainerPath: "/var/lib/docker", + HostPath: "/var/lib/docker", + }, } cp, err := actions.CreateControlPlane(clusterName, fmt.Sprintf("%s-control-plane", clusterName), lbipv4, "v1.14.2", cpMounts) diff --git a/objects/control_plane.go b/objects/control_plane.go index 9831997..cd7dbc6 100644 --- a/objects/control_plane.go +++ b/objects/control_plane.go @@ -91,7 +91,7 @@ func GetStatefulSet(image string) apps.StatefulSet { Tolerations: []core.Toleration{ { Key: constants.LabelNodeRoleMaster, - Effect: core.TaintEffectNoExecute, + Effect: core.TaintEffectNoSchedule, }, { Key: "CriticalAddonsOnly", From eee3a0a7972a6f8b085b77a280512d4a34846fcb Mon Sep 17 00:00:00 2001 From: liz Date: Mon, 15 Jul 2019 10:38:43 -0400 Subject: [PATCH 12/14] Add copyright headers --- kind/controlplane/create.go | 16 ++++++++++++++++ kind/controlplane/kubeconfig.go | 16 ++++++++++++++++ objects/all.go | 16 ++++++++++++++++ objects/capi.go | 16 ++++++++++++++++ objects/cluster.go | 16 ++++++++++++++++ objects/control_plane.go | 16 ++++++++++++++++ objects/rbac.go | 16 ++++++++++++++++ 7 files changed, 112 insertions(+) diff --git a/kind/controlplane/create.go b/kind/controlplane/create.go index c8f9655..04c5fbe 100644 --- a/kind/controlplane/create.go +++ b/kind/controlplane/create.go @@ -1,3 +1,19 @@ +/* +Copyright 2019 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 controlplane import ( diff --git a/kind/controlplane/kubeconfig.go b/kind/controlplane/kubeconfig.go index da69e1f..f0438de 100644 --- a/kind/controlplane/kubeconfig.go +++ b/kind/controlplane/kubeconfig.go @@ -1,3 +1,19 @@ +/* +Copyright 2019 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 controlplane import ( diff --git a/objects/all.go b/objects/all.go index f854d82..717c19a 100644 --- a/objects/all.go +++ b/objects/all.go @@ -1,3 +1,19 @@ +/* +Copyright 2019 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 objects import ( diff --git a/objects/capi.go b/objects/capi.go index c4eaac9..ddcf5a2 100644 --- a/objects/capi.go +++ b/objects/capi.go @@ -1,3 +1,19 @@ +/* +Copyright 2019 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 objects import ( diff --git a/objects/cluster.go b/objects/cluster.go index dc372c2..4bebab1 100644 --- a/objects/cluster.go +++ b/objects/cluster.go @@ -1,3 +1,19 @@ +/* +Copyright 2019 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 objects import ( diff --git a/objects/control_plane.go b/objects/control_plane.go index cd7dbc6..e19fc77 100644 --- a/objects/control_plane.go +++ b/objects/control_plane.go @@ -1,3 +1,19 @@ +/* +Copyright 2019 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 objects import ( diff --git a/objects/rbac.go b/objects/rbac.go index 0eb5ee1..81f5f01 100644 --- a/objects/rbac.go +++ b/objects/rbac.go @@ -1,3 +1,19 @@ +/* +Copyright 2019 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 objects import ( From d8cfeb96765c144478a7065243d9769f5ce3acfb Mon Sep 17 00:00:00 2001 From: liz Date: Mon, 15 Jul 2019 10:47:33 -0400 Subject: [PATCH 13/14] Molify the linter --- go.mod | 3 -- go.sum | 81 --------------------------------- kind/controlplane/create.go | 1 + kind/controlplane/kubeconfig.go | 1 + objects/all.go | 1 + objects/capi.go | 1 + objects/cluster.go | 3 ++ objects/control_plane.go | 2 + objects/rbac.go | 2 + 9 files changed, 11 insertions(+), 84 deletions(-) diff --git a/go.mod b/go.mod index 6d907fc..cdd7200 100644 --- a/go.mod +++ b/go.mod @@ -24,12 +24,9 @@ require ( golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 // indirect golang.org/x/text v0.3.2 // indirect golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect - golang.org/x/tools v0.0.0-20190710184609-286818132824 // indirect - golang.org/x/tools/gopls v0.1.3 // indirect k8s.io/api v0.0.0-20190703205437-39734b2a72fe k8s.io/apiextensions-apiserver v0.0.0-20181213153335-0fe22c71c476 // indirect k8s.io/apimachinery v0.0.0-20190703205208-4cfb76a8bf76 - k8s.io/cli-runtime v0.0.0-20190704050804-7ea68ffa02c5 k8s.io/client-go v11.0.0+incompatible k8s.io/cluster-bootstrap v0.0.0-20181213155137-5f9271efc2e7 // indirect k8s.io/klog v0.3.0 diff --git a/go.sum b/go.sum index dd037ef..cd08ffe 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,8 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= @@ -13,29 +10,19 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/appscode/jsonpatch v0.0.0-20190108182946-7c0e3b262f30 h1:Kn3rqvbUFqSepE2OqVu0Pn1CbDw9IuMlONapol0zuwk= github.com/appscode/jsonpatch v0.0.0-20190108182946-7c0e3b262f30/go.mod h1:4AJxUpXUhv4N+ziTvIcWWXgeorXpxPZOfk9HdEVr96M= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -47,30 +34,15 @@ github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aA github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.0 h1:FTUMcX77w5rQkClIzDtTxvn6Bsa894CcrzNj2MMfeg8= -github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0 h1:yJW3HCkTHg7NOA+gZ83IPHzUSnUzGXhGmsdiCcMexbA= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk= -github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.0 h1:A4SZ6IWh3lnjH0rG0Z5lkxazMGBECtrZcbyYQi+64k4= github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.17.2 h1:K/ycE/XTUDFltNHSO32cGRUhrVGJD64o8WgAIZNyc3k= -github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= @@ -95,7 +67,6 @@ github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc h1:f8eY6cV/x1x github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= @@ -109,20 +80,11 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -136,7 +98,6 @@ github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c h1:eSfnfIuwhxZyULg1NNu github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= @@ -155,32 +116,20 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.0-20180319062004-c439c4fa0937/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.4 h1:S0tLZ3VOKl2Te0hpq8+ke0eSJPfCnNTPiDlsfwi1/NE= -github.com/spf13/cobra v0.0.4/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= @@ -188,11 +137,8 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -200,31 +146,21 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190514140710-3ec191127204 h1:4yG6GqBtw9C+UrLp6s2wtSniayy/Vd/3F7ffLE427XI= golang.org/x/net v0.0.0-20190514140710-3ec191127204/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 h1:6ZQFf1D2YYDDI7eSwW8adlkkavTB9sw5I24FVtEvNUQ= golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -237,38 +173,21 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190710153321-831012c29e42/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190710184609-286818132824 h1:dOGf5KG5e5tnConXcTAnHv2YgmYJtrYjN9b1cMC21TY= -golang.org/x/tools v0.0.0-20190710184609-286818132824/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools/gopls v0.1.3 h1:CB5ECiPysqZrwxcyRjN+exyZpY0gODTZvNiqQi3lpeo= -golang.org/x/tools/gopls v0.1.3/go.mod h1:vrCQzOKxvuiZLjCKSmbbov04oeBQQOb4VQqwYK2PWIY= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= k8s.io/api v0.0.0-20181213150558-05914d821849 h1:WZFcFPXmLR7g5CxQNmjWv0mg8qulJLxDghbzS4pQtzY= k8s.io/api v0.0.0-20181213150558-05914d821849/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/apiextensions-apiserver v0.0.0-20181213153335-0fe22c71c476 h1:Ws9zfxsgV19Durts9ftyTG7TO0A/QLhmu98VqNWLiH8= k8s.io/apiextensions-apiserver v0.0.0-20181213153335-0fe22c71c476/go.mod h1:IxkesAMoaCRoLrPJdZNZUQp9NfZnzqaVzLhb2VEQzXE= k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93 h1:tT6oQBi0qwLbbZSfDkdIsb23EwaLY85hoAV4SpXfdao= k8s.io/apimachinery v0.0.0-20181127025237-2b1284ed4c93/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/cli-runtime v0.0.0-20181213153952-835b10687cb6 h1:VCcOQ34dGCCgCCJIXgYGeqvr+X3qaMdfC+EYCsQoTTU= -k8s.io/cli-runtime v0.0.0-20181213153952-835b10687cb6/go.mod h1:qWnH3/b8sp/l7EvlDh7ulDU3UWA4P4N1NFbEEP791tM= -k8s.io/cli-runtime v0.0.0-20190703205208-cbd7455f4bce h1:dpKc4TTECHtkmznbkHTTt04LvVdehEtRhcj+ua0XxOE= -k8s.io/cli-runtime v0.0.0-20190703205208-cbd7455f4bce/go.mod h1:fEQcbuYGh3C5QA/zvlTJKRMybd95KaEbTryQUUJkrpE= -k8s.io/cli-runtime v0.0.0-20190704050804-7ea68ffa02c5 h1:F/pAp9KvuqaKLwVb1uWPXiv2jdZ8fqyXR6+6xQRn700= -k8s.io/cli-runtime v0.0.0-20190704050804-7ea68ffa02c5/go.mod h1:HYxpxDR0QWcp5ciJglNRCgbtZ9hlQLFd61jzH0V6668= -k8s.io/cli-runtime v0.0.0-20190704050804-bd8686edbd81 h1:2dm1cW5BXLyYnvX98poUqE5a7j57+xvRi84/LvXoECg= -k8s.io/cli-runtime v0.0.0-20190704050804-bd8686edbd81/go.mod h1:qWnH3/b8sp/l7EvlDh7ulDU3UWA4P4N1NFbEEP791tM= k8s.io/client-go v10.0.0+incompatible h1:F1IqCqw7oMBzDkqlcBymRq1450wD0eNqLE9jzUrIi34= k8s.io/client-go v10.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/cluster-bootstrap v0.0.0-20181213155137-5f9271efc2e7 h1:OKcz0eE/wbdRmbu4CCgcbjJ1BUBoljqJiPL/4MAS04w= diff --git a/kind/controlplane/create.go b/kind/controlplane/create.go index 04c5fbe..1f07390 100644 --- a/kind/controlplane/create.go +++ b/kind/controlplane/create.go @@ -26,6 +26,7 @@ import ( "sigs.k8s.io/kind/pkg/container/cri" ) +// CreateKindCluster sets up a KIND cluster and turns it into a CAPD control plane func CreateKindCluster(image, clusterName string) error { lb, err := actions.SetUpLoadBalancer(clusterName) if err != nil { diff --git a/kind/controlplane/kubeconfig.go b/kind/controlplane/kubeconfig.go index f0438de..a828b71 100644 --- a/kind/controlplane/kubeconfig.go +++ b/kind/controlplane/kubeconfig.go @@ -25,6 +25,7 @@ import ( // TODO: Add version number? const userAgent = "capdctl" +// GetKubeconfig retrieves and parsing the kind cluster config func GetKubeconfig(clusterName string) (*rest.Config, error) { ctx := cluster.NewContext(clusterName) path := ctx.KubeConfigPath() diff --git a/objects/all.go b/objects/all.go index 717c19a..e7f328c 100644 --- a/objects/all.go +++ b/objects/all.go @@ -20,6 +20,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) +// GetManegementCluster returns all the objects needed to create a working CAPD management cluster func GetManegementCluster(version, capiImage, capdImage string) ([]runtime.Object, error) { capiObjects, err := GetCAPI(version, capiImage) if err != nil { diff --git a/objects/capi.go b/objects/capi.go index ddcf5a2..05169c6 100644 --- a/objects/capi.go +++ b/objects/capi.go @@ -138,6 +138,7 @@ func decodeCAPIObjects(yaml io.Reader) ([]runtime.Object, error) { return objects, nil } +// GetCAPI retrieves the objects needed to create a CAPI control plane from Github and parses them into runtime.Objects func GetCAPI(version, capiImage string) ([]runtime.Object, error) { reader, err := getCAPIYAML(version, capiImage) if err != nil { diff --git a/objects/cluster.go b/objects/cluster.go index 4bebab1..61fc7bb 100644 --- a/objects/cluster.go +++ b/objects/cluster.go @@ -23,6 +23,7 @@ import ( const controlPlaneSet = "controlplane" +// GetMachineDeployment returns a worker node machine deployment object func GetMachineDeployment(name, namespace, clusterName, kubeletVersion string, replicas int32) capi.MachineDeployment { labels := map[string]string{ "cluster.k8s.io/cluster-name": clusterName, @@ -54,6 +55,7 @@ func GetMachineDeployment(name, namespace, clusterName, kubeletVersion string, r } } +// GetCluster returns a cluster object with the given name and namespace func GetCluster(clusterName, namespace string) capi.Cluster { return capi.Cluster{ ObjectMeta: meta.ObjectMeta{ @@ -74,6 +76,7 @@ func GetCluster(clusterName, namespace string) capi.Cluster { } } +// GetMachine returns a machine with the given parameters func GetMachine(name, namespace, clusterName, set, version string) capi.Machine { machine := capi.Machine{ ObjectMeta: meta.ObjectMeta{ diff --git a/objects/control_plane.go b/objects/control_plane.go index e19fc77..ca70d6f 100644 --- a/objects/control_plane.go +++ b/objects/control_plane.go @@ -26,6 +26,7 @@ import ( const namespace = "docker-provider-system" +// GetNamespace returns a "docker-provider-system" namespace object func GetNamespace() core.Namespace { return core.Namespace{ ObjectMeta: meta.ObjectMeta{ @@ -48,6 +49,7 @@ const ( dockerLibPath = "/var/lib/docker" ) +// GetStatefulSet returns a statefulset for running CAPD with the given image name func GetStatefulSet(image string) apps.StatefulSet { return apps.StatefulSet{ ObjectMeta: meta.ObjectMeta{ diff --git a/objects/rbac.go b/objects/rbac.go index 81f5f01..a2946b2 100644 --- a/objects/rbac.go +++ b/objects/rbac.go @@ -25,6 +25,7 @@ import ( const clusterRoleName = "docker-provider-manager-role" +// GetClusterRole returns the cluster role capi needs to function properly func GetClusterRole() rbac.ClusterRole { return rbac.ClusterRole{ ObjectMeta: meta.ObjectMeta{ @@ -95,6 +96,7 @@ func GetClusterRole() rbac.ClusterRole { } } +// GetClusterRoleBinding returns the binding for the role created by GetClusterRole func GetClusterRoleBinding() rbac.ClusterRoleBinding { return rbac.ClusterRoleBinding{ ObjectMeta: meta.ObjectMeta{ From 419ec5c92ab792a33f89fe93f1ea3fac57f73c6d Mon Sep 17 00:00:00 2001 From: liz Date: Mon, 15 Jul 2019 12:11:56 -0400 Subject: [PATCH 14/14] Setup klog to log to stderr --- cmd/capd-manager/main.go | 9 +++++++-- objects/control_plane.go | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cmd/capd-manager/main.go b/cmd/capd-manager/main.go index 36e668e..4189bf2 100644 --- a/cmd/capd-manager/main.go +++ b/cmd/capd-manager/main.go @@ -17,10 +17,11 @@ limitations under the License. package main import ( - "fmt" + "flag" "time" "k8s.io/client-go/kubernetes" + "k8s.io/klog" "k8s.io/klog/klogr" "sigs.k8s.io/cluster-api-provider-docker/actuators" "sigs.k8s.io/cluster-api-provider-docker/logger" @@ -35,6 +36,9 @@ import ( ) func main() { + klog.InitFlags(flag.CommandLine) + flag.Parse() + cfg, err := config.GetConfig() if err != nil { panic(err) @@ -86,7 +90,8 @@ func main() { if err := capicluster.AddWithActuator(mgr, &clusterActuator); err != nil { panic(err) } - fmt.Println("starting the controller...!") + + klogr.New().Info("Starting the controller") if err := mgr.Start(signals.SetupSignalHandler()); err != nil { panic(err) diff --git a/objects/control_plane.go b/objects/control_plane.go index ca70d6f..12cd532 100644 --- a/objects/control_plane.go +++ b/objects/control_plane.go @@ -73,6 +73,8 @@ func GetStatefulSet(image string) apps.StatefulSet { Image: image, Command: []string{ "capd-manager", + "-v=3", + "-logtostderr=true", }, VolumeMounts: []core.VolumeMount{ {