Skip to content

Commit 0e7eee2

Browse files
committed
Add endpoint info to "cx get api"
1 parent 0e50b29 commit 0e7eee2

File tree

10 files changed

+101
-32
lines changed

10 files changed

+101
-32
lines changed

cli/cmd/get.go

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -377,40 +377,50 @@ func describeAPI(name string, resourcesRes *schema.GetResourcesResponse) (string
377377
return "", userconfig.ErrorUndefinedResource(name, resource.APIType)
378378
}
379379

380-
api := resourcesRes.Context.APIs[name]
380+
ctx := resourcesRes.Context
381+
api := ctx.APIs[name]
382+
model := ctx.Models[api.ModelName]
381383

382384
var staleReplicas int32 = 0
383385
var ctxAPIStatus *resource.APIStatus = nil
386+
var anyAPIStatus *resource.APIStatus = nil
384387
for _, apiStatus := range resourcesRes.APIStatuses {
385388
if apiStatus.APIName != name {
386389
continue
387390
}
391+
anyAPIStatus = apiStatus
388392
if api != nil && apiStatus.ResourceID == api.ID {
389393
ctxAPIStatus = apiStatus
390394
}
391395
staleReplicas += apiStatus.TotalStaleReady()
392396
}
393397

394398
out := titleStr("Summary")
395-
396-
if groupStatus.ActiveStatus != nil {
397-
out += "Endpoint: " + util.URLJoin(resourcesRes.APIsBaseURL, groupStatus.ActiveStatus.Path) + "\n"
398-
}
399-
400399
out += "Status: " + groupStatus.Message() + "\n"
401-
out += "Created at: " + util.LocalTimestamp(groupStatus.Start) + "\n"
402-
403-
if groupStatus.ActiveStatus != nil && groupStatus.ActiveStatus.Start != nil {
404-
out += "Refreshed at: " + util.LocalTimestamp(groupStatus.ActiveStatus.Start) + "\n"
405-
}
406-
407400
if ctxAPIStatus != nil {
408401
out += fmt.Sprintf("Updated replicas: %d/%d ready\n", ctxAPIStatus.ReadyUpdated, ctxAPIStatus.RequestedReplicas)
409402
}
410-
411403
if staleReplicas != 0 {
412404
out += fmt.Sprintf("Stale replicas: %d ready\n", staleReplicas)
413405
}
406+
out += "Created at: " + util.LocalTimestamp(groupStatus.Start) + "\n"
407+
if groupStatus.ActiveStatus != nil && groupStatus.ActiveStatus.Start != nil {
408+
out += "Refreshed at: " + util.LocalTimestamp(groupStatus.ActiveStatus.Start) + "\n"
409+
}
410+
411+
out += titleStr("Endpoint")
412+
var samplePlaceholderFields []string
413+
for _, colName := range ctx.RawColumnInputNames(model) {
414+
column := ctx.GetColumn(colName)
415+
columnType := userconfig.ColumnTypeFromString(column.GetType())
416+
fieldStr := `"` + colName + `": ` + columnType.JSONPlaceholder()
417+
samplePlaceholderFields = append(samplePlaceholderFields, fieldStr)
418+
}
419+
samplesPlaceholderStr := `{ "samples": [ { ` + strings.Join(samplePlaceholderFields, ", ") + " } ] }"
420+
out += "URL: " + util.URLJoin(resourcesRes.APIsBaseURL, anyAPIStatus.Path) + "\n"
421+
out += "Method: POST\n"
422+
out += `Header: "Content-Type: application/json"` + "\n"
423+
out += "Payload: " + samplesPlaceholderStr + "\n"
414424

