@@ -2,15 +2,18 @@ package cd
22
33import (
44 "fmt"
5+ "path/filepath"
56 "strings"
67
78 "github.com/pluralsh/plural-cli/pkg/common"
9+ lua "github.com/yuin/gopher-lua"
810
911 gqlclient "github.com/pluralsh/console/go/client"
1012 "github.com/pluralsh/plural-cli/pkg/cd/template"
1113 "github.com/pluralsh/plural-cli/pkg/console"
1214 "github.com/pluralsh/plural-cli/pkg/utils"
1315 "github.com/pluralsh/polly/containers"
16+ "github.com/pluralsh/polly/luautils"
1417 "github.com/samber/lo"
1518 "github.com/urfave/cli"
1619 "k8s.io/apimachinery/pkg/util/yaml"
@@ -115,6 +118,25 @@ func (p *Plural) cdServiceCommands() []cli.Command {
115118 },
116119 },
117120 },
121+ {
122+ Name : "lua" ,
123+ Action : p .handleLuaTemplate ,
124+ Usage : "Templates a .lua file using the Plural defined lua engine and returns the result" ,
125+ Flags : []cli.Flag {
126+ cli.StringFlag {
127+ Name : "lua-file" ,
128+ Usage : "The .lua file you want to attempt to template." ,
129+ },
130+ cli.StringFlag {
131+ Name : "context" ,
132+ Usage : "A yaml context file to imitate the internal service template context" ,
133+ },
134+ cli.StringFlag {
135+ Name : "dir" ,
136+ Usage : "The directory to run the lua script from, defaults to the current working directory" ,
137+ },
138+ },
139+ },
118140 {
119141 Name : "delete" ,
120142 ArgsUsage : "@{cluster-handle}/{serviceName}" ,
@@ -277,6 +299,77 @@ func (p *Plural) handleTemplateService(c *cli.Context) error {
277299 return printResult (res )
278300}
279301
302+ func (p * Plural ) handleLuaTemplate (c * cli.Context ) error {
303+ if err := p .InitConsoleClient (consoleToken , consoleURL ); err != nil {
304+ return err
305+ }
306+
307+ luaFile := c .String ("lua-file" )
308+ context := c .String ("context" )
309+ dir := c .String ("dir" )
310+ if dir == "" {
311+ dir = "."
312+ }
313+
314+ if luaFile == "" {
315+ return fmt .Errorf ("expected --lua-file flag" )
316+ }
317+
318+ luaStr , err := utils .ReadFile (luaFile )
319+ if err != nil {
320+ return err
321+ }
322+
323+ ctx := map [string ]interface {}{}
324+ if context != "" {
325+ if err := utils .YamlFile (context , & ctx ); err != nil {
326+ return err
327+ }
328+ }
329+
330+ values := map [interface {}]interface {}{}
331+ valuesFiles := []string {}
332+
333+ dir , err = filepath .Abs (dir )
334+ if err != nil {
335+ return err
336+ }
337+ proc := luautils .NewProcessor (dir )
338+ defer proc .L .Close ()
339+
340+ // Register global values and valuesFiles in Lua
341+ valuesTable := proc .L .NewTable ()
342+ proc .L .SetGlobal ("values" , valuesTable )
343+
344+ valuesFilesTable := proc .L .NewTable ()
345+ proc .L .SetGlobal ("valuesFiles" , valuesFilesTable )
346+ proc .L .SetGlobal ("cluster" , luautils .GoValueToLuaValue (proc .L , ctx ["cluster" ]))
347+ proc .L .SetGlobal ("configuration" , luautils .GoValueToLuaValue (proc .L , ctx ["configuration" ]))
348+ proc .L .SetGlobal ("contexts" , luautils .GoValueToLuaValue (proc .L , ctx ["contexts" ]))
349+ proc .L .SetGlobal ("imports" , luautils .GoValueToLuaValue (proc .L , ctx ["imports" ]))
350+
351+ if err := proc .L .DoString (luaStr ); err != nil {
352+ return err
353+ }
354+
355+ if err := luautils .MapLua (proc .L .GetGlobal ("values" ).(* lua.LTable ), & values ); err != nil {
356+ return err
357+ }
358+
359+ if err := luautils .MapLua (proc .L .GetGlobal ("valuesFiles" ).(* lua.LTable ), & valuesFiles ); err != nil {
360+ return err
361+ }
362+
363+ result := map [string ]interface {}{
364+ "values" : luautils .SanitizeValue (values ),
365+ "valuesFiles" : valuesFiles ,
366+ }
367+
368+ utils .Highlight ("Final lua output:\n \n " )
369+ utils .NewYAMLPrinter (result ).PrettyPrint ()
370+ return nil
371+ }
372+
280373func (p * Plural ) handleCloneClusterService (c * cli.Context ) error {
281374 if err := p .InitConsoleClient (consoleToken , consoleURL ); err != nil {
282375 return err
0 commit comments