Skip to content
This repository has been archived by the owner on Sep 24, 2021. It is now read-only.

Commit

Permalink
POST resources, not by name
Browse files Browse the repository at this point in the history
  • Loading branch information
liztio committed Jul 15, 2019
1 parent 0025dbb commit 1bca27d
Showing 1 changed file with 49 additions and 7 deletions.
56 changes: 49 additions & 7 deletions cmd/capdctl/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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())
Expand All @@ -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:])
Expand All @@ -121,6 +127,8 @@ func main() {
fmt.Println(usage())
os.Exit(1)
}

klog.Flush()
}

func usage() string {
Expand Down Expand Up @@ -217,7 +225,7 @@ func applyControlPlane(clusterName, capiVersion, capiImage, capdImage string) {
}

type APIHelper struct {
client rest.Interface
cfg *rest.Config
mapper meta.RESTMapper
}

Expand All @@ -226,34 +234,68 @@ 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")
}
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
}

0 comments on commit 1bca27d

Please sign in to comment.