Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add broker create, delete and list cmds #894

Merged
merged 24 commits into from
Jun 23, 2020
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
22e9274
Add broker create, delete and list cmds
dsimansk Jun 19, 2020
91abb1c
fix: Fix copyright headers
dsimansk Jun 19, 2020
54befac
fix: Fix linter warnings
dsimansk Jun 19, 2020
629b73b
Update pkg/kn/commands/broker/create.go
dsimansk Jun 19, 2020
10536f2
Update pkg/kn/commands/broker/delete.go
dsimansk Jun 19, 2020
db5a42a
Update pkg/kn/commands/broker/list.go
dsimansk Jun 19, 2020
2997489
feat: Add broker describe command
dsimansk Jun 19, 2020
0f8a96a
fix: Fix copyright header
dsimansk Jun 19, 2020
784a912
fix: Fix linter issues
dsimansk Jun 19, 2020
25ec5bd
fix: Fix broker describe test
dsimansk Jun 21, 2020
4e70573
fix: Fix order of eventing cmds
dsimansk Jun 21, 2020
9b2901a
chore: Add e2e tests
dsimansk Jun 21, 2020
d671e82
fix: Fix e2e tests annotation
dsimansk Jun 21, 2020
2e0e657
fix: Reorder e2e tests methods
dsimansk Jun 21, 2020
e7b5261
feat: Add synchronous broker delete option
dsimansk Jun 22, 2020
1df31dc
fix: Fix broker describe example
dsimansk Jun 22, 2020
feacf79
fix: Fix variable name
dsimansk Jun 22, 2020
a61ef4c
fix: Fix broker list example formatting
dsimansk Jun 22, 2020
45abb53
fix: Fix eventing client func name
dsimansk Jun 22, 2020
045175e
fix: Reflect changes from PR review suggestions
dsimansk Jun 22, 2020
6f2d98c
fix: Fix formatting of cmd examples
dsimansk Jun 22, 2020
c24eba1
fix: Fix formatting of cmd examples & trailing spaces
dsimansk Jun 22, 2020
90a0dec
fix: Polish eventing client docs
dsimansk Jun 22, 2020
db8f0fb
fix: Fix examples alignment
dsimansk Jun 23, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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

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

Create a broker

### Synopsis

Create a broker

```
kn broker create NAME
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is a good default for a broker (named 'default') I wonder whether we can make the name optional for all broker commands.

That would help in creating a default broker like the injection would do

kn broker create
Broker 'default' is created

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd go for requiring the name explicitly as arg for create. Keeping create formula consistent with other resources.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've decided to keep create consistent with the rest of resource creation flow, but I've had those thoughts myself that "default" might be worth. However, we can consider "default" to be exclusive for annotation created broker, therefore keeping name argument required here.

```

### 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

47 changes: 47 additions & 0 deletions docs/cmd/kn_broker_delete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
## 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

116 changes: 113 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)
rhuss marked this conversation as resolved.
Show resolved Hide resolved
}

// 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,101 @@ 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
}

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)
}

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