Skip to content
This repository was archived by the owner on Dec 11, 2023. It is now read-only.

Commit 8b685e0

Browse files
authored
Transformation wizard (#287)
* Transformation GUI mock * Sample events * Transformation operations * Object creation * Create transformation from wizard * Editable operation path key * Fix components and event types parsing, fallback to stdin * Moved to the new registry * Targets layout read/write fix * Cleanup * Disable config registry param * Placeholder message * Update triggermesh upstream dependency * Change creation hotkey * Edit mode added * Escapable popups, more operations sanitizing * Docs update * Improved controls and layout behavior * Target selection mandatory
1 parent 3cff8aa commit 8b685e0

File tree

17 files changed

+1620
-29
lines changed

17 files changed

+1620
-29
lines changed

LICENSES/vendor/github.com/jroimartin/gocui/LICENSE

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

LICENSES/vendor/github.com/mattn/go-runewidth/LICENSE

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

LICENSES/vendor/github.com/nsf/termbox-go/LICENSE

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/create/transformation.go

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,19 @@ package create
1818

1919
import (
2020
"bufio"
21+
"bytes"
2122
"context"
2223
"fmt"
24+
"io"
2325
"os"
2426
"strings"
2527

28+
"github.com/jroimartin/gocui"
2629
"github.com/spf13/cobra"
2730
"gopkg.in/yaml.v3"
2831

2932
"github.com/triggermesh/tmctl/pkg/completion"
33+
transformationgui "github.com/triggermesh/tmctl/pkg/gui/transformation"
3034
"github.com/triggermesh/tmctl/pkg/log"
3135
"github.com/triggermesh/tmctl/pkg/output"
3236
"github.com/triggermesh/tmctl/pkg/triggermesh"
@@ -65,8 +69,9 @@ https://github.com/triggermesh/triggermesh/tree/main/config/samples/bumblebee`
6569
func (o *CliOptions) newTransformationCmd() *cobra.Command {
6670
var name, target, file string
6771
var eventSourcesFilter, eventTypesFilter []string
72+
var wizard bool
6873
transformationCmd := &cobra.Command{
69-
Use: "transformation [--target <name>][--source <name>...][--eventTypes <type>...][--from <path>]",
74+
Use: "transformation [--target <name>][--source <name>...][--eventTypes <type>...][--from <path>][--wizard]",
7075
Short: "Create TriggerMesh transformation. More information at https://docs.triggermesh.io/transformation/jsontransformation/",
7176
Example: `tmctl create transformation <<EOF
7277
data:
@@ -75,9 +80,26 @@ func (o *CliOptions) newTransformationCmd() *cobra.Command {
7580
- key: new-field
7681
value: hello from Transformation!
7782
EOF`,
78-
ValidArgs: []string{"--name", "--target", "--source", "--eventTypes", "--from"},
83+
ValidArgs: []string{"--name", "--target", "--source", "--eventTypes", "--from", "--wizard"},
7984
RunE: func(cmd *cobra.Command, args []string) error {
80-
return o.transformation(name, target, file, eventSourcesFilter, eventTypesFilter)
85+
if wizard {
86+
name, sourceEventType, target, spec, err := transformationgui.Create(o.CRD, o.Manifest, o.Config)
87+
if err == gocui.ErrQuit {
88+
return nil
89+
}
90+
if err != nil {
91+
return fmt.Errorf("transformation wizard error: %w", err)
92+
}
93+
return o.transformation(name, target, spec, []string{}, []string{sourceEventType})
94+
}
95+
if file != "" {
96+
data, err := os.ReadFile(file)
97+
if err != nil {
98+
return fmt.Errorf("file %q read: %w", file, err)
99+
}
100+
return o.transformation(name, target, bytes.NewBuffer(data), eventSourcesFilter, eventTypesFilter)
101+
}
102+
return o.transformation(name, target, nil, eventSourcesFilter, eventTypesFilter)
81103
},
82104
}
83105

@@ -91,6 +113,8 @@ EOF`,
91113
transformationCmd.Flags().StringSliceVar(&eventSourcesFilter, "source", []string{}, "Sources component names")
92114
transformationCmd.Flags().StringSliceVar(&eventTypesFilter, "eventTypes", []string{}, "Event types filter")
93115

116+
transformationCmd.Flags().BoolVar(&wizard, "wizard", false, "Experimental transformation wizard")
117+
94118
cobra.CheckErr(transformationCmd.RegisterFlagCompletionFunc("name", cobra.NoFileCompletions))
95119
cobra.CheckErr(transformationCmd.RegisterFlagCompletionFunc("source", func(cmd *cobra.Command, args []string, _ string) ([]string, cobra.ShellCompDirective) {
96120
return completion.ListSources(o.Manifest), cobra.ShellCompDirectiveNoFileComp
@@ -104,10 +128,13 @@ EOF`,
104128
return transformationCmd
105129
}
106130

107-
func (o *CliOptions) transformation(name, target, file string, eventSourcesFilter, eventTypesFilter []string) error {
131+
func (o *CliOptions) transformation(name, target string, specReader io.Reader, eventSourcesFilter, eventTypesFilter []string) error {
108132
ctx := context.Background()
133+
targetLabel := ""
134+
109135
var targetComponent triggermesh.Component
110136
if target != "" {
137+
targetLabel = target
111138
t, err := o.lookupTarget(ctx, target)
112139
if err != nil {
113140
return err
@@ -127,14 +154,14 @@ func (o *CliOptions) transformation(name, target, file string, eventSourcesFilte
127154
eventTypesFilter = append(eventTypesFilter, et...)
128155

129156
var data []byte
130-
if file == "" {
157+
if specReader == nil {
131158
input, err := fromStdIn()
132159
if err != nil {
133160
return fmt.Errorf("stdin read: %w", err)
134161
}
135162
data = []byte(input)
136163
} else {
137-
specFile, err := os.ReadFile(file)
164+
specFile, err := io.ReadAll(specReader)
138165
if err != nil {
139166
return fmt.Errorf("spec file read: %w", err)
140167
}
@@ -153,13 +180,13 @@ func (o *CliOptions) transformation(name, target, file string, eventSourcesFilte
153180
return fmt.Errorf("CRD for kind \"transformation\" not found")
154181
}
155182

156-
t := transformation.New(name, "transformation", o.Config.Context, o.Config.Triggermesh.ComponentsVersion, crd, spec)
183+
t := transformation.New(name, "transformation", o.Config.Context,
184+
o.Config.Triggermesh.ComponentsVersion, crd, spec)
157185

158186
transformationEventType := fmt.Sprintf("%s.output", t.GetName())
159187
if len(expectedEventTypes) > 0 {
160188
transformationEventType = expectedEventTypes[0]
161189
}
162-
163190
producedEventTypes, _ := t.(triggermesh.Producer).GetEventTypes()
164191
if len(producedEventTypes) == 0 {
165192
if err := t.(triggermesh.Producer).SetEventAttributes(map[string]string{
@@ -169,6 +196,7 @@ func (o *CliOptions) transformation(name, target, file string, eventSourcesFilte
169196
}
170197
} else {
171198
transformationEventType = producedEventTypes[0]
199+
targetLabel = producedEventTypes[0]
172200
}
173201

174202
eventTypesMatch := false
@@ -187,6 +215,8 @@ func (o *CliOptions) transformation(name, target, file string, eventSourcesFilte
187215
transformationEventType, targetComponent.GetName(), strings.Join(expectedEventTypes, ","))
188216
}
189217

218+
t.(*transformation.Transformation).SetLabel(transformation.TransformationContextLabel, transformationContexts(targetLabel, eventTypesFilter))
219+
190220
log.Println("Updating manifest")
191221
restart, err := o.Manifest.Add(t)
192222
if err != nil {
@@ -291,3 +321,15 @@ func (o *CliOptions) lookupTarget(ctx context.Context, target string) (triggerme
291321
}
292322
return targetObject, nil
293323
}
324+
325+
func transformationContexts(target string, sourceEventTypes []string) string {
326+
contexts := []string{}
327+
for _, et := range sourceEventTypes {
328+
c := et
329+
if target != "" {
330+
c = fmt.Sprintf("%s-%s", et, target)
331+
}
332+
contexts = append(contexts, c)
333+
}
334+
return strings.Join(contexts, ",")
335+
}

docs/tmctl_create_transformation.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
Create TriggerMesh transformation. More information at https://docs.triggermesh.io/transformation/jsontransformation/
44

55
```
6-
tmctl create transformation [--target <name>][--source <name>...][--eventTypes <type>...][--from <path>] [flags]
6+
tmctl create transformation [--target <name>][--source <name>...][--eventTypes <type>...][--from <path>][--wizard] [flags]
77
```
88

99
### Examples
@@ -27,6 +27,7 @@ EOF
2727
--name string Transformation name
2828
--source strings Sources component names
2929
--target string Target name
30+
--wizard Experimental transformation wizard
3031
```
3132

3233
### Options inherited from parent commands

go.mod

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ require (
1414
github.com/cloudevents/sdk-go/v2 v2.13.0
1515
github.com/docker/docker v23.0.6+incompatible
1616
github.com/docker/go-connections v0.4.0
17+
github.com/jroimartin/gocui v0.5.0
1718
github.com/spf13/cobra v1.7.0
1819
github.com/stretchr/testify v1.8.2
1920
github.com/triggermesh/brokers v1.2.1
@@ -31,6 +32,8 @@ require (
3132
require (
3233
github.com/google/go-querystring v1.1.0 // indirect
3334
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 // indirect
35+
github.com/mattn/go-runewidth v0.0.9 // indirect
36+
github.com/nsf/termbox-go v1.1.1 // indirect
3437
)
3538

3639
replace k8s.io/client-go => k8s.io/client-go v0.25.3
@@ -44,7 +47,7 @@ require (
4447
contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d // indirect
4548
contrib.go.opencensus.io/exporter/prometheus v0.4.0 // indirect
4649
contrib.go.opencensus.io/exporter/zipkin v0.1.2 // indirect
47-
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.0 // indirect
50+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 // indirect
4851
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
4952
github.com/Azure/go-autorest/autorest/adal v0.9.22 // indirect
5053
github.com/Azure/go-autorest/autorest/azure/cli v0.4.5 // indirect

go.sum

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCq
8282
github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo=
8383
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
8484
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
85-
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.0 h1:VuHAcMq8pU1IWNT/m5yRaGqbK0BiQKHT8X4DTp9CHdI=
86-
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.0/go.mod h1:tZoQYdDZNOiIjdSn0dVWVfl0NEPGOJqVLzSrcFk4Is0=
85+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 h1:rTnT/Jrcm+figWlYz4Ixzt0SJVR2cMC8lvZcimipiEY=
86+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M=
8787
github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
8888
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
8989
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
@@ -636,6 +636,8 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm
636636
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
637637
github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw=
638638
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
639+
github.com/jroimartin/gocui v0.5.0 h1:DCZc97zY9dMnHXJSJLLmx9VqiEnAj0yh0eTNpuEtG/4=
640+
github.com/jroimartin/gocui v0.5.0/go.mod h1:l7Hz8DoYoL6NoYnlnaX6XCNR62G7J5FfSW5jEogzaxE=
639641
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
640642
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
641643
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -719,6 +721,7 @@ github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peK
719721
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
720722
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
721723
github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
724+
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
722725
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
723726
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
724727
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
@@ -783,6 +786,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA
783786
github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc=
784787
github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ=
785788
github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE=
789+
github.com/nsf/termbox-go v1.1.1 h1:nksUPLCb73Q++DwbYUBEglYBRPZyoXJdrj5L+TkjyZY=
790+
github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo=
786791
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
787792
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
788793
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=

pkg/config/config.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ const (
4848
// Broker config polling period. On Windows only.
4949
defaultConfigPollingPeriod = "PT2S"
5050

51+
defaultSchemaRegistryURL = "https://registry.staging.triggermesh.io"
52+
5153
// TriggerMesh DockerHub Registry
5254
DockerRegistry = "triggermesh"
5355
)
@@ -57,9 +59,10 @@ type Config struct {
5759
ConfigHome string `yaml:"-"`
5860

5961
// Persisted attributes
60-
Context string `yaml:"context"`
61-
Triggermesh TmConfig `yaml:"triggermesh"`
62-
Docker Docker `yaml:"docker"`
62+
Context string `yaml:"context"`
63+
SchemaRegistry string `yaml:"schemaRegistry"`
64+
Triggermesh TmConfig `yaml:"triggermesh"`
65+
Docker Docker `yaml:"docker"`
6366
}
6467

6568
type Docker struct {

pkg/config/overrides.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type configOverride func(*Config) bool
2323
var overrides = []configOverride{
2424
brokerImageReplacement(),
2525
dockerTimeoutAppend(),
26+
schemaRegistryAppend(),
2627
}
2728

2829
func (c *Config) applyOverrides() error {
@@ -69,3 +70,13 @@ func dockerTimeoutAppend() configOverride {
6970
return true
7071
}
7172
}
73+
74+
func schemaRegistryAppend() configOverride {
75+
return func(c *Config) bool {
76+
if c.SchemaRegistry != "" {
77+
return false
78+
}
79+
c.SchemaRegistry = defaultSchemaRegistryURL
80+
return true
81+
}
82+
}

0 commit comments

Comments
 (0)