@@ -50,17 +50,14 @@ func resourcePulsarCluster() *schema.Resource {
5050 // Auto generate the name, so we don't need to check the diff.
5151 return nil
5252 }
53- if diff .HasChanges ([]string {"organization" , "name" , "instance_name" , "location" , "pool_member_name" }... ) {
53+ if diff .HasChanges ([]string {"organization" , "name" , "instance_name" , "location" , "pool_member_name" , "release_channel" }... ) {
5454 return fmt .Errorf ("ERROR_UPDATE_PULSAR_CLUSTER: " +
5555 "The pulsar cluster organization, name, instance_name, location, pool_member_name does not support updates, please recreate it" )
5656 }
5757 return nil
5858 },
5959 Importer : & schema.ResourceImporter {
6060 StateContext : func (ctx context.Context , d * schema.ResourceData , meta interface {}) ([]* schema.ResourceData , error ) {
61- organizationCluster := strings .Split (d .Id (), "/" )
62- _ = d .Set ("organization" , organizationCluster [0 ])
63- _ = d .Set ("name" , organizationCluster [1 ])
6461 err := resourcePulsarClusterRead (ctx , d , meta )
6562 if err .HasError () {
6663 return nil , fmt .Errorf ("import %q: %s" , d .Id (), err [0 ].Summary )
@@ -404,7 +401,15 @@ func resourcePulsarClusterCreate(ctx context.Context, d *schema.ResourceData, me
404401 if displayName != "" {
405402 pulsarCluster .Spec .DisplayName = displayName
406403 }
407- if pulsarInstance .Spec .Type == "serverless" {
404+ if pulsarInstance .IsServerless () {
405+ if computeUnit != 0.5 {
406+ return diag .FromErr (fmt .Errorf ("ERROR_CREATE_PULSAR_CLUSTER: " +
407+ "compute_unit must be 0.5 for serverless instance" ))
408+ }
409+ if brokerReplicas != 2 {
410+ return diag .FromErr (fmt .Errorf ("ERROR_CREATE_PULSAR_CLUSTER: " +
411+ "broker_replicas must be 2 for serverless instance" ))
412+ }
408413 pulsarCluster .Annotations = map [string ]string {
409414 "cloud.streamnative.io/type" : "serverless" ,
410415 }
@@ -421,10 +426,6 @@ func resourcePulsarClusterCreate(ctx context.Context, d *schema.ResourceData, me
421426 if ! ursaEnabled && ! pulsarInstance .IsServerless () {
422427 pulsarCluster .Spec .BookKeeper = bookkeeper
423428 }
424- if displayName == "" && name == "" {
425- return diag .FromErr (fmt .Errorf ("ERROR_CREATE_PULSAR_CLUSTER: " +
426- "either name or display_name must be provided" ))
427- }
428429 if pool_member_name != "" {
429430 pulsarCluster .Spec .PoolMemberRef = cloudv1alpha1.PoolMemberReference {
430431 Name : pool_member_name ,
@@ -442,7 +443,7 @@ func resourcePulsarClusterCreate(ctx context.Context, d *schema.ResourceData, me
442443 }
443444 }
444445 }
445- if pulsarInstance .Spec .Type == cloudv1alpha1 .PulsarInstanceTypeStandard {
446+ if pulsarInstance .Spec .Type != cloudv1alpha1 .PulsarInstanceTypeServerless && ! pulsarInstance . IsUsingUrsaEngine () {
446447 getPulsarClusterChanged (ctx , pulsarCluster , d )
447448 }
448449 pc , err := clientSet .CloudV1alpha1 ().PulsarClusters (namespace ).Create (ctx , pulsarCluster , metav1.CreateOptions {
@@ -451,8 +452,7 @@ func resourcePulsarClusterCreate(ctx context.Context, d *schema.ResourceData, me
451452 if err != nil {
452453 return diag .FromErr (fmt .Errorf ("ERROR_CREATE_PULSAR_CLUSTER: %w" , err ))
453454 }
454- d .Set ("name" , pc .Name )
455- d .Set ("display_name" , pc .Spec .DisplayName )
455+ d .SetId (fmt .Sprintf ("%s/%s" , pc .Namespace , pc .Name ))
456456 if pc .Status .Conditions != nil {
457457 ready := false
458458 for _ , condition := range pc .Status .Conditions {
@@ -484,36 +484,23 @@ func resourcePulsarClusterCreate(ctx context.Context, d *schema.ResourceData, me
484484func resourcePulsarClusterRead (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
485485 namespace := d .Get ("organization" ).(string )
486486 name := d .Get ("name" ).(string )
487- displayName := d .Get ("display_name" ).(string )
488487 clientSet , err := getClientSet (getFactoryFromMeta (meta ))
489488 if err != nil {
490489 return diag .FromErr (fmt .Errorf ("ERROR_INIT_CLIENT_ON_READ_PULSAR_CLUSTER: %w" , err ))
491490 }
492491 var pulsarCluster * cloudv1alpha1.PulsarCluster
493- if name != "" {
494- pulsarCluster , err = clientSet .CloudV1alpha1 ().PulsarClusters (namespace ).Get (ctx , name , metav1.GetOptions {})
495- if err != nil {
496- if apierrors .IsNotFound (err ) {
497- d .SetId ("" )
498- return nil
499- }
500- return diag .FromErr (fmt .Errorf ("ERROR_READ_PULSAR_CLUSTER: %w" , err ))
501- }
502- } else {
503- pulsarClusters , err := clientSet .CloudV1alpha1 ().PulsarClusters (namespace ).List (ctx , metav1.ListOptions {})
504- if err != nil {
505- return diag .FromErr (fmt .Errorf ("ERROR_LIST_PULSAR_CLUSTER: %w" , err ))
506- }
507- for _ , cluster := range pulsarClusters .Items {
508- if cluster .Spec .DisplayName == displayName {
509- pulsarCluster = & cluster
510- break
511- }
512- }
513- if pulsarCluster == nil {
514- return diag .FromErr (fmt .Errorf ("ERROR_READ_PULSAR_CLUSTER: " +
515- "the pulsar cluster with display_name %s does not exist" , displayName ))
492+ if name == "" {
493+ organizationCluster := strings .Split (d .Id (), "/" )
494+ name = organizationCluster [1 ]
495+ namespace = organizationCluster [0 ]
496+ }
497+ pulsarCluster , err = clientSet .CloudV1alpha1 ().PulsarClusters (namespace ).Get (ctx , name , metav1.GetOptions {})
498+ if err != nil {
499+ if apierrors .IsNotFound (err ) {
500+ d .SetId ("" )
501+ return nil
516502 }
503+ return diag .FromErr (fmt .Errorf ("ERROR_READ_PULSAR_CLUSTER: %w" , err ))
517504 }
518505 _ = d .Set ("ready" , "False" )
519506 if pulsarCluster .Status .Conditions != nil {
@@ -610,10 +597,10 @@ func resourcePulsarClusterRead(ctx context.Context, d *schema.ResourceData, meta
610597
611598func resourcePulsarClusterUpdate (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
612599 serverless := d .Get ("type" )
613- if serverless == cloudv1alpha1 . PulsarInstanceTypeServerless {
614- return diag . FromErr ( fmt . Errorf ( "ERROR_UPDATE_PULSAR_CLUSTER: " +
615- "updating a cluster under instance of type '%s' is no longer allowed" ,
616- cloudv1alpha1 . PulsarInstanceTypeServerless ))
600+ displayNameChanged := d . HasChange ( "display_name" )
601+ if ! displayNameChanged && serverless == string ( cloudv1alpha1 . PulsarInstanceTypeServerless ) {
602+ return diag . FromErr ( fmt . Errorf ( "ERROR_UPDATE_PULSAR_CLUSTER: " +
603+ "only display_name can be updated for serverless instance" ))
617604 }
618605 if d .HasChange ("organization" ) {
619606 return diag .FromErr (fmt .Errorf ("ERROR_UPDATE_PULSAR_CLUSTER: " +
@@ -641,10 +628,20 @@ func resourcePulsarClusterUpdate(ctx context.Context, d *schema.ResourceData, me
641628 }
642629 namespace := d .Get ("organization" ).(string )
643630 name := d .Get ("name" ).(string )
631+ if d .Get ("type" ) == cloudv1alpha1 .PulsarInstanceTypeServerless {
632+ organizationCluster := strings .Split (d .Id (), "/" )
633+ namespace = organizationCluster [0 ]
634+ name = organizationCluster [1 ]
635+ }
644636 clientSet , err := getClientSet (getFactoryFromMeta (meta ))
645637 if err != nil {
646638 return diag .FromErr (fmt .Errorf ("ERROR_INIT_CLIENT_ON_READ_PULSAR_CLUSTER: %w" , err ))
647639 }
640+ if name == "" {
641+ organizationCluster := strings .Split (d .Id (), "/" )
642+ name = organizationCluster [1 ]
643+ namespace = organizationCluster [0 ]
644+ }
648645 pulsarCluster , err := clientSet .CloudV1alpha1 ().PulsarClusters (namespace ).Get (ctx , name , metav1.GetOptions {})
649646 if err != nil {
650647 return diag .FromErr (fmt .Errorf ("ERROR_READ_PULSAR_CLUSTER: %w" , err ))
@@ -672,10 +669,14 @@ func resourcePulsarClusterUpdate(ctx context.Context, d *schema.ResourceData, me
672669 int64 (storageUnit * 8 * 1024 * 1024 * 1024 ), resource .DecimalSI )
673670 }
674671 changed := getPulsarClusterChanged (ctx , pulsarCluster , d )
672+ if displayNameChanged {
673+ displayName := d .Get ("display_name" ).(string )
674+ pulsarCluster .Spec .DisplayName = displayName
675+ }
675676 if d .HasChange ("bookie_replicas" ) ||
676677 d .HasChange ("broker_replicas" ) ||
677678 d .HasChange ("compute_unit" ) ||
678- d .HasChange ("storage_unit" ) || changed {
679+ d .HasChange ("storage_unit" ) || changed || displayNameChanged {
679680 _ , err = clientSet .CloudV1alpha1 ().PulsarClusters (namespace ).Update (ctx , pulsarCluster , metav1.UpdateOptions {
680681 FieldManager : "terraform-update" ,
681682 })
@@ -708,11 +709,11 @@ func resourcePulsarClusterDelete(ctx context.Context, d *schema.ResourceData, me
708709 return diag .FromErr (fmt .Errorf ("ERROR_INIT_CLIENT_ON_DELETE_PULSAR_CLUSTER: %w" , err ))
709710 }
710711 namespace := d .Get ("organization" ).(string )
711- t := d .Get ("type" )
712712 name := d .Get ("name" ).(string )
713- if t == cloudv1alpha1 .PulsarInstanceTypeServerless {
714- id := strings .Split (d .Id (), "/" )
715- name = id [1 ]
713+ if name == "" {
714+ organizationCluster := strings .Split (d .Id (), "/" )
715+ name = organizationCluster [1 ]
716+ namespace = organizationCluster [0 ]
716717 }
717718 err = clientSet .CloudV1alpha1 ().PulsarClusters (namespace ).Delete (ctx , name , metav1.DeleteOptions {})
718719 if err != nil {
0 commit comments