libnetwork: delete package idm
The only remaining user is Swarmkit, which now has its own private copy of the package tailored to its needs. Signed-off-by: Cory Snider <csnider@mirantis.com>
This commit is contained in:
parent
7366e44019
commit
8b167535db
2 changed files with 0 additions and 370 deletions
|
@ -1,76 +0,0 @@
|
|||
// Package idm manages reservation/release of numerical ids from a configured set of contiguous ids
|
||||
package idm
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/docker/docker/libnetwork/bitseq"
|
||||
"github.com/docker/docker/libnetwork/datastore"
|
||||
)
|
||||
|
||||
// Idm manages the reservation/release of numerical ids from a contiguous set
|
||||
type Idm struct {
|
||||
start uint64
|
||||
end uint64
|
||||
handle *bitseq.Handle
|
||||
}
|
||||
|
||||
// New returns an instance of id manager for a [start,end] set of numerical ids
|
||||
func New(ds datastore.DataStore, id string, start, end uint64) (*Idm, error) {
|
||||
if id == "" {
|
||||
return nil, errors.New("Invalid id")
|
||||
}
|
||||
if end <= start {
|
||||
return nil, fmt.Errorf("Invalid set range: [%d, %d]", start, end)
|
||||
}
|
||||
|
||||
h, err := bitseq.NewHandle("idm", ds, id, 1+end-start)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to initialize bit sequence handler: %s", err.Error())
|
||||
}
|
||||
|
||||
return &Idm{start: start, end: end, handle: h}, nil
|
||||
}
|
||||
|
||||
// GetID returns the first available id in the set
|
||||
func (i *Idm) GetID(serial bool) (uint64, error) {
|
||||
if i.handle == nil {
|
||||
return 0, errors.New("ID set is not initialized")
|
||||
}
|
||||
ordinal, err := i.handle.SetAny(serial)
|
||||
return i.start + ordinal, err
|
||||
}
|
||||
|
||||
// GetSpecificID tries to reserve the specified id
|
||||
func (i *Idm) GetSpecificID(id uint64) error {
|
||||
if i.handle == nil {
|
||||
return errors.New("ID set is not initialized")
|
||||
}
|
||||
|
||||
if id < i.start || id > i.end {
|
||||
return errors.New("Requested id does not belong to the set")
|
||||
}
|
||||
|
||||
return i.handle.Set(id - i.start)
|
||||
}
|
||||
|
||||
// GetIDInRange returns the first available id in the set within a [start,end] range
|
||||
func (i *Idm) GetIDInRange(start, end uint64, serial bool) (uint64, error) {
|
||||
if i.handle == nil {
|
||||
return 0, errors.New("ID set is not initialized")
|
||||
}
|
||||
|
||||
if start < i.start || end > i.end {
|
||||
return 0, errors.New("Requested range does not belong to the set")
|
||||
}
|
||||
|
||||
ordinal, err := i.handle.SetAnyInRange(start-i.start, end-i.start, serial)
|
||||
|
||||
return i.start + ordinal, err
|
||||
}
|
||||
|
||||
// Release releases the specified id
|
||||
func (i *Idm) Release(id uint64) {
|
||||
i.handle.Unset(id - i.start)
|
||||
}
|
|
@ -1,294 +0,0 @@
|
|||
package idm
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestNew(t *testing.T) {
|
||||
_, err := New(nil, "", 0, 1)
|
||||
if err == nil {
|
||||
t.Fatal("Expected failure, but succeeded")
|
||||
}
|
||||
|
||||
_, err = New(nil, "myset", 1<<10, 0)
|
||||
if err == nil {
|
||||
t.Fatal("Expected failure, but succeeded")
|
||||
}
|
||||
|
||||
i, err := New(nil, "myset", 0, 10)
|
||||
if err != nil {
|
||||
t.Fatalf("Unexpected failure: %v", err)
|
||||
}
|
||||
if i.handle == nil {
|
||||
t.Fatal("set is not initialized")
|
||||
}
|
||||
if i.start != 0 {
|
||||
t.Fatal("unexpected start")
|
||||
}
|
||||
if i.end != 10 {
|
||||
t.Fatal("unexpected end")
|
||||
}
|
||||
}
|
||||
|
||||
func TestAllocate(t *testing.T) {
|
||||
i, err := New(nil, "myids", 50, 52)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err = i.GetSpecificID(49); err == nil {
|
||||
t.Fatal("Expected failure but succeeded")
|
||||
}
|
||||
|
||||
if err = i.GetSpecificID(53); err == nil {
|
||||
t.Fatal("Expected failure but succeeded")
|
||||
}
|
||||
|
||||
o, err := i.GetID(false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 50 {
|
||||
t.Fatalf("Unexpected first id returned: %d", o)
|
||||
}
|
||||
|
||||
err = i.GetSpecificID(50)
|
||||
if err == nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
o, err = i.GetID(false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 51 {
|
||||
t.Fatalf("Unexpected id returned: %d", o)
|
||||
}
|
||||
|
||||
o, err = i.GetID(false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 52 {
|
||||
t.Fatalf("Unexpected id returned: %d", o)
|
||||
}
|
||||
|
||||
o, err = i.GetID(false)
|
||||
if err == nil {
|
||||
t.Fatalf("Expected failure but succeeded: %d", o)
|
||||
}
|
||||
|
||||
i.Release(50)
|
||||
|
||||
o, err = i.GetID(false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 50 {
|
||||
t.Fatal("Unexpected id returned")
|
||||
}
|
||||
|
||||
i.Release(52)
|
||||
err = i.GetSpecificID(52)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUninitialized(t *testing.T) {
|
||||
i := &Idm{}
|
||||
|
||||
if _, err := i.GetID(false); err == nil {
|
||||
t.Fatal("Expected failure but succeeded")
|
||||
}
|
||||
|
||||
if err := i.GetSpecificID(44); err == nil {
|
||||
t.Fatal("Expected failure but succeeded")
|
||||
}
|
||||
}
|
||||
|
||||
func TestAllocateInRange(t *testing.T) {
|
||||
i, err := New(nil, "myset", 5, 10)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
o, err := i.GetIDInRange(6, 6, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 6 {
|
||||
t.Fatalf("Unexpected id returned. Expected: 6. Got: %d", o)
|
||||
}
|
||||
|
||||
if err = i.GetSpecificID(6); err == nil {
|
||||
t.Fatalf("Expected failure but succeeded")
|
||||
}
|
||||
|
||||
o, err = i.GetID(false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 5 {
|
||||
t.Fatalf("Unexpected id returned. Expected: 5. Got: %d", o)
|
||||
}
|
||||
|
||||
i.Release(6)
|
||||
|
||||
o, err = i.GetID(false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 6 {
|
||||
t.Fatalf("Unexpected id returned. Expected: 6. Got: %d", o)
|
||||
}
|
||||
|
||||
for n := 7; n <= 10; n++ {
|
||||
o, err := i.GetIDInRange(7, 10, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != uint64(n) {
|
||||
t.Fatalf("Unexpected id returned. Expected: %d. Got: %d", n, o)
|
||||
}
|
||||
}
|
||||
|
||||
if err = i.GetSpecificID(7); err == nil {
|
||||
t.Fatalf("Expected failure but succeeded")
|
||||
}
|
||||
|
||||
if err = i.GetSpecificID(10); err == nil {
|
||||
t.Fatalf("Expected failure but succeeded")
|
||||
}
|
||||
|
||||
i.Release(10)
|
||||
|
||||
o, err = i.GetIDInRange(5, 10, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 10 {
|
||||
t.Fatalf("Unexpected id returned. Expected: 10. Got: %d", o)
|
||||
}
|
||||
|
||||
i.Release(5)
|
||||
|
||||
o, err = i.GetIDInRange(5, 10, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 5 {
|
||||
t.Fatalf("Unexpected id returned. Expected: 5. Got: %d", o)
|
||||
}
|
||||
|
||||
for n := 5; n <= 10; n++ {
|
||||
i.Release(uint64(n))
|
||||
}
|
||||
|
||||
for n := 5; n <= 10; n++ {
|
||||
o, err := i.GetIDInRange(5, 10, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != uint64(n) {
|
||||
t.Fatalf("Unexpected id returned. Expected: %d. Got: %d", n, o)
|
||||
}
|
||||
}
|
||||
|
||||
for n := 5; n <= 10; n++ {
|
||||
if err = i.GetSpecificID(uint64(n)); err == nil {
|
||||
t.Fatalf("Expected failure but succeeded for id: %d", n)
|
||||
}
|
||||
}
|
||||
|
||||
// New larger set
|
||||
ul := uint64((1 << 24) - 1)
|
||||
i, err = New(nil, "newset", 0, ul)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
o, err = i.GetIDInRange(4096, ul, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 4096 {
|
||||
t.Fatalf("Unexpected id returned. Expected: 4096. Got: %d", o)
|
||||
}
|
||||
|
||||
o, err = i.GetIDInRange(4096, ul, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 4097 {
|
||||
t.Fatalf("Unexpected id returned. Expected: 4097. Got: %d", o)
|
||||
}
|
||||
|
||||
o, err = i.GetIDInRange(4096, ul, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 4098 {
|
||||
t.Fatalf("Unexpected id returned. Expected: 4098. Got: %d", o)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAllocateSerial(t *testing.T) {
|
||||
i, err := New(nil, "myids", 50, 55)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err = i.GetSpecificID(49); err == nil {
|
||||
t.Fatal("Expected failure but succeeded")
|
||||
}
|
||||
|
||||
if err = i.GetSpecificID(56); err == nil {
|
||||
t.Fatal("Expected failure but succeeded")
|
||||
}
|
||||
|
||||
o, err := i.GetID(true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 50 {
|
||||
t.Fatalf("Unexpected first id returned: %d", o)
|
||||
}
|
||||
|
||||
err = i.GetSpecificID(50)
|
||||
if err == nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
o, err = i.GetID(true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 51 {
|
||||
t.Fatalf("Unexpected id returned: %d", o)
|
||||
}
|
||||
|
||||
o, err = i.GetID(true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 52 {
|
||||
t.Fatalf("Unexpected id returned: %d", o)
|
||||
}
|
||||
|
||||
i.Release(50)
|
||||
|
||||
o, err = i.GetID(true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if o != 53 {
|
||||
t.Fatal("Unexpected id returned")
|
||||
}
|
||||
|
||||
i.Release(52)
|
||||
err = i.GetSpecificID(52)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue