github.com/schwarzm/garden-linux@v0.0.0-20150507151835-33bca2147c47/linux_backend/resources.go (about) 1 package linux_backend 2 3 import ( 4 "encoding/json" 5 "net" 6 "sync" 7 ) 8 9 type Network struct { 10 Subnet *net.IPNet 11 IP net.IP 12 } 13 14 func (n *Network) MarshalJSON() ([]byte, error) { 15 return json.Marshal(map[string]string{ 16 "IP": n.IP.String(), 17 "Subnet": n.Subnet.String(), 18 }) 19 } 20 21 func (n *Network) UnmarshalJSON(b []byte) error { 22 var u = struct { 23 IP string 24 Subnet string 25 }{} 26 27 if err := json.Unmarshal(b, &u); err != nil { 28 return err 29 } 30 31 var err error 32 n.IP = net.ParseIP(u.IP) 33 _, n.Subnet, err = net.ParseCIDR(u.Subnet) 34 return err 35 } 36 37 type Resources struct { 38 UserUID int 39 RootUID int 40 Network *Network 41 Bridge string 42 Ports []uint32 43 ExternalIP net.IP 44 45 portsLock *sync.Mutex 46 } 47 48 func NewResources( 49 useruid int, 50 rootuid int, 51 network *Network, 52 bridge string, 53 ports []uint32, 54 externalIP net.IP, 55 ) *Resources { 56 return &Resources{ 57 UserUID: useruid, 58 RootUID: rootuid, 59 Bridge: bridge, 60 Network: network, 61 Ports: ports, 62 ExternalIP: externalIP, 63 64 portsLock: new(sync.Mutex), 65 } 66 } 67 68 func (r *Resources) AddPort(port uint32) { 69 r.portsLock.Lock() 70 defer r.portsLock.Unlock() 71 72 r.Ports = append(r.Ports, port) 73 }