diff --git a/config/context.go b/config/context.go new file mode 100644 index 00000000..56a63c00 --- /dev/null +++ b/config/context.go @@ -0,0 +1,132 @@ +package config + +import ( + "context" + + "github.com/rancher/norman/controller" + "github.com/rancher/norman/signal" + appsv1beta2 "github.com/rancher/types/apis/apps/v1beta2" + authzv1 "github.com/rancher/types/apis/authorization.cattle.io/v1" + clusterv1 "github.com/rancher/types/apis/cluster.cattle.io/v1" + corev1 "github.com/rancher/types/apis/core/v1" + workloadv1 "github.com/rancher/types/apis/workload.cattle.io/v1" + "github.com/sirupsen/logrus" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/rest" +) + +type ClusterContext struct { + RESTConfig rest.Config + UnversionedClient rest.Interface + Cluster clusterv1.Interface + Authorization authzv1.Interface +} + +type WorkloadContext struct { + Cluster *ClusterContext + RESTConfig rest.Config + UnversionedClient rest.Interface + Apps appsv1beta2.Interface + Workload workloadv1.Interface + Core corev1.Interface +} + +func NewClusterContext(config rest.Config) (*ClusterContext, error) { + var err error + + context := &ClusterContext{ + RESTConfig: config, + } + + context.Cluster, err = clusterv1.NewForConfig(config) + if err != nil { + return nil, err + } + + context.Authorization, err = authzv1.NewForConfig(config) + if err != nil { + return nil, err + } + + dynamicConfig := config + if dynamicConfig.NegotiatedSerializer == nil { + configConfig := dynamic.ContentConfig() + dynamicConfig.NegotiatedSerializer = configConfig.NegotiatedSerializer + } + + context.UnversionedClient, err = rest.UnversionedRESTClientFor(&dynamicConfig) + if err != nil { + return nil, err + } + + return context, err +} + +func (c *ClusterContext) Start(ctx context.Context) error { + logrus.Info("Syncing cluster controllers") + err := controller.Sync(ctx, + c.Cluster, + c.Authorization) + if err != nil { + return err + } + + logrus.Info("Starting cluster controllers") + if err := c.Cluster.Start(ctx, 5); err != nil { + return err + } + + if err := c.Authorization.Start(ctx, 5); err != nil { + return err + } + + logrus.Info("Cluster context started") + return nil +} + +func (c *ClusterContext) StartAndWait() error { + ctx := signal.SigTermCancelContext(context.Background()) + c.Start(ctx) + <-ctx.Done() + return ctx.Err() +} + +func NewWorkloadContext(clusterConfig, config rest.Config) (*WorkloadContext, error) { + var err error + context := &WorkloadContext{ + RESTConfig: config, + } + + context.Cluster, err = NewClusterContext(clusterConfig) + if err != nil { + return nil, err + } + + context.Apps, err = appsv1beta2.NewForConfig(config) + if err != nil { + return nil, err + } + + context.Workload, err = workloadv1.NewForConfig(config) + if err != nil { + return nil, err + } + + context.Core, err = corev1.NewForConfig(config) + if err != nil { + return nil, err + } + + dynamicConfig := config + if dynamicConfig.NegotiatedSerializer == nil { + configConfig := dynamic.ContentConfig() + dynamicConfig.NegotiatedSerializer = configConfig.NegotiatedSerializer + } + + context.UnversionedClient, err = rest.UnversionedRESTClientFor(&dynamicConfig) + if err != nil { + return nil, err + } + + return context, err +}