Add concurrency limit for parallel helm tests

Signed-off-by: Frank Hamand <frankhamand@gmail.com>
pull/4144/head
Frank Hamand 7 years ago
parent 2ad4e82a4e
commit db9ff331dd
No known key found for this signature in database
GPG Key ID: 3A94326B72FE75DF

8
glide.lock generated

@ -1,5 +1,5 @@
hash: fcbba2207c6511df365dfe355dfe601a862d340bbf15db47938a404fd0ec58d0 hash: 813d803db5fc2cb46f8050190d2a307f247da5b7b3a4b00eb4d3e766882ad4f9
updated: 2018-11-11T19:26:29.631232-05:00 updated: 2018-11-30T10:55:17.417707Z
imports: imports:
- name: cloud.google.com/go - name: cloud.google.com/go
version: 3b1ae45394a234c385be014e9a488f2bb6eef821 version: 3b1ae45394a234c385be014e9a488f2bb6eef821
@ -290,6 +290,10 @@ imports:
- internal - internal
- jws - jws
- jwt - jwt
- name: golang.org/x/sync
version: 1d60e4601c6fd243af51cc01ddf169918a5407ca
subpackages:
- semaphore
- name: golang.org/x/sys - name: golang.org/x/sys
version: 95c6576299259db960f6c5b9b69ea52422860fce version: 95c6576299259db960f6c5b9b69ea52422860fce
subpackages: subpackages:

@ -3,6 +3,9 @@ import:
- package: golang.org/x/net - package: golang.org/x/net
subpackages: subpackages:
- context - context
- package: golang.org/x/sync
subpackages:
- semaphore
- package: github.com/spf13/cobra - package: github.com/spf13/cobra
version: fe5e611709b0c57fa4a89136deaa8e1d4004d053 version: fe5e611709b0c57fa4a89136deaa8e1d4004d053
- package: github.com/spf13/pflag - package: github.com/spf13/pflag
@ -41,7 +44,6 @@ import:
- package: github.com/prometheus/client_golang - package: github.com/prometheus/client_golang
version: 0.8.0 version: 0.8.0
- package: github.com/grpc-ecosystem/go-grpc-prometheus - package: github.com/grpc-ecosystem/go-grpc-prometheus
- package: k8s.io/kubernetes - package: k8s.io/kubernetes
version: release-1.12 version: release-1.12
- package: k8s.io/client-go - package: k8s.io/client-go

@ -37,6 +37,7 @@ type Environment struct {
Stream services.ReleaseService_RunReleaseTestServer Stream services.ReleaseService_RunReleaseTestServer
Timeout int64 Timeout int64
Parallel bool Parallel bool
Parallelism uint32
streamLock sync.Mutex streamLock sync.Mutex
} }

@ -125,6 +125,7 @@ func newMockTestingEnvironment() *MockTestingEnvironment {
KubeClient: tEnv.KubeClient, KubeClient: tEnv.KubeClient,
Timeout: 5, Timeout: 5,
Stream: &mockStream{}, Stream: &mockStream{},
Parallelism: 20,
}, },
} }
} }

@ -17,7 +17,9 @@ limitations under the License.
package releasetesting package releasetesting
import ( import (
"context"
"fmt" "fmt"
"golang.org/x/sync/semaphore"
"strings" "strings"
"github.com/ghodss/yaml" "github.com/ghodss/yaml"
@ -81,11 +83,16 @@ func (ts *TestSuite) Run(env *Environment) error {
} }
if env.Parallel { if env.Parallel {
c := make(chan error) c := make(chan error, len(tests))
// Use a semaphore to restrict the number of tests running in parallel.
sem := semaphore.NewWeighted(int64(env.Parallelism))
ctx := context.Background()
for _, t := range tests { for _, t := range tests {
go func(t *test) { sem.Acquire(ctx, 1)
go func(t *test, sem *semaphore.Weighted) {
defer sem.Release(1)
c <- t.run(env) c <- t.run(env)
}(t) }(t, sem)
} }
for range tests { for range tests {
@ -93,6 +100,7 @@ func (ts *TestSuite) Run(env *Environment) error {
return err return err
} }
} }
} else { } else {
for _, t := range tests { for _, t := range tests {
if err := t.run(env); err != nil { if err := t.run(env); err != nil {

@ -22,6 +22,8 @@ import (
reltesting "k8s.io/helm/pkg/releasetesting" reltesting "k8s.io/helm/pkg/releasetesting"
) )
const maxParallelism = 20
// RunReleaseTest runs pre-defined tests stored as hooks on a given release // RunReleaseTest runs pre-defined tests stored as hooks on a given release
func (s *ReleaseServer) RunReleaseTest(req *services.TestReleaseRequest, stream services.ReleaseService_RunReleaseTestServer) error { func (s *ReleaseServer) RunReleaseTest(req *services.TestReleaseRequest, stream services.ReleaseService_RunReleaseTestServer) error {
@ -42,6 +44,7 @@ func (s *ReleaseServer) RunReleaseTest(req *services.TestReleaseRequest, stream
Timeout: req.Timeout, Timeout: req.Timeout,
Stream: stream, Stream: stream,
Parallel: req.Parallel, Parallel: req.Parallel,
Parallelism: maxParallelism,
} }
s.Log("running tests for release %s", rel.Name) s.Log("running tests for release %s", rel.Name)
tSuite, err := reltesting.NewTestSuite(rel) tSuite, err := reltesting.NewTestSuite(rel)

Loading…
Cancel
Save