You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/11/03 11:30:01 UTC

[1/2] brooklyn-client git commit: Experimental addition of 'catalog show'.

Repository: brooklyn-client
Updated Branches:
  refs/heads/master 807e3cde8 -> b36e6c652


Experimental addition of 'catalog show'.

Examples:

	br catalog show
	br catalog show ( application | entity | location | policy ) ITEM[:VERSION]

apps:
	br catalog show app TomcatServer
	Id:               | TomcatServer:4.1.0-SNAPSHOT
	Version:          | 4.1.0-SNAPSHOT
	Name:             | Tomcat Server
	...etc.

specific version:
	br catalog show app TomcatServer:4.1.0-SNAPSHOT
	Id:               | TomcatServer:4.1.0-SNAPSHOT
	Version:          | 4.1.0-SNAPSHOT
	Name:             | Tomcat Server
	...

entities:
	br catalog show ent docker-engine | head -3
	Id:                | docker-engine:2.1.0-SNAPSHOT
	Version:           | 2.1.0-SNAPSHOT
	Name:              | Docker Engine
	...

policies:
	br catalog show pol org.apache.brooklyn.policy.ha.ServiceReplacer
	Id:              | org.apache.brooklyn.policy.ha.ServiceReplacer:4.1.0-SNAPSHOT
	Version:         | 4.1.0-SNAPSHOT
	Name:            | Service Replacer
	Symbolic Name:   | org.apache.brooklyn.policy.ha.ServiceReplacer
	Description:     | HA policy for replacing a failed member of a group
	Java Type:       |

Experimental: render as JSON. Some work required...

