157 lines
3.5 KiB
Go
157 lines
3.5 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
|
||
|
"k8s.io/client-go/kubernetes"
|
||
|
"k8s.io/client-go/pkg/api"
|
||
|
"k8s.io/client-go/pkg/api/errors"
|
||
|
"k8s.io/client-go/pkg/api/v1"
|
||
|
"k8s.io/client-go/pkg/apis/extensions/v1beta1"
|
||
|
metav1 "k8s.io/client-go/pkg/apis/meta/v1"
|
||
|
"k8s.io/client-go/pkg/runtime"
|
||
|
"k8s.io/client-go/pkg/runtime/schema"
|
||
|
"k8s.io/client-go/pkg/runtime/serializer"
|
||
|
"k8s.io/client-go/rest"
|
||
|
"k8s.io/client-go/tools/clientcmd"
|
||
|
|
||
|
// Only required to authenticate against GKE clusters
|
||
|
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
config *rest.Config
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
kubeconfig := flag.String("kubeconfig", "", "Path to a kube config. Only required if out-of-cluster.")
|
||
|
flag.Parse()
|
||
|
|
||
|
// Create the client config. Use kubeconfig if given, otherwise assume in-cluster.
|
||
|
config, err := buildConfig(*kubeconfig)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
clientset, err := kubernetes.NewForConfig(config)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
// initialize third party resource if it does not exist
|
||
|
tpr, err := clientset.Extensions().ThirdPartyResources().Get("example.k8s.io", metav1.GetOptions{})
|
||
|
if err != nil {
|
||
|
if errors.IsNotFound(err) {
|
||
|
tpr := &v1beta1.ThirdPartyResource{
|
||
|
ObjectMeta: v1.ObjectMeta{
|
||
|
Name: "example.k8s.io",
|
||
|
},
|
||
|
Versions: []v1beta1.APIVersion{
|
||
|
{Name: "v1"},
|
||
|
},
|
||
|
Description: "An Example ThirdPartyResource",
|
||
|
}
|
||
|
|
||
|
result, err := clientset.Extensions().ThirdPartyResources().Create(tpr)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
fmt.Printf("CREATED: %#v\nFROM: %#v\n", result, tpr)
|
||
|
} else {
|
||
|
panic(err)
|
||
|
}
|
||
|
} else {
|
||
|
fmt.Printf("SKIPPING: already exists %#v\n", tpr)
|
||
|
}
|
||
|
|
||
|
// make a new config for our extension's API group, using the first config as a baseline
|
||
|
var tprconfig *rest.Config
|
||
|
tprconfig = config
|
||
|
configureClient(tprconfig)
|
||
|
|
||
|
tprclient, err := rest.RESTClientFor(tprconfig)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
var example Example
|
||
|
|
||
|
err = tprclient.Get().
|
||
|
Resource("examples").
|
||
|
Namespace(api.NamespaceDefault).
|
||
|
Name("example1").
|
||
|
Do().Into(&example)
|
||
|
|
||
|
if err != nil {
|
||
|
if errors.IsNotFound(err) {
|
||
|
// Create an instance of our TPR
|
||
|
example := &Example{
|
||
|
Metadata: api.ObjectMeta{
|
||
|
Name: "example1",
|
||
|
},
|
||
|
Spec: ExampleSpec{
|
||
|
Foo: "hello",
|
||
|
Bar: true,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
var result Example
|
||
|
err = tprclient.Post().
|
||
|
Resource("examples").
|
||
|
Namespace(api.NamespaceDefault).
|
||
|
Body(example).
|
||
|
Do().Into(&result)
|
||
|
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
fmt.Printf("CREATED: %#v\n", result)
|
||
|
} else {
|
||
|
panic(err)
|
||
|
}
|
||
|
} else {
|
||
|
fmt.Printf("GET: %#v\n", example)
|
||
|
}
|
||
|
|
||
|
// Fetch a list of our TPRs
|
||
|
exampleList := ExampleList{}
|
||
|
err = tprclient.Get().Resource("examples").Do().Into(&exampleList)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
fmt.Printf("LIST: %#v\n", exampleList)
|
||
|
}
|
||
|
|
||
|
func buildConfig(kubeconfig string) (*rest.Config, error) {
|
||
|
if kubeconfig != "" {
|
||
|
return clientcmd.BuildConfigFromFlags("", kubeconfig)
|
||
|
}
|
||
|
return rest.InClusterConfig()
|
||
|
}
|
||
|
|
||
|
func configureClient(config *rest.Config) {
|
||
|
groupversion := schema.GroupVersion{
|
||
|
Group: "k8s.io",
|
||
|
Version: "v1",
|
||
|
}
|
||
|
|
||
|
config.GroupVersion = &groupversion
|
||
|
config.APIPath = "/apis"
|
||
|
config.ContentType = runtime.ContentTypeJSON
|
||
|
config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: api.Codecs}
|
||
|
|
||
|
schemeBuilder := runtime.NewSchemeBuilder(
|
||
|
func(scheme *runtime.Scheme) error {
|
||
|
scheme.AddKnownTypes(
|
||
|
groupversion,
|
||
|
&Example{},
|
||
|
&ExampleList{},
|
||
|
&api.ListOptions{},
|
||
|
&api.DeleteOptions{},
|
||
|
)
|
||
|
return nil
|
||
|
})
|
||
|
schemeBuilder.AddToScheme(api.Scheme)
|
||
|
}
|