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  }