func TestControllerError(t *testing.T) { testCases := map[string]struct { err func() error errFn func(err error) bool reactFn testclient.ReactionFunc actions int }{ "not found": { err: func() error { return errors.NewNotFound("namespace", "test") }, errFn: func(err error) bool { return err == nil }, actions: 1, }, "unknown": { err: func() error { return fmt.Errorf("unknown") }, errFn: func(err error) bool { return err.Error() == "unknown" }, actions: 1, }, "conflict": { actions: 4, reactFn: func(a testclient.Action) (runtime.Object, error) { if a.Matches("get", "namespaces") { return &kapi.Namespace{ObjectMeta: kapi.ObjectMeta{Name: "test"}}, nil } return (*kapi.Namespace)(nil), errors.NewConflict("namespace", "test", fmt.Errorf("test conflict")) }, errFn: func(err error) bool { return err != nil && strings.Contains(err.Error(), "unable to allocate security info") }, }, } for s, testCase := range testCases { client := &testclient.Fake{ReactFn: testCase.reactFn} if client.ReactFn == nil { client.ReactFn = func(a testclient.Action) (runtime.Object, error) { return (*kapi.Namespace)(nil), testCase.err() } } uidr, _ := uid.NewRange(10, 19, 2) mcsr, _ := mcs.NewRange("s0:", 10, 2) uida := uidallocator.NewInMemory(uidr) c := Allocation{ uid: uida, mcs: DefaultMCSAllocation(uidr, mcsr, 5), client: client.Namespaces(), } err := c.Next(&kapi.Namespace{ObjectMeta: kapi.ObjectMeta{Name: "test"}}) if !testCase.errFn(err) { t.Errorf("%s: unexpected error: %v", s, err) } if len(client.Actions()) != testCase.actions { t.Errorf("%s: expected %d actions: %v", s, testCase.actions, client.Actions()) } if uida.Free() != 5 { t.Errorf("%s: should not have allocated uid: %d/%d", s, uida.Free(), uidr.Size()) } } }
func TestAllocate(t *testing.T) { ranger, _ := mcs.NewRange("s0:", 5, 2) r := New(ranger, func(max int, rangeSpec string) allocator.Interface { return allocator.NewContiguousAllocationMap(max, rangeSpec) }) if f := r.Free(); f != 10 { t.Errorf("unexpected free %d", f) } found := sets.NewString() count := 0 for r.Free() > 0 { label, err := r.AllocateNext() if err != nil { t.Fatalf("error @ %d: %v", count, err) } count++ if !ranger.Contains(label) { t.Fatalf("allocated %s which is outside of %s", label, ranger) } if found.Has(label.String()) { t.Fatalf("allocated %s twice @ %d", label, count) } found.Insert(label.String()) } if _, err := r.AllocateNext(); err != ErrFull { t.Fatal(err) } released, _ := ranger.LabelAt(3) if err := r.Release(released); err != nil { t.Fatal(err) } if f := r.Free(); f != 1 { t.Errorf("unexpected free %d", f) } label, err := r.AllocateNext() if err != nil { t.Fatal(err) } if !reflect.DeepEqual(released, label) { t.Errorf("unexpected %s : %s", label, released) } if err := r.Release(released); err != nil { t.Fatal(err) } badLabel, _ := ranger.LabelAt(30) if err := r.Allocate(badLabel); err != ErrNotInRange { t.Fatal(err) } if f := r.Free(); f != 1 { t.Errorf("unexpected free %d", f) } if err := r.Allocate(released); err != nil { t.Fatal(err) } if f := r.Free(); f != 0 { t.Errorf("unexpected free %d", f) } }
func TestController(t *testing.T) { var action testclient.Action client := &testclient.Fake{ ReactFn: func(a testclient.Action) (runtime.Object, error) { action = a return (*kapi.Namespace)(nil), nil }, } uidr, _ := uid.NewRange(10, 20, 2) mcsr, _ := mcs.NewRange("s0:", 10, 2) uida := uidallocator.NewInMemory(uidr) c := Allocation{ uid: uida, mcs: DefaultMCSAllocation(uidr, mcsr, 5), client: client.Namespaces(), } err := c.Next(&kapi.Namespace{ObjectMeta: kapi.ObjectMeta{Name: "test"}}) if err != nil { t.Fatal(err) } got := action.(testclient.CreateAction).GetObject().(*kapi.Namespace) if got.Annotations[security.UIDRangeAnnotation] != "10/2" { t.Errorf("unexpected annotation: %#v", got) } if got.Annotations[security.MCSAnnotation] != "s0:c1,c0" { t.Errorf("unexpected annotation: %#v", got) } if !uida.Has(uid.Block{Start: 10, End: 11}) { t.Errorf("did not allocate uid: %#v", uida) } }
func TestController(t *testing.T) { var action core.Action client := &fake.Clientset{} client.AddReactor("*", "*", func(a core.Action) (handled bool, ret runtime.Object, err error) { action = a return true, (*kapi.Namespace)(nil), nil }) uidr, _ := uid.NewRange(10, 20, 2) mcsr, _ := mcs.NewRange("s0:", 10, 2) uida := uidallocator.NewInMemory(uidr) c := Allocation{ uid: uida, mcs: DefaultMCSAllocation(uidr, mcsr, 5), client: client.Core().Namespaces(), } err := c.Next(&kapi.Namespace{ObjectMeta: kapi.ObjectMeta{Name: "test"}}) if err != nil { t.Fatal(err) } got := action.(core.CreateAction).GetObject().(*kapi.Namespace) if got.Annotations[security.UIDRangeAnnotation] != "10/2" { t.Errorf("unexpected uid annotation: %#v", got) } if got.Annotations[security.SupplementalGroupsAnnotation] != "10/2" { t.Errorf("unexpected supplemental group annotation: %#v", got) } if got.Annotations[security.MCSAnnotation] != "s0:c1,c0" { t.Errorf("unexpected mcs annotation: %#v", got) } if !uida.Has(uid.Block{Start: 10, End: 11}) { t.Errorf("did not allocate uid: %#v", uida) } }