Skip to content

Commit

Permalink
Add broker create, delete and list cmds (#894)
Browse files Browse the repository at this point in the history
* Add broker create, delete and list cmds

* fix: Fix copyright headers

* fix: Fix linter warnings

* Update pkg/kn/commands/broker/create.go

Co-authored-by: Roland Huß <[email protected]>

* Update pkg/kn/commands/broker/delete.go

Co-authored-by: Roland Huß <[email protected]>

* Update pkg/kn/commands/broker/list.go

Co-authored-by: Roland Huß <[email protected]>

* feat: Add broker describe command

* fix: Fix copyright header

* fix: Fix linter issues

* fix: Fix broker describe test

* fix: Fix order of eventing cmds

* chore: Add e2e tests

* fix: Fix e2e tests annotation

* fix: Reorder e2e tests methods

* feat: Add synchronous broker delete option

* fix: Fix broker describe example

Co-authored-by: Navid Shaikh <[email protected]>

* fix: Fix variable name

Co-authored-by: Navid Shaikh <[email protected]>

* fix: Fix broker list example formatting

Co-authored-by: Navid Shaikh <[email protected]>

* fix: Fix eventing client func name

Co-authored-by: Navid Shaikh <[email protected]>

* fix: Reflect changes from PR review suggestions

* fix: Fix formatting of cmd examples

* fix: Fix formatting of cmd examples & trailing spaces

* fix: Polish eventing client docs

* fix: Fix examples alignment

Co-authored-by: Roland Huß <[email protected]>
Co-authored-by: Navid Shaikh <[email protected]>
  • Loading branch information
3 people authored Jun 23, 2020
1 parent 94e84d4 commit 1f59f53
Show file tree
Hide file tree
Showing 22 changed files with 1,421 additions and 3 deletions.
1 change: 1 addition & 0 deletions docs/cmd/kn.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ kn is the command line interface for managing Knative Serving and Eventing resou

### SEE ALSO

* [kn broker](kn_broker.md) - Manage message broker
* [kn completion](kn_completion.md) - Output shell completion code
* [kn options](kn_options.md) - Print the list of flags inherited by all commands
* [kn plugin](kn_plugin.md) - Manage kn plugins
Expand Down
34 changes: 34 additions & 0 deletions docs/cmd/kn_broker.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
## kn broker

Manage message broker

### Synopsis

Manage message broker

```
kn broker
```

### Options

```
-h, --help help for broker
```

### Options inherited from parent commands

```
--config string kn configuration file (default: ~/.config/kn/config.yaml)
--kubeconfig string kubectl configuration file (default: ~/.kube/config)
--log-http log http traffic
```

### SEE ALSO

* [kn](kn.md) - kn manages Knative Serving and Eventing resources
* [kn broker create](kn_broker_create.md) - Create a broker
* [kn broker delete](kn_broker_delete.md) - Delete a broker
* [kn broker describe](kn_broker_describe.md) - Describe broker
* [kn broker list](kn_broker_list.md) - List brokers

42 changes: 42 additions & 0 deletions docs/cmd/kn_broker_create.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
## kn broker create

Create a broker

### Synopsis

Create a broker

```
kn broker create NAME
```

### Examples

```
# Create a broker 'mybroker' in the current namespace
kn broker create mybroker
# Create a broker 'mybroker' in the 'myproject' namespace
kn broker create mybroker --namespace myproject
```

### Options

```
-h, --help help for create
-n, --namespace string Specify the namespace to operate in.
```

### Options inherited from parent commands

```
--config string kn configuration file (default: ~/.config/kn/config.yaml)
--kubeconfig string kubectl configuration file (default: ~/.kube/config)
--log-http log http traffic
```

### SEE ALSO

* [kn broker](kn_broker.md) - Manage message broker

46 changes: 46 additions & 0 deletions docs/cmd/kn_broker_delete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
## kn broker delete

Delete a broker

### Synopsis

Delete a broker

```
kn broker delete NAME
```

### Examples

```
# Delete a broker 'mybroker' in the current namespace
kn broker create mybroker
# Delete a broker 'mybroker' in the 'myproject' namespace
kn broker create mybroker --namespace myproject
```

### Options

```
--async DEPRECATED: please use --no-wait instead. Do not wait for 'broker delete' operation to be completed. (default true)
-h, --help help for delete
-n, --namespace string Specify the namespace to operate in.
--no-wait Do not wait for 'broker delete' operation to be completed. (default true)
--wait Wait for 'broker delete' operation to be completed.
--wait-timeout int Seconds to wait before giving up on waiting for broker to be deleted. (default 600)
```

### Options inherited from parent commands

```
--config string kn configuration file (default: ~/.config/kn/config.yaml)
--kubeconfig string kubectl configuration file (default: ~/.kube/config)
--log-http log http traffic
```

### SEE ALSO

* [kn broker](kn_broker.md) - Manage message broker

42 changes: 42 additions & 0 deletions docs/cmd/kn_broker_describe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
## kn broker describe

Describe broker

### Synopsis

Describe broker

```
kn broker describe NAME
```

### Examples

```
# Describe broker 'mybroker' in the current namespace
kn broker describe mybroker
# Describe broker 'mybroker' in the 'myproject' namespace
kn broker describe mybroker --namespace myproject
```

### Options

```
-h, --help help for describe
-n, --namespace string Specify the namespace to operate in.
```

### Options inherited from parent commands

```
--config string kn configuration file (default: ~/.config/kn/config.yaml)
--kubeconfig string kubectl configuration file (default: ~/.kube/config)
--log-http log http traffic
```

### SEE ALSO

* [kn broker](kn_broker.md) - Manage message broker

47 changes: 47 additions & 0 deletions docs/cmd/kn_broker_list.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
## kn broker list

List brokers

### Synopsis

List brokers

```
kn broker list
```

### Examples

```
# List all brokers
kn broker list
# List all brokers in JSON output format
kn broker list -o json
```

### Options

```
-A, --all-namespaces If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace.
--allow-missing-template-keys If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to golang and jsonpath output formats. (default true)
-h, --help help for list
-n, --namespace string Specify the namespace to operate in.
--no-headers When using the default output format, don't print headers (default: print headers).
-o, --output string Output format. One of: json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-file.
--template string Template string or path to template file to use when -o=go-template, -o=go-template-file. The template format is golang templates [http://golang.org/pkg/text/template/#pkg-overview].
```

### Options inherited from parent commands

```
--config string kn configuration file (default: ~/.config/kn/config.yaml)
--kubeconfig string kubectl configuration file (default: ~/.kube/config)
--log-http log http traffic
```

### SEE ALSO

* [kn broker](kn_broker.md) - Manage message broker

119 changes: 116 additions & 3 deletions pkg/eventing/v1beta1/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,20 @@
package v1beta1

import (
"time"

apis_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/watch"
v1beta1 "knative.dev/eventing/pkg/apis/eventing/v1beta1"
"knative.dev/eventing/pkg/client/clientset/versioned/scheme"
client_v1beta1 "knative.dev/eventing/pkg/client/clientset/versioned/typed/eventing/v1beta1"
duckv1 "knative.dev/pkg/apis/duck/v1"

kn_errors "knative.dev/client/pkg/errors"
"knative.dev/client/pkg/util"
"knative.dev/client/pkg/wait"
)

// KnEventingClient to Eventing Sources. All methods are relative to the
Expand All @@ -42,6 +46,14 @@ type KnEventingClient interface {
ListTriggers() (*v1beta1.TriggerList, error)
// UpdateTrigger is used to update an instance of trigger
UpdateTrigger(trigger *v1beta1.Trigger) error
// CreateBroker is used to create an instance of broker
CreateBroker(broker *v1beta1.Broker) error
// GetBroker is used to get an instance of broker
GetBroker(name string) (*v1beta1.Broker, error)
// DeleteBroker is used to delete an instance of broker
DeleteBroker(name string, timeout time.Duration) error
// ListBroker returns list of broker CRDs
ListBrokers() (*v1beta1.BrokerList, error)
}

// KnEventingClient is a combination of Sources client interface and namespace
Expand Down Expand Up @@ -93,15 +105,15 @@ func (c *knEventingClient) ListTriggers() (*v1beta1.TriggerList, error) {
return nil, kn_errors.GetError(err)
}
triggerListNew := triggerList.DeepCopy()
err = updateTriggerGvk(triggerListNew)
err = updateEventingGVK(triggerListNew)
if err != nil {
return nil, err
}

triggerListNew.Items = make([]v1beta1.Trigger, len(triggerList.Items))
for idx, trigger := range triggerList.Items {
triggerClone := trigger.DeepCopy()
err := updateTriggerGvk(triggerClone)
err := updateEventingGVK(triggerClone)
if err != nil {
return nil, err
}
Expand All @@ -125,7 +137,7 @@ func (c *knEventingClient) Namespace() string {
}

// update with the v1beta1 group + version
func updateTriggerGvk(obj runtime.Object) error {
func updateEventingGVK(obj runtime.Object) error {
return util.UpdateGroupVersionKindWithScheme(obj, v1beta1.SchemeGroupVersion, scheme.Scheme)
}

Expand Down Expand Up @@ -200,3 +212,104 @@ func (b *TriggerBuilder) Filters(filters map[string]string) *TriggerBuilder {
func (b *TriggerBuilder) Build() *v1beta1.Trigger {
return b.trigger
}

// CreateBroker is used to create an instance of broker
func (c *knEventingClient) CreateBroker(broker *v1beta1.Broker) error {
_, err := c.client.Brokers(c.namespace).Create(broker)
if err != nil {
return kn_errors.GetError(err)
}
return nil
}

// GetBroker is used to get an instance of broker
func (c *knEventingClient) GetBroker(name string) (*v1beta1.Broker, error) {
trigger, err := c.client.Brokers(c.namespace).Get(name, apis_v1.GetOptions{})
if err != nil {
return nil, kn_errors.GetError(err)
}
return trigger, nil
}

// WatchBroker is used to create watcher object
func (c *knEventingClient) WatchBroker(name string, timeout time.Duration) (watch.Interface, error) {
return wait.NewWatcher(c.client.Brokers(c.namespace).Watch,
c.client.RESTClient(), c.namespace, "brokers", name, timeout)
}

// DeleteBroker is used to delete an instance of broker and wait for completion until given timeout
// For `timeout == 0` delete is performed async without any wait
func (c *knEventingClient) DeleteBroker(name string, timeout time.Duration) error {
if timeout == 0 {
return c.deleteBroker(name, apis_v1.DeletePropagationBackground)
}
waitC := make(chan error)
go func() {
waitForEvent := wait.NewWaitForEvent("broker", c.WatchBroker, func(evt *watch.Event) bool { return evt.Type == watch.Deleted })
err, _ := waitForEvent.Wait(name, wait.Options{Timeout: &timeout}, wait.NoopMessageCallback())
waitC <- err
}()
err := c.deleteBroker(name, apis_v1.DeletePropagationForeground)
if err != nil {
return err
}
return <-waitC
}

// deleteBroker is used to delete an instance of broker
func (c *knEventingClient) deleteBroker(name string, propagationPolicy apis_v1.DeletionPropagation) error {
err := c.client.Brokers(c.namespace).Delete(name, &apis_v1.DeleteOptions{PropagationPolicy: &propagationPolicy})
if err != nil {
return kn_errors.GetError(err)
}
return nil
}

// ListBrokers is used to retrieve the list of broker instances
func (c *knEventingClient) ListBrokers() (*v1beta1.BrokerList, error) {
brokerList, err := c.client.Brokers(c.namespace).List(apis_v1.ListOptions{})
if err != nil {
return nil, kn_errors.GetError(err)
}
brokerListNew := brokerList.DeepCopy()
err = updateEventingGVK(brokerListNew)
if err != nil {
return nil, err
}

brokerListNew.Items = make([]v1beta1.Broker, len(brokerList.Items))
for idx, trigger := range brokerList.Items {
triggerClone := trigger.DeepCopy()
err := updateEventingGVK(triggerClone)
if err != nil {
return nil, err
}
brokerListNew.Items[idx] = *triggerClone
}
return brokerListNew, nil
}

// BrokerBuilder is for building the broker
type BrokerBuilder struct {
broker *v1beta1.Broker
}

// NewBrokerBuilder for building broker object
func NewBrokerBuilder(name string) *BrokerBuilder {
return &BrokerBuilder{broker: &v1beta1.Broker{
ObjectMeta: meta_v1.ObjectMeta{
Name: name,
},
}}
}

// Namespace for broker builder
func (b *BrokerBuilder) Namespace(ns string) *BrokerBuilder {
b.broker.Namespace = ns
return b
}

// Build to return an instance of broker object
func (b *BrokerBuilder) Build() *v1beta1.Broker {
return b.broker
}
Loading

0 comments on commit 1f59f53

Please sign in to comment.