hs-test: add test suite features
[vpp.git] / extras / hs-test / vppinstance.go
1 package main
2
3 import (
4         "fmt"
5         "encoding/json"
6         "github.com/edwarnicke/exechelper"
7 )
8
9 const vppConfigTemplate = `unix {
10   nodaemon
11   log %[1]s/var/log/vpp/vpp.log
12   full-coredump
13   cli-listen %[1]s%[2]s
14   runtime-dir %[1]s/var/run
15   gid vpp
16 }
17
18 api-trace {
19   on
20 }
21
22 api-segment {
23   gid vpp
24 }
25
26 socksvr {
27   socket-name %[1]s/var/run/vpp/api.sock
28 }
29
30 statseg {
31   socket-name %[1]s/var/run/vpp/stats.sock
32 }
33
34 plugins {
35   plugin unittest_plugin.so { enable }
36   plugin dpdk_plugin.so { disable }
37   plugin crypto_aesni_plugin.so { enable }
38   plugin quic_plugin.so { enable }
39 }
40
41 `
42
43 type VppInstance struct {
44         container *Container
45         config VppConfig
46         actionFuncName string
47 }
48
49 type VppConfig struct {
50         Variant string
51         CliSocketFilePath string
52 }
53
54 func (vc *VppConfig) getTemplate() string {
55         return fmt.Sprintf(vppConfigTemplate, "%[1]s", vc.CliSocketFilePath)
56 }
57
58 func (vpp *VppInstance) set2VethsServer() {
59         vpp.actionFuncName = "Configure2Veths"
60         vpp.config.Variant = "srv"
61 }
62
63 func (vpp *VppInstance) set2VethsClient() {
64         vpp.actionFuncName = "Configure2Veths"
65         vpp.config.Variant = "cln"
66 }
67
68 func (vpp *VppInstance) setCliSocket(filePath string) {
69         vpp.config.CliSocketFilePath = filePath
70 }
71
72 func (vpp *VppInstance) getCliSocket() string {
73         return fmt.Sprintf("/tmp/%s/%s", vpp.actionFuncName, vpp.config.CliSocketFilePath)
74 }
75
76 func (vpp *VppInstance) start() error {
77         if vpp.config.Variant == "" {
78                 return fmt.Errorf("vpp start failed: variant must not be blank")
79         }
80         if vpp.actionFuncName == "" {
81                 return fmt.Errorf("vpp start failed: action function name must not be blank")
82         }
83
84         serializedConfig, err := json.Marshal(vpp.config)
85         if err != nil {
86                 return fmt.Errorf("vpp start failed: serializing configuration failed: %s", err)
87         }
88         args := fmt.Sprintf("%s '%s'", vpp.actionFuncName, string(serializedConfig))
89         _, err = hstExec(args, vpp.container.name)
90         if err != nil {
91                 return fmt.Errorf("vpp start failed: %s", err)
92         }
93
94         return nil
95 }
96
97 func (vpp *VppInstance) vppctl(command string) (string, error) {
98         dockerExecCommand := fmt.Sprintf("docker exec --detach=false %[1]s vppctl -s %[2]s %[3]s",
99                 vpp.container.name, vpp.getCliSocket(), command)
100         output, err := exechelper.CombinedOutput(dockerExecCommand)
101         if err != nil {
102                 return "", fmt.Errorf("vppctl failed: %s", err)
103         }
104
105         return string(output), nil
106 }
107
108 func NewVppInstance(c *Container) *VppInstance {
109         vpp := new(VppInstance)
110         vpp.container = c
111         return vpp
112 }
113
114 func DeserializeVppConfig(input string) (VppConfig, error) {
115         var vppConfig VppConfig
116         err := json.Unmarshal([]byte(input), &vppConfig)
117         if err != nil {
118                 // Since input is not a  valid JSON it is going be used as variant value
119                 // for compatibility reasons
120                 vppConfig.Variant = input
121                 vppConfig.CliSocketFilePath = "/var/run/vpp/cli.sock"
122         }
123         return vppConfig, nil
124 }