Skip to content

Commit 4dcf1a3

Browse files
authored
Merge pull request #1199 from planetscale/nick/vtctld-cli-materialize
vtctld: add Materialize CLI commands
2 parents c221bb5 + 32b4434 commit 4dcf1a3

File tree

4 files changed

+625
-0
lines changed

4 files changed

+625
-0
lines changed
Lines changed: 338 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,338 @@
1+
package vtctld
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
7+
"github.com/planetscale/cli/internal/cmdutil"
8+
"github.com/planetscale/cli/internal/printer"
9+
ps "github.com/planetscale/planetscale-go/planetscale"
10+
"github.com/spf13/cobra"
11+
)
12+
13+
func MaterializeCmd(ch *cmdutil.Helper) *cobra.Command {
14+
cmd := &cobra.Command{
15+
Use: "materialize <command>",
16+
Short: "Manage Materialize workflows",
17+
}
18+
19+
cmd.AddCommand(MaterializeCreateCmd(ch))
20+
cmd.AddCommand(MaterializeShowCmd(ch))
21+
cmd.AddCommand(MaterializeStartCmd(ch))
22+
cmd.AddCommand(MaterializeStopCmd(ch))
23+
cmd.AddCommand(MaterializeCancelCmd(ch))
24+
25+
return cmd
26+
}
27+
28+
func MaterializeCreateCmd(ch *cmdutil.Helper) *cobra.Command {
29+
var flags struct {
30+
workflow string
31+
targetKeyspace string
32+
sourceKeyspace string
33+
tableSettings string
34+
cells []string
35+
referenceTables []string
36+
tabletTypes []string
37+
stopAfterCopy bool
38+
tabletTypesInPreferenceOrder bool
39+
deferSecondaryKeys bool
40+
atomicCopy bool
41+
onDDL string
42+
sourceTimeZone string
43+
}
44+
45+
cmd := &cobra.Command{
46+
Use: "create <database> <branch>",
47+
Short: "Create a Materialize workflow",
48+
Args: cmdutil.RequiredArgs("database", "branch"),
49+
RunE: func(cmd *cobra.Command, args []string) error {
50+
ctx := cmd.Context()
51+
database, branch := args[0], args[1]
52+
53+
client, err := ch.Client()
54+
if err != nil {
55+
return err
56+
}
57+
58+
end := ch.Printer.PrintProgress(
59+
fmt.Sprintf("Creating Materialize workflow %s on %s/%s\u2026",
60+
printer.BoldBlue(flags.workflow), printer.BoldBlue(database), printer.BoldBlue(branch)))
61+
defer end()
62+
63+
req := &ps.MaterializeCreateRequest{
64+
Organization: ch.Config.Organization,
65+
Database: database,
66+
Branch: branch,
67+
Workflow: flags.workflow,
68+
TargetKeyspace: flags.targetKeyspace,
69+
SourceKeyspace: flags.sourceKeyspace,
70+
TableSettings: json.RawMessage(flags.tableSettings),
71+
Cells: flags.cells,
72+
ReferenceTables: flags.referenceTables,
73+
TabletTypes: flags.tabletTypes,
74+
OnDDL: flags.onDDL,
75+
SourceTimeZone: flags.sourceTimeZone,
76+
}
77+
78+
if cmd.Flags().Changed("stop-after-copy") {
79+
req.StopAfterCopy = &flags.stopAfterCopy
80+
}
81+
if cmd.Flags().Changed("atomic-copy") {
82+
req.AtomicCopy = &flags.atomicCopy
83+
}
84+
if cmd.Flags().Changed("tablet-types-in-preference-order") {
85+
req.TabletTypesInPreferenceOrder = &flags.tabletTypesInPreferenceOrder
86+
}
87+
if cmd.Flags().Changed("defer-secondary-keys") {
88+
req.DeferSecondaryKeys = &flags.deferSecondaryKeys
89+
}
90+
91+
data, err := client.Materialize.Create(ctx, req)
92+
if err != nil {
93+
return cmdutil.HandleError(err)
94+
}
95+
96+
end()
97+
return ch.Printer.PrettyPrintJSON(data)
98+
},
99+
}
100+
101+
cmd.Flags().StringVar(&flags.workflow, "workflow", "", "Name of the workflow (required)")
102+
cmd.Flags().StringVar(&flags.targetKeyspace, "target-keyspace", "", "Target keyspace (required)")
103+
cmd.Flags().StringVar(&flags.sourceKeyspace, "source-keyspace", "", "Source keyspace (required)")
104+
cmd.Flags().StringVar(&flags.tableSettings, "table-settings", "", "JSON array of table materialization settings (required)")
105+
cmd.Flags().StringSliceVar(&flags.cells, "cells", nil, "Cells to use")
106+
cmd.Flags().StringSliceVar(&flags.referenceTables, "reference-tables", nil, "Reference tables to include")
107+
cmd.Flags().StringSliceVar(&flags.tabletTypes, "tablet-types", nil, "Tablet types to use")
108+
cmd.Flags().BoolVar(&flags.stopAfterCopy, "stop-after-copy", false, "Stop the workflow after copying is complete")
109+
cmd.Flags().BoolVar(&flags.tabletTypesInPreferenceOrder, "tablet-types-in-preference-order", false, "Use tablet types in order of preference")
110+
cmd.Flags().BoolVar(&flags.deferSecondaryKeys, "defer-secondary-keys", false, "Defer secondary keys during copy")
111+
cmd.Flags().BoolVar(&flags.atomicCopy, "atomic-copy", false, "Use atomic copy")
112+
cmd.Flags().StringVar(&flags.onDDL, "on-ddl", "", "DDL handling strategy (IGNORE, STOP, EXEC, EXEC_IGNORE)")
113+
cmd.Flags().StringVar(&flags.sourceTimeZone, "source-time-zone", "", "Source time zone")
114+
115+
_ = cmd.MarkFlagRequired("workflow")
116+
_ = cmd.MarkFlagRequired("target-keyspace")
117+
_ = cmd.MarkFlagRequired("source-keyspace")
118+
_ = cmd.MarkFlagRequired("table-settings")
119+
120+
return cmd
121+
}
122+
123+
func MaterializeShowCmd(ch *cmdutil.Helper) *cobra.Command {
124+
var flags struct {
125+
workflow string
126+
targetKeyspace string
127+
includeLogs bool
128+
}
129+
130+
cmd := &cobra.Command{
131+
Use: "show <database> <branch>",
132+
Short: "Show a Materialize workflow",
133+
Args: cmdutil.RequiredArgs("database", "branch"),
134+
RunE: func(cmd *cobra.Command, args []string) error {
135+
ctx := cmd.Context()
136+
database, branch := args[0], args[1]
137+
138+
client, err := ch.Client()
139+
if err != nil {
140+
return err
141+
}
142+
143+
end := ch.Printer.PrintProgress(
144+
fmt.Sprintf("Fetching Materialize workflow %s on %s/%s\u2026",
145+
printer.BoldBlue(flags.workflow), printer.BoldBlue(database), printer.BoldBlue(branch)))
146+
defer end()
147+
148+
req := &ps.MaterializeShowRequest{
149+
Organization: ch.Config.Organization,
150+
Database: database,
151+
Branch: branch,
152+
Workflow: flags.workflow,
153+
TargetKeyspace: flags.targetKeyspace,
154+
}
155+
156+
if cmd.Flags().Changed("include-logs") {
157+
req.IncludeLogs = &flags.includeLogs
158+
}
159+
160+
data, err := client.Materialize.Show(ctx, req)
161+
if err != nil {
162+
return cmdutil.HandleError(err)
163+
}
164+
165+
end()
166+
return ch.Printer.PrettyPrintJSON(data)
167+
},
168+
}
169+
170+
cmd.Flags().StringVar(&flags.workflow, "workflow", "", "Name of the workflow (required)")
171+
cmd.Flags().StringVar(&flags.targetKeyspace, "target-keyspace", "", "Target keyspace (required)")
172+
cmd.Flags().BoolVar(&flags.includeLogs, "include-logs", true, "Include workflow logs in the response")
173+
174+
_ = cmd.MarkFlagRequired("workflow")
175+
_ = cmd.MarkFlagRequired("target-keyspace")
176+
177+
return cmd
178+
}
179+
180+
func MaterializeStartCmd(ch *cmdutil.Helper) *cobra.Command {
181+
var flags struct {
182+
workflow string
183+
targetKeyspace string
184+
}
185+
186+
cmd := &cobra.Command{
187+
Use: "start <database> <branch>",
188+
Short: "Start a Materialize workflow",
189+
Args: cmdutil.RequiredArgs("database", "branch"),
190+
RunE: func(cmd *cobra.Command, args []string) error {
191+
ctx := cmd.Context()
192+
database, branch := args[0], args[1]
193+
194+
client, err := ch.Client()
195+
if err != nil {
196+
return err
197+
}
198+
199+
end := ch.Printer.PrintProgress(
200+
fmt.Sprintf("Starting Materialize workflow %s on %s/%s\u2026",
201+
printer.BoldBlue(flags.workflow), printer.BoldBlue(database), printer.BoldBlue(branch)))
202+
defer end()
203+
204+
data, err := client.Materialize.Start(ctx, &ps.MaterializeStartRequest{
205+
Organization: ch.Config.Organization,
206+
Database: database,
207+
Branch: branch,
208+
Workflow: flags.workflow,
209+
TargetKeyspace: flags.targetKeyspace,
210+
})
211+
if err != nil {
212+
return cmdutil.HandleError(err)
213+
}
214+
215+
end()
216+
return ch.Printer.PrettyPrintJSON(data)
217+
},
218+
}
219+
220+
cmd.Flags().StringVar(&flags.workflow, "workflow", "", "Name of the workflow (required)")
221+
cmd.Flags().StringVar(&flags.targetKeyspace, "target-keyspace", "", "Target keyspace (required)")
222+
223+
_ = cmd.MarkFlagRequired("workflow")
224+
_ = cmd.MarkFlagRequired("target-keyspace")
225+
226+
return cmd
227+
}
228+
229+
func MaterializeStopCmd(ch *cmdutil.Helper) *cobra.Command {
230+
var flags struct {
231+
workflow string
232+
targetKeyspace string
233+
}
234+
235+
cmd := &cobra.Command{
236+
Use: "stop <database> <branch>",
237+
Short: "Stop a Materialize workflow",
238+
Args: cmdutil.RequiredArgs("database", "branch"),
239+
RunE: func(cmd *cobra.Command, args []string) error {
240+
ctx := cmd.Context()
241+
database, branch := args[0], args[1]
242+
243+
client, err := ch.Client()
244+
if err != nil {
245+
return err
246+
}
247+
248+
end := ch.Printer.PrintProgress(
249+
fmt.Sprintf("Stopping Materialize workflow %s on %s/%s\u2026",
250+
printer.BoldBlue(flags.workflow), printer.BoldBlue(database), printer.BoldBlue(branch)))
251+
defer end()
252+
253+
data, err := client.Materialize.Stop(ctx, &ps.MaterializeStopRequest{
254+
Organization: ch.Config.Organization,
255+
Database: database,
256+
Branch: branch,
257+
Workflow: flags.workflow,
258+
TargetKeyspace: flags.targetKeyspace,
259+
})
260+
if err != nil {
261+
return cmdutil.HandleError(err)
262+
}
263+
264+
end()
265+
return ch.Printer.PrettyPrintJSON(data)
266+
},
267+
}
268+
269+
cmd.Flags().StringVar(&flags.workflow, "workflow", "", "Name of the workflow (required)")
270+
cmd.Flags().StringVar(&flags.targetKeyspace, "target-keyspace", "", "Target keyspace (required)")
271+
272+
_ = cmd.MarkFlagRequired("workflow")
273+
_ = cmd.MarkFlagRequired("target-keyspace")
274+
275+
return cmd
276+
}
277+
278+
func MaterializeCancelCmd(ch *cmdutil.Helper) *cobra.Command {
279+
var flags struct {
280+
workflow string
281+
targetKeyspace string
282+
keepData bool
283+
keepRoutingRules bool
284+
}
285+
286+
cmd := &cobra.Command{
287+
Use: "cancel <database> <branch>",
288+
Short: "Cancel a Materialize workflow",
289+
Args: cmdutil.RequiredArgs("database", "branch"),
290+
RunE: func(cmd *cobra.Command, args []string) error {
291+
ctx := cmd.Context()
292+
database, branch := args[0], args[1]
293+
294+
client, err := ch.Client()
295+
if err != nil {
296+
return err
297+
}
298+
299+
end := ch.Printer.PrintProgress(
300+
fmt.Sprintf("Canceling Materialize workflow %s on %s/%s\u2026",
301+
printer.BoldBlue(flags.workflow), printer.BoldBlue(database), printer.BoldBlue(branch)))
302+
defer end()
303+
304+
req := &ps.MaterializeCancelRequest{
305+
Organization: ch.Config.Organization,
306+
Database: database,
307+
Branch: branch,
308+
Workflow: flags.workflow,
309+
TargetKeyspace: flags.targetKeyspace,
310+
}
311+
312+
if cmd.Flags().Changed("keep-data") {
313+
req.KeepData = &flags.keepData
314+
}
315+
if cmd.Flags().Changed("keep-routing-rules") {
316+
req.KeepRoutingRules = &flags.keepRoutingRules
317+
}
318+
319+
data, err := client.Materialize.Cancel(ctx, req)
320+
if err != nil {
321+
return cmdutil.HandleError(err)
322+
}
323+
324+
end()
325+
return ch.Printer.PrettyPrintJSON(data)
326+
},
327+
}
328+
329+
cmd.Flags().StringVar(&flags.workflow, "workflow", "", "Name of the workflow (required)")
330+
cmd.Flags().StringVar(&flags.targetKeyspace, "target-keyspace", "", "Target keyspace (required)")
331+
cmd.Flags().BoolVar(&flags.keepData, "keep-data", false, "Keep the data after canceling")
332+
cmd.Flags().BoolVar(&flags.keepRoutingRules, "keep-routing-rules", false, "Keep the routing rules after canceling")
333+
334+
_ = cmd.MarkFlagRequired("workflow")
335+
_ = cmd.MarkFlagRequired("target-keyspace")
336+
337+
return cmd
338+
}

0 commit comments

Comments
 (0)