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 }