1
0
mirror of https://github.com/rancher/types.git synced 2025-06-19 02:11:54 +00:00
types/config/context.go

560 lines
13 KiB
Go
Raw Normal View History

2017-11-29 00:30:08 +00:00
package config
import (
"context"
"github.com/rancher/norman/controller"
2018-10-10 02:34:28 +00:00
"github.com/rancher/norman/objectclient/dynamic"
2018-04-02 22:46:03 +00:00
"github.com/rancher/norman/restwatch"
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"
apiregistrationv1 "github.com/rancher/types/apis/apiregistration.k8s.io/v1"
2017-11-29 00:30:08 +00:00
appsv1beta2 "github.com/rancher/types/apis/apps/v1beta2"
2019-03-28 13:16:41 +00:00
autoscaling "github.com/rancher/types/apis/autoscaling/v2beta2"
2018-02-13 22:15:18 +00:00
batchv1 "github.com/rancher/types/apis/batch/v1"
batchv1beta1 "github.com/rancher/types/apis/batch/v1beta1"
2018-10-25 16:56:31 +00:00
clusterv3 "github.com/rancher/types/apis/cluster.cattle.io/v3"
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"
monitoringv1 "github.com/rancher/types/apis/monitoring.coreos.com/v1"
istiov1alpha3 "github.com/rancher/types/apis/networking.istio.io/v1alpha3"
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"
storagev1 "github.com/rancher/types/apis/storage.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"
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"
k8dynamic "k8s.io/client-go/dynamic"
2017-11-29 04:48:28 +00:00
"k8s.io/client-go/kubernetes"
2017-11-29 00:30:08 +00:00
"k8s.io/client-go/rest"
)
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
Storage storagev1.Interface
2018-02-20 19:42:58 +00:00
}
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 {
2018-10-10 02:34:28 +00:00
dynamicConfig.NegotiatedSerializer = dynamic.NegotiatedSerializer
2018-02-20 19:42:58 +00:00
}
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 {
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
DynamicClient k8dynamic.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
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
APIAggregation apiregistrationv1.Interface
Apps appsv1beta2.Interface
Autoscaling autoscaling.Interface
Project projectv3.Interface
Core corev1.Interface
RBAC rbacv1.Interface
Extensions extv1beta1.Interface
BatchV1 batchv1.Interface
BatchV1Beta1 batchv1beta1.Interface
Networking knetworkingv1.Interface
Monitoring monitoringv1.Interface
Cluster clusterv3.Interface
Istio istiov1alpha3.Interface
Storage storagev1.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.APIAggregation,
2017-11-29 01:57:50 +00:00
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,
w.Monitoring,
2018-10-25 16:56:31 +00:00
w.Cluster,
w.Storage,
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,
2019-03-28 13:16:41 +00:00
Autoscaling: w.Autoscaling,
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,
Monitoring: w.Monitoring,
2018-10-25 16:56:31 +00:00
Cluster: w.Cluster,
Istio: w.Istio,
Storage: w.Storage,
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
APIRegistration apiregistrationv1.Interface
Apps appsv1beta2.Interface
Autoscaling autoscaling.Interface
Project projectv3.Interface
Core corev1.Interface
RBAC rbacv1.Interface
Extensions extv1beta1.Interface
BatchV1 batchv1.Interface
BatchV1Beta1 batchv1beta1.Interface
Monitoring monitoringv1.Interface
Cluster clusterv3.Interface
Istio istiov1alpha3.Interface
Storage storagev1.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.APIRegistration,
2017-12-20 04:48:52 +00:00
w.Apps,
w.Project,
w.Core,
w.RBAC,
w.Extensions,
2018-02-13 22:15:18 +00:00
w.BatchV1,
w.BatchV1Beta1,
w.Monitoring,
w.Storage,
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
}
context.DynamicClient, err = k8dynamic.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 {
2018-10-10 02:34:28 +00:00
dynamicConfig.NegotiatedSerializer = dynamic.NegotiatedSerializer
2017-11-29 00:30:08 +00:00
}
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
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
return controller.SyncThenStart(ctx, 50, c.controllers()...)
2017-11-29 00:30:08 +00:00
}
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
}
context.Storage, err = storagev1.NewForConfig(config)
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
}
2019-03-28 13:16:41 +00:00
context.Autoscaling, err = autoscaling.NewForConfig(config)
if err != nil {
return nil, err
}
context.Monitoring, err = monitoringv1.NewForConfig(config)
if err != nil {
return nil, err
}
2018-10-25 16:56:31 +00:00
context.Cluster, err = clusterv3.NewForConfig(config)
if err != nil {
return nil, err
}
context.Istio, err = istiov1alpha3.NewForConfig(config)
if err != nil {
return nil, err
}
context.APIAggregation, err = apiregistrationv1.NewForConfig(config)
if err != nil {
return nil, err
}
2017-11-29 00:30:08 +00:00
dynamicConfig := config
if dynamicConfig.NegotiatedSerializer == nil {
2018-10-10 02:34:28 +00:00
dynamicConfig.NegotiatedSerializer = dynamic.NegotiatedSerializer
2017-11-29 00:30:08 +00:00
}
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-10-15 21:31:00 +00:00
func NewUserOnlyContext(config rest.Config) (*UserOnlyContext, error) {
var err error
context := &UserOnlyContext{
RESTConfig: config,
}
context.K8sClient, err = kubernetes.NewForConfig(&config)
if err != nil {
return nil, err
}
context.Apps, err = appsv1beta2.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
}
context.Storage, err = storagev1.NewForConfig(config)
if err != nil {
return nil, err
}
2018-10-15 21:31:00 +00:00
context.RBAC, err = rbacv1.NewForConfig(config)
if err != nil {
return nil, err
}
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
}
2019-03-28 13:16:41 +00:00
context.Autoscaling, err = autoscaling.NewForConfig(config)
if err != nil {
return nil, err
}
context.Monitoring, err = monitoringv1.NewForConfig(config)
if err != nil {
return nil, err
}
2018-10-25 16:56:31 +00:00
context.Cluster, err = clusterv3.NewForConfig(config)
if err != nil {
return nil, err
}
context.Istio, err = istiov1alpha3.NewForConfig(config)
if err != nil {
return nil, err
}
context.APIRegistration, err = apiregistrationv1.NewForConfig(config)
if err != nil {
return nil, err
}
2018-10-15 21:31:00 +00:00
dynamicConfig := config
if dynamicConfig.NegotiatedSerializer == nil {
dynamicConfig.NegotiatedSerializer = dynamic.NegotiatedSerializer
}
context.UnversionedClient, err = restwatch.UnversionedRESTClientFor(&dynamicConfig)
if err != nil {
return nil, err
}
context.Schemas = types.NewSchemas().
AddSchemas(managementSchema.Schemas).
AddSchemas(clusterSchema.Schemas).
AddSchemas(projectSchema.Schemas)
return context, err
}
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()...)
}