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

600 lines
16 KiB
Go
Raw Permalink Normal View History

2017-11-29 00:30:08 +00:00
package config
import (
"context"
"time"
2017-11-29 00:30:08 +00:00
"github.com/rancher/wrangler/pkg/generic"
prommonitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
istiov1alpha3api "github.com/knative/pkg/apis/istio/v1alpha3"
"github.com/rancher/lasso/pkg/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"
2019-08-28 23:35:54 +00:00
appsv1 "github.com/rancher/types/apis/apps/v1"
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"
2019-08-28 23:35:54 +00:00
policyv1beta1 "github.com/rancher/types/apis/policy/v1beta1"
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"
"github.com/rancher/wrangler-api/pkg/generated/controllers/rbac"
wrbacv1 "github.com/rancher/wrangler-api/pkg/generated/controllers/rbac/v1"
"github.com/rancher/wrangler/pkg/schemes"
2017-11-29 00:30:08 +00:00
"github.com/sirupsen/logrus"
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
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"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
k8dynamic "k8s.io/client-go/dynamic"
2017-11-29 04:48:28 +00:00
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
2017-11-29 00:30:08 +00:00
"k8s.io/client-go/rest"
2020-02-12 21:45:06 +00:00
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
apiregistrationv12 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
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"
localSchemeBuilder = runtime.SchemeBuilder{
managementv3.AddToScheme,
projectv3.AddToScheme,
clusterv3.AddToScheme,
scheme.AddToScheme,
apiextensionsv1beta1.AddToScheme,
apiregistrationv12.AddToScheme,
prommonitoringv1.AddToScheme,
istiov1alpha3api.AddToScheme,
}
AddToScheme = localSchemeBuilder.AddToScheme
Scheme = runtime.NewScheme()
2017-12-23 06:26:07 +00:00
)
func init() {
utilruntime.Must(AddToScheme(Scheme))
utilruntime.Must(schemes.AddToScheme(Scheme))
}
2018-02-20 19:42:58 +00:00
type ScaledContext struct {
ClientGetter proxy.ClientGetter
2020-02-12 21:45:06 +00:00
KubeConfig clientcmdapi.Config
2018-02-20 19:42:58 +00:00
RESTConfig rest.Config
ControllerFactory controller.SharedControllerFactory
2018-02-20 19:42:58 +00:00
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
RunContext context.Context
managementContext *ManagementContext
2018-02-20 19:42:58 +00:00
}
func (c *ScaledContext) NewManagementContext() (*ManagementContext, error) {
if c.managementContext != nil {
return c.managementContext, nil
}
mgmt, err := newManagementContext(c)
if err != nil {
return nil, err
}
mgmt.Dialer = c.Dialer
mgmt.UserManager = c.UserManager
c.managementContext = mgmt
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,
}
controllerFactory, err := controller.NewSharedControllerFactoryFromConfig(&context.RESTConfig, Scheme)
if err != nil {
return nil, err
}
context.ControllerFactory = controllerFactory
context.Management, err = managementv3.NewFromControllerFactory(controllerFactory)
2018-02-20 19:42:58 +00:00
if err != nil {
return nil, err
}
context.Project, err = projectv3.NewFromControllerFactory(controllerFactory)
2018-02-20 19:42:58 +00:00
if err != nil {
return nil, err
}
context.K8sClient, err = kubernetes.NewForConfig(&config)
if err != nil {
return nil, err
}
context.RBAC, err = rbacv1.NewFromControllerFactory(controllerFactory)
2018-02-20 19:42:58 +00:00
if err != nil {
return nil, err
}
context.Core, err = corev1.NewFromControllerFactory(controllerFactory)
2018-02-20 19:42:58 +00:00
if err != nil {
return nil, err
}
context.Project, err = projectv3.NewFromControllerFactory(controllerFactory)
2018-02-20 19:42:58 +00:00
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 c.ControllerFactory.Start(ctx, 50)
2018-02-20 19:42:58 +00:00
}
2017-12-04 23:42:18 +00:00
type ManagementContext struct {
2018-02-09 20:33:36 +00:00
ClientGetter proxy.ClientGetter
2017-11-29 00:30:08 +00:00
RESTConfig rest.Config
ControllerFactory controller.SharedControllerFactory
2017-11-29 00:30:08 +00:00
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
}
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
ControllerFactory controller.SharedControllerFactory
2017-11-29 00:30:08 +00:00
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
runContext context.Context
2017-11-29 01:57:50 +00:00
APIAggregation apiregistrationv1.Interface
2019-08-28 23:35:54 +00:00
Apps appsv1.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
2019-08-28 23:35:54 +00:00
Policy policyv1beta1.Interface
RBACw wrbacv1.Interface
rbacw *rbac.Factory
2017-11-29 01:57:50 +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,
2019-08-28 23:35:54 +00:00
Policy: w.Policy,
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
ControllerFactory controller.SharedControllerFactory
2017-12-20 04:48:52 +00:00
UnversionedClient rest.Interface
K8sClient kubernetes.Interface
APIRegistration apiregistrationv1.Interface
2019-08-28 23:35:54 +00:00
Apps appsv1.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
2019-08-28 23:35:54 +00:00
Policy policyv1beta1.Interface
2017-12-20 04:48:52 +00:00
}
func newManagementContext(c *ScaledContext) (*ManagementContext, error) {
2017-11-29 00:30:08 +00:00
var err error
2017-12-04 23:42:18 +00:00
context := &ManagementContext{
RESTConfig: c.RESTConfig,
2017-11-29 00:30:08 +00:00
}
config := c.RESTConfig
controllerFactory := c.ControllerFactory
context.ControllerFactory = controllerFactory
context.Management, err = managementv3.NewFromControllerFactory(controllerFactory)
2018-02-11 10:45:31 +00:00
if err != nil {
return nil, err
}
context.Project, err = projectv3.NewFromControllerFactory(controllerFactory)
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
}
context.RBAC, err = rbacv1.NewFromControllerFactory(controllerFactory)
2017-12-17 04:16:29 +00:00
if err != nil {
return nil, err
}
context.Core, err = corev1.NewFromControllerFactory(controllerFactory)
2017-12-26 22:49:45 +00:00
if err != nil {
return nil, err
}
context.Project, err = projectv3.NewFromControllerFactory(controllerFactory)
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)
context.Scheme = 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")
return c.ControllerFactory.Start(ctx, 50)
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,
runContext: scaledContext.RunContext,
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
}
controllerFactory, err := controller.NewSharedControllerFactoryFromConfig(&config, Scheme)
if err != nil {
return nil, err
}
context.ControllerFactory = controllerFactory
2017-11-29 04:48:28 +00:00
context.K8sClient, err = kubernetes.NewForConfig(&config)
if err != nil {
return nil, err
}
context.Apps, err = appsv1.NewFromControllerFactory(controllerFactory)
2017-11-29 00:30:08 +00:00
if err != nil {
return nil, err
}
context.Core, err = corev1.NewFromControllerFactory(controllerFactory)
2017-11-29 00:30:08 +00:00
if err != nil {
return nil, err
}
context.Project, err = projectv3.NewFromControllerFactory(controllerFactory)
2017-11-29 00:30:08 +00:00
if err != nil {
return nil, err
}
context.Storage, err = storagev1.NewFromControllerFactory(controllerFactory)
if err != nil {
return nil, err
}
context.RBAC, err = rbacv1.NewFromControllerFactory(controllerFactory)
2017-12-09 16:19:33 +00:00
if err != nil {
return nil, err
}
context.Networking, err = knetworkingv1.NewFromControllerFactory(controllerFactory)
2018-03-26 22:57:47 +00:00
if err != nil {
return nil, err
}
context.Extensions, err = extv1beta1.NewFromControllerFactory(controllerFactory)
2017-12-09 16:19:33 +00:00
if err != nil {
return nil, err
}
context.Policy, err = policyv1beta1.NewFromControllerFactory(controllerFactory)
2019-08-28 23:35:54 +00:00
if err != nil {
return nil, err
}
context.BatchV1, err = batchv1.NewFromControllerFactory(controllerFactory)
if err != nil {
return nil, err
}
context.BatchV1Beta1, err = batchv1beta1.NewFromControllerFactory(controllerFactory)
if err != nil {
return nil, err
}
context.Autoscaling, err = autoscaling.NewFromControllerFactory(controllerFactory)
2019-03-28 13:16:41 +00:00
if err != nil {
return nil, err
}
context.Monitoring, err = monitoringv1.NewFromControllerFactory(controllerFactory)
if err != nil {
return nil, err
}
context.Cluster, err = clusterv3.NewFromControllerFactory(controllerFactory)
if err != nil {
return nil, err
}
context.Istio, err = istiov1alpha3.NewFromControllerFactory(controllerFactory)
if err != nil {
return nil, err
}
context.APIAggregation, err = apiregistrationv1.NewFromControllerFactory(controllerFactory)
if err != nil {
return nil, err
}
wranglerConf := config
wranglerConf.Timeout = 30 * time.Minute
opts := &generic.FactoryOptions{
SharedControllerFactory: controllerFactory,
}
context.rbacw, err = rbac.NewFactoryFromConfigWithOptions(&wranglerConf, opts)
if err != nil {
return nil, err
}
context.RBACw = context.rbacw.Rbac().V1()
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)
if err := w.Management.ControllerFactory.Start(w.runContext, 50); err != nil {
return err
}
return w.ControllerFactory.Start(ctx, 5)
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,
}
controllerFactory, err := controller.NewSharedControllerFactoryFromConfig(&config, Scheme)
if err != nil {
return nil, err
}
context.ControllerFactory = controllerFactory
2018-10-15 21:31:00 +00:00
context.K8sClient, err = kubernetes.NewForConfig(&config)
if err != nil {
return nil, err
}
context.Apps, err = appsv1.NewFromControllerFactory(controllerFactory)
2018-10-15 21:31:00 +00:00
if err != nil {
return nil, err
}
context.Core, err = corev1.NewFromControllerFactory(controllerFactory)
2018-10-15 21:31:00 +00:00
if err != nil {
return nil, err
}
context.Project, err = projectv3.NewFromControllerFactory(controllerFactory)
2018-10-15 21:31:00 +00:00
if err != nil {
return nil, err
}
context.Storage, err = storagev1.NewFromControllerFactory(controllerFactory)
if err != nil {
return nil, err
}
context.RBAC, err = rbacv1.NewFromControllerFactory(controllerFactory)
2018-10-15 21:31:00 +00:00
if err != nil {
return nil, err
}
context.Extensions, err = extv1beta1.NewFromControllerFactory(controllerFactory)
2018-10-15 21:31:00 +00:00
if err != nil {
return nil, err
}
context.Policy, err = policyv1beta1.NewFromControllerFactory(controllerFactory)
2019-08-28 23:35:54 +00:00
if err != nil {
return nil, err
}
context.BatchV1, err = batchv1.NewFromControllerFactory(controllerFactory)
2018-10-15 21:31:00 +00:00
if err != nil {
return nil, err
}
context.BatchV1Beta1, err = batchv1beta1.NewFromControllerFactory(controllerFactory)
2018-10-15 21:31:00 +00:00
if err != nil {
return nil, err
}
context.Autoscaling, err = autoscaling.NewFromControllerFactory(controllerFactory)
2019-03-28 13:16:41 +00:00
if err != nil {
return nil, err
}
context.Monitoring, err = monitoringv1.NewFromControllerFactory(controllerFactory)
if err != nil {
return nil, err
}
context.Cluster, err = clusterv3.NewFromControllerFactory(controllerFactory)
if err != nil {
return nil, err
}
context.Istio, err = istiov1alpha3.NewFromControllerFactory(controllerFactory)
if err != nil {
return nil, err
}
context.APIRegistration, err = apiregistrationv1.NewFromControllerFactory(controllerFactory)
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 w.ControllerFactory.Start(ctx, 5)
2017-12-20 04:48:52 +00:00
}