Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion cmd/example-tests/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
g "github.com/openshift-eng/openshift-tests-extension/pkg/ginkgo"

// If using ginkgo, import your tests here
_ "github.com/openshift-eng/openshift-tests-extension/test/example"
"github.com/openshift-eng/openshift-tests-extension/test/example"
)

func main() {
Expand Down Expand Up @@ -69,6 +69,17 @@ func main() {
},
})

// Pool-aware suite: demonstrates resource pool scheduling. The scheduler
// ensures parallel test demand never exceeds pool capacity.
ext.AddSuite(e.Suite{
Name: "example/pools",
Qualifiers: []string{
`labels.exists(l, l=="POOL-TEST")`,
},
Parallelism: 4,
ResourcePools: map[string]int{"workers": 2},
})

// If using Ginkgo, build test specs automatically
specs, err := g.BuildExtensionTestSpecsFromOpenShiftGinkgoSuite()
if err != nil {
Expand Down Expand Up @@ -141,6 +152,7 @@ func main() {
// })

ext.AddSpecs(specs)
ext.AddSpecs(example.PoolTestSpecs())
registry.Register(ext)

root := &cobra.Command{
Expand Down
1 change: 1 addition & 0 deletions pkg/extension/extensiontests/spec.go
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ func (specs ExtensionTestSpecs) Run(ctx context.Context, w ResultWriter, maxConc
// We can't assume the runner will set the name of a test; it may not know it. Even if
// it does, we may want to modify it (e.g. k8s-tests for annotations currently).
res.Name = spec.Name
res.ResourcePools = spec.Resources.ResourcePools
w.Write(res)
resultChan <- res
}()
Expand Down
19 changes: 10 additions & 9 deletions pkg/extension/extensiontests/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,16 @@ var ResultSkipped Result = "skipped"
var ResultFailed Result = "failed"

type ExtensionTestResult struct {
Name string `json:"name"`
Lifecycle Lifecycle `json:"lifecycle"`
Duration int64 `json:"duration"`
StartTime *dbtime.DBTime `json:"startTime"`
EndTime *dbtime.DBTime `json:"endTime"`
Result Result `json:"result"`
Output string `json:"output"`
Error string `json:"error,omitempty"`
Details []Details `json:"details,omitempty"`
Name string `json:"name"`
Lifecycle Lifecycle `json:"lifecycle"`
Duration int64 `json:"duration"`
StartTime *dbtime.DBTime `json:"startTime"`
EndTime *dbtime.DBTime `json:"endTime"`
Result Result `json:"result"`
Output string `json:"output"`
Error string `json:"error,omitempty"`
Details []Details `json:"details,omitempty"`
ResourcePools map[string]int `json:"resourcePools,omitempty"`
}

// Details are human-readable messages to further explain skips, timeouts, etc.
Expand Down
75 changes: 75 additions & 0 deletions test/example/pools.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package example

import (
"context"
"fmt"
"time"

et "github.com/openshift-eng/openshift-tests-extension/pkg/extension/extensiontests"
"github.com/openshift-eng/openshift-tests-extension/pkg/util/sets"
)

// PoolTestSpecs returns manually-built test specs that exercise resource pool scheduling.
// Specs are labeled "POOL-TEST" for suite qualification. The mix includes:
// - 8 worker tests demanding 1 unit each of pool "workers"
// - 2 exclusive tests demanding 2 units each (consuming full capacity)
// - 3 non-pool tests with no resource demands (should run unconstrained)
func PoolTestSpecs() et.ExtensionTestSpecs {
var specs et.ExtensionTestSpecs

for i := 0; i < 8; i++ {
name := fmt.Sprintf("[sig-testing] pool-scheduling worker-test-%d", i)
specs = append(specs, &et.ExtensionTestSpec{
Name: name,
Labels: sets.New[string]("POOL-TEST"),
Lifecycle: et.LifecycleBlocking,
Resources: et.Resources{
ResourcePools: map[string]int{"workers": 1},
},
Run: func(ctx context.Context) *et.ExtensionTestResult {
time.Sleep(50 * time.Millisecond)
return &et.ExtensionTestResult{
Name: name,
Result: et.ResultPassed,
}
},
})
}

for i := 0; i < 2; i++ {
name := fmt.Sprintf("[sig-testing] pool-scheduling exclusive-test-%d", i)
specs = append(specs, &et.ExtensionTestSpec{
Name: name,
Labels: sets.New[string]("POOL-TEST"),
Lifecycle: et.LifecycleBlocking,
Resources: et.Resources{
ResourcePools: map[string]int{"workers": 2},
},
Run: func(ctx context.Context) *et.ExtensionTestResult {
time.Sleep(50 * time.Millisecond)
return &et.ExtensionTestResult{
Name: name,
Result: et.ResultPassed,
}
},
})
}

for i := 0; i < 3; i++ {
name := fmt.Sprintf("[sig-testing] pool-scheduling no-pool-test-%d", i)
specs = append(specs, &et.ExtensionTestSpec{
Name: name,
Labels: sets.New[string]("POOL-TEST"),
Lifecycle: et.LifecycleBlocking,
Run: func(ctx context.Context) *et.ExtensionTestResult {
time.Sleep(50 * time.Millisecond)
return &et.ExtensionTestResult{
Name: name,
Result: et.ResultPassed,
}
},
})
}

return specs
}
4 changes: 3 additions & 1 deletion test/framework/info.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,12 @@ var _ = Describe("[sig-testing] example-tests info", Label("framework"), func()
})

It("should have the expected suites", func() {
Expect(result.Suites).To(HaveLen(3), "expected 3 suites")
Expect(result.Suites).To(HaveLen(4), "expected 4 suites")
Expect(result.Suites).To(ContainElement(HaveField("Name", Equal("example/tests"))), "Expected to contain a suite with name 'example/tests'")
Expect(result.Suites).To(ContainElement(HaveField("Name", Equal("example/fast"))),
"Expected to contain a suite with name 'example/fast'")
Expect(result.Suites).To(ContainElement(HaveField("Name", Equal("example/pools"))),
"Expected to contain a suite with name 'example/pools'")
})

It("should have the correct component information", func() {
Expand Down
Loading