feat(scheduling): add zfs pool capacity tracking (#335)

Signed-off-by: shubham <shubham.bajpai@mayadata.io>
This commit is contained in:
Shubham Bajpai 2021-05-31 18:59:59 +05:30 committed by GitHub
parent 4fce22afb5
commit 3eb2c9e894
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 2284 additions and 7 deletions

View file

@ -32,6 +32,10 @@ func (c *FakeZfsV1) ZFSBackups(namespace string) v1.ZFSBackupInterface {
return &FakeZFSBackups{c, namespace}
}
func (c *FakeZfsV1) ZFSNodes(namespace string) v1.ZFSNodeInterface {
return &FakeZFSNodes{c, namespace}
}
func (c *FakeZfsV1) ZFSRestores(namespace string) v1.ZFSRestoreInterface {
return &FakeZFSRestores{c, namespace}
}

View file

@ -0,0 +1,130 @@
/*
Copyright 2019 The OpenEBS 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.
*/
// Code generated by client-gen. DO NOT EDIT.
package fake
import (
"context"
zfsv1 "github.com/openebs/zfs-localpv/pkg/apis/openebs.io/zfs/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
labels "k8s.io/apimachinery/pkg/labels"
schema "k8s.io/apimachinery/pkg/runtime/schema"
types "k8s.io/apimachinery/pkg/types"
watch "k8s.io/apimachinery/pkg/watch"
testing "k8s.io/client-go/testing"
)
// FakeZFSNodes implements ZFSNodeInterface
type FakeZFSNodes struct {
Fake *FakeZfsV1
ns string
}
var zfsnodesResource = schema.GroupVersionResource{Group: "zfs.openebs.io", Version: "v1", Resource: "zfsnodes"}
var zfsnodesKind = schema.GroupVersionKind{Group: "zfs.openebs.io", Version: "v1", Kind: "ZFSNode"}
// Get takes name of the zFSNode, and returns the corresponding zFSNode object, and an error if there is any.
func (c *FakeZFSNodes) Get(ctx context.Context, name string, options v1.GetOptions) (result *zfsv1.ZFSNode, err error) {
obj, err := c.Fake.
Invokes(testing.NewGetAction(zfsnodesResource, c.ns, name), &zfsv1.ZFSNode{})
if obj == nil {
return nil, err
}
return obj.(*zfsv1.ZFSNode), err
}
// List takes label and field selectors, and returns the list of ZFSNodes that match those selectors.
func (c *FakeZFSNodes) List(ctx context.Context, opts v1.ListOptions) (result *zfsv1.ZFSNodeList, err error) {
obj, err := c.Fake.
Invokes(testing.NewListAction(zfsnodesResource, zfsnodesKind, c.ns, opts), &zfsv1.ZFSNodeList{})
if obj == nil {
return nil, err
}
label, _, _ := testing.ExtractFromListOptions(opts)
if label == nil {
label = labels.Everything()
}
list := &zfsv1.ZFSNodeList{ListMeta: obj.(*zfsv1.ZFSNodeList).ListMeta}
for _, item := range obj.(*zfsv1.ZFSNodeList).Items {
if label.Matches(labels.Set(item.Labels)) {
list.Items = append(list.Items, item)
}
}
return list, err
}
// Watch returns a watch.Interface that watches the requested zFSNodes.
func (c *FakeZFSNodes) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
return c.Fake.
InvokesWatch(testing.NewWatchAction(zfsnodesResource, c.ns, opts))
}
// Create takes the representation of a zFSNode and creates it. Returns the server's representation of the zFSNode, and an error, if there is any.
func (c *FakeZFSNodes) Create(ctx context.Context, zFSNode *zfsv1.ZFSNode, opts v1.CreateOptions) (result *zfsv1.ZFSNode, err error) {
obj, err := c.Fake.
Invokes(testing.NewCreateAction(zfsnodesResource, c.ns, zFSNode), &zfsv1.ZFSNode{})
if obj == nil {
return nil, err
}
return obj.(*zfsv1.ZFSNode), err
}
// Update takes the representation of a zFSNode and updates it. Returns the server's representation of the zFSNode, and an error, if there is any.
func (c *FakeZFSNodes) Update(ctx context.Context, zFSNode *zfsv1.ZFSNode, opts v1.UpdateOptions) (result *zfsv1.ZFSNode, err error) {
obj, err := c.Fake.
Invokes(testing.NewUpdateAction(zfsnodesResource, c.ns, zFSNode), &zfsv1.ZFSNode{})
if obj == nil {
return nil, err
}
return obj.(*zfsv1.ZFSNode), err
}
// Delete takes name of the zFSNode and deletes it. Returns an error if one occurs.
func (c *FakeZFSNodes) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
_, err := c.Fake.
Invokes(testing.NewDeleteAction(zfsnodesResource, c.ns, name), &zfsv1.ZFSNode{})
return err
}
// DeleteCollection deletes a collection of objects.
func (c *FakeZFSNodes) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
action := testing.NewDeleteCollectionAction(zfsnodesResource, c.ns, listOpts)
_, err := c.Fake.Invokes(action, &zfsv1.ZFSNodeList{})
return err
}
// Patch applies the patch and returns the patched zFSNode.
func (c *FakeZFSNodes) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *zfsv1.ZFSNode, err error) {
obj, err := c.Fake.
Invokes(testing.NewPatchSubresourceAction(zfsnodesResource, c.ns, name, pt, data, subresources...), &zfsv1.ZFSNode{})
if obj == nil {
return nil, err
}
return obj.(*zfsv1.ZFSNode), err
}

