6 "github.com/edwarnicke/exechelper"
9 const vppConfigTemplate = `unix {
11 log %[1]s/var/log/vpp/vpp.log
14 runtime-dir %[1]s/var/run
27 socket-name %[1]s/var/run/vpp/api.sock
31 socket-name %[1]s/var/run/vpp/stats.sock
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 }
43 type VppInstance struct {
49 type VppConfig struct {
51 CliSocketFilePath string
54 func (vc *VppConfig) getTemplate() string {
55 return fmt.Sprintf(vppConfigTemplate, "%[1]s", vc.CliSocketFilePath)
58 func (vpp *VppInstance) set2VethsServer() {
59 vpp.actionFuncName = "Configure2Veths"
60 vpp.config.Variant = "srv"
63 func (vpp *VppInstance) set2VethsClient() {
64 vpp.actionFuncName = "Configure2Veths"
65 vpp.config.Variant = "cln"
68 func (vpp *VppInstance) setCliSocket(filePath string) {
69 vpp.config.CliSocketFilePath = filePath
72 func (vpp *VppInstance) getCliSocket() string {
73 return fmt.Sprintf("/tmp/%s/%s", vpp.actionFuncName, vpp.config.CliSocketFilePath)
76 func (vpp *VppInstance) start() error {
77 if vpp.config.Variant == "" {
78 return fmt.Errorf("vpp start failed: variant must not be blank")
80 if vpp.actionFuncName == "" {
81 return fmt.Errorf("vpp start failed: action function name must not be blank")
84 serializedConfig, err := json.Marshal(vpp.config)
86 return fmt.Errorf("vpp start failed: serializing configuration failed: %s", err)
88 args := fmt.Sprintf("%s '%s'", vpp.actionFuncName, string(serializedConfig))
89 _, err = hstExec(args, vpp.container.name)
91 return fmt.Errorf("vpp start failed: %s", err)
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)
102 return "", fmt.Errorf("vppctl failed: %s", err)
105 return string(output), nil
108 func NewVppInstance(c *Container) *VppInstance {
109 vpp := new(VppInstance)
114 func DeserializeVppConfig(input string) (VppConfig, error) {
115 var vppConfig VppConfig
116 err := json.Unmarshal([]byte(input), &vppConfig)
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"
123 return vppConfig, nil