Skip to content

Commit

Permalink
Adding synchronization and other features to extended test's cluster …
Browse files Browse the repository at this point in the history
…loader.

Fixes:
- number of templates no longer ignored
- tuningsets no longer ignored for templates
- maxRetries reflected the number of all tries, not retries

New features:
- label-based pod post deployment synchronization at pod, template
  or global level
- creation of config maps and secrets from files
- support for getting parameter values from the environment
  • Loading branch information
jmencak committed Jan 2, 2018
1 parent 607caee commit 3adc981
Show file tree
Hide file tree
Showing 3 changed files with 237 additions and 77 deletions.
76 changes: 45 additions & 31 deletions test/extended/cluster/cl.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import (
oapi "github.com/openshift/origin/pkg/api"
projectapi "github.com/openshift/origin/pkg/project/apis/project"
exutil "github.com/openshift/origin/test/extended/util"
testutil "github.com/openshift/origin/test/util"
)

const deploymentRunTimeout = 5 * time.Minute
Expand Down Expand Up @@ -59,6 +58,7 @@ var _ = g.Describe("[Feature:Performance][Serial][Slow] Load cluster", func() {
g.It("should load the cluster", func() {
project := ConfigContext.ClusterLoader.Projects
tuningSets := ConfigContext.ClusterLoader.TuningSets
sync := ConfigContext.ClusterLoader.Sync
if project == nil {
e2e.Failf("Invalid config file.\nFile: %v", project)
}
Expand All @@ -81,30 +81,34 @@ var _ = g.Describe("[Feature:Performance][Serial][Slow] Load cluster", func() {
e2e.Logf("%d/%d : Created new namespace: %v", j+1, p.Number, nsName)
namespaces = append(namespaces, nsName)

// Create templates as defined
for _, template := range p.Templates {
var allArgs []string
templateFile := mkPath(template.File)
e2e.Logf("We're loading file %v: ", templateFile)
templateObj, err := testutil.GetTemplateFixture(templateFile)
if err != nil {
e2e.Failf("Cant read template config file. Error: %v", err)
// Create config maps
if p.Configmaps != nil {
// Config maps defined
for k, v := range p.Configmaps {
args, err := getConfigMapArgs(k, v)
o.Expect(err).NotTo(o.HaveOccurred())
err = oc.SetNamespace(nsName).Run("create").Args(args...).Execute()
o.Expect(err).NotTo(o.HaveOccurred())
}
allArgs = append(allArgs, templateObj.Name)
}

if template.Parameters == nil {
e2e.Logf("Template environment variables will not be modified.")
} else {
params := convertVariablesToString(template.Parameters)
allArgs = append(allArgs, params...)
// Create secrets
if p.Secrets != nil {
// Secrets defined
for k, v := range p.Secrets {
args, err := getSecretArgs(k, v)
o.Expect(err).NotTo(o.HaveOccurred())
err = oc.SetNamespace(nsName).Run("create").Args(args...).Execute()
o.Expect(err).NotTo(o.HaveOccurred())
}
}

config, err := oc.AdminTemplateClient().Template().Templates(nsName).Create(templateObj)
e2e.Logf("Template %v created, arguments: %v, config: %+v", templateObj.Name, allArgs, config)

err = oc.SetNamespace(nsName).Run("new-app").Args(allArgs...).Execute()
// Create templates as defined
for _, template := range p.Templates {
err := CreateTemplates(oc, c, nsName, template, template.Number, tuning)
o.Expect(err).NotTo(o.HaveOccurred())
}

// This is too familiar, create pods
for _, pod := range p.Pods {
// Parse Pod file into struct
Expand All @@ -122,11 +126,32 @@ var _ = g.Describe("[Feature:Performance][Serial][Slow] Load cluster", func() {
}
// TODO sjug: pass label via config
labels := map[string]string{"purpose": "test"}
CreatePods(c, pod.Basename, nsName, labels, config.Spec, pod.Number, tuning)
err := CreatePods(c, pod.Basename, nsName, labels, config.Spec, pod.Number, tuning, &pod.Sync)
o.Expect(err).NotTo(o.HaveOccurred())
}
}
}

if sync.Running {
for _, ns := range namespaces {
err := SyncRunningPods(c, ns, sync.Selectors, time.Duration(sync.Timeout) * time.Second)
o.Expect(err).NotTo(o.HaveOccurred())
}
}

if sync.Server.Enable {
var podCount PodCount
err := Server(&podCount, sync.Server.Port, false)
o.Expect(err).NotTo(o.HaveOccurred())
}

if sync.Finished {
for _, ns := range namespaces {
err := SyncNotRunningPods(c, ns, sync.Selectors, time.Duration(sync.Timeout) * time.Second)
o.Expect(err).NotTo(o.HaveOccurred())
}
}

// Wait for builds and deployments to complete
for _, ns := range namespaces {
buildList, err := oc.BuildClient().Build().Builds(ns).List(metav1.ListOptions{})
Expand Down Expand Up @@ -158,17 +183,6 @@ var _ = g.Describe("[Feature:Performance][Serial][Slow] Load cluster", func() {
err := writeJSONToDisk(TestResult{testDuration}, testResultFile)
o.Expect(err).NotTo(o.HaveOccurred())

// Wait for pods to be running
//for _, ns := range namespaces {
// label := labels.SelectorFromSet(labels.Set(map[string]string{"purpose": "test"}))
// err := testutils.WaitForPodsWithLabelRunning(c, ns, label)
// if err != nil {
// e2e.Failf("Got %v when trying to wait for the pods to start", err)
// }
// o.Expect(err).NotTo(o.HaveOccurred())
// e2e.Logf("All pods running in namespace %s.", ns)
//}

// If config context set to cleanup on completion
if ConfigContext.ClusterLoader.Cleanup == true {
for _, ns := range namespaces {
Expand Down
26 changes: 21 additions & 5 deletions test/extended/cluster/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,20 @@ type ContextType struct {
ClusterLoader struct {
Cleanup bool
Projects []ClusterLoaderType
Sync SyncObjectType
TuningSets []TuningSetType
}
}

// ClusterLoaderType struct only used for Cluster Loader test config
type ClusterLoaderType struct {
Number int `mapstructure:"num"`
Basename string
Tuning string
Pods []ClusterLoaderObjectType
Templates []ClusterLoaderObjectType
Number int `mapstructure:"num"`
Basename string
Tuning string
Configmaps map[string]interface{}
Secrets map[string]interface{}
Pods []ClusterLoaderObjectType
Templates []ClusterLoaderObjectType
}

// ClusterLoaderObjectType is nested object type for cluster loader struct
Expand All @@ -33,9 +36,22 @@ type ClusterLoaderObjectType struct {
Image string
Basename string
File string
Sync SyncObjectType
Parameters map[string]interface{}
}

// SyncObjectType is nested object type for cluster loader synchronisation functionality
type SyncObjectType struct {
Server struct {
Enable bool
Port int
}
Running bool
Finished bool
Selectors map[string]string
Timeout int
}

// TuningSetType is nested type for controlling Cluster Loader deployment pattern
type TuningSetType struct {
Name string
Expand Down
Loading

0 comments on commit 3adc981

Please sign in to comment.