Skip to content

Commit

Permalink
Add support for service url in svc describe output (#916)
Browse files Browse the repository at this point in the history
* Add support for service url in svc describe output

* Add changes in CHANGELOG.adoc

* Update CHANGELOG.adoc

Co-authored-by: Matt Moore <[email protected]>

* Add url as output format in kn service describe --help command

* Build locally and autogenerated doc

* Change service describe help message for consistency

Co-authored-by: Matt Moore <[email protected]>
  • Loading branch information
hemanrnjn and mattmoor authored Jul 7, 2020
1 parent 1a8cf96 commit e6f125f
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 4 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
|===
| | Description | PR

| 🎁
| Add "url" output format to return service url in service describe
| https://github.com/knative/client/pull/916[#916]

| 🐛
| Fix panic for `kn source apiserver` and `kn source binding` describe with Sink URI
| https://github.com/knative/client/pull/901[#901]
Expand Down
16 changes: 15 additions & 1 deletion docs/cmd/kn_service_describe.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,27 @@ Show details of a service
kn service describe NAME
```

### Examples

```
# Describe service 'svc' in human friendly format
kn service describe svc
# Describe service 'svc' in YAML format
kn service describe svc -o yaml
# Print only service URL
kn service describe svc -o url
```

### Options

```
--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 describe
-n, --namespace string Specify the namespace to operate in.
-o, --output string Output format. One of: json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-file.
-o, --output string Output format. One of: json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-file|url.
--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].
-v, --verbose More output.
```
Expand Down
24 changes: 21 additions & 3 deletions pkg/kn/commands/service/describe.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"io"
"sort"
"strconv"
"strings"

"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/cli-runtime/pkg/genericclioptions"
Expand Down Expand Up @@ -70,15 +71,26 @@ type revisionDesc struct {
// As this command does not do any writes/updates, it's just a matter of fallbacks.
// [/REMOVE COMMENT WHEN MOVING TO 0.7.0]

var describe_example = `
# Describe service 'svc' in human friendly format
kn service describe svc
# Describe service 'svc' in YAML format
kn service describe svc -o yaml
# Print only service URL
kn service describe svc -o url`

// NewServiceDescribeCommand returns a new command for describing a service.
func NewServiceDescribeCommand(p *commands.KnParams) *cobra.Command {

// For machine readable output
machineReadablePrintFlags := genericclioptions.NewPrintFlags("")

command := &cobra.Command{
Use: "describe NAME",
Short: "Show details of a service",
Use: "describe NAME",
Short: "Show details of a service",
Example: describe_example,
RunE: func(cmd *cobra.Command, args []string) error {
if len(args) != 1 {
return errors.New("'service describe' requires the service name given as single argument")
Expand All @@ -102,11 +114,16 @@ func NewServiceDescribeCommand(p *commands.KnParams) *cobra.Command {

// Print out machine readable output if requested
if machineReadablePrintFlags.OutputFlagSpecified() {
out := cmd.OutOrStdout()
if strings.ToLower(*machineReadablePrintFlags.OutputFormat) == "url" {
fmt.Fprintf(out, "%s\n", extractURL(service))
return nil
}
printer, err := machineReadablePrintFlags.ToPrinter()
if err != nil {
return err
}
return printer.PrintObj(service, cmd.OutOrStdout())
return printer.PrintObj(service, out)
}

printDetails, err = cmd.Flags().GetBool("verbose")
Expand All @@ -126,6 +143,7 @@ func NewServiceDescribeCommand(p *commands.KnParams) *cobra.Command {
commands.AddNamespaceFlags(flags, false)
flags.BoolP("verbose", "v", false, "More output.")
machineReadablePrintFlags.AddFlags(command)
command.Flag("output").Usage = fmt.Sprintf("Output format. One of: %s.", strings.Join(append(machineReadablePrintFlags.AllowedFormats(), "url"), "|"))
return command
}

Expand Down
17 changes: 17 additions & 0 deletions pkg/kn/commands/service/describe_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,23 @@ func TestServiceDescribeMachineReadable(t *testing.T) {
r.Validate()
}

func TestServiceDescribeURL(t *testing.T) {
client := knclient.NewMockKnServiceClient(t)

// Recording:
r := client.Recorder()

// Prepare service
expectedService := createTestService("foo", []string{"rev1", "rev2"}, goodConditions())
r.GetService("foo", &expectedService, nil)

output, err := executeServiceCommand(client, "describe", "foo", "-o", "url")
assert.NilError(t, err)
assert.Assert(t, util.ContainsAll(output, "foo.default.example.com"))

r.Validate()
}

func validateServiceOutput(t *testing.T, service string, output string) {
assert.Assert(t, cmp.Regexp("Name:\\s+"+service, output))
assert.Assert(t, cmp.Regexp("Namespace:\\s+default", output))
Expand Down

0 comments on commit e6f125f

Please sign in to comment.