Skip to content

Commit

Permalink
Merge pull request #71 from vladimirvivien/parser-package-reorg
Browse files Browse the repository at this point in the history
Decouple script parsing from script representation by introducing a new `parser` package which is responsible for parsing and creating a `script.Script`
  • Loading branch information
vladimirvivien authored May 22, 2020
2 parents 56431d7 + 6e056ab commit 896db9b
Show file tree
Hide file tree
Showing 34 changed files with 3,370 additions and 1,752 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
.vscode
.vendor
.build
dist
dist
.idea
.DS_Store
3 changes: 2 additions & 1 deletion cmd/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (

"github.com/spf13/cobra"
"github.com/vmware-tanzu/crash-diagnostics/exec"
"github.com/vmware-tanzu/crash-diagnostics/parser"
"github.com/vmware-tanzu/crash-diagnostics/script"
)

Expand Down Expand Up @@ -46,7 +47,7 @@ func run(flag *runFlags, args []string) error {

defer file.Close()

src, err := script.Parse(file)
src, err := parser.Parse(file)
if err != nil {
return err
}
Expand Down
3 changes: 2 additions & 1 deletion exec/executor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"testing"

"github.com/sirupsen/logrus"
"github.com/vmware-tanzu/crash-diagnostics/parser"
"github.com/vmware-tanzu/crash-diagnostics/script"
"github.com/vmware-tanzu/crash-diagnostics/ssh"
testcrashd "github.com/vmware-tanzu/crash-diagnostics/testing"
Expand Down Expand Up @@ -66,7 +67,7 @@ func runExecutorTest(t *testing.T, test execTest) {
}
}()

