mirror of
https://github.com/rancher/rke.git
synced 2025-08-11 19:53:02 +00:00
185 lines
4.3 KiB
Go
185 lines
4.3 KiB
Go
package v1
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/pkg/errors"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/apimachinery/pkg/watch"
|
|
"k8s.io/client-go/dynamic"
|
|
"k8s.io/client-go/rest"
|
|
)
|
|
|
|
const (
|
|
ClusterNodesKind = "ClusterNode"
|
|
ClusterNodesName = "clusternodes"
|
|
ClusterNodesSingularName = "clusternode"
|
|
)
|
|
|
|
type ClusterNodesGetter interface {
|
|
ClusterNodes(namespace string) ClusterNodeInterface
|
|
}
|
|
|
|
var _ ClusterNodeInterface = &clusternodes{}
|
|
|
|
type ClusterNodeInterface interface {
|
|
Create(*ClusterNode) (*ClusterNode, error)
|
|
Get(name string, opts metav1.GetOptions) (*ClusterNode, error)
|
|
Update(*ClusterNode) (*ClusterNode, error)
|
|
Delete(name string, options *metav1.DeleteOptions) error
|
|
List(opts metav1.ListOptions) (runtime.Object, error)
|
|
Watch(opts metav1.ListOptions) (watch.Interface, error)
|
|
DeleteCollection(dopts *metav1.DeleteOptions, lopts metav1.ListOptions) error
|
|
}
|
|
|
|
type clusternodes struct {
|
|
restClient rest.Interface
|
|
client *dynamic.ResourceClient
|
|
ns string
|
|
}
|
|
|
|
func newClusterNodes(r rest.Interface, c *dynamic.Client) *clusternodes {
|
|
return &clusternodes{
|
|
r,
|
|
c.Resource(
|
|
&metav1.APIResource{
|
|
Kind: ClusterNodesKind,
|
|
Name: ClusterNodesName,
|
|
Namespaced: false,
|
|
},
|
|
"",
|
|
),
|
|
"",
|
|
}
|
|
}
|
|
|
|
func (p *clusternodes) Create(o *ClusterNode) (*ClusterNode, error) {
|
|
up, err := UnstructuredFromClusterNode(o)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
up, err = p.client.Create(up)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return ClusterNodeFromUnstructured(up)
|
|
}
|
|
|
|
func (p *clusternodes) Get(name string, opts metav1.GetOptions) (*ClusterNode, error) {
|
|
obj, err := p.client.Get(name, opts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ClusterNodeFromUnstructured(obj)
|
|
}
|
|
|
|
func (p *clusternodes) Update(o *ClusterNode) (*ClusterNode, error) {
|
|
up, err := UnstructuredFromClusterNode(o)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
curp, err := p.Get(o.Name, metav1.GetOptions{})
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "unable to get current version for update")
|
|
}
|
|
up.SetResourceVersion(curp.ObjectMeta.ResourceVersion)
|
|
|
|
up, err = p.client.Update(up)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return ClusterNodeFromUnstructured(up)
|
|
}
|
|
|
|
func (p *clusternodes) Delete(name string, options *metav1.DeleteOptions) error {
|
|
return p.client.Delete(name, options)
|
|
}
|
|
|
|
func (p *clusternodes) List(opts metav1.ListOptions) (runtime.Object, error) {
|
|
req := p.restClient.Get().
|
|
Namespace(p.ns).
|
|
Resource(ClusterNodesName).
|
|
FieldsSelectorParam(nil)
|
|
|
|
b, err := req.DoRaw()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var prom ClusterNodeList
|
|
return &prom, json.Unmarshal(b, &prom)
|
|
}
|
|
|
|
func (p *clusternodes) Watch(opts metav1.ListOptions) (watch.Interface, error) {
|
|
r, err := p.restClient.Get().
|
|
Prefix("watch").
|
|
Namespace(p.ns).
|
|
Resource(ClusterNodesName).
|
|
FieldsSelectorParam(nil).
|
|
Stream()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return watch.NewStreamWatcher(&clusterDecoder{
|
|
dec: json.NewDecoder(r),
|
|
close: r.Close,
|
|
}), nil
|
|
}
|
|
|
|
func (p *clusternodes) DeleteCollection(dopts *metav1.DeleteOptions, lopts metav1.ListOptions) error {
|
|
return p.client.DeleteCollection(dopts, lopts)
|
|
}
|
|
|
|
func ClusterNodeFromUnstructured(r *unstructured.Unstructured) (*ClusterNode, error) {
|
|
b, err := json.Marshal(r.Object)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var p ClusterNode
|
|
if err := json.Unmarshal(b, &p); err != nil {
|
|
return nil, err
|
|
}
|
|
p.TypeMeta.Kind = ClusterNodesKind
|
|
p.TypeMeta.APIVersion = Group + "/" + Version
|
|
return &p, nil
|
|
}
|
|
|
|
func UnstructuredFromClusterNode(p *ClusterNode) (*unstructured.Unstructured, error) {
|
|
p.TypeMeta.Kind = ClusterNodesKind
|
|
p.TypeMeta.APIVersion = Group + "/" + Version
|
|
b, err := json.Marshal(p)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var r unstructured.Unstructured
|
|
if err := json.Unmarshal(b, &r.Object); err != nil {
|
|
return nil, err
|
|
}
|
|
return &r, nil
|
|
}
|
|
|
|
type clusterNodeDecoder struct {
|
|
dec *json.Decoder
|
|
close func() error
|
|
}
|
|
|
|
func (d *clusterNodeDecoder) Close() {
|
|
d.close()
|
|
}
|
|
|
|
func (d *clusterNodeDecoder) Decode() (action watch.EventType, object runtime.Object, err error) {
|
|
var e struct {
|
|
Type watch.EventType
|
|
Object ClusterNode
|
|
}
|
|
if err := d.dec.Decode(&e); err != nil {
|
|
return watch.Error, nil, err
|
|
}
|
|
return e.Type, &e.Object, nil
|
|
}
|