View file

@ -20,6 +20,8 @@ package v1
type ZFSBackupExpansion interface{}
type ZFSNodeExpansion interface{}
type ZFSRestoreExpansion interface{}
type ZFSSnapshotExpansion interface{}

View file

@ -27,6 +27,7 @@ import (
type ZfsV1Interface interface {
RESTClient() rest.Interface
ZFSBackupsGetter
ZFSNodesGetter
ZFSRestoresGetter
ZFSSnapshotsGetter
ZFSVolumesGetter
@ -41,6 +42,10 @@ func (c *ZfsV1Client) ZFSBackups(namespace string) ZFSBackupInterface {
return newZFSBackups(c, namespace)
}
func (c *ZfsV1Client) ZFSNodes(namespace string) ZFSNodeInterface {
return newZFSNodes(c, namespace)
}
func (c *ZfsV1Client) ZFSRestores(namespace string) ZFSRestoreInterface {
return newZFSRestores(c, namespace)
}

View file

@ -0,0 +1,178 @@
/*
Copyright 2019 The OpenEBS 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.
*/
// Code generated by client-gen. DO NOT EDIT.
package v1
import (
"context"
"time"
v1 "github.com/openebs/zfs-localpv/pkg/apis/openebs.io/zfs/v1"
scheme "github.com/openebs/zfs-localpv/pkg/generated/clientset/internalclientset/scheme"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
types "k8s.io/apimachinery/pkg/types"
watch "k8s.io/apimachinery/pkg/watch"
rest "k8s.io/client-go/rest"
)
// ZFSNodesGetter has a method to return a ZFSNodeInterface.
// A group's client should implement this interface.
type ZFSNodesGetter interface {
ZFSNodes(namespace string) ZFSNodeInterface
}
// ZFSNodeInterface has methods to work with ZFSNode resources.
type ZFSNodeInterface interface {
Create(ctx context.Context, zFSNode *v1.ZFSNode, opts metav1.CreateOptions) (*v1.ZFSNode, error)
Update(ctx context.Context, zFSNode *v1.ZFSNode, opts metav1.UpdateOptions) (*v1.ZFSNode, error)
Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error
DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error
Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.ZFSNode, error)
List(ctx context.Context, opts metav1.ListOptions) (*v1.ZFSNodeList, error)
Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error)
Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ZFSNode, err error)
ZFSNodeExpansion
}
// zFSNodes implements ZFSNodeInterface
type zFSNodes struct {
client rest.Interface
ns string
}
// newZFSNodes returns a ZFSNodes
func newZFSNodes(c *ZfsV1Client, namespace string) *zFSNodes {
return &zFSNodes{
client: c.RESTClient(),
ns: namespace,
}
}
// Get takes name of the zFSNode, and returns the corresponding zFSNode object, and an error if there is any.
func (c *zFSNodes) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.ZFSNode, err error) {
result = &v1.ZFSNode{}
err = c.client.Get().
Namespace(c.ns).
Resource("zfsnodes").
Name(name).
VersionedParams(&options, scheme.ParameterCodec).
Do(ctx).
Into(result)
return
}
// List takes label and field selectors, and returns the list of ZFSNodes that match those selectors.
func (c *zFSNodes) List(ctx context.Context, opts metav1.ListOptions) (result *v1.ZFSNodeList, err error) {
var timeout time.Duration
if opts.TimeoutSeconds != nil {
timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
}
result = &v1.ZFSNodeList{}
err = c.client.Get().
Namespace(c.ns).
Resource("zfsnodes").
VersionedParams(&opts, scheme.ParameterCodec).
Timeout(timeout).
Do(ctx).
Into(result)
return
}
// Watch returns a watch.Interface that watches the requested zFSNodes.
func (c *zFSNodes) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
var timeout time.Duration
if opts.TimeoutSeconds != nil {
timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
}
opts.Watch = true
return c.client.Get().
Namespace(c.ns).
Resource("zfsnodes").
VersionedParams(&opts, scheme.ParameterCodec).
Timeout(timeout).
Watch(ctx)
}
// Create takes the representation of a zFSNode and creates it. Returns the server's representation of the zFSNode, and an error, if there is any.
func (c *zFSNodes) Create(ctx context.Context, zFSNode *v1.ZFSNode, opts metav1.CreateOptions) (result *v1.ZFSNode, err error) {
result = &v1.ZFSNode{}
err = c.client.Post().
Namespace(c.ns).
Resource("zfsnodes").
VersionedParams(&opts, scheme.ParameterCodec).
Body(zFSNode).
Do(ctx).
Into(result)
return
}
// Update takes the representation of a zFSNode and updates it. Returns the server's representation of the zFSNode, and an error, if there is any.
func (c *zFSNodes) Update(ctx context.Context, zFSNode *v1.ZFSNode, opts metav1.UpdateOptions) (result *v1.ZFSNode, err error) {
result = &v1.ZFSNode{}
err = c.client.Put().
Namespace(c.ns).
Resource("zfsnodes").
Name(zFSNode.Name).
VersionedParams(&opts, scheme.ParameterCodec).
Body(zFSNode).
Do(ctx).
Into(result)
return
}
// Delete takes name of the zFSNode and deletes it. Returns an error if one occurs.
func (c *zFSNodes) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error {
return c.client.Delete().
Namespace(c.ns).
Resource("zfsnodes").
Name(name).
Body(&opts).
Do(ctx).
Error()
}
// DeleteCollection deletes a collection of objects.
func (c *zFSNodes) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error {
var timeout time.Duration
if listOpts.TimeoutSeconds != nil {
timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
}
return c.client.Delete().
Namespace(c.ns).
Resource("zfsnodes").
VersionedParams(&listOpts, scheme.ParameterCodec).
Timeout(timeout).
Body(&opts).
Do(ctx).
Error()
}
// Patch applies the patch and returns the patched zFSNode.
func (c *zFSNodes) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.ZFSNode, err error) {
result = &v1.ZFSNode{}
err = c.client.Patch(pt).
Namespace(c.ns).
Resource("zfsnodes").
Name(name).
SubResource(subresources...).
VersionedParams(&opts, scheme.ParameterCodec).
Body(data).
Do(ctx).
Into(result)
return
}

