func doTestWatch(t *testing.T, sm subnet.Manager) { ctx, cancel := context.WithCancel(context.Background()) wg := sync.WaitGroup{} wg.Add(1) defer func() { cancel() wg.Wait() }() events := make(chan []subnet.Event) go func() { subnet.WatchLeases(ctx, sm, "_", nil, events) wg.Done() }() // skip over the initial snapshot <-events attrs := &subnet.LeaseAttrs{ PublicIP: mustParseIP4("1.1.1.2"), } l, err := sm.AcquireLease(ctx, "_", attrs) if err != nil { t.Errorf("AcquireLease failed: %v", err) return } if !mustParseIP4Net(expectedNetwork).Contains(l.Subnet.IP) { t.Errorf("AcquireLease returned subnet not in network: %v (in %v)", l.Subnet, expectedNetwork) } evtBatch := <-events if len(evtBatch) != 1 { t.Fatalf("WatchSubnets produced wrong sized event batch") } evt := evtBatch[0] if evt.Type != subnet.SubnetAdded { t.Fatalf("WatchSubnets produced wrong event type") } if evt.Lease.Key() != l.Key() { t.Errorf("WatchSubnet produced wrong subnet: expected %s, got %s", l.Key(), evt.Lease.Key()) } }
// POST /{network}/leases func handleAcquireLease(ctx context.Context, sm subnet.Manager, w http.ResponseWriter, r *http.Request) { network := mux.Vars(r)["network"] if network == "_" { network = "" } attrs := subnet.LeaseAttrs{} if err := json.NewDecoder(r.Body).Decode(&attrs); err != nil { w.WriteHeader(http.StatusBadRequest) fmt.Fprint(w, "JSON decoding error: ", err) return } lease, err := sm.AcquireLease(ctx, network, &attrs) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprint(w, err) return } jsonResponse(w, http.StatusOK, lease) }