415425
if api != nil {
416426
out += resourceStr(api.API)

docs/quick-start.md

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -560,25 +560,33 @@ $ cortex get api iris-type
560560
Summary
561561
-------
562562
563-
Endpoint: https://a84607a462f1811e9aa3b020abd0a844-645332984.us-west-2.elb.amazonaws.com/iris/iris-type
564-
Status: ready
565-
Created at: 2019-02-14 14:57:04 PST
566-
Refreshed at: 2019-02-14 14:57:35 PST
567-
Updated replicas: 1/1 ready
563+
Status: ready
564+
Updated replicas: 1/1 ready
565+
Created at: 2019-02-14 14:57:04 PST
566+
Refreshed at: 2019-02-14 14:57:35 PST
567+
568+
--------
569+
Endpoint
570+
--------
571+
572+
URL: https://a84607a462f1811e9aa3b020abd0a844-645332984.us-west-2.elb.amazonaws.com/iris/iris-type
573+
Method: POST
574+
Header: "Content-Type: application/json"
575+
Payload: { "samples": [ { "petal_length": FLOAT, "petal_width": FLOAT, "sepal_length": FLOAT, "sepal_width": FLOAT } ] }
568576
569577
-------------
570578
Configuration
571579
-------------
572580
573581
{
574-
"name": "iris-type",
575-
"model_name": "dnn",
576-
"compute": {
577-
"replicas": 1,
578-
"cpu": <null>,
579-
"mem": <null>
580-
},
581-
"tags": {}
582+
"name": "iris-type",
583+
"model_name": "dnn",
584+
"compute": {
585+
"replicas": 1,
586+
"cpu": <null>,
587+
"mem": <null>
588+
},
589+
"tags": {}
582590
}
583591
```
584592

pkg/api/context/columns.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type Column interface {
3131
ComputedResource
3232
GetType() string
3333
IsRaw() bool
34+
GetInputRawColumnNames() []string
3435
}
3536

3637
func (ctx *Context) Columns() Columns {

pkg/api/context/dependencies.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func (ctx *Context) aggregatesDependencies(aggregate *Aggregate) map[string]bool
8787
for _, pythonPackage := range ctx.PythonPackages {
8888
dependencies[pythonPackage.GetID()] = true
8989
}
90-
for rawColumnName := range rawColumnNames {
90+
for _, rawColumnName := range rawColumnNames {
9191
rawColumn := ctx.RawColumns[rawColumnName]
9292
dependencies[rawColumn.GetID()] = true
9393
}
@@ -102,7 +102,7 @@ func (ctx *Context) transformedColumnDependencies(transformedColumn *Transformed
102102
}
103103

104104
rawColumnNames := transformedColumn.InputColumnNames()
105-
for rawColumnName := range rawColumnNames {
105+
for _, rawColumnName := range rawColumnNames {
106106
rawColumn := ctx.RawColumns[rawColumnName]
107107
dependencies[rawColumn.GetID()] = true
108108
}

pkg/api/context/models.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@ limitations under the License.
1717
package context
1818

1919
import (
20+
"sort"
21+
2022
"github.com/cortexlabs/cortex/pkg/api/resource"
2123
s "github.com/cortexlabs/cortex/pkg/api/strings"
2224
"github.com/cortexlabs/cortex/pkg/api/userconfig"
2325
"github.com/cortexlabs/cortex/pkg/utils/errors"
26+
"github.com/cortexlabs/cortex/pkg/utils/sets/strset"
2427
)
2528

2629
type Models map[string]*Model
@@ -91,3 +94,14 @@ func ValidateModelTargetType(targetDataTypeStr string, modelType string) error {
9194

9295
return errors.New(s.ErrInvalidStr(modelType, "classification", "regression")) // unexpected
9396
}
97+
98+
func (ctx *Context) RawColumnInputNames(model *Model) []string {
99+
rawColumnInputNames := strset.New()
100+
for _, colName := range model.FeatureColumns {
101+
col := ctx.GetColumn(colName)
102+
rawColumnInputNames.Add(col.GetInputRawColumnNames()...)
103+
}
104+
list := rawColumnInputNames.List()
105+
sort.Strings(list)
106+
return list
107+
}

pkg/api/context/raw_columns.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,15 @@ func (rawColumns RawColumns) ColumnInputsID(columnInputValues map[string]interfa
8686
func (rawColumns RawColumns) ColumnInputsIDWithTags(columnInputValues map[string]interface{}) string {
8787
return rawColumns.columnInputsID(columnInputValues, true)
8888
}
89+
90+
func (rawColumn *RawIntColumn) GetInputRawColumnNames() []string {
91+
return []string{rawColumn.GetName()}
92+
}
93+
94+
func (rawColumn *RawFloatColumn) GetInputRawColumnNames() []string {
95+
return []string{rawColumn.GetName()}
96+
}
97+
98+
func (rawColumn *RawStringColumn) GetInputRawColumnNames() []string {
99+
return []string{rawColumn.GetName()}
100+
}

pkg/api/context/transformed_columns.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,7 @@ func (transformedColumns TransformedColumns) OneByID(id string) *TransformedColu
5757
}
5858
return nil
5959
}
60+
61+
func (transformedColumn *TransformedColumn) GetInputRawColumnNames() []string {
62+
return transformedColumn.InputColumnNames()
63+
}

pkg/api/userconfig/aggregates.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
package userconfig
1818

1919
import (
20+
"sort"
21+
2022
"github.com/cortexlabs/cortex/pkg/api/resource"
2123
cr "github.com/cortexlabs/cortex/pkg/utils/configreader"
2224
"github.com/cortexlabs/cortex/pkg/utils/util"
@@ -89,7 +91,8 @@ func (aggregates Aggregates) Get(name string) *Aggregate {
8991
return nil
9092
}
9193

92-
func (aggregate *Aggregate) InputColumnNames() map[string]bool {
93-
inputs, _ := util.FlattenAllStrValuesAsSet(aggregate.Inputs.Columns)
94+
func (aggregate *Aggregate) InputColumnNames() []string {
95+
inputs, _ := util.FlattenAllStrValues(aggregate.Inputs.Columns)
96+
sort.Strings(inputs)
9497
return inputs
9598
}

pkg/api/userconfig/column_type.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ var columnTypes = []string{
4141
"STRING_LIST_COLUMN",
4242
}
4343

44+
var columnJSONPlaceholders = []string{
45+
"_",
46+
"INT",
47+
"FLOAT",
48+
"\"STRING\"",
49+
"[INT]",
50+
"[FLOAT]",
51+
"[\"STRING\"]",
52+
}
53+
4454
func ColumnTypeFromString(s string) ColumnType {
4555
for i := 0; i < len(columnTypes); i++ {
4656
if s == columnTypes[i] {
@@ -58,6 +68,10 @@ func (t ColumnType) String() string {
5868
return columnTypes[t]
5969
}
6070

71+
func (t ColumnType) JSONPlaceholder() string {
72+
return columnJSONPlaceholders[t]
73+
}
74+
6175
// MarshalText satisfies TextMarshaler
6276
func (t ColumnType) MarshalText() ([]byte, error) {
6377
return []byte(t.String()), nil

pkg/api/userconfig/transformed_columns.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
package userconfig
1818

1919
import (
20+
"sort"
21+
2022
"github.com/cortexlabs/cortex/pkg/api/resource"
2123
cr "github.com/cortexlabs/cortex/pkg/utils/configreader"
2224
"github.com/cortexlabs/cortex/pkg/utils/util"
@@ -94,7 +96,8 @@ func (transformedColumns TransformedColumns) Get(name string) *TransformedColumn
9496
return nil
9597
}
9698

97-
func (transformedColumn *TransformedColumn) InputColumnNames() map[string]bool {
98-
inputs, _ := util.FlattenAllStrValuesAsSet(transformedColumn.Inputs.Columns)
99+
func (transformedColumn *TransformedColumn) InputColumnNames() []string {
100+
inputs, _ := util.FlattenAllStrValues(transformedColumn.Inputs.Columns)
101+
sort.Strings(inputs)
99102
return inputs
100103
}

0 commit comments

Comments
 (0)