This is an automated email from the ASF dual-hosted git repository.

crossoverjie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar-client-go.git


The following commit(s) were added to refs/heads/master by this push:
     new 230d11b8 Add max topics per namespace methods (#1413)
230d11b8 is described below

commit 230d11b82ba8b60c971013516c4922afea4a022d
Author: Collignon-Ducret Rémi <mito...@users.noreply.github.com>
AuthorDate: Tue Sep 2 04:40:14 2025 +0200

    Add max topics per namespace methods (#1413)
---
 pulsaradmin/pkg/admin/namespace.go      | 27 ++++++++++++
 pulsaradmin/pkg/admin/namespace_test.go | 76 +++++++++++++++++++++++++++++++++
 2 files changed, 103 insertions(+)

diff --git a/pulsaradmin/pkg/admin/namespace.go 
b/pulsaradmin/pkg/admin/namespace.go
index bd4dc88c..9a5cb361 100644
--- a/pulsaradmin/pkg/admin/namespace.go
+++ b/pulsaradmin/pkg/admin/namespace.go
@@ -154,6 +154,16 @@ type Namespaces interface {
        // GetMaxProducersPerTopic returns the maxProducersPerTopic for a 
namespace.
        GetMaxProducersPerTopic(namespace utils.NameSpaceName) (int, error)
 
+       // SetMaxTopicsPerNamespace sets maxTopicsPerNamespace for a namespace.
+       SetMaxTopicsPerNamespace(namespace utils.NameSpaceName, max int) error
+
+       // GetMaxTopicsPerNamespace returns the maxTopicsPerNamespace for a 
namespace.
+       GetMaxTopicsPerNamespace(namespace utils.NameSpaceName) (int, error)
+
+       // RemoveMaxTopicsPerNamespace removes maxTopicsPerNamespace 
configuration for a namespace,
+       // defaulting to broker settings
+       RemoveMaxTopicsPerNamespace(namespace utils.NameSpaceName) error
+
        // GetNamespaceReplicationClusters returns the replication clusters for 
a namespace
        GetNamespaceReplicationClusters(namespace string) ([]string, error)
 
@@ -996,3 +1006,20 @@ func (n *namespaces) RemoveProperties(namespace 
utils.NameSpaceName) error {
        endpoint := n.pulsar.endpoint(n.basePath, namespace.String(), 
"properties")
        return n.pulsar.Client.Delete(endpoint)
 }
+
+func (n *namespaces) SetMaxTopicsPerNamespace(namespace utils.NameSpaceName, 
max int) error {
+       endpoint := n.pulsar.endpoint(n.basePath, namespace.String(), 
"maxTopicsPerNamespace")
+       return n.pulsar.Client.Post(endpoint, max)
+}
+
+func (n *namespaces) GetMaxTopicsPerNamespace(namespace utils.NameSpaceName) 
(int, error) {
+       var result int
+       endpoint := n.pulsar.endpoint(n.basePath, namespace.String(), 
"maxTopicsPerNamespace")
+       err := n.pulsar.Client.Get(endpoint, &result)
+       return result, err
+}
+
+func (n *namespaces) RemoveMaxTopicsPerNamespace(namespace 
utils.NameSpaceName) error {
+       endpoint := n.pulsar.endpoint(n.basePath, namespace.String(), 
"maxTopicsPerNamespace")
+       return n.pulsar.Client.Delete(endpoint)
+}
diff --git a/pulsaradmin/pkg/admin/namespace_test.go 
b/pulsaradmin/pkg/admin/namespace_test.go
index 4917e94b..6600cfaf 100644
--- a/pulsaradmin/pkg/admin/namespace_test.go
+++ b/pulsaradmin/pkg/admin/namespace_test.go
@@ -523,3 +523,79 @@ func TestNamespaces_Properties(t *testing.T) {
        assert.Equal(t, err, nil)
        assert.Equal(t, actualPropertiesAfterRemoveCall, map[string]string{})
 }
+
+func TestNamespaces_SetMaxTopicsPerNamespace(t *testing.T) {
+       config := &config.Config{}
+       admin, err := New(config)
+       require.NoError(t, err)
+       require.NotNil(t, admin)
+
+       tests := []struct {
+               name      string
+               namespace string
+               maxTopics int
+               errReason string
+       }{
+               {
+                       name:      "Set valid max topics per namespace",
+                       namespace: "public/default",
+                       maxTopics: 100,
+                       errReason: "",
+               },
+               {
+                       name:      "Set invalid max topics per namespace",
+                       namespace: "public/default",
+                       maxTopics: -1,
+                       errReason: "maxTopicsPerNamespace must be 0 or more",
+               },
+               {
+                       name:      "Set valid max topics per namespace: 0",
+                       namespace: "public/default",
+                       maxTopics: 0,
+                       errReason: "",
+               },
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       namespace, _ := utils.GetNamespaceName(tt.namespace)
+                       err := 
admin.Namespaces().SetMaxTopicsPerNamespace(*namespace, tt.maxTopics)
+                       if tt.errReason == "" {
+                               assert.Equal(t, nil, err)
+
+                               err = 
admin.Namespaces().RemoveMaxTopicsPerNamespace(*namespace)
+                               assert.Equal(t, nil, err)
+                       }
+                       if err != nil {
+                               restError := err.(rest.Error)
+                               assert.Equal(t, tt.errReason, restError.Reason)
+                       }
+               })
+       }
+}
+
+func TestNamespaces_GetMaxTopicsPerNamespace(t *testing.T) {
+
+       config := &config.Config{}
+       admin, err := New(config)
+       require.NoError(t, err)
+       require.NotNil(t, admin)
+
+       namespace, _ := utils.GetNamespaceName("public/default")
+
+       // set the max topics per namespace and get it
+       err = admin.Namespaces().SetMaxTopicsPerNamespace(*namespace, 100)
+       assert.Equal(t, nil, err)
+       maxTopics, err := 
admin.Namespaces().GetMaxTopicsPerNamespace(*namespace)
+       assert.Equal(t, nil, err)
+       expected := 100
+       assert.Equal(t, expected, maxTopics)
+
+       // remove the max topics per namespace and get it
+       err = admin.Namespaces().RemoveMaxTopicsPerNamespace(*namespace)
+       assert.Equal(t, nil, err)
+
+       maxTopics, err = admin.Namespaces().GetMaxTopicsPerNamespace(*namespace)
+       assert.Equal(t, nil, err)
+       expected = 0
+       assert.Equal(t, expected, maxTopics)
+}

Reply via email to