1
0
mirror of https://github.com/rancher/types.git synced 2025-04-29 19:03:21 +00:00
types/config/context.go

447 lines
11 KiB
Go
Raw Normal View History

2017-11-29 00:30:08 +00:00
package config
import (
"context"
"github.com/rancher/norman/controller"
2017-12-16 08:41:33 +00:00
"github.com/rancher/norman/event"
2018-04-02 22:46:03 +00:00
"github.com/rancher/norman/restwatch"
2017-11-29 00:30:08 +00:00
"github.com/rancher/norman/signal"
2018-02-09 20:33:36 +00:00
"github.com/rancher/norman/store/proxy"
2017-12-16 08:41:33 +00:00
"github.com/rancher/norman/types"
2017-11-29 00:30:08 +00:00
appsv1beta2 "github.com/rancher/types/apis/apps/v1beta2"
2018-02-13 22:15:18 +00:00
batchv1 "github.com/rancher/types/apis/batch/v1"
batchv1beta1 "github.com/rancher/types/apis/batch/v1beta1"
clusterSchema "github.com/rancher/types/apis/cluster.cattle.io/v3/schema"
2017-11-29 00:30:08 +00:00
corev1 "github.com/rancher/types/apis/core/v1"
2017-12-09 16:19:33 +00:00
extv1beta1 "github.com/rancher/types/apis/extensions/v1beta1"
2017-12-04 23:42:18 +00:00
managementv3 "github.com/rancher/types/apis/management.cattle.io/v3"
2017-12-16 08:41:33 +00:00
managementSchema "github.com/rancher/types/apis/management.cattle.io/v3/schema"
2018-03-26 22:57:47 +00:00
knetworkingv1 "github.com/rancher/types/apis/networking.k8s.io/v1"
2017-12-04 23:42:18 +00:00
projectv3 "github.com/rancher/types/apis/project.cattle.io/v3"
2017-12-23 06:26:07 +00:00
projectSchema "github.com/rancher/types/apis/project.cattle.io/v3/schema"
rbacv1 "github.com/rancher/types/apis/rbac.authorization.k8s.io/v1"
2018-02-20 19:42:58 +00:00
"github.com/rancher/types/config/dialer"
2018-09-17 22:58:44 +00:00
"github.com/rancher/types/peermanager"
"github.com/rancher/types/user"
2017-11-29 00:30:08 +00:00
"github.com/sirupsen/logrus"
2017-12-16 08:41:33 +00:00
"k8s.io/api/core/v1"
2018-02-09 20:33:36 +00:00
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
2017-12-16 08:41:33 +00:00
"k8s.io/apimachinery/pkg/runtime"
2017-11-29 00:30:08 +00:00
"k8s.io/client-go/dynamic"
2017-11-29 04:48:28 +00:00
"k8s.io/client-go/kubernetes"
2017-12-16 08:41:33 +00:00
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
2017-11-29 00:30:08 +00:00
"k8s.io/client-go/rest"
2017-12-16 08:41:33 +00:00
"k8s.io/client-go/tools/record"
2017-11-29 00:30:08 +00:00
)
2017-12-23 06:26:07 +00:00
var (
2018-02-09 20:33:36 +00:00
UserStorageContext types.StorageContext = "user"
ManagementStorageContext types.StorageContext = "mgmt"
2017-12-23 06:26:07 +00:00
)
2018-02-20 19:42:58 +00:00
type ScaledContext struct {
ClientGetter proxy.ClientGetter
LocalConfig *rest.Config
RESTConfig rest.Config
UnversionedClient rest.Interface
K8sClient kubernetes.Interface
APIExtClient clientset.Interface
Schemas *types.Schemas
AccessControl types.AccessControl
Dialer dialer.Factory
UserManager user.Manager
2018-09-17 22:58:44 +00:00
PeerManager peermanager.PeerManager
2018-02-20 19:42:58 +00:00
Management managementv3.Interface
Project projectv3.Interface
RBAC rbacv1.Interface
Core corev1.Interface
}
func (c *ScaledContext) controllers() []controller.Starter {
return []controller.Starter{
c.Management,
c.Project,
c.RBAC,
c.Core,
}
}
func (c *ScaledContext) NewManagementContext() (*ManagementContext, error) {
mgmt, err := NewManagementContext(c.RESTConfig)
if err != nil {
return nil, err
}
mgmt.Dialer = c.Dialer
mgmt.UserManager = c.UserManager
return mgmt, nil
}
2018-02-20 19:42:58 +00:00
func NewScaledContext(config rest.Config) (*ScaledContext, error) {
var err error
context := &ScaledContext{
RESTConfig: config,
}
context.Management, err = managementv3.NewForConfig(config)
if err != nil {
return nil, err
}
context.Project, err = projectv3.NewForConfig(config)
if err != nil {
return nil, err
}
context.K8sClient, err = kubernetes.NewForConfig(&config)
if err != nil {
return nil, err
}
context.RBAC, err = rbacv1.NewForConfig(config)
if err != nil {
return nil, err
}
context.Core, err = corev1.NewForConfig(config)
if err != nil {
return nil, err
}
context.Project, err = projectv3.NewForConfig(config)
if err != nil {
return nil, err
}
dynamicConfig := config
if dynamicConfig.NegotiatedSerializer == nil {
configConfig := dynamic.ContentConfig()
dynamicConfig.NegotiatedSerializer = configConfig.NegotiatedSerializer
}
2018-04-02 22:46:03 +00:00
context.UnversionedClient, err = restwatch.UnversionedRESTClientFor(&dynamicConfig)
2018-02-20 19:42:58 +00:00
if err != nil {
return nil, err
}
context.APIExtClient, err = clientset.NewForConfig(&dynamicConfig)
if err != nil {
return nil, err
}
context.Schemas = types.NewSchemas().
AddSchemas(managementSchema.Schemas).
AddSchemas(clusterSchema.Schemas).
AddSchemas(projectSchema.Schemas)
return context, err
}
func (c *ScaledContext) Start(ctx context.Context) error {
logrus.Info("Starting API controllers")
return controller.SyncThenStart(ctx, 5, c.controllers()...)
}
2017-12-04 23:42:18 +00:00
type ManagementContext struct {
2017-12-16 08:41:33 +00:00
eventBroadcaster record.EventBroadcaster
2018-02-09 20:33:36 +00:00
ClientGetter proxy.ClientGetter
2017-12-11 22:42:51 +00:00
LocalConfig *rest.Config
2017-11-29 00:30:08 +00:00
RESTConfig rest.Config
UnversionedClient rest.Interface
2017-12-16 08:41:33 +00:00
K8sClient kubernetes.Interface
2018-02-09 20:33:36 +00:00
APIExtClient clientset.Interface
2017-12-16 08:41:33 +00:00
Events record.EventRecorder
EventLogger event.Logger
Schemas *types.Schemas
Scheme *runtime.Scheme
2018-02-20 19:42:58 +00:00
Dialer dialer.Factory
UserManager user.Manager
2018-02-11 10:45:31 +00:00
Management managementv3.Interface
Project projectv3.Interface
RBAC rbacv1.Interface
Core corev1.Interface
2017-11-29 01:57:50 +00:00
}
2017-12-04 23:42:18 +00:00
func (c *ManagementContext) controllers() []controller.Starter {
2017-11-29 01:57:50 +00:00
return []controller.Starter{
2017-12-04 23:42:18 +00:00
c.Management,
2018-02-11 10:45:31 +00:00
c.Project,
2017-12-17 04:16:29 +00:00
c.RBAC,
2017-12-26 22:49:45 +00:00
c.Core,
2017-11-29 01:57:50 +00:00
}
2017-11-29 00:30:08 +00:00
}
2018-02-07 20:17:41 +00:00
type UserContext struct {
2017-12-04 23:42:18 +00:00
Management *ManagementContext
2017-11-29 01:57:50 +00:00
ClusterName string
2017-11-29 00:30:08 +00:00
RESTConfig rest.Config
UnversionedClient rest.Interface
2018-02-09 20:33:36 +00:00
APIExtClient clientset.Interface
2017-11-29 04:48:28 +00:00
K8sClient kubernetes.Interface
2017-11-29 01:57:50 +00:00
2018-02-13 22:15:18 +00:00
Apps appsv1beta2.Interface
Project projectv3.Interface
Core corev1.Interface
RBAC rbacv1.Interface
Extensions extv1beta1.Interface
BatchV1 batchv1.Interface
BatchV1Beta1 batchv1beta1.Interface
2018-03-26 22:57:47 +00:00
Networking knetworkingv1.Interface
2017-11-29 01:57:50 +00:00
}
2018-02-07 20:17:41 +00:00
func (w *UserContext) controllers() []controller.Starter {
2017-11-29 01:57:50 +00:00
return []controller.Starter{
w.Apps,
2017-12-04 23:42:18 +00:00
w.Project,
2017-11-29 01:57:50 +00:00
w.Core,
2017-12-09 16:19:33 +00:00
w.RBAC,
w.Extensions,
2018-02-13 22:15:18 +00:00
w.BatchV1,
w.BatchV1Beta1,
2018-03-26 22:57:47 +00:00
w.Networking,
2017-11-29 01:57:50 +00:00
}
2017-11-29 00:30:08 +00:00
}
2018-02-07 20:17:41 +00:00
func (w *UserContext) UserOnlyContext() *UserOnlyContext {
return &UserOnlyContext{
2018-02-09 20:33:36 +00:00
Schemas: w.Management.Schemas,
2017-12-20 04:48:52 +00:00
ClusterName: w.ClusterName,
RESTConfig: w.RESTConfig,
UnversionedClient: w.UnversionedClient,
K8sClient: w.K8sClient,
2018-02-13 22:15:18 +00:00
Apps: w.Apps,
Project: w.Project,
Core: w.Core,
RBAC: w.RBAC,
Extensions: w.Extensions,
BatchV1: w.BatchV1,
BatchV1Beta1: w.BatchV1Beta1,
2017-12-20 04:48:52 +00:00
}
}
2018-02-07 20:17:41 +00:00
type UserOnlyContext struct {
Schemas *types.Schemas
2017-12-20 04:48:52 +00:00
ClusterName string
RESTConfig rest.Config
UnversionedClient rest.Interface
K8sClient kubernetes.Interface
2018-02-13 22:15:18 +00:00
Apps appsv1beta2.Interface
Project projectv3.Interface
Core corev1.Interface
RBAC rbacv1.Interface
Extensions extv1beta1.Interface
BatchV1 batchv1.Interface
BatchV1Beta1 batchv1beta1.Interface
2017-12-20 04:48:52 +00:00
}
2018-02-07 20:17:41 +00:00
func (w *UserOnlyContext) controllers() []controller.Starter {
2017-12-20 04:48:52 +00:00
return []controller.Starter{
w.Apps,
w.Project,
w.Core,
w.RBAC,
w.Extensions,
2018-02-13 22:15:18 +00:00
w.BatchV1,
w.BatchV1Beta1,
2017-12-20 04:48:52 +00:00
}
}
2017-12-04 23:42:18 +00:00
func NewManagementContext(config rest.Config) (*ManagementContext, error) {
2017-11-29 00:30:08 +00:00
var err error
2017-12-04 23:42:18 +00:00
context := &ManagementContext{
2017-11-29 00:30:08 +00:00
RESTConfig: config,
}
2017-12-04 23:42:18 +00:00
context.Management, err = managementv3.NewForConfig(config)
2018-02-11 10:45:31 +00:00
if err != nil {
return nil, err
}
context.Project, err = projectv3.NewForConfig(config)
2017-11-29 00:30:08 +00:00
if err != nil {
return nil, err
}
2017-12-16 08:41:33 +00:00
context.K8sClient, err = kubernetes.NewForConfig(&config)
if err != nil {
return nil, err
}
2017-12-17 04:16:29 +00:00
context.RBAC, err = rbacv1.NewForConfig(config)
if err != nil {
return nil, err
}
2017-12-26 22:49:45 +00:00
context.Core, err = corev1.NewForConfig(config)
if err != nil {
return nil, err
}
context.Project, err = projectv3.NewForConfig(config)
if err != nil {
return nil, err
}
2017-12-26 22:49:45 +00:00
2017-11-29 00:30:08 +00:00
dynamicConfig := config
if dynamicConfig.NegotiatedSerializer == nil {
configConfig := dynamic.ContentConfig()
dynamicConfig.NegotiatedSerializer = configConfig.NegotiatedSerializer
}
2018-04-02 22:46:03 +00:00
context.UnversionedClient, err = restwatch.UnversionedRESTClientFor(&dynamicConfig)
2017-11-29 00:30:08 +00:00
if err != nil {
return nil, err
}
2018-02-09 20:33:36 +00:00
context.APIExtClient, err = clientset.NewForConfig(&dynamicConfig)
if err != nil {
return nil, err
2017-12-23 06:26:07 +00:00
}
2018-02-09 20:33:36 +00:00
context.Schemas = types.NewSchemas().
AddSchemas(managementSchema.Schemas).
AddSchemas(clusterSchema.Schemas).
AddSchemas(projectSchema.Schemas)
2017-12-16 08:41:33 +00:00
context.Scheme = runtime.NewScheme()
managementv3.AddToScheme(context.Scheme)
2018-02-09 20:33:36 +00:00
projectv3.AddToScheme(context.Scheme)
2017-12-16 08:41:33 +00:00
context.eventBroadcaster = record.NewBroadcaster()
context.Events = context.eventBroadcaster.NewRecorder(context.Scheme, v1.EventSource{
Component: "CattleManagementServer",
})
context.EventLogger = event.NewLogger(context.Events)
2017-11-29 00:30:08 +00:00
return context, err
}
2017-12-04 23:42:18 +00:00
func (c *ManagementContext) Start(ctx context.Context) error {
logrus.Info("Starting management controllers")
2017-12-16 08:41:33 +00:00
watcher := c.eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{
Interface: c.K8sClient.CoreV1().Events(""),
})
go func() {
<-ctx.Done()
watcher.Stop()
}()
return controller.SyncThenStart(ctx, 50, c.controllers()...)
2017-11-29 00:30:08 +00:00
}
2017-12-04 23:42:18 +00:00
func (c *ManagementContext) StartAndWait() error {
2017-11-29 00:30:08 +00:00
ctx := signal.SigTermCancelContext(context.Background())
c.Start(ctx)
<-ctx.Done()
return ctx.Err()
}
func NewUserContext(scaledContext *ScaledContext, config rest.Config, clusterName string) (*UserContext, error) {
2017-11-29 00:30:08 +00:00
var err error
2018-02-07 20:17:41 +00:00
context := &UserContext{
2017-11-29 03:59:54 +00:00
RESTConfig: config,
ClusterName: clusterName,
2017-11-29 00:30:08 +00:00
}
context.Management, err = scaledContext.NewManagementContext()
2017-11-29 00:30:08 +00:00
if err != nil {
return nil, err
}
2017-11-29 04:48:28 +00:00
context.K8sClient, err = kubernetes.NewForConfig(&config)
if err != nil {
return nil, err
}
2017-11-29 00:30:08 +00:00
context.Apps, err = appsv1beta2.NewForConfig(config)
if err != nil {
return nil, err
}
2017-12-04 23:42:18 +00:00
context.Core, err = corev1.NewForConfig(config)
2017-11-29 00:30:08 +00:00
if err != nil {
return nil, err
}
2017-12-04 23:42:18 +00:00
context.Project, err = projectv3.NewForConfig(config)
2017-11-29 00:30:08 +00:00
if err != nil {
return nil, err
}
2017-12-09 16:19:33 +00:00
context.RBAC, err = rbacv1.NewForConfig(config)
if err != nil {
return nil, err
}
2018-03-26 22:57:47 +00:00
context.Networking, err = knetworkingv1.NewForConfig(config)
if err != nil {
return nil, err
}
2017-12-09 16:19:33 +00:00
context.Extensions, err = extv1beta1.NewForConfig(config)
if err != nil {
return nil, err
}
context.BatchV1, err = batchv1.NewForConfig(config)
if err != nil {
return nil, err
}
context.BatchV1Beta1, err = batchv1beta1.NewForConfig(config)
if err != nil {
return nil, err
}
2017-11-29 00:30:08 +00:00
dynamicConfig := config
if dynamicConfig.NegotiatedSerializer == nil {
configConfig := dynamic.ContentConfig()
dynamicConfig.NegotiatedSerializer = configConfig.NegotiatedSerializer
}
2018-04-02 22:46:03 +00:00
context.UnversionedClient, err = restwatch.UnversionedRESTClientFor(&dynamicConfig)
2017-11-29 00:30:08 +00:00
if err != nil {
return nil, err
}
2018-02-09 20:33:36 +00:00
context.APIExtClient, err = clientset.NewForConfig(&dynamicConfig)
if err != nil {
return nil, err
}
2017-11-29 00:30:08 +00:00
return context, err
}
2017-11-29 01:57:50 +00:00
2018-02-07 20:17:41 +00:00
func (w *UserContext) Start(ctx context.Context) error {
2018-01-12 10:01:35 +00:00
logrus.Info("Starting cluster controllers for ", w.ClusterName)
2017-12-04 23:42:18 +00:00
controllers := w.Management.controllers()
2017-11-29 01:57:50 +00:00
controllers = append(controllers, w.controllers()...)
2017-12-20 04:48:52 +00:00
return controller.SyncThenStart(ctx, 5, controllers...)
2017-11-29 01:57:50 +00:00
}
2018-02-07 20:17:41 +00:00
func (w *UserContext) StartAndWait(ctx context.Context) error {
2017-12-11 22:42:51 +00:00
ctx = signal.SigTermCancelContext(ctx)
2017-11-29 01:57:50 +00:00
w.Start(ctx)
<-ctx.Done()
return ctx.Err()
}
2017-12-20 04:48:52 +00:00
2018-02-07 20:17:41 +00:00
func (w *UserOnlyContext) Start(ctx context.Context) error {
2017-12-20 04:48:52 +00:00
logrus.Info("Starting workload controllers")
return controller.SyncThenStart(ctx, 5, w.controllers()...)
}
2018-02-07 20:17:41 +00:00
func (w *UserOnlyContext) StartAndWait(ctx context.Context) error {
2017-12-20 04:48:52 +00:00
ctx = signal.SigTermCancelContext(ctx)
w.Start(ctx)
<-ctx.Done()
return ctx.Err()
}