Special case: render the whole JSON with jsonpath value `$`:

	br -j '$' catalog show ent docker-engine
	{"id":"docker-engine:2.1.0-SNAPSHOT","name":"Docker Engine",...

General case: give a JSON path expression following the syntax of https://github.com/NodePrime/jsonpath:

	 br -j '$.config[*].label+' catalog show ent docker-engine
	"Docker Package"
	"Docker Version"
	"Docker Repository URL"
	"Docker GPG Key URL"
	"Docker Additional Options"
	"Image Pre-install"
	"archive.nameFormat"


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-client/commit/3163afa8
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-client/tree/3163afa8
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-client/diff/3163afa8

Branch: refs/heads/master
Commit: 3163afa80bf0d5cf4139b4feda1ec2efec61a05f
Parents: ba2037e
Author: Geoff Macartney <ge...@cloudsoftcorp.com>
Authored: Tue Nov 1 12:14:05 2016 +0000
Committer: Geoff Macartney <ge...@cloudsoftcorp.com>
Committed: Tue Nov 1 17:47:39 2016 +0000

----------------------------------------------------------------------
 cli/api/catalog/catalog.go   |  35 +++++----
 cli/app/app.go               |   4 +
 cli/commands/catalog-list.go |   2 +-
 cli/commands/catalog-show.go | 148 +++++++++++++++++++++++++++++++++++
 cli/commands/catalog.go      |   6 +-
 cli/glide.lock               |  10 ++-
 cli/glide.yaml               |   1 +
 cli/models/catalog.go        | 159 ++++++++++++++++++++++++++++++++++----
 cli/models/config.go         |   1 +
 9 files changed, 329 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/3163afa8/cli/api/catalog/catalog.go
----------------------------------------------------------------------
diff --git a/cli/api/catalog/catalog.go b/cli/api/catalog/catalog.go
index cab5214..2ff3a88 100644
--- a/cli/api/catalog/catalog.go
+++ b/cli/api/catalog/catalog.go
@@ -89,7 +89,7 @@ func GetPolicy(network *net.Network, policyId string) (models.CatalogItemSummary
 }
 
 func GetPolicyWithVersion(network *net.Network, policyId, version string) (models.CatalogItemSummary, error) {
-	url := fmt.Sprintf("/v1/catalog/policies/%s/%s", policyId)
+	url := fmt.Sprintf("/v1/catalog/policies/%s/%s", policyId, version)
 	var catalogItem models.CatalogItemSummary
 	body, err := network.SendGetRequest(url)
 	if err != nil {
@@ -148,9 +148,9 @@ func DeleteLocationWithVersion(network *net.Network, locationId, version string)
 	return string(body), nil
 }
 
-func Policies(network *net.Network) ([]models.CatalogPolicySummary, error) {
+func Policies(network *net.Network) ([]models.CatalogItemSummary, error) {
 	url := "/v1/catalog/policies?allVersions"
-	var policies []models.CatalogPolicySummary
+	var policies []models.CatalogItemSummary
 	body, err := network.SendGetRequest(url)
 	if err != nil {
 		return policies, err
@@ -159,9 +159,9 @@ func Policies(network *net.Network) ([]models.CatalogPolicySummary, error) {
 	return policies, err
 }
 
-func Locations(network *net.Network) ([]models.CatalogLocationSummary, error) {
+func Locations(network *net.Network) ([]models.CatalogItemSummary, error) {
 	url := "/v1/catalog/locations?allVersions=true"
-	var catalogLocations []models.CatalogLocationSummary
+	var catalogLocations []models.CatalogItemSummary
 	body, err := network.SendGetRequest(url)
 	if err != nil {
 		return catalogLocations, err
@@ -190,9 +190,20 @@ func Reset(network *net.Network) (string, error) {
 	return string(body), nil
 }
 
-func GetLocationWithVersion(network *net.Network, locationId, version string) (models.CatalogLocationSummary, error) {
+func GetLocation(network *net.Network, locationId string) (models.CatalogItemSummary, error) {
+	url := fmt.Sprintf("/v1/catalog/locations/%s", locationId)
+	var catalogLocation models.CatalogItemSummary
+	body, err := network.SendGetRequest(url)
+	if err != nil {
+		return catalogLocation, err
+	}
+	err = json.Unmarshal(body, &catalogLocation)
+	return catalogLocation, err
+}
+
+func GetLocationWithVersion(network *net.Network, locationId, version string) (models.CatalogItemSummary, error) {
 	url := fmt.Sprintf("/v1/catalog/locations/%s/%s", locationId, version)
-	var catalogLocation models.CatalogLocationSummary
+	var catalogLocation models.CatalogItemSummary
 	body, err := network.SendGetRequest(url)
 	if err != nil {
 		return catalogLocation, err
@@ -232,13 +243,3 @@ func Catalog(network *net.Network) ([]models.CatalogItemSummary, error) {
 	return applications, err
 }
 
-func GetLocation(network *net.Network, locationId string) (models.CatalogLocationSummary, error) {
-	url := fmt.Sprintf("/v1/catalog/locations/%s", locationId)
-	var catalogLocation models.CatalogLocationSummary
-	body, err := network.SendGetRequest(url)
-	if err != nil {
-		return catalogLocation, err
-	}
-	err = json.Unmarshal(body, &catalogLocation)
-	return catalogLocation, err
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/3163afa8/cli/app/app.go
----------------------------------------------------------------------
diff --git a/cli/app/app.go b/cli/app/app.go
index 07ef3cd..191584e 100644
--- a/cli/app/app.go
+++ b/cli/app/app.go
@@ -56,6 +56,10 @@ func NewApp(baseName string, cmdRunner command_runner.Runner, metadatas ...comma
 			Name:  "skipSslChecks",
 			Usage: "Skip verification of server's certificate chain and hostname (for use with self-signed certs)",
 		},
+		cli.StringFlag{
+			Name:  "json, j",
+			Usage: "Render value as json with json path selector as described at https://github.com/NodePrime/jsonpath. (Experimental, not supported on all commands at present) ",
+		},
 	}
 
 	app.Commands = []cli.Command{}

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/3163afa8/cli/commands/catalog-list.go
----------------------------------------------------------------------
diff --git a/cli/commands/catalog-list.go b/cli/commands/catalog-list.go
index bc22c2c..e31821d 100644
--- a/cli/commands/catalog-list.go
+++ b/cli/commands/catalog-list.go
@@ -109,7 +109,7 @@ func (cmd *CatalogList) listLocations(c *cli.Context) ([]models.IdentityDetails,
 	}
 	result := make([]models.IdentityDetails, len(locations))
 	for i, location := range locations {
-		result[i] = location.CatalogItemSummary.IdentityDetails
+		result[i] = location.IdentityDetails
 	}
 	return result, nil
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/3163afa8/cli/commands/catalog-show.go
----------------------------------------------------------------------
diff --git a/cli/commands/catalog-show.go b/cli/commands/catalog-show.go
new file mode 100644
index 0000000..940d6c4
--- /dev/null
+++ b/cli/commands/catalog-show.go
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 commands
+
+import (
+	"github.com/apache/brooklyn-client/cli/api/catalog"
+	"github.com/apache/brooklyn-client/cli/command_metadata"
+	"github.com/apache/brooklyn-client/cli/error_handler"
+	"github.com/apache/brooklyn-client/cli/net"
+	"github.com/apache/brooklyn-client/cli/scope"
+	"github.com/urfave/cli"
+	"github.com/apache/brooklyn-client/cli/models"
+	"errors"
+	"strings"
+)
+
+type CatalogShow struct {
+	network *net.Network
+}
+
+func NewCatalogShow(network *net.Network) (cmd *CatalogShow) {
+	cmd = new(CatalogShow)
+	cmd.network = network
+	return
+}
+
+const showCommandName = "show"
+
+func (cmd *CatalogShow) Metadata() command_metadata.CommandMetadata {
+	return command_metadata.CommandMetadata{
+		Name:        showCommandName,
+		Description: "Show a catalog item",
+		Usage:       "BROOKLYN_NAME catalog " + showCommandName + " " + catalogItemTypesUsage + " ITEM",
+	}
+}
+
+func (cmd *CatalogShow) Run(scope scope.Scope, c *cli.Context) {
+	if err := net.VerifyLoginURL(cmd.network); err != nil {
+		error_handler.ErrorExit(err)
+	}
+	err := cmd.show(c)
+	if nil != err {
+		error_handler.ErrorExit(err)
+	}
+}
+
+func (cmd *CatalogShow) show(c *cli.Context) (error) {
+	if len(c.Args()) != 2 {
+		return errors.New(c.App.Name + " " + showCommandName + catalogItemTypesUsage + " ITEM[:VERSION]")
+	}
+	catalogType, err := GetCatalogType(c)
+	if  err != nil {
+		return err
+	}
+	item := c.Args().Get(1)
+	var version string
+	if strings.Contains(item, ":") {
+		itemVersion := strings.Split(item, ":")
+		item = itemVersion[0]
+		version = itemVersion[1]
+	}
+	switch catalogType {
+	case ApplicationsItemType:
+		return cmd.showCatalogApplication(c, item, version)
+	case EntitiesItemType:
+		return cmd.showCatalogEntity(c, item, version)
+	case LocationsItemType:
+		return cmd.showCatalogLocation(c, item, version)
+	case PoliciesItemType:
+		return cmd.showPolicy(c, item, version)
+	}
+	return errors.New("Unrecognised argument")
+}
+
+func (cmd *CatalogShow) showPolicy(c *cli.Context, item string, version string) (error) {
+	var summary models.CatalogItemSummary
+	var err error
+	if version == "" {
+		summary, err = catalog.GetPolicy(cmd.network, item)
+	} else {
+		summary, err = catalog.GetPolicyWithVersion(cmd.network, item, version)
+	}
+	if err != nil {
+		return err
+	}
+
+	return summary.Display(c)
+}
+
+func (cmd *CatalogShow) showCatalogLocation(c *cli.Context, item string, version string) (error) {
+	var summary models.CatalogItemSummary
+	var err error
+	if version == "" {
+		summary, err = catalog.GetLocation(cmd.network, item)
+	} else {
+		summary, err = catalog.GetLocationWithVersion(cmd.network, item, version)
+	}
+	if err != nil {
+		return err
+	}
+	return summary.Display(c)
+}
+
+func (cmd *CatalogShow) showCatalogEntity(c *cli.Context, item string, version string) (error) {
+	var summary models.CatalogEntitySummary
+	var err error
+	if version == "" {
+		summary, err = catalog.GetEntity(cmd.network, item)
+	} else {
+		summary, err = catalog.GetEntityWithVersion(cmd.network, item, version)
+	}
+	if err != nil {
+		return err
+	}
+	return summary.Display(c)
+}
+
+func (cmd *CatalogShow) showCatalogApplication(c *cli.Context, item string, version string) (error) {
+	var summary models.CatalogEntitySummary
+	var err error
+	if version == "" {
+		summary, err = catalog.GetApplication(cmd.network, item)
+	} else {
+		summary, err = catalog.GetApplicationWithVersion(cmd.network, item, version)
+	}
+	if err != nil {
+		return err
+	}
+
+	return summary.Display(c)
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/3163afa8/cli/commands/catalog.go
----------------------------------------------------------------------
diff --git a/cli/commands/catalog.go b/cli/commands/catalog.go
index 3d5e525..31819cb 100644
--- a/cli/commands/catalog.go
+++ b/cli/commands/catalog.go
@@ -39,6 +39,7 @@ func NewCatalog(network *net.Network) (cmd *Catalog) {
 	cmd = new(Catalog)
 	cmd.network = network
 	cmd.catalogCommands = map[string]command.Command {
+		ShowCatalogCommand: NewCatalogShow(cmd.network),
 		ListCatalogCommand: NewCatalogList(cmd.network),
 		AddCatalogCommand: NewCatalogAdd(cmd.network),
 		DeleteCatalogCommand: NewDeleteCatalogItem(cmd.network),
@@ -46,16 +47,18 @@ func NewCatalog(network *net.Network) (cmd *Catalog) {
 	return
 }
 
+const ShowCatalogCommand = "show"
 const ListCatalogCommand = "list"
 const AddCatalogCommand = "add"
 const DeleteCatalogCommand = "delete"
 
 var catalogCommands = []string{
+	ShowCatalogCommand,
 	ListCatalogCommand,
 	AddCatalogCommand,
 	DeleteCatalogCommand,
 }
-var catalogCommandsUsage = "list TYPE | add FILE/URL | delete TYPE ID:VERSION"
+var catalogCommandsUsage = "list TYPE | add FILE/URL | delete TYPE ID:VERSION | show ITEM"
 
 type CatalogItemType int
 const  (
@@ -96,6 +99,7 @@ func (cmd *Catalog) Metadata() command_metadata.CommandMetadata {
 		Usage:       "BROOKLYN_NAME catalog (" + catalogCommandsUsage + ")",
 		Flags:       []cli.Flag{},
 		Operands:    []command_metadata.CommandMetadata{
+			cmd.SubCommand(ShowCatalogCommand).Metadata(),
 			cmd.SubCommand(ListCatalogCommand).Metadata(),
 			cmd.SubCommand(AddCatalogCommand).Metadata(),
 			cmd.SubCommand(DeleteCatalogCommand).Metadata(),

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/3163afa8/cli/glide.lock
----------------------------------------------------------------------
diff --git a/cli/glide.lock b/cli/glide.lock
index f214d4c..54561ee 100644
--- a/cli/glide.lock
+++ b/cli/glide.lock
@@ -1,10 +1,14 @@
-hash: 1d87d5643857ae47cd40cc29e7b9b813198980c84b3491376b3561c467e37994
-updated: 2016-06-02T21:50:02.953614402+01:00
+hash: b5e09364283348512d5174937c662382a47e3d5e93f0f707aada9c2520d861e3
+updated: 2016-11-01T17:46:14.530067679Z
 imports:
+- name: github.com/NodePrime/jsonpath
+  version: 84403ded544328c99be3472727667179eef23a91
+  subpackages:
+  - cli/jsonpath
 - name: github.com/urfave/cli
   version: 5db74198dee1cfe60cf06a611d03a420361baad6
 - name: golang.org/x/crypto
   version: 1f22c0103821b9390939b6776727195525381532
   subpackages:
   - ssh/terminal
-devImports: []
\ No newline at end of file
+testImports: []

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/3163afa8/cli/glide.yaml
----------------------------------------------------------------------
diff --git a/cli/glide.yaml b/cli/glide.yaml
index e2cf5c9..6742536 100644
--- a/cli/glide.yaml
+++ b/cli/glide.yaml
@@ -1,6 +1,7 @@
 package: github.com/apache/brooklyn-client
 import:
 - package: github.com/urfave/cli
+- package: github.com/NodePrime/jsonpath/cli/jsonpath
 - package: golang.org/x/crypto
   subpackages:
   - ssh/terminal

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/3163afa8/cli/models/catalog.go
----------------------------------------------------------------------
diff --git a/cli/models/catalog.go b/cli/models/catalog.go
index ff537c8..edc6b0e 100644
--- a/cli/models/catalog.go
+++ b/cli/models/catalog.go
@@ -18,6 +18,16 @@
  */
 package models
 
+import (
+	"github.com/apache/brooklyn-client/cli/terminal"
+	"bytes"
+	"strconv"
+	"fmt"
+	"encoding/json"
+	"github.com/urfave/cli"
+	"github.com/NodePrime/jsonpath"
+)
+
 type IdentityDetails struct {
 	Id           string                 `json:"id"`
 	Name         string                 `json:"name"`
@@ -31,28 +41,147 @@ type CatalogItemSummary struct {
 	JavaType     string                 `json:"javaType"`
 	PlanYaml     string                 `json:"planYaml"`
 	Deprecated   bool                   `json:"deprecated"`
+	Config       []ConfigSummary        `json:"config"`
+	Tags         []interface{}          `json:"tags"`
 	Links        map[string]interface{} `json:"links"`
 	Type         string                 `json:"type"`
 }
 
-type CatalogPolicySummary struct {
-	IdentityDetails
-	javaType     string         `json:"javaType"`
-	planYaml     string         `json:"planYaml"`
-	iconUrl      string         `json:"iconUrl"`
-	deprecated   bool           `json:"deprecated"`
-	links        map[string]URI `json:"links"`
+type CatalogEntitySummary struct {
+	CatalogItemSummary
+	IconUrl      string                `json:"iconUrl"`
+	Effectors    []EffectorSummary     `json:"effectors"`
+	Sensors      []SensorSummary       `json:"sensors"`
+}
+
+func createTableWithIdentityDetails(item IdentityDetails) (terminal.Table) {
+	table := terminal.NewTable([]string{"Id:", item.Id})
+	table.Add("Version:", item.Version)
+	table.Add("Name:", item.Name)
+	table.Add("Symbolic Name:", item.SymbolicName)
+	table.Add("Description:", item.Description)
+	return table
 }
 
+func (summary *CatalogItemSummary) Display(c *cli.Context) (err error) {
 
-type CatalogLocationSummary struct {
-	CatalogItemSummary
-	IconUrl     string                 `json:"iconUrl"`
+	if json := c.GlobalString("json") ; json != "" {
+		displayAsJson(summary, json)
+	} else {
+		summary.displayAsTable()
+	}
+	return err
 }
 
-type CatalogEntitySummary struct {
-	CatalogItemSummary
-	Config       []ConfigSummary        `json:"config"`
-	Effectors    []EffectorSummary      `json:"effectors"`
-	Sensors      []SensorSummary        `json:"sensors"`
+
+func (summary *CatalogEntitySummary) Display(c *cli.Context) (err error) {
+
+	if json := c.GlobalString("json") ; json != "" {
+		displayAsJson(summary, json)
+	} else {
+		summary.displayAsTable()
+	}
+	return err
 }
+
+
+
+func (summary *CatalogItemSummary) displayAsTable() (err error){
+
+	table := createTableWithIdentityDetails(summary.IdentityDetails)
+	if summary.Deprecated {
+		table.Add("Deprecated:", "true")
+	}
+	table.Add("Java Type:", summary.JavaType)
+	table.Print()
+	return err
+}
+
+func (summary *CatalogEntitySummary) displayAsTable() (err error){
+
+	table := createTableWithIdentityDetails(summary.IdentityDetails)
+	if summary.Deprecated {
+		table.Add("Deprecated:", "true")
+	}
+	table.Add("Java Type:", summary.JavaType)
+	table.Add("Icon URL:", summary.IconUrl)
+
+	for c, conf := range summary.Config {
+		if c == 0 {
+			table.Add("", "") // helps distinguish entries from one another
+			table.Add("Config:", "")
+		}
+		table.Add("Name:", conf.Name)
+		table.Add("Type:", conf.Type)
+		table.Add("Description:", conf.Description)
+		table.Add("Default Value:", fmt.Sprintf("%v", conf.DefaultValue))
+		table.Add("Reconfigurable:", strconv.FormatBool(conf.Reconfigurable))
+		table.Add("Label:", conf.Label)
+		table.Add("Priority:", strconv.FormatFloat(conf.Priority, 'f', -1, 64))
+		table.Add("Pinned:", strconv.FormatBool(conf.Pinned))
+
+		if len(conf.PossibleValues) > 0 {
+			var values bytes.Buffer
+			for i, pv := range conf.PossibleValues {
+				if i > 0 {
+					values.WriteString(", ")
+				}
+				values.WriteString(pv["value"])
+				if pv["value"] != pv["description"] {
+					values.WriteString(" (" + pv["description"] + ")")
+				}
+			}
+			table.Add("Possible Values:", values.String())
+		}
+		table.Add("", "") // helps distinguish entries from one another
+	}
+
+	for t, tag := range summary.Tags {
+		if t == 0 {
+			table.Add("", "") // helps distinguish entries from one another
+			table.Add("Tags:", "")
+		}
+		if asJson, erj := json.Marshal(tag); nil == erj {
+			table.Add("tag:", string(asJson))
+		} else {
+			table.Add("tag:", fmt.Sprintf("%v", tag))
+		}
+	}
+
+	table.Print()
+	return err
+}
+
+
+
+func displayAsJson(v interface{}, jsonPath string) (err error) {
+	marshalled, err := json.Marshal(v)
+	if err != nil {
+		return err
+	}
+	// a convenient special case
+	if "$" == jsonPath {
+		fmt.Printf("%s", string(marshalled))
+		return nil
+	}
+
+	paths, err := jsonpath.ParsePaths(jsonPath)
+	if err != nil {
+		return err
+	}
+	eval, err := jsonpath.EvalPathsInBytes(marshalled, paths)
+	if err != nil {
+		return err
+	}
+	for {
+		if result, ok := eval.Next(); ok {
+			fmt.Print(result.Pretty(false)) // true -> show keys in pretty string
+		} else {
+			break
+		}
+	}
+	if eval.Error != nil {
+		return eval.Error
+	}
+	return nil
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/brooklyn-client/blob/3163afa8/cli/models/config.go
----------------------------------------------------------------------
diff --git a/cli/models/config.go b/cli/models/config.go
index bc97650..656a31f 100644
--- a/cli/models/config.go
+++ b/cli/models/config.go
@@ -27,5 +27,6 @@ type ConfigSummary struct {
 	Links          map[string]URI      `json:"links"`
 	Label          string              `json:"label"`
 	Priority       float64             `json:"priority"`
+	Pinned         bool                `json:"pinned"`
 	Type           string              `json:"type"`
 }


[2/2] brooklyn-client git commit: This closes #31

Posted by he...@apache.org.
This closes #31


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-client/commit/b36e6c65
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-client/tree/b36e6c65
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-client/diff/b36e6c65

Branch: refs/heads/master
Commit: b36e6c65207be84a5e8be11fde9aa102504dade9
Parents: 807e3cd 3163afa
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 3 10:49:55 2016 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 3 10:49:55 2016 +0000

----------------------------------------------------------------------
 cli/api/catalog/catalog.go   |  35 +++++----
 cli/app/app.go               |   4 +
 cli/commands/catalog-list.go |   2 +-
 cli/commands/catalog-show.go | 148 +++++++++++++++++++++++++++++++++++
 cli/commands/catalog.go      |   6 +-
 cli/glide.lock               |  10 ++-
 cli/glide.yaml               |   1 +
 cli/models/catalog.go        | 159 ++++++++++++++++++++++++++++++++++----
 cli/models/config.go         |   1 +
 9 files changed, 329 insertions(+), 37 deletions(-)
----------------------------------------------------------------------