github.com/rancher/types@v0.0.0-20220328215343-4370ff10ecd5/config/context.go (about)

     1  package config
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/rancher/norman/controller"
     8  	"github.com/rancher/norman/objectclient/dynamic"
     9  	"github.com/rancher/norman/restwatch"
    10  	"github.com/rancher/norman/store/proxy"
    11  	"github.com/rancher/norman/types"
    12  	apiregistrationv1 "github.com/rancher/types/apis/apiregistration.k8s.io/v1"
    13  	appsv1 "github.com/rancher/types/apis/apps/v1"
    14  	autoscaling "github.com/rancher/types/apis/autoscaling/v2beta2"
    15  	batchv1 "github.com/rancher/types/apis/batch/v1"
    16  	batchv1beta1 "github.com/rancher/types/apis/batch/v1beta1"
    17  	clusterv3 "github.com/rancher/types/apis/cluster.cattle.io/v3"
    18  	clusterSchema "github.com/rancher/types/apis/cluster.cattle.io/v3/schema"
    19  	corev1 "github.com/rancher/types/apis/core/v1"
    20  	extv1beta1 "github.com/rancher/types/apis/extensions/v1beta1"
    21  	managementv3 "github.com/rancher/types/apis/management.cattle.io/v3"
    22  	managementSchema "github.com/rancher/types/apis/management.cattle.io/v3/schema"
    23  	monitoringv1 "github.com/rancher/types/apis/monitoring.coreos.com/v1"
    24  	istiov1alpha3 "github.com/rancher/types/apis/networking.istio.io/v1alpha3"
    25  	knetworkingv1 "github.com/rancher/types/apis/networking.k8s.io/v1"
    26  	policyv1beta1 "github.com/rancher/types/apis/policy/v1beta1"
    27  	projectv3 "github.com/rancher/types/apis/project.cattle.io/v3"
    28  	projectSchema "github.com/rancher/types/apis/project.cattle.io/v3/schema"
    29  	rbacv1 "github.com/rancher/types/apis/rbac.authorization.k8s.io/v1"
    30  	storagev1 "github.com/rancher/types/apis/storage.k8s.io/v1"
    31  	"github.com/rancher/types/config/dialer"
    32  	"github.com/rancher/types/peermanager"
    33  	"github.com/rancher/types/user"
    34  	"github.com/rancher/wrangler-api/pkg/generated/controllers/rbac"
    35  	wrbacv1 "github.com/rancher/wrangler-api/pkg/generated/controllers/rbac/v1"
    36  	"github.com/sirupsen/logrus"
    37  	"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
    38  	"k8s.io/apimachinery/pkg/runtime"
    39  	k8dynamic "k8s.io/client-go/dynamic"
    40  	"k8s.io/client-go/kubernetes"
    41  	"k8s.io/client-go/rest"
    42  	clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
    43  )
    44  
    45  var (
    46  	UserStorageContext       types.StorageContext = "user"
    47  	ManagementStorageContext types.StorageContext = "mgmt"
    48  )
    49  
    50  type ScaledContext struct {
    51  	ClientGetter      proxy.ClientGetter
    52  	KubeConfig        clientcmdapi.Config
    53  	RESTConfig        rest.Config
    54  	UnversionedClient rest.Interface
    55  	K8sClient         kubernetes.Interface
    56  	APIExtClient      clientset.Interface
    57  	Schemas           *types.Schemas
    58  	AccessControl     types.AccessControl
    59  	Dialer            dialer.Factory
    60  	UserManager       user.Manager
    61  	PeerManager       peermanager.PeerManager
    62  	CatalogManager    CatalogManager
    63  
    64  	Management managementv3.Interface
    65  	Project    projectv3.Interface
    66  	RBAC       rbacv1.Interface
    67  	Core       corev1.Interface
    68  	Storage    storagev1.Interface
    69  
    70  	RunContext        context.Context
    71  	managementContext *ManagementContext
    72  }
    73  
    74  type CatalogManager interface {
    75  	ValidateChartCompatibility(template *managementv3.CatalogTemplateVersion, clusterName string) error
    76  	ValidateKubeVersion(template *managementv3.CatalogTemplateVersion, clusterName string) error
    77  	ValidateRancherVersion(template *managementv3.CatalogTemplateVersion) error
    78  	LatestAvailableTemplateVersion(template *managementv3.CatalogTemplate, clusterName string) (*managementv3.TemplateVersionSpec, error)
    79  	GetSystemAppCatalogID(templateVersionID, clusterName string) (string, error)
    80  }
    81  
    82  func (c *ScaledContext) controllers() []controller.Starter {
    83  	return []controller.Starter{
    84  		c.Management,
    85  		c.Project,
    86  		c.RBAC,
    87  		c.Core,
    88  	}
    89  }
    90  
    91  func (c *ScaledContext) NewManagementContext() (*ManagementContext, error) {
    92  	if c.managementContext != nil {
    93  		return c.managementContext, nil
    94  	}
    95  	mgmt, err := NewManagementContext(c.RESTConfig)
    96  	if err != nil {
    97  		return nil, err
    98  	}
    99  	mgmt.Dialer = c.Dialer
   100  	mgmt.UserManager = c.UserManager
   101  	mgmt.CatalogManager = c.CatalogManager
   102  	c.managementContext = mgmt
   103  	return mgmt, nil
   104  }
   105  
   106  func NewScaledContext(config rest.Config) (*ScaledContext, error) {
   107  	var err error
   108  
   109  	context := &ScaledContext{
   110  		RESTConfig: config,
   111  	}
   112  
   113  	context.Management, err = managementv3.NewForConfig(config)
   114  	if err != nil {
   115  		return nil, err
   116  	}
   117  
   118  	context.Project, err = projectv3.NewForConfig(config)
   119  	if err != nil {
   120  		return nil, err
   121  	}
   122  
   123  	context.K8sClient, err = kubernetes.NewForConfig(&config)
   124  	if err != nil {
   125  		return nil, err
   126  	}
   127  
   128  	context.RBAC, err = rbacv1.NewForConfig(config)
   129  	if err != nil {
   130  		return nil, err
   131  	}
   132  
   133  	context.Core, err = corev1.NewForConfig(config)
   134  	if err != nil {
   135  		return nil, err
   136  	}
   137  	context.Project, err = projectv3.NewForConfig(config)
   138  	if err != nil {
   139  		return nil, err
   140  	}
   141  	dynamicConfig := config
   142  	if dynamicConfig.NegotiatedSerializer == nil {
   143  		dynamicConfig.NegotiatedSerializer = dynamic.NegotiatedSerializer
   144  	}
   145  
   146  	context.UnversionedClient, err = restwatch.UnversionedRESTClientFor(&dynamicConfig)
   147  	if err != nil {
   148  		return nil, err
   149  	}
   150  
   151  	context.APIExtClient, err = clientset.NewForConfig(&dynamicConfig)
   152  	if err != nil {
   153  		return nil, err
   154  	}
   155  
   156  	context.Schemas = types.NewSchemas().
   157  		AddSchemas(managementSchema.Schemas).
   158  		AddSchemas(clusterSchema.Schemas).
   159  		AddSchemas(projectSchema.Schemas)
   160  
   161  	return context, err
   162  }
   163  
   164  func (c *ScaledContext) Start(ctx context.Context) error {
   165  	logrus.Info("Starting API controllers")
   166  	return controller.SyncThenStart(ctx, 5, c.controllers()...)
   167  }
   168  
   169  type ManagementContext struct {
   170  	ClientGetter      proxy.ClientGetter
   171  	RESTConfig        rest.Config
   172  	UnversionedClient rest.Interface
   173  	DynamicClient     k8dynamic.Interface
   174  	K8sClient         kubernetes.Interface
   175  	APIExtClient      clientset.Interface
   176  	Schemas           *types.Schemas
   177  	Scheme            *runtime.Scheme
   178  	Dialer            dialer.Factory
   179  	UserManager       user.Manager
   180  	CatalogManager    CatalogManager
   181  
   182  	Management managementv3.Interface
   183  	Project    projectv3.Interface
   184  	RBAC       rbacv1.Interface
   185  	Core       corev1.Interface
   186  }
   187  
   188  func (c *ManagementContext) controllers() []controller.Starter {
   189  	return []controller.Starter{
   190  		c.Management,
   191  		c.Project,
   192  		c.RBAC,
   193  		c.Core,
   194  	}
   195  }
   196  
   197  type UserContext struct {
   198  	Management        *ManagementContext
   199  	ClusterName       string
   200  	RESTConfig        rest.Config
   201  	UnversionedClient rest.Interface
   202  	APIExtClient      clientset.Interface
   203  	K8sClient         kubernetes.Interface
   204  	runContext        context.Context
   205  
   206  	APIAggregation apiregistrationv1.Interface
   207  	Apps           appsv1.Interface
   208  	Autoscaling    autoscaling.Interface
   209  	Project        projectv3.Interface
   210  	Core           corev1.Interface
   211  	RBAC           rbacv1.Interface
   212  	Extensions     extv1beta1.Interface
   213  	BatchV1        batchv1.Interface
   214  	BatchV1Beta1   batchv1beta1.Interface
   215  	Networking     knetworkingv1.Interface
   216  	Monitoring     monitoringv1.Interface
   217  	Cluster        clusterv3.Interface
   218  	Istio          istiov1alpha3.Interface
   219  	Storage        storagev1.Interface
   220  	Policy         policyv1beta1.Interface
   221  
   222  	RBACw wrbacv1.Interface
   223  	rbacw *rbac.Factory
   224  }
   225  
   226  func (w *UserContext) controllers() []controller.Starter {
   227  	return []controller.Starter{
   228  		w.APIAggregation,
   229  		w.Apps,
   230  		w.Project,
   231  		w.Core,
   232  		w.RBAC,
   233  		w.Extensions,
   234  		w.BatchV1,
   235  		w.BatchV1Beta1,
   236  		w.Networking,
   237  		w.Monitoring,
   238  		w.Cluster,
   239  		w.Storage,
   240  		w.Policy,
   241  		w.rbacw,
   242  	}
   243  }
   244  
   245  func (w *UserContext) UserOnlyContext() *UserOnlyContext {
   246  	return &UserOnlyContext{
   247  		Schemas:           w.Management.Schemas,
   248  		ClusterName:       w.ClusterName,
   249  		RESTConfig:        w.RESTConfig,
   250  		UnversionedClient: w.UnversionedClient,
   251  		K8sClient:         w.K8sClient,
   252  
   253  		Autoscaling:  w.Autoscaling,
   254  		Apps:         w.Apps,
   255  		Project:      w.Project,
   256  		Core:         w.Core,
   257  		RBAC:         w.RBAC,
   258  		Extensions:   w.Extensions,
   259  		BatchV1:      w.BatchV1,
   260  		BatchV1Beta1: w.BatchV1Beta1,
   261  		Monitoring:   w.Monitoring,
   262  		Cluster:      w.Cluster,
   263  		Istio:        w.Istio,
   264  		Storage:      w.Storage,
   265  		Policy:       w.Policy,
   266  	}
   267  }
   268  
   269  type UserOnlyContext struct {
   270  	Schemas           *types.Schemas
   271  	ClusterName       string
   272  	RESTConfig        rest.Config
   273  	UnversionedClient rest.Interface
   274  	K8sClient         kubernetes.Interface
   275  
   276  	APIRegistration apiregistrationv1.Interface
   277  	Apps            appsv1.Interface
   278  	Autoscaling     autoscaling.Interface
   279  	Project         projectv3.Interface
   280  	Core            corev1.Interface
   281  	RBAC            rbacv1.Interface
   282  	Extensions      extv1beta1.Interface
   283  	BatchV1         batchv1.Interface
   284  	BatchV1Beta1    batchv1beta1.Interface
   285  	Monitoring      monitoringv1.Interface
   286  	Cluster         clusterv3.Interface
   287  	Istio           istiov1alpha3.Interface
   288  	Storage         storagev1.Interface
   289  	Policy          policyv1beta1.Interface
   290  }
   291  
   292  func (w *UserOnlyContext) controllers() []controller.Starter {
   293  	return []controller.Starter{
   294  		w.APIRegistration,
   295  		w.Apps,
   296  		w.Project,
   297  		w.Core,
   298  		w.RBAC,
   299  		w.Extensions,
   300  		w.BatchV1,
   301  		w.BatchV1Beta1,
   302  		w.Monitoring,
   303  		w.Storage,
   304  		w.Policy,
   305  	}
   306  }
   307  
   308  func NewManagementContext(config rest.Config) (*ManagementContext, error) {
   309  	var err error
   310  
   311  	context := &ManagementContext{
   312  		RESTConfig: config,
   313  	}
   314  
   315  	context.Management, err = managementv3.NewForConfig(config)
   316  	if err != nil {
   317  		return nil, err
   318  	}
   319  
   320  	context.Project, err = projectv3.NewForConfig(config)
   321  	if err != nil {
   322  		return nil, err
   323  	}
   324  
   325  	context.K8sClient, err = kubernetes.NewForConfig(&config)
   326  	if err != nil {
   327  		return nil, err
   328  	}
   329  
   330  	context.DynamicClient, err = k8dynamic.NewForConfig(&config)
   331  	if err != nil {
   332  		return nil, err
   333  	}
   334  
   335  	context.RBAC, err = rbacv1.NewForConfig(config)
   336  	if err != nil {
   337  		return nil, err
   338  	}
   339  
   340  	context.Core, err = corev1.NewForConfig(config)
   341  	if err != nil {
   342  		return nil, err
   343  	}
   344  	context.Project, err = projectv3.NewForConfig(config)
   345  	if err != nil {
   346  		return nil, err
   347  	}
   348  
   349  	dynamicConfig := config
   350  	if dynamicConfig.NegotiatedSerializer == nil {
   351  		dynamicConfig.NegotiatedSerializer = dynamic.NegotiatedSerializer
   352  	}
   353  
   354  	context.UnversionedClient, err = restwatch.UnversionedRESTClientFor(&dynamicConfig)
   355  	if err != nil {
   356  		return nil, err
   357  	}
   358  
   359  	context.APIExtClient, err = clientset.NewForConfig(&dynamicConfig)
   360  	if err != nil {
   361  		return nil, err
   362  	}
   363  
   364  	context.Schemas = types.NewSchemas().
   365  		AddSchemas(managementSchema.Schemas).
   366  		AddSchemas(clusterSchema.Schemas).
   367  		AddSchemas(projectSchema.Schemas)
   368  
   369  	context.Scheme = runtime.NewScheme()
   370  	managementv3.AddToScheme(context.Scheme)
   371  	projectv3.AddToScheme(context.Scheme)
   372  
   373  	return context, err
   374  }
   375  
   376  func (c *ManagementContext) Start(ctx context.Context) error {
   377  	logrus.Info("Starting management controllers")
   378  
   379  	return controller.SyncThenStart(ctx, 50, c.controllers()...)
   380  }
   381  
   382  func NewUserContext(scaledContext *ScaledContext, config rest.Config, clusterName string) (*UserContext, error) {
   383  	var err error
   384  	context := &UserContext{
   385  		RESTConfig:  config,
   386  		ClusterName: clusterName,
   387  		runContext:  scaledContext.RunContext,
   388  	}
   389  
   390  	context.Management, err = scaledContext.NewManagementContext()
   391  	if err != nil {
   392  		return nil, err
   393  	}
   394  
   395  	context.K8sClient, err = kubernetes.NewForConfig(&config)
   396  	if err != nil {
   397  		return nil, err
   398  	}
   399  
   400  	context.Apps, err = appsv1.NewForConfig(config)
   401  	if err != nil {
   402  		return nil, err
   403  	}
   404  
   405  	context.Core, err = corev1.NewForConfig(config)
   406  	if err != nil {
   407  		return nil, err
   408  	}
   409  
   410  	context.Project, err = projectv3.NewForConfig(config)
   411  	if err != nil {
   412  		return nil, err
   413  	}
   414  
   415  	context.Storage, err = storagev1.NewForConfig(config)
   416  	if err != nil {
   417  		return nil, err
   418  	}
   419  
   420  	context.RBAC, err = rbacv1.NewForConfig(config)
   421  	if err != nil {
   422  		return nil, err
   423  	}
   424  
   425  	context.Networking, err = knetworkingv1.NewForConfig(config)
   426  	if err != nil {
   427  		return nil, err
   428  	}
   429  
   430  	context.Extensions, err = extv1beta1.NewForConfig(config)
   431  	if err != nil {
   432  		return nil, err
   433  	}
   434  
   435  	context.Policy, err = policyv1beta1.NewForConfig(config)
   436  	if err != nil {
   437  		return nil, err
   438  	}
   439  
   440  	context.BatchV1, err = batchv1.NewForConfig(config)
   441  	if err != nil {
   442  		return nil, err
   443  	}
   444  
   445  	context.BatchV1Beta1, err = batchv1beta1.NewForConfig(config)
   446  	if err != nil {
   447  		return nil, err
   448  	}
   449  
   450  	context.Autoscaling, err = autoscaling.NewForConfig(config)
   451  	if err != nil {
   452  		return nil, err
   453  	}
   454  
   455  	context.Monitoring, err = monitoringv1.NewForConfig(config)
   456  	if err != nil {
   457  		return nil, err
   458  	}
   459  
   460  	context.Cluster, err = clusterv3.NewForConfig(config)
   461  	if err != nil {
   462  		return nil, err
   463  	}
   464  
   465  	context.Istio, err = istiov1alpha3.NewForConfig(config)
   466  	if err != nil {
   467  		return nil, err
   468  	}
   469  
   470  	context.APIAggregation, err = apiregistrationv1.NewForConfig(config)
   471  	if err != nil {
   472  		return nil, err
   473  	}
   474  
   475  	wranglerConf := config
   476  	wranglerConf.Timeout = 30 * time.Minute
   477  	context.rbacw, err = rbac.NewFactoryFromConfig(&wranglerConf)
   478  	if err != nil {
   479  		return nil, err
   480  	}
   481  	context.RBACw = context.rbacw.Rbac().V1()
   482  
   483  	dynamicConfig := config
   484  	if dynamicConfig.NegotiatedSerializer == nil {
   485  		dynamicConfig.NegotiatedSerializer = dynamic.NegotiatedSerializer
   486  	}
   487  
   488  	context.UnversionedClient, err = restwatch.UnversionedRESTClientFor(&dynamicConfig)
   489  	if err != nil {
   490  		return nil, err
   491  	}
   492  
   493  	context.APIExtClient, err = clientset.NewForConfig(&dynamicConfig)
   494  	if err != nil {
   495  		return nil, err
   496  	}
   497  
   498  	return context, err
   499  }
   500  
   501  func (w *UserContext) Start(ctx context.Context) error {
   502  	logrus.Info("Starting cluster controllers for ", w.ClusterName)
   503  	if err := controller.SyncThenStart(w.runContext, 50, w.Management.controllers()...); err != nil {
   504  		return err
   505  	}
   506  	return controller.SyncThenStart(ctx, 5, w.controllers()...)
   507  }
   508  
   509  func NewUserOnlyContext(config rest.Config) (*UserOnlyContext, error) {
   510  	var err error
   511  	context := &UserOnlyContext{
   512  		RESTConfig: config,
   513  	}
   514  
   515  	context.K8sClient, err = kubernetes.NewForConfig(&config)
   516  	if err != nil {
   517  		return nil, err
   518  	}
   519  
   520  	context.Apps, err = appsv1.NewForConfig(config)
   521  	if err != nil {
   522  		return nil, err
   523  	}
   524  
   525  	context.Core, err = corev1.NewForConfig(config)
   526  	if err != nil {
   527  		return nil, err
   528  	}
   529  
   530  	context.Project, err = projectv3.NewForConfig(config)
   531  	if err != nil {
   532  		return nil, err
   533  	}
   534  
   535  	context.Storage, err = storagev1.NewForConfig(config)
   536  	if err != nil {
   537  		return nil, err
   538  	}
   539  
   540  	context.RBAC, err = rbacv1.NewForConfig(config)
   541  	if err != nil {
   542  		return nil, err
   543  	}
   544  
   545  	context.Extensions, err = extv1beta1.NewForConfig(config)
   546  	if err != nil {
   547  		return nil, err
   548  	}
   549  
   550  	context.Policy, err = policyv1beta1.NewForConfig(config)
   551  	if err != nil {
   552  		return nil, err
   553  	}
   554  
   555  	context.BatchV1, err = batchv1.NewForConfig(config)
   556  	if err != nil {
   557  		return nil, err
   558  	}
   559  
   560  	context.BatchV1Beta1, err = batchv1beta1.NewForConfig(config)
   561  	if err != nil {
   562  		return nil, err
   563  	}
   564  
   565  	context.Autoscaling, err = autoscaling.NewForConfig(config)
   566  	if err != nil {
   567  		return nil, err
   568  	}
   569  
   570  	context.Monitoring, err = monitoringv1.NewForConfig(config)
   571  	if err != nil {
   572  		return nil, err
   573  	}
   574  
   575  	context.Cluster, err = clusterv3.NewForConfig(config)
   576  	if err != nil {
   577  		return nil, err
   578  	}
   579  
   580  	context.Istio, err = istiov1alpha3.NewForConfig(config)
   581  	if err != nil {
   582  		return nil, err
   583  	}
   584  
   585  	context.APIRegistration, err = apiregistrationv1.NewForConfig(config)
   586  	if err != nil {
   587  		return nil, err
   588  	}
   589  
   590  	dynamicConfig := config
   591  	if dynamicConfig.NegotiatedSerializer == nil {
   592  		dynamicConfig.NegotiatedSerializer = dynamic.NegotiatedSerializer
   593  	}
   594  
   595  	context.UnversionedClient, err = restwatch.UnversionedRESTClientFor(&dynamicConfig)
   596  	if err != nil {
   597  		return nil, err
   598  	}
   599  
   600  	context.Schemas = types.NewSchemas().
   601  		AddSchemas(managementSchema.Schemas).
   602  		AddSchemas(clusterSchema.Schemas).
   603  		AddSchemas(projectSchema.Schemas)
   604  
   605  	return context, err
   606  }
   607  
   608  func (w *UserOnlyContext) Start(ctx context.Context) error {
   609  	logrus.Info("Starting workload controllers")
   610  	return controller.SyncThenStart(ctx, 5, w.controllers()...)
   611  }