From 59a6ee577e1aa60aba539213a68324c6497278b6 Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Wed, 14 Aug 2019 13:13:26 -0700 Subject: [PATCH] Add apigroups --- pkg/resources/apigroups/apigroup.go | 71 +++++++++++++++++++++++++++++ pkg/resources/schema.go | 5 +- pkg/server/server.go | 3 +- 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 pkg/resources/apigroups/apigroup.go diff --git a/pkg/resources/apigroups/apigroup.go b/pkg/resources/apigroups/apigroup.go new file mode 100644 index 0000000..962e186 --- /dev/null +++ b/pkg/resources/apigroups/apigroup.go @@ -0,0 +1,71 @@ +package apigroups + +import ( + "net/http" + + "github.com/rancher/norman/pkg/data" + "github.com/rancher/norman/pkg/store/empty" + "github.com/rancher/norman/pkg/types" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/discovery" +) + +func Register(schemas *types.Schemas, discovery discovery.DiscoveryInterface) { + schemas.MustImportAndCustomize(v1.APIGroup{}, func(schema *types.Schema) { + schema.CollectionMethods = []string{http.MethodGet} + schema.ResourceMethods = []string{http.MethodGet} + schema.Store = NewStore(discovery) + schema.Formatter = func(request *types.APIRequest, resource *types.RawResource) { + resource.ID = data.Object(resource.Values).String("name") + } + }) +} + +type Store struct { + empty.Store + + discovery discovery.DiscoveryInterface +} + +func NewStore(discovery discovery.DiscoveryInterface) types.Store { + return &Store{ + Store: empty.Store{}, + discovery: discovery, + } +} + +func (e *Store) ByID(apiOp *types.APIRequest, schema *types.Schema, id string) (types.APIObject, error) { + groupList, err := e.discovery.ServerGroups() + if err != nil { + return types.APIObject{}, err + } + + if id == "core" { + id = "" + } + + for _, group := range groupList.Groups { + if group.Name == id { + return types.ToAPI(group), nil + } + } + + return types.APIObject{}, nil +} + +func (e *Store) List(apiOp *types.APIRequest, schema *types.Schema, opt *types.QueryOptions) (types.APIObject, error) { + groupList, err := e.discovery.ServerGroups() + if err != nil { + return types.APIObject{}, err + } + + var result []interface{} + for _, item := range groupList.Groups { + if item.Name == "" { + item.Name = "core" + } + result = append(result, item) + } + + return types.ToAPI(result), nil +} diff --git a/pkg/resources/schema.go b/pkg/resources/schema.go index 3a9adfe..9f93905 100644 --- a/pkg/resources/schema.go +++ b/pkg/resources/schema.go @@ -2,20 +2,23 @@ package resources import ( "github.com/rancher/naok/pkg/accesscontrol" + "github.com/rancher/naok/pkg/resources/apigroups" "github.com/rancher/naok/pkg/resources/common" "github.com/rancher/naok/pkg/resources/counts" "github.com/rancher/naok/pkg/resources/schema" "github.com/rancher/norman/pkg/store/proxy" "github.com/rancher/norman/pkg/subscribe" "github.com/rancher/norman/pkg/types" + "k8s.io/client-go/kubernetes" ) -func SchemaFactory(getter proxy.ClientGetter, as *accesscontrol.AccessStore) *schema.Collection { +func SchemaFactory(getter proxy.ClientGetter, as *accesscontrol.AccessStore, k8s kubernetes.Interface) *schema.Collection { baseSchema := types.EmptySchemas() collection := schema.NewCollection(baseSchema, as) counts.Register(baseSchema) subscribe.Register(baseSchema) + apigroups.Register(baseSchema, k8s.Discovery()) common.Register(collection, getter) diff --git a/pkg/server/server.go b/pkg/server/server.go index ea1f135..6f49017 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -56,7 +56,8 @@ func Run(ctx context.Context, cfg Config) error { } sf := resources.SchemaFactory(cf, - accesscontrol.NewAccessStore(rbac.Rbac().V1())) + accesscontrol.NewAccessStore(rbac.Rbac().V1()), + k8s) schema.Register(ctx, k8s.Discovery(),