func (t *Tap) Close() error { if err := deleteTap(t.Name); err != nil { return err } if t.LocalIP != nil { ipallocator.ReleaseIP(t.bridge.ipNet, t.LocalIP) } if t.RemoteIP != nil { ipallocator.ReleaseIP(t.bridge.ipNet, t.RemoteIP) } return nil }
func (c *libvirtContainer) cleanup() error { g := grohl.NewContext(grohl.Data{"backend": "libvirt-lxc", "fn": "cleanup", "job.id": c.job.ID}) g.Log(grohl.Data{"at": "start"}) if err := syscall.Unmount(filepath.Join(c.RootPath, ".containerinit"), 0); err != nil { g.Log(grohl.Data{"at": "unmount", "file": ".containerinit", "status": "error", "err": err}) } if err := syscall.Unmount(filepath.Join(c.RootPath, "etc/resolv.conf"), 0); err != nil { g.Log(grohl.Data{"at": "unmount", "file": "resolv.conf", "status": "error", "err": err}) } if err := pinkerton.Cleanup(c.job.ID); err != nil { g.Log(grohl.Data{"at": "pinkerton", "status": "error", "err": err}) } for _, m := range c.job.Config.Mounts { if err := syscall.Unmount(filepath.Join(c.RootPath, m.Location), 0); err != nil { g.Log(grohl.Data{"at": "unmount", "location": m.Location, "status": "error", "err": err}) } } for _, p := range c.job.Config.Ports { if err := c.l.forwarder.Remove(&net.TCPAddr{IP: c.IP, Port: p.Port}, p.RangeEnd, p.Proto); err != nil { g.Log(grohl.Data{"at": "iptables", "status": "error", "err": err, "port": p.Port}) } c.l.ports[p.Proto].Put(uint16(p.Port)) } ipallocator.ReleaseIP(defaultNet, &c.IP) g.Log(grohl.Data{"at": "finish"}) return nil }
// release an interface for a select ip func Release(job *engine.Job) engine.Status { var ( id = job.Args[0] containerInterface = currentInterfaces.Get(id) ) if containerInterface == nil { return job.Errorf("No network information to release for %s", id) } for _, nat := range containerInterface.PortMappings { if err := portmapper.Unmap(nat); err != nil { log.Infof("Unable to unmap port %s: %s", nat, err) } } if err := ipallocator.ReleaseIP(bridgeNetwork, &containerInterface.IP); err != nil { log.Infof("Unable to release ip %s", err) } return engine.StatusOK }