diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index d1da34c80e..ef06169905 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -17,6 +17,10 @@ |=== | | Description | PR +| 🎁 +| Adding --class flag to broker create command +| https://github.com/knative/client/pull/1402[#1402] + | 🎁 | Add an `client.knative.dev/updateTimestamp` annotation to trigger a new revision when required | https://github.com/knative/client/pull/1364[#1364] diff --git a/docs/cmd/kn_broker_create.md b/docs/cmd/kn_broker_create.md index ed1469b8d2..8a202530d0 100644 --- a/docs/cmd/kn_broker_create.md +++ b/docs/cmd/kn_broker_create.md @@ -20,6 +20,7 @@ kn broker create NAME ### Options ``` + -c, --class string Broker class name. -h, --help help for create -n, --namespace string Specify the namespace to operate in. ``` diff --git a/lib/test/broker.go b/lib/test/broker.go index de4a669606..83ddf9dffd 100644 --- a/lib/test/broker.go +++ b/lib/test/broker.go @@ -32,6 +32,13 @@ func BrokerCreate(r *KnRunResultCollector, name string) { assert.Check(r.T(), util.ContainsAllIgnoreCase(out.Stdout, "Broker", name, "created", "namespace", r.KnTest().Kn().Namespace())) } +// BrokerCreateWithClass creates a broker with the given name and class. +func BrokerCreateWithClass(r *KnRunResultCollector, name, class string) { + out := r.KnTest().Kn().Run("broker", "create", name, "--class", class) + r.AssertNoError(out) + assert.Check(r.T(), util.ContainsAllIgnoreCase(out.Stdout, "Broker", name, "created", "namespace", r.KnTest().Kn().Namespace())) +} + // BrokerDelete deletes a broker with the given name. func BrokerDelete(r *KnRunResultCollector, name string, wait bool) { args := []string{"broker", "delete", name} diff --git a/pkg/eventing/v1/client.go b/pkg/eventing/v1/client.go index 6401346f49..eae946a63b 100644 --- a/pkg/eventing/v1/client.go +++ b/pkg/eventing/v1/client.go @@ -325,6 +325,18 @@ func (b *BrokerBuilder) Namespace(ns string) *BrokerBuilder { return b } +// Class for broker builder +func (b *BrokerBuilder) Class(class string) *BrokerBuilder { + if class == "" { + return b + } + if len(b.broker.Annotations) == 0 { + b.broker.Annotations = make(map[string]string) + } + b.broker.Annotations[eventingv1.BrokerClassAnnotationKey] = class + return b +} + // Build to return an instance of broker object func (b *BrokerBuilder) Build() *eventingv1.Broker { return b.broker diff --git a/pkg/kn/commands/broker/broker_test.go b/pkg/kn/commands/broker/broker_test.go index 07e14fd57a..26735ba847 100644 --- a/pkg/kn/commands/broker/broker_test.go +++ b/pkg/kn/commands/broker/broker_test.go @@ -77,3 +77,7 @@ func createBroker(brokerName string) *v1beta1.Broker { func createBrokerWithNamespace(brokerName, namespace string) *v1beta1.Broker { return clientv1beta1.NewBrokerBuilder(brokerName).Namespace(namespace).Build() } + +func createBrokerWithClass(brokerName, class string) *v1beta1.Broker { + return clientv1beta1.NewBrokerBuilder(brokerName).Namespace("default").Class(class).Build() +} diff --git a/pkg/kn/commands/broker/create.go b/pkg/kn/commands/broker/create.go index 4dc24a8927..8ba9f84c96 100644 --- a/pkg/kn/commands/broker/create.go +++ b/pkg/kn/commands/broker/create.go @@ -36,6 +36,8 @@ var createExample = ` // NewBrokerCreateCommand represents command to create new broker instance func NewBrokerCreateCommand(p *commands.KnParams) *cobra.Command { + var className string + cmd := &cobra.Command{ Use: "create NAME", Short: "Create a broker", @@ -58,7 +60,8 @@ func NewBrokerCreateCommand(p *commands.KnParams) *cobra.Command { brokerBuilder := clientv1beta1. NewBrokerBuilder(name). - Namespace(namespace) + Namespace(namespace). + Class(className) err = eventingClient.CreateBroker(cmd.Context(), brokerBuilder.Build()) if err != nil { @@ -71,5 +74,6 @@ func NewBrokerCreateCommand(p *commands.KnParams) *cobra.Command { }, } commands.AddNamespaceFlags(cmd.Flags(), false) + cmd.Flags().StringVarP(&className, "class", "c", "", "Broker class name.") return cmd } diff --git a/pkg/kn/commands/broker/create_test.go b/pkg/kn/commands/broker/create_test.go index d4f4beefb2..2ff3e7fba0 100644 --- a/pkg/kn/commands/broker/create_test.go +++ b/pkg/kn/commands/broker/create_test.go @@ -27,6 +27,7 @@ import ( var ( brokerName = "foo" + className = "foo-class" ) func TestBrokerCreate(t *testing.T) { @@ -42,6 +43,24 @@ func TestBrokerCreate(t *testing.T) { eventingRecorder.Validate() } +func TestBrokerCreateWithClass(t *testing.T) { + eventingClient := clienteventingv1.NewMockKnEventingClient(t) + + eventingRecorder := eventingClient.Recorder() + eventingRecorder.CreateBroker(createBrokerWithClass(brokerName, className), nil) + + out, err := executeBrokerCommand(eventingClient, "create", brokerName, "--class", className) + assert.NilError(t, err, "Broker should be created") + assert.Assert(t, util.ContainsAll(out, "Broker", brokerName, "created", "namespace", "default")) + + eventingRecorder.CreateBroker(createBrokerWithClass(brokerName, ""), nil) + out, err = executeBrokerCommand(eventingClient, "create", brokerName, "--class", "") + assert.NilError(t, err, "Broker should be created") + assert.Assert(t, util.ContainsAll(out, "Broker", brokerName, "created", "namespace", "default")) + + eventingRecorder.Validate() +} + func TestBrokerCreateWithError(t *testing.T) { eventingClient := clienteventingv1.NewMockKnEventingClient(t) diff --git a/test/e2e/broker_test.go b/test/e2e/broker_test.go index 993c104a5d..317f0e9b6d 100644 --- a/test/e2e/broker_test.go +++ b/test/e2e/broker_test.go @@ -59,6 +59,12 @@ func TestBroker(t *testing.T) { test.BrokerDelete(r, "foo4", true) verifyBrokerNotfound(r, "foo3") verifyBrokerNotfound(r, "foo4") + + t.Log("create broker with class") + test.BrokerCreateWithClass(r, "foo5", "foo-class") + verifyBrokerList(r, "foo5") + verifyBrokerListOutputName(r, "foo5") + verifyBrokerDescribeContains(r, "foo5", "foo-class") } // Private functions @@ -86,3 +92,9 @@ func verifyBrokerNotfound(r *test.KnRunResultCollector, name string) { r.AssertError(out) assert.Check(r.T(), util.ContainsAll(out.Stderr, name, "not found")) } + +func verifyBrokerDescribeContains(r *test.KnRunResultCollector, name, str string) { + out := r.KnTest().Kn().Run("broker", "describe", name) + r.AssertNoError(out) + assert.Check(r.T(), util.ContainsAllIgnoreCase(out.Stdout, name, str)) +}