|
7 | 7 |
|
8 | 8 | . "github.com/onsi/ginkgo"
|
9 | 9 | . "github.com/onsi/gomega"
|
| 10 | + v1 "k8s.io/api/core/v1" |
10 | 11 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
11 | 12 | "k8s.io/apimachinery/pkg/util/rand"
|
12 | 13 | operatorv1 "open-cluster-management.io/api/operator/v1"
|
@@ -410,3 +411,180 @@ var _ = Describe("ClusterManager API test with WorkConfiguration", func() {
|
410 | 411 | Expect(clusterManager.Spec.WorkConfiguration.FeatureGates[1].Mode).Should(Equal(operatorv1.FeatureGateModeTypeEnable))
|
411 | 412 | })
|
412 | 413 | })
|
| 414 | + |
| 415 | +var _ = Describe("ClusterManager v1 Enhanced API test", func() { |
| 416 | + var clusterManagerName string |
| 417 | + |
| 418 | + BeforeEach(func() { |
| 419 | + suffix := rand.String(5) |
| 420 | + clusterManagerName = fmt.Sprintf("cm-enhanced-%s", suffix) |
| 421 | + }) |
| 422 | + |
| 423 | + AfterEach(func() { |
| 424 | + err := operatorClient.OperatorV1().ClusterManagers().Delete(context.TODO(), clusterManagerName, metav1.DeleteOptions{}) |
| 425 | + if err != nil { |
| 426 | + // Ignore not found errors in cleanup |
| 427 | + } |
| 428 | + }) |
| 429 | + |
| 430 | + Context("ClusterManager comprehensive configuration validation", func() { |
| 431 | + It("should handle complete configuration with all optional fields", func() { |
| 432 | + clusterManager := &operatorv1.ClusterManager{ |
| 433 | + ObjectMeta: metav1.ObjectMeta{ |
| 434 | + Name: clusterManagerName, |
| 435 | + }, |
| 436 | + Spec: operatorv1.ClusterManagerSpec{ |
| 437 | + RegistrationImagePullSpec: "quay.io/test/registration:latest", |
| 438 | + WorkImagePullSpec: "quay.io/test/work:latest", |
| 439 | + PlacementImagePullSpec: "quay.io/test/placement:latest", |
| 440 | + AddOnManagerImagePullSpec: "quay.io/test/addon-manager:latest", |
| 441 | + NodePlacement: operatorv1.NodePlacement{ |
| 442 | + NodeSelector: map[string]string{ |
| 443 | + "node-role.kubernetes.io/infra": "", |
| 444 | + }, |
| 445 | + Tolerations: []v1.Toleration{ |
| 446 | + { |
| 447 | + Key: "node-role.kubernetes.io/infra", |
| 448 | + Operator: v1.TolerationOpExists, |
| 449 | + Effect: v1.TaintEffectNoSchedule, |
| 450 | + }, |
| 451 | + }, |
| 452 | + }, |
| 453 | + DeployOption: operatorv1.ClusterManagerDeployOption{ |
| 454 | + Mode: operatorv1.InstallModeDefault, |
| 455 | + }, |
| 456 | + RegistrationConfiguration: &operatorv1.RegistrationHubConfiguration{ |
| 457 | + AutoApproveUsers: []string{"system:admin"}, |
| 458 | + FeatureGates: []operatorv1.FeatureGate{ |
| 459 | + { |
| 460 | + Feature: "DefaultClusterSet", |
| 461 | + Mode: operatorv1.FeatureGateModeTypeEnable, |
| 462 | + }, |
| 463 | + }, |
| 464 | + }, |
| 465 | + WorkConfiguration: &operatorv1.WorkConfiguration{ |
| 466 | + WorkDriver: operatorv1.WorkDriverTypeKube, |
| 467 | + FeatureGates: []operatorv1.FeatureGate{ |
| 468 | + { |
| 469 | + Feature: "ManifestWorkReplicaSet", |
| 470 | + Mode: operatorv1.FeatureGateModeTypeEnable, |
| 471 | + }, |
| 472 | + }, |
| 473 | + }, |
| 474 | + }, |
| 475 | + } |
| 476 | + |
| 477 | + createdClusterManager, err := operatorClient.OperatorV1().ClusterManagers().Create(context.TODO(), clusterManager, metav1.CreateOptions{}) |
| 478 | + Expect(err).ToNot(HaveOccurred()) |
| 479 | + Expect(createdClusterManager.Spec.NodePlacement.NodeSelector["node-role.kubernetes.io/infra"]).Should(Equal("")) |
| 480 | + Expect(len(createdClusterManager.Spec.NodePlacement.Tolerations)).Should(Equal(1)) |
| 481 | + Expect(createdClusterManager.Spec.RegistrationConfiguration.FeatureGates[0].Mode).Should(Equal(operatorv1.FeatureGateModeTypeEnable)) |
| 482 | + Expect(createdClusterManager.Spec.WorkConfiguration.FeatureGates[0].Mode).Should(Equal(operatorv1.FeatureGateModeTypeEnable)) |
| 483 | + }) |
| 484 | + |
| 485 | + It("should validate addon manager configuration", func() { |
| 486 | + clusterManager := &operatorv1.ClusterManager{ |
| 487 | + ObjectMeta: metav1.ObjectMeta{ |
| 488 | + Name: clusterManagerName, |
| 489 | + }, |
| 490 | + Spec: operatorv1.ClusterManagerSpec{ |
| 491 | + AddOnManagerConfiguration: &operatorv1.AddOnManagerConfiguration{ |
| 492 | + FeatureGates: []operatorv1.FeatureGate{ |
| 493 | + { |
| 494 | + Feature: "AddonManagement", |
| 495 | + Mode: operatorv1.FeatureGateModeTypeEnable, |
| 496 | + }, |
| 497 | + }, |
| 498 | + }, |
| 499 | + }, |
| 500 | + } |
| 501 | + |
| 502 | + createdClusterManager, err := operatorClient.OperatorV1().ClusterManagers().Create(context.TODO(), clusterManager, metav1.CreateOptions{}) |
| 503 | + Expect(err).ToNot(HaveOccurred()) |
| 504 | + Expect(createdClusterManager.Spec.AddOnManagerConfiguration.FeatureGates[0].Feature).Should(Equal("AddonManagement")) |
| 505 | + }) |
| 506 | + |
| 507 | + It("should validate server configuration", func() { |
| 508 | + clusterManager := &operatorv1.ClusterManager{ |
| 509 | + ObjectMeta: metav1.ObjectMeta{ |
| 510 | + Name: clusterManagerName, |
| 511 | + }, |
| 512 | + Spec: operatorv1.ClusterManagerSpec{ |
| 513 | + ServerConfiguration: &operatorv1.ServerConfiguration{}, |
| 514 | + }, |
| 515 | + } |
| 516 | + |
| 517 | + createdClusterManager, err := operatorClient.OperatorV1().ClusterManagers().Create(context.TODO(), clusterManager, metav1.CreateOptions{}) |
| 518 | + Expect(err).ToNot(HaveOccurred()) |
| 519 | + Expect(createdClusterManager.Spec.ServerConfiguration).ShouldNot(BeNil()) |
| 520 | + }) |
| 521 | + }) |
| 522 | + |
| 523 | + Context("ClusterManager resource requirements", func() { |
| 524 | + It("should handle resource requirements configuration", func() { |
| 525 | + clusterManager := &operatorv1.ClusterManager{ |
| 526 | + ObjectMeta: metav1.ObjectMeta{ |
| 527 | + Name: clusterManagerName, |
| 528 | + }, |
| 529 | + Spec: operatorv1.ClusterManagerSpec{ |
| 530 | + ResourceRequirement: &operatorv1.ResourceRequirement{ |
| 531 | + Type: operatorv1.ResourceQosClassResourceRequirement, |
| 532 | + }, |
| 533 | + }, |
| 534 | + } |
| 535 | + |
| 536 | + createdClusterManager, err := operatorClient.OperatorV1().ClusterManagers().Create(context.TODO(), clusterManager, metav1.CreateOptions{}) |
| 537 | + Expect(err).ToNot(HaveOccurred()) |
| 538 | + Expect(createdClusterManager.Spec.ResourceRequirement.Type).Should(Equal(operatorv1.ResourceQosClassResourceRequirement)) |
| 539 | + }) |
| 540 | + }) |
| 541 | + |
| 542 | + Context("ClusterManager status updates", func() { |
| 543 | + It("should allow status updates", func() { |
| 544 | + clusterManager := &operatorv1.ClusterManager{ |
| 545 | + ObjectMeta: metav1.ObjectMeta{ |
| 546 | + Name: clusterManagerName, |
| 547 | + }, |
| 548 | + Spec: operatorv1.ClusterManagerSpec{}, |
| 549 | + } |
| 550 | + |
| 551 | + createdClusterManager, err := operatorClient.OperatorV1().ClusterManagers().Create(context.TODO(), clusterManager, metav1.CreateOptions{}) |
| 552 | + Expect(err).ToNot(HaveOccurred()) |
| 553 | + |
| 554 | + // Update status |
| 555 | + createdClusterManager.Status = operatorv1.ClusterManagerStatus{ |
| 556 | + ObservedGeneration: 1, |
| 557 | + Conditions: []metav1.Condition{ |
| 558 | + { |
| 559 | + Type: "Applied", |
| 560 | + Status: metav1.ConditionTrue, |
| 561 | + Reason: "ClusterManagerDeployed", |
| 562 | + LastTransitionTime: metav1.Now(), |
| 563 | + }, |
| 564 | + }, |
| 565 | + Generations: []operatorv1.GenerationStatus{ |
| 566 | + { |
| 567 | + Group: "apps", |
| 568 | + Version: "v1", |
| 569 | + Resource: "deployments", |
| 570 | + Namespace: "open-cluster-management-hub", |
| 571 | + Name: "cluster-manager-registration-controller", |
| 572 | + LastGeneration: 1, |
| 573 | + }, |
| 574 | + }, |
| 575 | + RelatedResources: []operatorv1.RelatedResourceMeta{ |
| 576 | + { |
| 577 | + Group: "apps", |
| 578 | + Version: "v1", |
| 579 | + Resource: "deployments", |
| 580 | + Namespace: "open-cluster-management-hub", |
| 581 | + Name: "cluster-manager-registration-controller", |
| 582 | + }, |
| 583 | + }, |
| 584 | + } |
| 585 | + |
| 586 | + _, err = operatorClient.OperatorV1().ClusterManagers().UpdateStatus(context.TODO(), createdClusterManager, metav1.UpdateOptions{}) |
| 587 | + Expect(err).ToNot(HaveOccurred()) |
| 588 | + }) |
| 589 | + }) |
| 590 | +}) |
0 commit comments