View file

@ -55,6 +55,8 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource
// Group=zfs.openebs.io, Version=v1
case v1.SchemeGroupVersion.WithResource("zfsbackups"):
return &genericInformer{resource: resource.GroupResource(), informer: f.Zfs().V1().ZFSBackups().Informer()}, nil
case v1.SchemeGroupVersion.WithResource("zfsnodes"):
return &genericInformer{resource: resource.GroupResource(), informer: f.Zfs().V1().ZFSNodes().Informer()}, nil
case v1.SchemeGroupVersion.WithResource("zfsrestores"):
return &genericInformer{resource: resource.GroupResource(), informer: f.Zfs().V1().ZFSRestores().Informer()}, nil
case v1.SchemeGroupVersion.WithResource("zfssnapshots"):

View file

@ -26,6 +26,8 @@ import (
type Interface interface {
// ZFSBackups returns a ZFSBackupInformer.
ZFSBackups() ZFSBackupInformer
// ZFSNodes returns a ZFSNodeInformer.
ZFSNodes() ZFSNodeInformer
// ZFSRestores returns a ZFSRestoreInformer.
ZFSRestores() ZFSRestoreInformer
// ZFSSnapshots returns a ZFSSnapshotInformer.
@ -50,6 +52,11 @@ func (v *version) ZFSBackups() ZFSBackupInformer {
return &zFSBackupInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
}
// ZFSNodes returns a ZFSNodeInformer.
func (v *version) ZFSNodes() ZFSNodeInformer {
return &zFSNodeInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
}
// ZFSRestores returns a ZFSRestoreInformer.
func (v *version) ZFSRestores() ZFSRestoreInformer {
return &zFSRestoreInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}

View file

@ -0,0 +1,90 @@
/*
Copyright 2019 The OpenEBS 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.
*/
// Code generated by informer-gen. DO NOT EDIT.
package v1
import (
"context"
time "time"
zfsv1 "github.com/openebs/zfs-localpv/pkg/apis/openebs.io/zfs/v1"
internalclientset "github.com/openebs/zfs-localpv/pkg/generated/clientset/internalclientset"
internalinterfaces "github.com/openebs/zfs-localpv/pkg/generated/informer/externalversions/internalinterfaces"
v1 "github.com/openebs/zfs-localpv/pkg/generated/lister/zfs/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
watch "k8s.io/apimachinery/pkg/watch"
cache "k8s.io/client-go/tools/cache"
)
// ZFSNodeInformer provides access to a shared informer and lister for
// ZFSNodes.
type ZFSNodeInformer interface {
Informer() cache.SharedIndexInformer
Lister() v1.ZFSNodeLister
}
type zFSNodeInformer struct {
factory internalinterfaces.SharedInformerFactory
tweakListOptions internalinterfaces.TweakListOptionsFunc
namespace string
}
// NewZFSNodeInformer constructs a new informer for ZFSNode type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewZFSNodeInformer(client internalclientset.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
return NewFilteredZFSNodeInformer(client, namespace, resyncPeriod, indexers, nil)
}
// NewFilteredZFSNodeInformer constructs a new informer for ZFSNode type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewFilteredZFSNodeInformer(client internalclientset.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
return cache.NewSharedIndexInformer(
&cache.ListWatch{
ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
if tweakListOptions != nil {
tweakListOptions(&options)
}
return client.ZfsV1().ZFSNodes(namespace).List(context.TODO(), options)
},
WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
tweakListOptions(&options)
}
return client.ZfsV1().ZFSNodes(namespace).Watch(context.TODO(), options)
},
},
&zfsv1.ZFSNode{},
resyncPeriod,
indexers,
)
}
func (f *zFSNodeInformer) defaultInformer(client internalclientset.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
return NewFilteredZFSNodeInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
}
func (f *zFSNodeInformer) Informer() cache.SharedIndexInformer {
return f.factory.InformerFor(&zfsv1.ZFSNode{}, f.defaultInformer)
}
func (f *zFSNodeInformer) Lister() v1.ZFSNodeLister {
return v1.NewZFSNodeLister(f.Informer().GetIndexer())
}

