X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=extras%2Fhs-test%2Fhst_suite.go;h=1fcffa42e0045a5ed2366fa465e460bf73ae2732;hb=608d0069d98579b0635be978dea8e316f77a8841;hp=8e52cc4e851f353efca2dcf2502b888fcd66cc4a;hpb=af004ddad1231682d0a64ce9671e2619c2910c7a;p=vpp.git diff --git a/extras/hs-test/hst_suite.go b/extras/hs-test/hst_suite.go index 8e52cc4e851..1fcffa42e00 100644 --- a/extras/hs-test/hst_suite.go +++ b/extras/hs-test/hst_suite.go @@ -14,12 +14,14 @@ import ( ) const ( - defaultNetworkNumber int = 1 + DEFAULT_NETWORK_NUM int = 1 ) -var IsPersistent = flag.Bool("persist", false, "persists topology config") -var IsVerbose = flag.Bool("verbose", false, "verbose test output") -var IsUnconfiguring = flag.Bool("unconfigure", false, "remove topology") +var isPersistent = flag.Bool("persist", false, "persists topology config") +var isVerbose = flag.Bool("verbose", false, "verbose test output") +var isUnconfiguring = flag.Bool("unconfigure", false, "remove topology") +var isVppDebug = flag.Bool("debug", false, "attach gdb to vpp") +var nConfiguredCpus = flag.Int("cpus", 1, "number of CPUs assigned to vpp") type HstSuite struct { suite.Suite @@ -29,6 +31,29 @@ type HstSuite struct { netInterfaces map[string]*NetInterface addresser *Addresser testIds map[string]string + cpuAllocator *CpuAllocatorT + cpuContexts []*CpuContext + cpuPerVpp int +} + +func (s *HstSuite) SetupSuite() { + var err error + s.cpuAllocator, err = CpuAllocator() + if err != nil { + s.FailNow("failed to init cpu allocator: %v", err) + } + s.cpuPerVpp = *nConfiguredCpus +} + +func (s *HstSuite) AllocateCpus() []int { + cpuCtx, err := s.cpuAllocator.Allocate(s.cpuPerVpp) + s.assertNil(err) + s.AddCpuContext(cpuCtx) + return cpuCtx.cpus +} + +func (s *HstSuite) AddCpuContext(cpuCtx *CpuContext) { + s.cpuContexts = append(s.cpuContexts, cpuCtx) } func (s *HstSuite) TearDownSuite() { @@ -36,26 +61,29 @@ func (s *HstSuite) TearDownSuite() { } func (s *HstSuite) TearDownTest() { - if *IsPersistent { + if *isPersistent { return } - s.ResetContainers() - s.RemoveVolumes() + for _, c := range s.cpuContexts { + c.Release() + } + s.resetContainers() + s.removeVolumes() } func (s *HstSuite) skipIfUnconfiguring() { - if *IsUnconfiguring { + if *isUnconfiguring { s.skip("skipping to unconfigure") } } func (s *HstSuite) SetupTest() { s.skipIfUnconfiguring() - s.SetupVolumes() - s.SetupContainers() + s.setupVolumes() + s.setupContainers() } -func (s *HstSuite) SetupVolumes() { +func (s *HstSuite) setupVolumes() { for _, volume := range s.volumes { cmd := "docker volume create --name=" + volume s.log(cmd) @@ -63,9 +91,9 @@ func (s *HstSuite) SetupVolumes() { } } -func (s *HstSuite) SetupContainers() { +func (s *HstSuite) setupContainers() { for _, container := range s.containers { - if container.isOptional == false { + if !container.isOptional { container.run() } } @@ -118,7 +146,7 @@ func (s *HstSuite) assertNotEmpty(object interface{}, msgAndArgs ...interface{}) } func (s *HstSuite) log(args ...any) { - if *IsVerbose { + if *isVerbose { s.T().Helper() s.T().Log(args...) } @@ -129,13 +157,19 @@ func (s *HstSuite) skip(args ...any) { s.T().SkipNow() } -func (s *HstSuite) ResetContainers() { +func (s *HstSuite) SkipIfMultiWorker(args ...any) { + if *nConfiguredCpus > 1 { + s.skip("test case not supported with multiple vpp workers") + } +} + +func (s *HstSuite) resetContainers() { for _, container := range s.containers { container.stop() } } -func (s *HstSuite) RemoveVolumes() { +func (s *HstSuite) removeVolumes() { for _, volumeName := range s.volumes { cmd := "docker volume rm " + volumeName exechelper.Run(cmd) @@ -157,7 +191,7 @@ func (s *HstSuite) getTransientContainerByName(name string) *Container { } func (s *HstSuite) loadContainerTopology(topologyName string) { - data, err := ioutil.ReadFile(ContainerTopologyDir + topologyName + ".yaml") + data, err := ioutil.ReadFile(containerTopologyDir + topologyName + ".yaml") if err != nil { s.T().Fatalf("read error: %v", err) } @@ -175,7 +209,7 @@ func (s *HstSuite) loadContainerTopology(topologyName string) { s.containers = make(map[string]*Container) for _, elem := range yamlTopo.Containers { - newContainer, err := NewContainer(elem) + newContainer, err := newContainer(elem) newContainer.suite = s if err != nil { s.T().Fatalf("container config error: %v", err) @@ -185,7 +219,7 @@ func (s *HstSuite) loadContainerTopology(topologyName string) { } func (s *HstSuite) loadNetworkTopology(topologyName string) { - data, err := ioutil.ReadFile(NetworkTopologyDir + topologyName + ".yaml") + data, err := ioutil.ReadFile(networkTopologyDir + topologyName + ".yaml") if err != nil { s.T().Fatalf("read error: %v", err) } @@ -195,13 +229,13 @@ func (s *HstSuite) loadNetworkTopology(topologyName string) { s.T().Fatalf("unmarshal error: %v", err) } - s.addresser = NewAddresser(s) + 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 { + if namespace, err := newNetNamespace(elem); err == nil { s.netConfigs = append(s.netConfigs, &namespace) } else { s.T().Fatalf("network config error: %v", err) @@ -209,7 +243,7 @@ func (s *HstSuite) loadNetworkTopology(topologyName string) { } case Veth, Tap: { - if netIf, err := NewNetworkInterface(elem, s.addresser); err == nil { + if netIf, err := newNetworkInterface(elem, s.addresser); err == nil { s.netConfigs = append(s.netConfigs, netIf) s.netInterfaces[netIf.Name()] = netIf } else { @@ -218,7 +252,7 @@ func (s *HstSuite) loadNetworkTopology(topologyName string) { } case Bridge: { - if bridge, err := NewBridge(elem); err == nil { + if bridge, err := newBridge(elem); err == nil { s.netConfigs = append(s.netConfigs, &bridge) } else { s.T().Fatalf("network config error: %v", err) @@ -231,23 +265,23 @@ func (s *HstSuite) loadNetworkTopology(topologyName string) { func (s *HstSuite) configureNetworkTopology(topologyName string) { s.loadNetworkTopology(topologyName) - if *IsUnconfiguring { + if *isUnconfiguring { return } for _, nc := range s.netConfigs { - if err := nc.Configure(); err != nil { + if err := nc.configure(); err != nil { s.T().Fatalf("network config error: %v", err) } } } func (s *HstSuite) unconfigureNetworkTopology() { - if *IsPersistent { + if *isPersistent { return } for _, nc := range s.netConfigs { - nc.Unconfigure() + nc.unconfigure() } } @@ -259,7 +293,7 @@ func (s *HstSuite) getTestId() string { } if _, ok := s.testIds[testName]; !ok { - s.testIds[testName] = time.Now().Format(time.RFC3339) + s.testIds[testName] = time.Now().Format("2006-01-02_15-04-05") } return s.testIds[testName] @@ -272,18 +306,18 @@ type Addresser struct { suite *HstSuite } -func (a *Addresser) AddNetwork(networkNumber int) { +func (a *Addresser) addNetwork(networkNumber int) { a.networks[networkNumber] = 1 } -func (a *Addresser) NewIp4Address(inputNetworkNumber ...int) (string, error) { +func (a *Addresser) newIp4Address(inputNetworkNumber ...int) (string, error) { var networkNumber int = 0 if len(inputNetworkNumber) > 0 { networkNumber = inputNetworkNumber[0] } if _, ok := a.networks[networkNumber]; !ok { - a.AddNetwork(networkNumber) + a.addNetwork(networkNumber) } numberOfAddresses := a.networks[networkNumber] @@ -298,10 +332,10 @@ func (a *Addresser) NewIp4Address(inputNetworkNumber ...int) (string, error) { return address, nil } -func NewAddresser(suite *HstSuite) *Addresser { +func newAddresser(suite *HstSuite) *Addresser { var addresser = new(Addresser) addresser.suite = suite addresser.networks = make(map[int]AddressCounter) - addresser.AddNetwork(0) + addresser.addNetwork(0) return addresser }