hs-test: refactor test cases from ns suite

This converts more tests to configure VPP from test context.

Type: test
Signed-off-by: Maros Ondrejicka <maros.ondrejicka@pantheon.tech>
Change-Id: Idf26b0c16f87e87c97b198412af39b99d947ced6
This commit is contained in:
Maros Ondrejicka
2023-02-02 08:58:04 +01:00
committed by Florin Coras
parent 0a192ea93d
commit 2908f8cf07
20 changed files with 337 additions and 528 deletions

View File

@@ -8,10 +8,13 @@ import (
"github.com/edwarnicke/exechelper"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
"go.fd.io/govpp/binapi/ip_types"
"gopkg.in/yaml.v3"
)
const (
defaultNamespaceName string = "default"
)
func IsPersistent() bool {
return os.Getenv("HST_PERSIST") == "1"
}
@@ -22,14 +25,12 @@ func IsVerbose() bool {
type HstSuite struct {
suite.Suite
teardownSuite func()
containers map[string]*Container
volumes []string
networkNamespaces map[string]*NetworkNamespace
veths map[string]*NetworkInterfaceVeth
taps map[string]*NetworkInterfaceTap
bridges map[string]*NetworkBridge
numberOfAddresses int
teardownSuite func()
containers map[string]*Container
volumes []string
netConfigs []NetConfig
netInterfaces map[string]NetInterface
addresser *Addresser
}
func (s *HstSuite) TearDownSuite() {
@@ -138,9 +139,11 @@ func (s *HstSuite) getContainerByName(name string) *Container {
return s.containers[name]
}
func (s *HstSuite) getContainerCopyByName(name string) *Container {
// Create a copy and return its address, so that individial tests which call this
// are not able to modify the original container and affect other tests by doing that
/*
* Create a copy and return its address, so that individial tests which call this
* are not able to modify the original container and affect other tests by doing that
*/
func (s *HstSuite) getTransientContainerByName(name string) *Container {
containerCopy := *s.containers[name]
return &containerCopy
}
@@ -185,32 +188,32 @@ func (s *HstSuite) loadNetworkTopology(topologyName string) {
s.T().Fatalf("unmarshal error: %v", err)
}
s.networkNamespaces = make(map[string]*NetworkNamespace)
s.veths = make(map[string]*NetworkInterfaceVeth)
s.taps = make(map[string]*NetworkInterfaceTap)
s.bridges = make(map[string]*NetworkBridge)
s.addresser = NewAddresser(s)
s.netInterfaces = make(map[string]NetInterface)
for _, elem := range yamlTopo.Devices {
switch elem["type"].(string) {
case NetNs:
{
if namespace, err := NewNetNamespace(elem); err == nil {
s.networkNamespaces[namespace.Name()] = &namespace
s.netConfigs = append(s.netConfigs, &namespace)
} else {
s.T().Fatalf("network config error: %v", err)
}
}
case Veth:
{
if veth, err := NewVeth(elem); err == nil {
s.veths[veth.Name()] = &veth
if veth, err := NewVeth(elem, s.addresser); err == nil {
s.netConfigs = append(s.netConfigs, &veth)
s.netInterfaces[veth.Name()] = &veth
} else {
s.T().Fatalf("network config error: %v", err)
}
}
case Tap:
{
if tap, err := NewTap(elem); err == nil {
s.taps[tap.Name()] = &tap
if tap, err := NewTap(elem, s.addresser); err == nil {
s.netConfigs = append(s.netConfigs, &tap)
s.netInterfaces[tap.Name()] = &tap
} else {
s.T().Fatalf("network config error: %v", err)
}
@@ -218,7 +221,7 @@ func (s *HstSuite) loadNetworkTopology(topologyName string) {
case Bridge:
{
if bridge, err := NewBridge(elem); err == nil {
s.bridges[bridge.Name()] = &bridge
s.netConfigs = append(s.netConfigs, &bridge)
} else {
s.T().Fatalf("network config error: %v", err)
}
@@ -230,23 +233,8 @@ func (s *HstSuite) loadNetworkTopology(topologyName string) {
func (s *HstSuite) configureNetworkTopology(topologyName string) {
s.loadNetworkTopology(topologyName)
for _, ns := range s.networkNamespaces {
if err := ns.Configure(); err != nil {
s.T().Fatalf("network config error: %v", err)
}
}
for _, veth := range s.veths {
if err := veth.Configure(); err != nil {
s.T().Fatalf("network config error: %v", err)
}
}
for _, tap := range s.taps {
if err := tap.Configure(); err != nil {
s.T().Fatalf("network config error: %v", err)
}
}
for _, bridge := range s.bridges {
if err := bridge.Configure(); err != nil {
for _, nc := range s.netConfigs {
if err := nc.Configure(); err != nil {
s.T().Fatalf("network config error: %v", err)
}
}
@@ -256,34 +244,52 @@ func (s *HstSuite) unconfigureNetworkTopology() {
if IsPersistent() {
return
}
for _, ns := range s.networkNamespaces {
ns.Unconfigure()
}
for _, veth := range s.veths {
veth.Unconfigure()
}
for _, tap := range s.taps {
tap.Unconfigure()
}
for _, bridge := range s.bridges {
bridge.Unconfigure()
for _, nc := range s.netConfigs {
nc.Unconfigure()
}
}
func (s *HstSuite) NewAddress() (AddressWithPrefix, error) {
var ipPrefix AddressWithPrefix
var err error
if s.numberOfAddresses == 255 {
s.T().Fatalf("no available IPv4 addresses")
}
address := fmt.Sprintf("10.10.10.%v/24", s.numberOfAddresses+1)
ipPrefix, err = ip_types.ParseAddressWithPrefix(address)
if err != nil {
return AddressWithPrefix{}, err
}
s.numberOfAddresses++
return ipPrefix, nil
type NamespaceAddresses struct {
namespace string
numberOfAddresses int
}
type Addresser struct {
namespaces []*NamespaceAddresses
suite *HstSuite
}
func (a *Addresser) AddNamespace(name string) {
var newNamespace = &NamespaceAddresses{
namespace: name,
numberOfAddresses: 0,
}
a.namespaces = append(a.namespaces, newNamespace)
}
func (a *Addresser) NewIp4Address() (string, error) {
return a.NewIp4AddressWithNamespace(defaultNamespaceName)
}
func (a *Addresser) NewIp4AddressWithNamespace(namespace string) (string, error) {
for i, val := range a.namespaces {
if val.namespace != namespace {
continue
}
if val.numberOfAddresses == 255 {
return "", fmt.Errorf("no available IPv4 addresses")
}
address := fmt.Sprintf("10.10.%v.%v/24", i, val.numberOfAddresses+1)
val.numberOfAddresses++
return address, nil
}
a.AddNamespace(namespace)
return a.NewIp4AddressWithNamespace(namespace)
}
func NewAddresser(suite *HstSuite) *Addresser {
var addresser = new(Addresser)
addresser.suite = suite
addresser.AddNamespace(defaultNamespaceName)
return addresser
}