View file

@ -26,6 +26,14 @@ type ZFSBackupListerExpansion interface{}
// ZFSBackupNamespaceLister.
type ZFSBackupNamespaceListerExpansion interface{}
// ZFSNodeListerExpansion allows custom methods to be added to
// ZFSNodeLister.
type ZFSNodeListerExpansion interface{}
// ZFSNodeNamespaceListerExpansion allows custom methods to be added to
// ZFSNodeNamespaceLister.
type ZFSNodeNamespaceListerExpansion interface{}
// ZFSRestoreListerExpansion allows custom methods to be added to
// ZFSRestoreLister.
type ZFSRestoreListerExpansion interface{}

View file

@ -0,0 +1,99 @@
/*
Copyright 2019 The OpenEBS 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.
*/
// Code generated by lister-gen. DO NOT EDIT.
package v1
import (
v1 "github.com/openebs/zfs-localpv/pkg/apis/openebs.io/zfs/v1"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/tools/cache"
)
// ZFSNodeLister helps list ZFSNodes.
// All objects returned here must be treated as read-only.
type ZFSNodeLister interface {
// List lists all ZFSNodes in the indexer.
// Objects returned here must be treated as read-only.
List(selector labels.Selector) (ret []*v1.ZFSNode, err error)
// ZFSNodes returns an object that can list and get ZFSNodes.
ZFSNodes(namespace string) ZFSNodeNamespaceLister
ZFSNodeListerExpansion
}
// zFSNodeLister implements the ZFSNodeLister interface.
type zFSNodeLister struct {
indexer cache.Indexer
}
// NewZFSNodeLister returns a new ZFSNodeLister.
func NewZFSNodeLister(indexer cache.Indexer) ZFSNodeLister {
return &zFSNodeLister{indexer: indexer}
}
// List lists all ZFSNodes in the indexer.
func (s *zFSNodeLister) List(selector labels.Selector) (ret []*v1.ZFSNode, err error) {
err = cache.ListAll(s.indexer, selector, func(m interface{}) {
ret = append(ret, m.(*v1.ZFSNode))
})
return ret, err
}
// ZFSNodes returns an object that can list and get ZFSNodes.
func (s *zFSNodeLister) ZFSNodes(namespace string) ZFSNodeNamespaceLister {
return zFSNodeNamespaceLister{indexer: s.indexer, namespace: namespace}
}
// ZFSNodeNamespaceLister helps list and get ZFSNodes.
// All objects returned here must be treated as read-only.
type ZFSNodeNamespaceLister interface {
// List lists all ZFSNodes in the indexer for a given namespace.
// Objects returned here must be treated as read-only.
List(selector labels.Selector) (ret []*v1.ZFSNode, err error)
// Get retrieves the ZFSNode from the indexer for a given namespace and name.
// Objects returned here must be treated as read-only.
Get(name string) (*v1.ZFSNode, error)
ZFSNodeNamespaceListerExpansion
}
// zFSNodeNamespaceLister implements the ZFSNodeNamespaceLister
// interface.
type zFSNodeNamespaceLister struct {
indexer cache.Indexer
namespace string
}
// List lists all ZFSNodes in the indexer for a given namespace.
func (s zFSNodeNamespaceLister) List(selector labels.Selector) (ret []*v1.ZFSNode, err error) {
err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) {
ret = append(ret, m.(*v1.ZFSNode))
})
return ret, err
}
// Get retrieves the ZFSNode from the indexer for a given namespace and name.
func (s zFSNodeNamespaceLister) Get(name string) (*v1.ZFSNode, error) {
obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name)
if err != nil {
return nil, err
}
if !exists {
return nil, errors.NewNotFound(v1.Resource("zfsnode"), name)
}
return obj.(*v1.ZFSNode), nil
}