f719adfa89
Volumes can be referenced with anchors to reduce text duplication and to explicitly show which containers share a volume. Type: test Signed-off-by: Maros Ondrejicka <maros.ondrejicka@pantheon.tech> Change-Id: Id408a78262573b3faf2257c32bfa569eca2e2049
188 lines
3.8 KiB
Go
188 lines
3.8 KiB
Go
package main
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/edwarnicke/exechelper"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/suite"
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
func IsPersistent() bool {
|
|
return os.Getenv("HST_PERSIST") == "1"
|
|
}
|
|
|
|
func IsVerbose() bool {
|
|
return os.Getenv("HST_VERBOSE") == "1"
|
|
}
|
|
|
|
type HstSuite struct {
|
|
suite.Suite
|
|
teardownSuite func()
|
|
containers map[string]*Container
|
|
volumes []string
|
|
}
|
|
|
|
func (s *HstSuite) TearDownSuite() {
|
|
s.teardownSuite()
|
|
}
|
|
|
|
func (s *HstSuite) TearDownTest() {
|
|
if IsPersistent() {
|
|
return
|
|
}
|
|
s.ResetContainers()
|
|
s.RemoveVolumes()
|
|
}
|
|
|
|
func (s *HstSuite) SetupTest() {
|
|
for _, volume := range s.volumes {
|
|
cmd := "docker volume create --name=" + volume
|
|
s.log(cmd)
|
|
exechelper.Run(cmd)
|
|
}
|
|
for _, container := range s.containers {
|
|
if container.isOptional == false {
|
|
container.run()
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s *HstSuite) hstFail() {
|
|
s.T().FailNow()
|
|
}
|
|
|
|
func (s *HstSuite) assertNil(object interface{}, msgAndArgs ...interface{}) {
|
|
if !assert.Nil(s.T(), object, msgAndArgs...) {
|
|
s.hstFail()
|
|
}
|
|
}
|
|
|
|
func (s *HstSuite) assertNotNil(object interface{}, msgAndArgs ...interface{}) {
|
|
if !assert.NotNil(s.T(), object, msgAndArgs...) {
|
|
s.hstFail()
|
|
}
|
|
}
|
|
|
|
func (s *HstSuite) assertEqual(expected, actual interface{}, msgAndArgs ...interface{}) {
|
|
if !assert.Equal(s.T(), expected, actual, msgAndArgs...) {
|
|
s.hstFail()
|
|
}
|
|
}
|
|
|
|
func (s *HstSuite) assertNotEqual(expected, actual interface{}, msgAndArgs ...interface{}) {
|
|
if !assert.NotEqual(s.T(), expected, actual, msgAndArgs...) {
|
|
s.hstFail()
|
|
}
|
|
}
|
|
|
|
func (s *HstSuite) assertContains(testString, contains interface{}, msgAndArgs ...interface{}) {
|
|
if !assert.Contains(s.T(), testString, contains, msgAndArgs...) {
|
|
s.hstFail()
|
|
}
|
|
}
|
|
|
|
func (s *HstSuite) assertNotContains(testString, contains interface{}, msgAndArgs ...interface{}) {
|
|
if !assert.NotContains(s.T(), testString, contains, msgAndArgs...) {
|
|
s.hstFail()
|
|
}
|
|
}
|
|
|
|
func (s *HstSuite) log(args ...any) {
|
|
if IsVerbose() {
|
|
s.T().Log(args...)
|
|
}
|
|
}
|
|
|
|
func (s *HstSuite) skip(args ...any) {
|
|
s.log(args...)
|
|
s.T().SkipNow()
|
|
}
|
|
|
|
func (s *HstSuite) ResetContainers() {
|
|
for _, container := range s.containers {
|
|
container.stop()
|
|
}
|
|
}
|
|
|
|
func (s *HstSuite) RemoveVolumes() {
|
|
for _, volumeName := range s.volumes {
|
|
cmd := "docker volume rm " + volumeName
|
|
exechelper.Run(cmd)
|
|
}
|
|
}
|
|
|
|
func (s *HstSuite) getContainerByName(name string) *Container {
|
|
return s.containers[name]
|
|
}
|
|
|
|
func (s *HstSuite) loadContainerTopology(topologyName string) {
|
|
data, err := ioutil.ReadFile(ContainerTopologyDir + topologyName + ".yaml")
|
|
if err != nil {
|
|
s.T().Fatalf("read error: %v", err)
|
|
}
|
|
var yamlTopo YamlTopology
|
|
err = yaml.Unmarshal(data, &yamlTopo)
|
|
if err != nil {
|
|
s.T().Fatalf("unmarshal error: %v", err)
|
|
}
|
|
|
|
for _, elem := range yamlTopo.Volumes {
|
|
volumeMap := elem["volume"].(VolumeConfig)
|
|
hostDir := volumeMap["host-dir"].(string)
|
|
s.volumes = append(s.volumes, hostDir)
|
|
}
|
|
|
|
s.containers = make(map[string]*Container)
|
|
for _, elem := range yamlTopo.Containers {
|
|
newContainer, err := NewContainer(elem)
|
|
if err != nil {
|
|
s.T().Fatalf("config error: %v", err)
|
|
}
|
|
s.log(newContainer.getRunCommand())
|
|
s.containers[newContainer.name] = newContainer
|
|
}
|
|
}
|
|
|
|
func setupSuite(s *suite.Suite, topologyName string) func() {
|
|
t := s.T()
|
|
topology, err := LoadTopology(NetworkTopologyDir, topologyName)
|
|
if err != nil {
|
|
t.Fatalf("error on loading topology '%s': %v", topologyName, err)
|
|
}
|
|
err = topology.Configure()
|
|
if err != nil {
|
|
t.Fatalf("failed to configure %s: %v", topologyName, err)
|
|
}
|
|
|
|
return func() {
|
|
if IsPersistent() {
|
|
return
|
|
}
|
|
topology.Unconfigure()
|
|
}
|
|
}
|
|
|
|
func TestTapSuite(t *testing.T) {
|
|
var m TapSuite
|
|
suite.Run(t, &m)
|
|
}
|
|
|
|
func TestNs(t *testing.T) {
|
|
var m NsSuite
|
|
suite.Run(t, &m)
|
|
}
|
|
|
|
func TestVeths(t *testing.T) {
|
|
var m VethsSuite
|
|
suite.Run(t, &m)
|
|
}
|
|
|
|
func TestNoTopo(t *testing.T) {
|
|
var m NoTopoSuite
|
|
suite.Run(t, &m)
|
|
}
|