mirror of https://github.com/k3s-io/k3s
improvements to integration test organization
parent
da61f90b08
commit
50bbf39925
|
@ -30,25 +30,18 @@ import (
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/controller"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/controller"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet"
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/master"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/master"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
||||||
"github.com/coreos/go-etcd/etcd"
|
"github.com/coreos/go-etcd/etcd"
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
var (
|
||||||
runtime.GOMAXPROCS(4)
|
fakeDocker1, fakeDocker2 kubelet.FakeDockerClient
|
||||||
util.ReallyCrash = true
|
)
|
||||||
util.InitLogs()
|
|
||||||
defer util.FlushLogs()
|
|
||||||
|
|
||||||
go func() {
|
func startComponents(manifestURL string) (apiServerURL string) {
|
||||||
defer util.FlushLogs()
|
|
||||||
time.Sleep(3 * time.Minute)
|
|
||||||
glog.Fatalf("This test has timed out.")
|
|
||||||
}()
|
|
||||||
|
|
||||||
manifestUrl := ServeCachedManifestFile()
|
|
||||||
// Setup
|
// Setup
|
||||||
servers := []string{"http://localhost:4001"}
|
servers := []string{"http://localhost:4001"}
|
||||||
glog.Infof("Creating etcd client pointing to %v", servers)
|
glog.Infof("Creating etcd client pointing to %v", servers)
|
||||||
|
@ -63,23 +56,21 @@ func main() {
|
||||||
controllerManager.Run(1 * time.Second)
|
controllerManager.Run(1 * time.Second)
|
||||||
|
|
||||||
// Kubelet
|
// Kubelet
|
||||||
fakeDocker1 := &kubelet.FakeDockerClient{}
|
|
||||||
myKubelet := kubelet.Kubelet{
|
myKubelet := kubelet.Kubelet{
|
||||||
Hostname: machineList[0],
|
Hostname: machineList[0],
|
||||||
DockerClient: fakeDocker1,
|
DockerClient: &fakeDocker1,
|
||||||
DockerPuller: &kubelet.FakeDockerPuller{},
|
DockerPuller: &kubelet.FakeDockerPuller{},
|
||||||
FileCheckFrequency: 5 * time.Second,
|
FileCheckFrequency: 5 * time.Second,
|
||||||
SyncFrequency: 5 * time.Second,
|
SyncFrequency: 5 * time.Second,
|
||||||
HTTPCheckFrequency: 5 * time.Second,
|
HTTPCheckFrequency: 5 * time.Second,
|
||||||
}
|
}
|
||||||
go myKubelet.RunKubelet("", manifestUrl, servers[0], "localhost", "", 0)
|
go myKubelet.RunKubelet("", manifestURL, servers[0], "localhost", "", 0)
|
||||||
|
|
||||||
// Create a second kubelet so that the guestbook example's two redis slaves both
|
// Create a second kubelet so that the guestbook example's two redis slaves both
|
||||||
// have a place they can schedule.
|
// have a place they can schedule.
|
||||||
fakeDocker2 := &kubelet.FakeDockerClient{}
|
|
||||||
otherKubelet := kubelet.Kubelet{
|
otherKubelet := kubelet.Kubelet{
|
||||||
Hostname: machineList[1],
|
Hostname: machineList[1],
|
||||||
DockerClient: fakeDocker2,
|
DockerClient: &fakeDocker2,
|
||||||
DockerPuller: &kubelet.FakeDockerPuller{},
|
DockerPuller: &kubelet.FakeDockerPuller{},
|
||||||
FileCheckFrequency: 5 * time.Second,
|
FileCheckFrequency: 5 * time.Second,
|
||||||
SyncFrequency: 5 * time.Second,
|
SyncFrequency: 5 * time.Second,
|
||||||
|
@ -87,12 +78,10 @@ func main() {
|
||||||
}
|
}
|
||||||
go otherKubelet.RunKubelet("", "", servers[0], "localhost", "", 0)
|
go otherKubelet.RunKubelet("", "", servers[0], "localhost", "", 0)
|
||||||
|
|
||||||
// Ok. we're good to go.
|
return apiserver.URL
|
||||||
glog.Infof("API Server started on %s", apiserver.URL)
|
}
|
||||||
// Wait for the synchronization threads to come up.
|
|
||||||
time.Sleep(time.Second * 10)
|
|
||||||
|
|
||||||
kubeClient := client.New(apiserver.URL, nil)
|
func runReplicationControllerTest(kubeClient *client.Client) {
|
||||||
data, err := ioutil.ReadFile("api/examples/controller.json")
|
data, err := ioutil.ReadFile("api/examples/controller.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Unexpected error: %#v", err)
|
glog.Fatalf("Unexpected error: %#v", err)
|
||||||
|
@ -109,31 +98,56 @@ func main() {
|
||||||
time.Sleep(time.Second * 10)
|
time.Sleep(time.Second * 10)
|
||||||
|
|
||||||
// Validate that they're truly up.
|
// Validate that they're truly up.
|
||||||
pods, err := kubeClient.ListPods(nil)
|
pods, err := kubeClient.ListPods(labels.Set(controllerRequest.DesiredState.ReplicaSelector).AsSelector())
|
||||||
if err != nil || len(pods.Items) != 2 {
|
if err != nil || len(pods.Items) != controllerRequest.DesiredState.Replicas {
|
||||||
glog.Fatal("FAILED: %#v", pods.Items)
|
glog.Fatalf("FAILED: %#v", pods.Items)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
runtime.GOMAXPROCS(4)
|
||||||
|
util.ReallyCrash = true
|
||||||
|
util.InitLogs()
|
||||||
|
defer util.FlushLogs()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
defer util.FlushLogs()
|
||||||
|
time.Sleep(3 * time.Minute)
|
||||||
|
glog.Fatalf("This test has timed out.")
|
||||||
|
}()
|
||||||
|
|
||||||
|
manifestURL := ServeCachedManifestFile()
|
||||||
|
|
||||||
|
apiServerURL := startComponents(manifestURL)
|
||||||
|
|
||||||
|
// Ok. we're good to go.
|
||||||
|
glog.Infof("API Server started on %s", apiServerURL)
|
||||||
|
// Wait for the synchronization threads to come up.
|
||||||
|
time.Sleep(time.Second * 10)
|
||||||
|
|
||||||
|
kubeClient := client.New(apiServerURL, nil)
|
||||||
|
runReplicationControllerTest(kubeClient)
|
||||||
|
|
||||||
// Check that kubelet tried to make the pods.
|
// Check that kubelet tried to make the pods.
|
||||||
// Using a set to list unique creation attempts. Our fake is
|
// Using a set to list unique creation attempts. Our fake is
|
||||||
// really stupid, so kubelet tries to create these multiple times.
|
// really stupid, so kubelet tries to create these multiple times.
|
||||||
createdPods := map[string]struct{}{}
|
createdPods := util.StringSet{}
|
||||||
for _, p := range fakeDocker1.Created {
|
for _, p := range fakeDocker1.Created {
|
||||||
// The last 8 characters are random, so slice them off.
|
// The last 8 characters are random, so slice them off.
|
||||||
if n := len(p); n > 8 {
|
if n := len(p); n > 8 {
|
||||||
createdPods[p[:n-8]] = struct{}{}
|
createdPods.Insert(p[:n-8])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, p := range fakeDocker2.Created {
|
for _, p := range fakeDocker2.Created {
|
||||||
// The last 8 characters are random, so slice them off.
|
// The last 8 characters are random, so slice them off.
|
||||||
if n := len(p); n > 8 {
|
if n := len(p); n > 8 {
|
||||||
createdPods[p[:n-8]] = struct{}{}
|
createdPods.Insert(p[:n-8])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// We expect 5: 2 net containers + 2 pods from the replication controller +
|
// We expect 5: 2 net containers + 2 pods from the replication controller +
|
||||||
// 1 net container + 2 pods from the URL.
|
// 1 net container + 2 pods from the URL.
|
||||||
if len(createdPods) != 7 {
|
if len(createdPods) != 7 {
|
||||||
glog.Fatalf("Unexpected list of created pods: %#v %#v %#v\n", createdPods, fakeDocker1.Created, fakeDocker2.Created)
|
glog.Fatalf("Unexpected list of created pods:\n\n%#v\n\n%#v\n\n%#v\n\n", createdPods.List(), fakeDocker1.Created, fakeDocker2.Created)
|
||||||
}
|
}
|
||||||
glog.Infof("OK")
|
glog.Infof("OK")
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,10 @@ limitations under the License.
|
||||||
|
|
||||||
package util
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sort"
|
||||||
|
)
|
||||||
|
|
||||||
type empty struct{}
|
type empty struct{}
|
||||||
|
|
||||||
// A set of strings, implemented via map[string]struct{} for minimal memory consumption.
|
// A set of strings, implemented via map[string]struct{} for minimal memory consumption.
|
||||||
|
@ -45,3 +49,13 @@ func (s StringSet) Has(item string) bool {
|
||||||
_, contained := s[item]
|
_, contained := s[item]
|
||||||
return contained
|
return contained
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return the contents as a sorted string slice.
|
||||||
|
func (s StringSet) List() []string {
|
||||||
|
res := make([]string, 0, len(s))
|
||||||
|
for key := range s {
|
||||||
|
res = append(res, key)
|
||||||
|
}
|
||||||
|
sort.StringSlice(res).Sort()
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ limitations under the License.
|
||||||
package util
|
package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -51,3 +52,10 @@ func TestNewStringSet(t *testing.T) {
|
||||||
t.Errorf("Unexpected contents: %#v", s)
|
t.Errorf("Unexpected contents: %#v", s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestStringSetList(t *testing.T) {
|
||||||
|
s := NewStringSet("z", "y", "x", "a")
|
||||||
|
if !reflect.DeepEqual(s.List(), []string{"a", "x", "y", "z"}) {
|
||||||
|
t.Errorf("List gave unexpected result: %#v", s.List())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue