package integration import ( "testing" "time" imageapi "github.com/openshift/origin/pkg/image/api" kapi "k8s.io/kubernetes/pkg/api" kapierrors "k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/unversioned" kcoreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" utilwait "k8s.io/kubernetes/pkg/util/wait" "github.com/openshift/origin/pkg/client" quotaapi "github.com/openshift/origin/pkg/quota/api" testutil "github.com/openshift/origin/test/util" testserver "github.com/openshift/origin/test/util/server" ) func TestClusterQuota(t *testing.T) { testutil.RequireEtcd(t) defer testutil.DumpEtcdOnFailure(t) _, clusterAdminKubeConfig, err := testserver.StartTestMaster() if err != nil { t.Fatalf("unexpected error: %v", err) } clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig) if err != nil { t.Fatalf("unexpected error: %v", err) } clusterAdminKubeClient, err := testutil.GetClusterAdminKubeClient(clusterAdminKubeConfig) if err != nil { t.Fatalf("unexpected error: %v", err) } clusterAdminClientConfig, err := testutil.GetClusterAdminClientConfig(clusterAdminKubeConfig) if err != nil { t.Fatalf("unexpected error: %v", err) } // time.Sleep(10 * time.Second) cq := "aapi.ClusterResourceQuota{ ObjectMeta: kapi.ObjectMeta{Name: "overall"}, Spec: quotaapi.ClusterResourceQuotaSpec{ Selector: quotaapi.ClusterResourceQuotaSelector{ LabelSelector: &unversioned.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, }, Quota: kapi.ResourceQuotaSpec{ Hard: kapi.ResourceList{ kapi.ResourceConfigMaps: resource.MustParse("2"), "openshift.io/imagestreams": resource.MustParse("1"), }, }, }, } if _, err := clusterAdminClient.ClusterResourceQuotas().Create(cq); err != nil { t.Fatalf("unexpected error: %v", err) } if _, err := testserver.CreateNewProject(clusterAdminClient, *clusterAdminClientConfig, "first", "harold"); err != nil { t.Fatalf("unexpected error: %v", err) } if _, err := testserver.CreateNewProject(clusterAdminClient, *clusterAdminClientConfig, "second", "harold"); err != nil { t.Fatalf("unexpected error: %v", err) } if err := labelNamespace(clusterAdminKubeClient.Core(), "first"); err != nil { t.Fatalf("unexpected error: %v", err) } if err := labelNamespace(clusterAdminKubeClient.Core(), "second"); err != nil { t.Fatalf("unexpected error: %v", err) } if err := waitForQuotaLabeling(clusterAdminClient, "first"); err != nil { t.Fatalf("unexpected error: %v", err) } if err := waitForQuotaLabeling(clusterAdminClient, "second"); err != nil { t.Fatalf("unexpected error: %v", err) } configmap := &kapi.ConfigMap{} configmap.GenerateName = "test" if _, err := clusterAdminKubeClient.Core().ConfigMaps("first").Create(configmap); err != nil { t.Fatalf("unexpected error: %v", err) } if _, err := clusterAdminKubeClient.Core().ConfigMaps("second").Create(configmap); err != nil { t.Fatalf("unexpected error: %v", err) } if _, err := clusterAdminKubeClient.Core().ConfigMaps("second").Create(configmap); !kapierrors.IsForbidden(err) { list, err := clusterAdminClient.AppliedClusterResourceQuotas("second").List(kapi.ListOptions{}) if err == nil { t.Errorf("quota is %#v", list) } list2, err := clusterAdminKubeClient.Core().ConfigMaps("").List(kapi.ListOptions{}) if err == nil { t.Errorf("ConfigMaps is %#v", list2) } t.Fatalf("unexpected error: %v", err) } imagestream := &imageapi.ImageStream{} imagestream.GenerateName = "test" if _, err := clusterAdminClient.ImageStreams("first").Create(imagestream); err != nil { t.Fatalf("unexpected error: %v", err) } if _, err := clusterAdminClient.ImageStreams("second").Create(imagestream); !kapierrors.IsForbidden(err) { list, err := clusterAdminClient.AppliedClusterResourceQuotas("second").List(kapi.ListOptions{}) if err == nil { t.Errorf("quota is %#v", list) } list2, err := clusterAdminClient.ImageStreams("").List(kapi.ListOptions{}) if err == nil { t.Errorf("ImageStreams is %#v", list2) } t.Fatalf("unexpected error: %v", err) } } func waitForQuotaLabeling(clusterAdminClient client.AppliedClusterResourceQuotasNamespacer, namespaceName string) error { return utilwait.PollImmediate(100*time.Millisecond, 10*time.Second, func() (done bool, err error) { list, err := clusterAdminClient.AppliedClusterResourceQuotas(namespaceName).List(kapi.ListOptions{}) if err != nil { return false, nil } if len(list.Items) > 0 && len(list.Items[0].Status.Total.Hard) > 0 { return true, nil } return false, nil }) } func labelNamespace(clusterAdminKubeClient kcoreclient.NamespacesGetter, namespaceName string) error { ns1, err := clusterAdminKubeClient.Namespaces().Get(namespaceName) if err != nil { return err } if ns1.Labels == nil { ns1.Labels = map[string]string{} } ns1.Labels["foo"] = "bar" if _, err := clusterAdminKubeClient.Namespaces().Update(ns1); err != nil { return err } return nil }