package integration
import (
"testing"
"time"
kapi "k8s.io/kubernetes/pkg/api"
kapierrors "k8s.io/kubernetes/pkg/api/errors"
kapiv1 "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/watch"
projectapi "github.com/openshift/origin/pkg/project/api"
"github.com/openshift/origin/pkg/project/registry/projectrequest/delegated"
templateapi "github.com/openshift/origin/pkg/template/api"
testutil "github.com/openshift/origin/test/util"
testserver "github.com/openshift/origin/test/util/server"
)
func TestProjectRequestError(t *testing.T) {
testutil.RequireEtcd(t)
defer testutil.DumpEtcdOnFailure(t)
const (
ns = "testns"
templateNamespace = "default"
templateName = "project-request-template"
)
masterConfig, err := testserver.DefaultMasterOptions()
if err != nil {
t.Fatalf("error creating config: %v", err)
}
masterConfig.ProjectConfig.ProjectRequestTemplate = templateNamespace + "/" + templateName
kubeConfigFile, err := testserver.StartConfiguredMaster(masterConfig)
if err != nil {
t.Fatalf("error starting server: %v", err)
}
kubeClientset, err := testutil.GetClusterAdminKubeClient(kubeConfigFile)
if err != nil {
t.Fatalf("error getting client: %v", err)
}
openshiftClient, err := testutil.GetClusterAdminClient(kubeConfigFile)
if err != nil {
t.Fatalf("error getting openshift client: %v", err)
}
// Create custom template
template := delegated.DefaultTemplate()
template.Name = templateName
additionalObjects := []runtime.Object{
// Append an object that will succeed
&kapi.ConfigMap{ObjectMeta: kapi.ObjectMeta{Name: "configmapname"}},
// Append a custom object that will fail validation
&kapi.ConfigMap{},
// Append another object that should never be created, since we short circuit
&kapi.ConfigMap{ObjectMeta: kapi.ObjectMeta{Name: "configmapname2"}},
}
if err := templateapi.AddObjectsToTemplate(template, additionalObjects, kapiv1.SchemeGroupVersion); err != nil {
t.Fatal(err)
}
if _, err := openshiftClient.Templates(templateNamespace).Create(template); err != nil {
t.Fatal(err)
}
// Watch the project, rolebindings, and configmaps
nswatch, err := kubeClientset.Core().Namespaces().Watch(kapi.ListOptions{FieldSelector: fields.OneTermEqualSelector("metadata.name", ns)})
if err != nil {
t.Fatal(err)
}
policywatch, err := openshiftClient.PolicyBindings(ns).Watch(kapi.ListOptions{})
if err != nil {
t.Fatal(err)
}
cmwatch, err := kubeClientset.Core().ConfigMaps(ns).Watch(kapi.ListOptions{})
if err != nil {
t.Fatal(err)
}
// Create project request
_, err = openshiftClient.ProjectRequests().Create(&projectapi.ProjectRequest{ObjectMeta: kapi.ObjectMeta{Name: ns}})
if err == nil || err.Error() != `Internal error occurred: ConfigMap "" is invalid: metadata.name: Required value: name or generateName is required` {
t.Fatalf("Expected internal error creating project, got %v", err)
}
pairCreationDeletion := func(w watch.Interface) (int, int, []watch.Event) {
added := 0
deleted := 0
events := []watch.Event{}
for {
select {
case e := <-w.ResultChan():
events = append(events, e)
switch e.Type {
case watch.Added:
added++
case watch.Deleted:
deleted++
}
case <-time.After(10 * time.Second):
return added, deleted, events
}
if added == deleted && added > 0 {
return added, deleted, events
}
}
}
if added, deleted, events := pairCreationDeletion(nswatch); added != deleted || added != 1 {
for _, e := range events {
t.Logf("%s %#v", e.Type, e.Object)
}
t.Errorf("expected 1 namespace to be added and deleted, got %d added / %d deleted", added, deleted)
}
if added, deleted, events := pairCreationDeletion(policywatch); added != deleted || added != 1 {
for _, e := range events {
t.Logf("%s %#v", e.Type, e.Object)
}
t.Errorf("expected 1 policybinding to be added and deleted, got %d added / %d deleted", added, deleted)
}
if added, deleted, events := pairCreationDeletion(cmwatch); added != deleted || added != 1 {
for _, e := range events {
t.Logf("%s %#v", e.Type, e.Object)
}
t.Errorf("expected 1 configmap to be added and deleted, got %d added / %d deleted", added, deleted)
}
// Verify project is deleted
if nsObj, err := kubeClientset.Core().Namespaces().Get(ns); !kapierrors.IsNotFound(err) {
t.Errorf("Expected namespace to be gone, got %#v, %#v", nsObj, err)
}
}