script, err := script.Parse(strings.NewReader(test.source()))
script, err := parser.Parse(strings.NewReader(test.source()))
if err != nil {
if !test.shouldFail {
t.Fatal(err)
Expand Down
17 changes: 9 additions & 8 deletions exec/from_exec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"testing"

"github.com/vmware-tanzu/crash-diagnostics/k8s"
"github.com/vmware-tanzu/crash-diagnostics/parser"
"github.com/vmware-tanzu/crash-diagnostics/script"
testcrashd "github.com/vmware-tanzu/crash-diagnostics/testing"
)
Expand Down Expand Up @@ -40,7 +41,7 @@ func TestExecFROMFunc(t *testing.T) {
{
name: "FROM with host:port",
script: func() *script.Script {
script, _ := script.Parse(strings.NewReader("FROM 1.1.1.1:4444"))
script, _ := parser.Parse(strings.NewReader("FROM 1.1.1.1:4444"))
return script
},
exec: func(k8sc *k8s.Client, src *script.Script) error {
Expand All @@ -65,7 +66,7 @@ func TestExecFROMFunc(t *testing.T) {
{
name: "FROM with host default port",
script: func() *script.Script {
script, _ := script.Parse(strings.NewReader("FROM 1.1.1.1"))
script, _ := parser.Parse(strings.NewReader("FROM 1.1.1.1"))
return script
},
exec: func(k8sc *k8s.Client, src *script.Script) error {
Expand All @@ -90,7 +91,7 @@ func TestExecFROMFunc(t *testing.T) {
{
name: "FROM with host:port and global port",
script: func() *script.Script {
script, _ := script.Parse(strings.NewReader(`FROM hosts:"1.1.1.1 10.10.10.10:2222" port:2121`))
script, _ := parser.Parse(strings.NewReader(`FROM hosts:"1.1.1.1 10.10.10.10:2222" port:2121`))
return script
},
exec: func(k8sc *k8s.Client, src *script.Script) error {
Expand Down Expand Up @@ -120,7 +121,7 @@ func TestExecFROMFunc(t *testing.T) {
KUBECONFIG %s
FROM nodes:'all'
`, k8sconfig)
script, _ := script.Parse(strings.NewReader(src))
script, _ := parser.Parse(strings.NewReader(src))
return script
},
exec: func(k8sc *k8s.Client, src *script.Script) error {
Expand Down Expand Up @@ -153,7 +154,7 @@ func TestExecFROMFunc(t *testing.T) {
KUBECONFIG %s
FROM nodes:'%s'
`, k8sconfig, kindNodeName)
script, _ := script.Parse(strings.NewReader(src))
script, _ := parser.Parse(strings.NewReader(src))
return script
},
exec: func(k8sc *k8s.Client, src *script.Script) error {
Expand Down Expand Up @@ -181,7 +182,7 @@ func TestExecFROMFunc(t *testing.T) {
KUBECONFIG %s
FROM nodes:'bad-node-name'
`, k8sconfig)
script, _ := script.Parse(strings.NewReader(src))
script, _ := parser.Parse(strings.NewReader(src))
return script
},
exec: func(k8sc *k8s.Client, src *script.Script) error {
Expand All @@ -202,7 +203,7 @@ func TestExecFROMFunc(t *testing.T) {
KUBECONFIG %s
FROM nodes:'all' labels:'kubernetes.io/hostname=%s'
`, k8sconfig, kindNodeName)
script, _ := script.Parse(strings.NewReader(src))
script, _ := parser.Parse(strings.NewReader(src))
return script
},
exec: func(k8sc *k8s.Client, src *script.Script) error {
Expand Down Expand Up @@ -230,7 +231,7 @@ func TestExecFROMFunc(t *testing.T) {
KUBECONFIG %s
FROM nodes:'all' labels:'foo/bar=mycluster-control-plane'
`, k8sconfig)
script, _ := script.Parse(strings.NewReader(src))
script, _ := parser.Parse(strings.NewReader(src))
return script
},
exec: func(k8sc *k8s.Client, src *script.Script) error {
Expand Down
5 changes: 3 additions & 2 deletions exec/kubecfg_exe_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"strings"
"testing"

"github.com/vmware-tanzu/crash-diagnostics/parser"
"github.com/vmware-tanzu/crash-diagnostics/script"
testcrashd "github.com/vmware-tanzu/crash-diagnostics/testing"
)
Expand Down Expand Up @@ -40,7 +41,7 @@ func TestExecKUBECONFIGFunc(t *testing.T) {
src := fmt.Sprintf(`
KUBECONFIG %s
`, k8sconfig)
script, _ := script.Parse(strings.NewReader(src))
script, _ := parser.Parse(strings.NewReader(src))
return script
},
exec: func(src *script.Script) {
Expand All @@ -57,7 +58,7 @@ func TestExecKUBECONFIGFunc(t *testing.T) {
name: "KUBECONFIG with bad path",
script: func() *script.Script {
src := fmt.Sprintf(`KUBECONFIG bad-path`)
script, _ := script.Parse(strings.NewReader(src))
script, _ := parser.Parse(strings.NewReader(src))
return script
},
exec: func(src *script.Script) {
Expand Down
15 changes: 8 additions & 7 deletions exec/kubeget_exec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (

"github.com/sirupsen/logrus"
"github.com/vmware-tanzu/crash-diagnostics/k8s"
"github.com/vmware-tanzu/crash-diagnostics/parser"
"github.com/vmware-tanzu/crash-diagnostics/script"
testcrashd "github.com/vmware-tanzu/crash-diagnostics/testing"
)
Expand All @@ -39,7 +40,7 @@ func testExeKubeGet(t *testing.T, k8sconfig string) {
KUBECONFIG %s
KUBEGET objects groups:"core" kinds:"pods" namespaces:"kube-system"
`, k8sconfig)
script, err := script.Parse(strings.NewReader(src))
script, err := parser.Parse(strings.NewReader(src))
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -72,7 +73,7 @@ func testExeKubeGet(t *testing.T, k8sconfig string) {
KUBECONFIG %s
KUBEGET objects groups:"core" kinds:"pods" namespaces:"kube-system" labels:"component=kube-apiserver"
`, k8sconfig)
script, err := script.Parse(strings.NewReader(src))
script, err := parser.Parse(strings.NewReader(src))
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -103,7 +104,7 @@ func testExeKubeGet(t *testing.T, k8sconfig string) {
KUBECONFIG %s
KUBEGET logs groups:"core" kinds:"pods" namespaces:"kube-system" labels:"component=kube-apiserver"
`, k8sconfig)
script, err := script.Parse(strings.NewReader(src))
script, err := parser.Parse(strings.NewReader(src))
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -155,7 +156,7 @@ func testWriteSearchResults(t *testing.T, k8sconfig string) {
KUBECONFIG %s
KUBEGET objects groups:"core" kinds:"services" namespaces:"default kube-system"
`, k8sconfig)
scrpt, err := script.Parse(strings.NewReader(src))
scrpt, err := parser.Parse(strings.NewReader(src))
if err != nil {
t.Error(err)
return nil
Expand Down Expand Up @@ -208,7 +209,7 @@ func testWriteSearchResults(t *testing.T, k8sconfig string) {
KUBECONFIG %s
KUBEGET objects groups:"core" kinds:"nodes"
`, k8sconfig)
scrpt, err := script.Parse(strings.NewReader(src))
scrpt, err := parser.Parse(strings.NewReader(src))
if err != nil {
t.Error(err)
return nil
Expand Down Expand Up @@ -257,7 +258,7 @@ func testWriteSearchResults(t *testing.T, k8sconfig string) {
KUBECONFIG %s
KUBEGET logs namespace:"kube-system"
`, k8sconfig)
scrpt, err := script.Parse(strings.NewReader(src))
scrpt, err := parser.Parse(strings.NewReader(src))
if err != nil {
t.Error(err)
return nil
Expand Down Expand Up @@ -310,7 +311,7 @@ func testWriteSearchResults(t *testing.T, k8sconfig string) {
KUBECONFIG %s
KUBEGET logs namespace:"kube-system" containers:"etcd"
`, k8sconfig)
scrpt, err := script.Parse(strings.NewReader(src))
scrpt, err := parser.Parse(strings.NewReader(src))
if err != nil {
t.Error(err)
return nil
Expand Down
158 changes: 158 additions & 0 deletions parser/parse_ascmd_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
// Copyright (c) 2019 VMware, Inc. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package parser

import (
"testing"

"github.com/vmware-tanzu/crash-diagnostics/script"
)

func TestCommandAS(t *testing.T) {
tests := []parserTest{
{
name: "AS",
source: func(t *testing.T) string {
return "AS userid:foo groupid:bar"
},
script: func(t *testing.T, s *script.Script) {
cmds := s.Preambles[script.CmdAs]
if len(cmds) != 1 {
t.Errorf("Script missing preamble %s", script.CmdAs)
}
asCmd, ok := cmds[0].(*script.AsCommand)
if !ok {
t.Errorf("Unexpected type %T in script", cmds[0])
}
if asCmd.GetUserId() != "foo" {
t.Errorf("Unexpected AS userid %s", asCmd.GetUserId())
}
if asCmd.GetGroupId() != "bar" {
t.Errorf("Unexpected AS groupid %s", asCmd.GetUserId())
}
},
},
// {
// name: "AS with quoted userid and groupid",
// source: func() string {
// return `AS userid:"foo" groupid:bar`
// },
// script: func(s *Script) error {
// cmds := s.Preambles[CmdAs]
// if len(cmds) != 1 {
// return fmt.Errorf("Script missing preamble %s", CmdAs)
// }
// asCmd, ok := cmds[0].(*AsCommand)
// if !ok {
// return fmt.Errorf("Unexpected type %T in script", cmds[0])
// }
// if asCmd.GetUserId() != "foo" {
// return fmt.Errorf("Unexpected AS userid %s", asCmd.GetUserId())
// }
// if asCmd.GetGroupId() != "bar" {
// return fmt.Errorf("Unexpected AS groupid %s", asCmd.GetUserId())
// }
// return nil
// },
// },
// {
// name: "AS with only userid",
// source: func() string {
// return "AS userid:foo"
// },
// script: func(s *Script) error {
// cmds := s.Preambles[CmdAs]
// if len(cmds) != 1 {
// return fmt.Errorf("Script missing preamble %s", CmdAs)
// }
// asCmd, ok := cmds[0].(*AsCommand)
// if !ok {
// return fmt.Errorf("Unexpected type %T in script", cmds[0])
// }
// if asCmd.GetUserId() != "foo" {
// return fmt.Errorf("Unexpected AS userid %s", asCmd.GetUserId())
// }
// if asCmd.GetGroupId() != fmt.Sprintf("%d", os.Getgid()) {
// return fmt.Errorf("Unexpected AS groupid %s", asCmd.GetGroupId())
// }
// return nil
// },
// },
// {
// name: "AS not specified",
// source: func() string {
// return "FROM local"
// },
// script: func(s *Script) error {
// cmds := s.Preambles[CmdAs]
// if len(cmds) != 1 {
// return fmt.Errorf("Script missing default AS preamble")
// }
// asCmd, ok := cmds[0].(*AsCommand)
// if !ok {
// return fmt.Errorf("Unexpected type %T in script", cmds[0])
// }
// if asCmd.GetUserId() != fmt.Sprintf("%d", os.Getuid()) {
// return fmt.Errorf("Unexpected AS default userid %s", asCmd.GetUserId())
// }
// if asCmd.GetGroupId() != fmt.Sprintf("%d", os.Getgid()) {
// return fmt.Errorf("Unexpected AS default groupid %s", asCmd.GetUserId())
// }
// return nil
// },
// },
// {
// name: "Multiple AS provided",
// source: func() string {
// return "AS userid:foo\nAS userid:bar"
// },
// script: func(s *Script) error {
// cmds := s.Preambles[CmdAs]
// if len(cmds) != 1 {
// return fmt.Errorf("Script should only have 1 AS instruction, got %d", len(cmds))
// }
// asCmd := cmds[0].(*AsCommand)
// if asCmd.GetUserId() != "bar" {
// return fmt.Errorf("Unexpected AS userid %s", asCmd.GetUserId())
// }
// if asCmd.GetGroupId() != "" {
// return fmt.Errorf("Unexpected AS groupid %s", asCmd.GetUserId())
// }
// return nil
// },
// shouldFail: true,
// },
// {
// name: "AS with var expansion",
// source: func() string {
// os.Setenv("foogid", "barid")
// return "AS userid:$USER groupid:$foogid"
// },
// script: func(s *Script) error {
// cmds := s.Preambles[CmdAs]
// asCmd := cmds[0].(*AsCommand)
// if asCmd.GetUserId() != ExpandEnv("$USER") {
// return fmt.Errorf("Unexpected AS userid %s", asCmd.GetUserId())
// }
// if asCmd.GetGroupId() != "barid" {
// return fmt.Errorf("Unexpected AS groupid %s", asCmd.GetUserId())
// }
// return nil
// },
// },
// {
// name: "AS with multiple args",
// source: func() string {
// return "AS foo:bar fuzz:buzz"
// },
// shouldFail: true,
// },
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
runParserTest(t, test)
})
}
}
Loading

0 comments on commit 896db9b

Please sign in to comment.