Skip to content

Commit

Permalink
Add kn revision delete command (knative#207)
Browse files Browse the repository at this point in the history
* Adds kn revision delete command

* Adds unit tests for revision delete command

* Adds integration tests for revision delete command

 Added revision delete command tests in new workflow namely
 TestRevisionWorkflow.

* Removes extra line and renames an import alias

* Adds 10 seconds sleep between service create and revision delete

 Also adds check for 'No resources found' while grabbing revision name.

* Clean up imports

* Removes the pause after service create

* Updates testing output strings in unit and e2e

* Updates post goimports on hack and test dirs
  • Loading branch information
navidshaikh authored and maximilien committed Jul 1, 2019
1 parent 263d2c0 commit 0ea4430
Show file tree
Hide file tree
Showing 13 changed files with 230 additions and 7 deletions.
1 change: 1 addition & 0 deletions docs/cmd/kn_revision.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ kn revision [flags]
### SEE ALSO

* [kn](kn.md) - Knative client
* [kn revision delete](kn_revision_delete.md) - Delete a revision.
* [kn revision describe](kn_revision_describe.md) - Describe revisions.
* [kn revision list](kn_revision_list.md) - List available revisions.

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

Delete a revision.

### Synopsis

Delete a revision.

```
kn revision delete NAME [flags]
```

### Examples

```
# Delete a revision 'svc1-abcde' in default namespace
kn revision delete svc1-abcde
```

### Options

```
-h, --help help for delete
-n, --namespace string List the requested object(s) in given namespace.
```

### Options inherited from parent commands

```
--config string config file (default is $HOME/.kn/config.yaml)
--kubeconfig string kubectl config file (default is $HOME/.kube/config)
```

### SEE ALSO

* [kn revision](kn_revision.md) - Revision command group

4 changes: 2 additions & 2 deletions hack/generate-docs.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ func main() {
if len(os.Args) > 1 {
dir = os.Args[1]
}
err := doc.GenMarkdownTree(rootCmd, dir + "/docs/cmd/")
err := doc.GenMarkdownTree(rootCmd, dir+"/docs/cmd/")
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
}
59 changes: 59 additions & 0 deletions pkg/kn/commands/revision/delete.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// Copyright © 2019 The Knative Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package revision

import (
"errors"
"fmt"

"github.com/knative/client/pkg/kn/commands"
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// NewRevisionDeleteCommand represent 'revision delete' command
func NewRevisionDeleteCommand(p *commands.KnParams) *cobra.Command {
RevisionDeleteCommand := &cobra.Command{
Use: "delete NAME",
Short: "Delete a revision.",
Example: `
# Delete a revision 'svc1-abcde' in default namespace
kn revision delete svc1-abcde`,
RunE: func(cmd *cobra.Command, args []string) error {
if len(args) != 1 {
return errors.New("'revision delete' requires the revision name given as single argument")
}
client, err := p.ServingFactory()
if err != nil {
return err
}
namespace, err := p.GetNamespace(cmd)
if err != nil {
return err
}
err = client.Revisions(namespace).Delete(
args[0],
&metav1.DeleteOptions{},
)
if err != nil {
return err
}
fmt.Fprintf(cmd.OutOrStdout(), "Revision '%s' successfully deleted in namespace '%s'.\n", args[0], namespace)
return nil
},
}
commands.AddNamespaceFlags(RevisionDeleteCommand.Flags(), false)
return RevisionDeleteCommand
}
59 changes: 59 additions & 0 deletions pkg/kn/commands/revision/delete_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// Copyright © 2019 The Knative Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package revision

import (
"testing"

"github.com/knative/client/pkg/kn/commands"
"k8s.io/apimachinery/pkg/runtime"
client_testing "k8s.io/client-go/testing"
)

func fakeRevisionDelete(args []string) (action client_testing.Action, name string, output string, err error) {
knParams := &commands.KnParams{}
cmd, fakeServing, buf := commands.CreateTestKnCommand(NewRevisionCommand(knParams), knParams)
fakeServing.AddReactor("delete", "revisions",
func(a client_testing.Action) (bool, runtime.Object, error) {
deleteAction, _ := a.(client_testing.DeleteAction)
action = deleteAction
name = deleteAction.GetName()
return true, nil, nil
})
cmd.SetArgs(args)
err = cmd.Execute()
if err != nil {
return
}
output = buf.String()
return
}

func TestRevisionDelete(t *testing.T) {
revName := "foo-12345"
action, name, output, err := fakeRevisionDelete([]string{"revision", "delete", revName})
if err != nil {
t.Error(err)
return
}
if action == nil {
t.Errorf("No action")
} else if !action.Matches("delete", "revisions") {
t.Errorf("Bad action %v", action)
} else if name != revName {
t.Errorf("Bad revision name returned after delete.")
}
commands.TestContains(t, output, []string{"Revision", revName, "deleted", "namespace", commands.FakeNamespace}, "word in output")
}
1 change: 1 addition & 0 deletions pkg/kn/commands/revision/revision.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,6 @@ func NewRevisionCommand(p *commands.KnParams) *cobra.Command {
}
revisionCmd.AddCommand(NewRevisionListCommand(p))
revisionCmd.AddCommand(NewRevisionDescribeCommand(p))
revisionCmd.AddCommand(NewRevisionDeleteCommand(p))
return revisionCmd
}
5 changes: 3 additions & 2 deletions pkg/kn/commands/service/service_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@ package service
import (
"errors"
"fmt"
"io"
"time"

"github.com/knative/client/pkg/kn/commands"
serving_v1alpha1_api "github.com/knative/serving/pkg/apis/serving/v1alpha1"
serving_v1alpha1_client "github.com/knative/serving/pkg/client/clientset/versioned/typed/serving/v1alpha1"
"github.com/spf13/cobra"
"io"
"time"

corev1 "k8s.io/api/core/v1"
api_errors "k8s.io/apimachinery/pkg/api/errors"
Expand Down
1 change: 1 addition & 0 deletions pkg/kn/commands/service/wait_args.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package service

import (
"fmt"

"github.com/knative/client/pkg/wait"
"github.com/knative/pkg/apis"
serving_v1alpha1_api "github.com/knative/serving/pkg/apis/serving/v1alpha1"
Expand Down
12 changes: 12 additions & 0 deletions pkg/kn/commands/test_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ package commands
import (
"bytes"
"flag"
"strings"
"testing"

serving "github.com/knative/serving/pkg/client/clientset/versioned/typed/serving/v1alpha1"
"github.com/knative/serving/pkg/client/clientset/versioned/typed/serving/v1alpha1/fake"
Expand Down Expand Up @@ -67,3 +69,13 @@ Eventing: Manage event subscriptions and channels. Connect up event sources.`,
flag.CommandLine.Parse([]string{})
return rootCmd
}

// TestContains is a test helper function, checking if a substring is present in given
// output string
func TestContains(t *testing.T, output string, sub []string, element string) {
for _, each := range sub {
if !strings.Contains(output, each) {
t.Errorf("Missing %s: %s", element, each)
}
}
}
1 change: 1 addition & 0 deletions pkg/kn/commands/wait_flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package commands

import (
"fmt"

"github.com/spf13/cobra"
)

Expand Down
3 changes: 2 additions & 1 deletion pkg/kn/commands/wait_flags_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@
package commands

import (
"github.com/spf13/cobra"
"strings"
"testing"

"github.com/spf13/cobra"
)

type waitTestCase struct {
Expand Down
5 changes: 3 additions & 2 deletions pkg/wait/wait_for_ready.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@ package wait

import (
"fmt"
"github.com/knative/pkg/apis"
"io"
"time"

"github.com/knative/pkg/apis"
corev1 "k8s.io/api/core/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/watch"
"time"
)

// Callbacks and configuration used while waiting
Expand Down
48 changes: 48 additions & 0 deletions test/e2e/revision_workflow_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright 2019 The Knative Authors

// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at

// http://www.apache.org/licenses/LICENSE-2.0

// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or im
// See the License for the specific language governing permissions and
// limitations under the License.

// +build e2e

package e2e

import (
"strings"
"testing"

"github.com/knative/client/pkg/kn/commands"
)

func TestRevisionWorkflow(t *testing.T) {
teardown := Setup(t)
defer teardown(t)

testServiceCreate(t, k, "hello")
testDeleteRevision(t, k, "hello")
testServiceDelete(t, k, "hello")
}

func testDeleteRevision(t *testing.T, k kn, serviceName string) {
revName, err := k.RunWithOpts([]string{"revision", "list", "-o=jsonpath={.items[0].metadata.name}"}, runOpts{})
if err != nil {
t.Errorf("Error executing 'revision list -o' command. Error: %s", err.Error())
}
if strings.Contains(revName, "No resources found.") {
t.Errorf("Could not find revision name.")
}
out, err := k.RunWithOpts([]string{"revision", "delete", revName}, runOpts{})
if err != nil {
t.Errorf("Error executing 'revision delete %s' command. Error: %s", revName, err.Error())
}
commands.TestContains(t, out, []string{"Revision", revName, "deleted", "namespace", k.namespace}, "word in output")
}

0 comments on commit 0ea4430

Please sign in to comment.