github.com/schwarzm/garden-linux@v0.0.0-20150507151835-33bca2147c47/linux_backend/hooks.go (about)

     1  package linux_backend
     2  
     3  import (
     4  	"encoding/json"
     5  	"net"
     6  	"os"
     7  	"os/exec"
     8  	"strconv"
     9  
    10  	"github.com/cloudfoundry-incubator/garden-linux/hook"
    11  	"github.com/cloudfoundry-incubator/garden-linux/network"
    12  	"github.com/cloudfoundry-incubator/garden-linux/process"
    13  )
    14  
    15  type Config struct {
    16  	Network json.RawMessage `json:"network"`
    17  }
    18  
    19  //go:generate counterfeiter . ContainerInitializer
    20  type ContainerInitializer interface {
    21  	MountProc() error
    22  	MountTmp() error
    23  }
    24  
    25  func RegisterHooks(hs hook.HookSet, runner Runner, config process.Env, containerInitializer ContainerInitializer, configurer network.Configurer) {
    26  	hs.Register(hook.PARENT_BEFORE_CLONE, func() {
    27  		must(runner.Run(exec.Command("./hook-parent-before-clone.sh")))
    28  	})
    29  
    30  	hs.Register(hook.PARENT_AFTER_CLONE, func() {
    31  		must(runner.Run(exec.Command("./hook-parent-after-clone.sh")))
    32  		must(configureHostNetwork(config, configurer))
    33  	})
    34  
    35  	hs.Register(hook.CHILD_AFTER_PIVOT, func() {
    36  		must(configureContainerNetwork(config, configurer))
    37  
    38  		must(containerInitializer.MountProc())
    39  		must(containerInitializer.MountTmp())
    40  
    41  		// Temporary until /etc/seed functionality removed
    42  		if _, err := os.Stat("/etc/seed"); err == nil {
    43  			must(exec.Command("/bin/sh", "-c", ". /etc/seed").Run())
    44  		}
    45  	})
    46  }
    47  
    48  func configureHostNetwork(config process.Env, configurer network.Configurer) error {
    49  	_, ipNet, err := net.ParseCIDR(config["network_cidr"])
    50  	if err != nil {
    51  		return err
    52  	}
    53  
    54  	mtu, err := strconv.ParseInt(config["container_iface_mtu"], 0, 64)
    55  	if err != nil {
    56  		return err
    57  	}
    58  
    59  	// Temporary until PID is passed in from Go rewrite of wshd.
    60  	containerPid, _ := pidFromFile("../run/wshd.pid")
    61  	if err != nil {
    62  		return err
    63  	}
    64  
    65  	err = configurer.ConfigureHost(&network.HostConfig{
    66  		HostIntf:      config["network_host_iface"],
    67  		BridgeName:    config["bridge_iface"],
    68  		BridgeIP:      net.ParseIP(config["network_host_ip"]),
    69  		ContainerIntf: config["network_container_iface"],
    70  		ContainerPid:  containerPid,
    71  		Subnet:        ipNet,
    72  		Mtu:           int(mtu),
    73  	})
    74  	if err != nil {
    75  		return err
    76  	}
    77  
    78  	return nil
    79  }
    80  
    81  func configureContainerNetwork(config process.Env, configurer network.Configurer) error {
    82  
    83  	_, ipNet, err := net.ParseCIDR(config["network_cidr"])
    84  	if err != nil {
    85  		return err
    86  	}
    87  
    88  	mtu, err := strconv.ParseInt(config["container_iface_mtu"], 0, 64)
    89  	if err != nil {
    90  		return err
    91  	}
    92  
    93  	err = configurer.ConfigureContainer(&network.ContainerConfig{
    94  		Hostname:      config["id"],
    95  		ContainerIntf: config["network_container_iface"],
    96  		ContainerIP:   net.ParseIP(config["network_container_ip"]),
    97  		GatewayIP:     net.ParseIP(config["network_host_ip"]),
    98  		Subnet:        ipNet,
    99  		Mtu:           int(mtu),
   100  	})
   101  	if err != nil {
   102  		return err
   103  	}
   104  
   105  	return nil
   106  }
   107  
   108  func must(err error) {
   109  	if err != nil {
   110  		panic(err)
   111  	}
   112  }
   113  
   114  type Runner interface {
   115  	Run(*exec.Cmd) error
   116  }