blob: be6c443d7d841eb6b91bdfce5a5e07b6649e48fc [file] [log] [blame]
/*
* 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 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"`
SymbolicName string `json:"symbolicName"`
Version string `json:"version"`
Description string `json:"description"`
}
type CatalogItemSummary struct {
IdentityDetails
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 CatalogEntitySummary struct {
CatalogItemSummary
IconUrl string `json:"iconUrl"`
Effectors []EffectorSummary `json:"effectors"`
Sensors []SensorSummary `json:"sensors"`
}
type CatalogBundleAddResult struct {
Message string `json:"message"`
Bundle string `json:"bundle"`
Code string `json:"code"`
Types map[string]CatalogItemSummary `json:"types"`
}
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) {
if json := c.GlobalString("json") ; json != "" {
displayAsJson(summary, json)
} else {
summary.displayAsTable()
}
return err
}
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
}