func (s *LxcSuite) TestCreateContainerWithBlockStorage(c *gc.C) { err := os.Remove(s.RestartDir) c.Assert(err, jc.ErrorIsNil) manager := s.makeManager(c, "test") machineConfig, err := containertesting.MockMachineConfig("1/lxc/0") c.Assert(err, jc.ErrorIsNil) storageConfig := &container.StorageConfig{AllowMount: true} networkConfig := container.BridgeNetworkConfig("nic42", 4321, nil) instance := containertesting.CreateContainerWithMachineAndNetworkAndStorageConfig(c, manager, machineConfig, networkConfig, storageConfig) name := string(instance.Id()) autostartLink := lxc.RestartSymlink(name) config, err := ioutil.ReadFile(lxc.ContainerConfigFilename(name)) c.Assert(err, jc.ErrorIsNil) expected := fmt.Sprintf(` # network config # interface "eth0" lxc.network.type = veth lxc.network.link = nic42 lxc.network.flags = up lxc.network.mtu = 4321 lxc.start.auto = 1 lxc.mount.entry = %s var/log/juju none defaults,bind 0 0 lxc.aa_profile = lxc-container-default-with-mounting lxc.cgroup.devices.allow = b 7:* rwm lxc.cgroup.devices.allow = c 10:237 rwm `, s.logDir) c.Assert(string(config), gc.Equals, expected) c.Assert(autostartLink, jc.DoesNotExist) }
func (s *LxcSuite) TestUpdateContainerConfig(c *gc.C) { networkConfig := container.BridgeNetworkConfig("nic42", 4321, []network.InterfaceInfo{{ DeviceIndex: 0, CIDR: "0.1.2.0/20", InterfaceName: "eth0", MACAddress: "aa:bb:cc:dd:ee:f0", Address: network.NewAddress("0.1.2.3"), GatewayAddress: network.NewAddress("0.1.2.1"), }, { DeviceIndex: 1, InterfaceName: "eth1", }}) storageConfig := &container.StorageConfig{ AllowMount: true, } manager := s.makeManager(c, "test") instanceConfig, err := containertesting.MockMachineConfig("1/lxc/0") c.Assert(err, jc.ErrorIsNil) envConfig, err := config.New(config.NoDefaults, dummy.SampleConfig()) c.Assert(err, jc.ErrorIsNil) instanceConfig.Config = envConfig instance := containertesting.CreateContainerWithMachineAndNetworkAndStorageConfig( c, manager, instanceConfig, networkConfig, storageConfig, ) name := string(instance.Id()) // Append a few extra lines to the config. extraLines := []string{ " lxc.rootfs = /some/thing # else ", "", " # just comment", "lxc.network.vlan.id=42", "something else # ignore", "lxc.network.type=veth", "lxc.network.link = foo # comment", "lxc.network.hwaddr = bar", } configPath := lxc.ContainerConfigFilename(name) configFile, err := os.OpenFile(configPath, os.O_RDWR|os.O_APPEND, 0644) c.Assert(err, jc.ErrorIsNil) _, err = configFile.WriteString(strings.Join(extraLines, "\n") + "\n") c.Assert(err, jc.ErrorIsNil) err = configFile.Close() c.Assert(err, jc.ErrorIsNil) expectedConf := fmt.Sprintf(` # network config # interface "eth0" lxc.network.type = veth lxc.network.link = nic42 lxc.network.flags = up lxc.network.name = eth0 lxc.network.hwaddr = aa:bb:cc:dd:ee:f0 lxc.network.ipv4 = 0.1.2.3/20 lxc.network.ipv4.gateway = 0.1.2.1 # interface "eth1" lxc.network.type = veth lxc.network.link = nic42 lxc.network.flags = up lxc.network.name = eth1 lxc.mount.entry = %s var/log/juju none defaults,bind 0 0 lxc.aa_profile = lxc-container-default-with-mounting lxc.cgroup.devices.allow = b 7:* rwm lxc.cgroup.devices.allow = c 10:237 rwm `, s.logDir) + strings.Join(extraLines, "\n") + "\n" lxcConfContents, err := ioutil.ReadFile(configPath) c.Assert(err, jc.ErrorIsNil) c.Assert(string(lxcConfContents), gc.Equals, expectedConf) linesToReplace := []string{ "", // empty lines are ignored " lxc.network.type = bar # free drinks !! ", // formatting is sanitized. " # comments are ignored", "lxc.network.type=foo", // replace the second "type". "lxc.network.name = em0 # renamed now", // replace the first "name" "lxc.network.name = em1", // replace the second "name" "lxc.network.mtu = 1234", // replace only the first "mtu". "lxc.network.hwaddr = ff:ee:dd:cc:bb:aa", // replace the first "hwaddr". "lxc.network.hwaddr=deadbeef", // replace second "hwaddr". "lxc.network.hwaddr=nonsense", // no third "hwaddr", so append. "lxc.network.hwaddr = ", // no fourth "hwaddr" to remove - ignored. "lxc.network.link=", // remove only the first "link" "lxc.network.vlan.id=69", // replace. "lxc.missing = appended", // missing - appended. "lxc.network.type = phys", // replace the third "type". "lxc.mount.entry=", // delete existing "entry". "lxc.rootfs = /foo/bar", // replace first "rootfs". "lxc.rootfs = /bar/foo", // append new. } newConfig := strings.Join(linesToReplace, "\n") updatedConfig := ` # network config # interface "eth0" lxc.network.type = bar lxc.network.flags = up lxc.network.name = em0 lxc.network.hwaddr = ff:ee:dd:cc:bb:aa lxc.network.ipv4 = 0.1.2.3/20 lxc.network.ipv4.gateway = 0.1.2.1 # interface "eth1" lxc.network.type = foo lxc.network.link = nic42 lxc.network.flags = up lxc.network.name = em1 lxc.aa_profile = lxc-container-default-with-mounting lxc.cgroup.devices.allow = b 7:* rwm lxc.cgroup.devices.allow = c 10:237 rwm lxc.rootfs = /foo/bar # just comment lxc.network.vlan.id = 69 something else # ignore lxc.network.type = phys lxc.network.link = foo # comment lxc.network.hwaddr = deadbeef lxc.network.mtu = 1234 lxc.network.hwaddr = nonsense lxc.missing = appended lxc.rootfs = /bar/foo ` err = lxc.UpdateContainerConfig(name, newConfig) c.Assert(err, jc.ErrorIsNil) lxcConfContents, err = ioutil.ReadFile(configPath) c.Assert(err, jc.ErrorIsNil) c.Assert(string(lxcConfContents), gc.Equals, updatedConfig) // Now test the example in updateContainerConfig's doc string. oldConfig := ` lxc.foo = off lxc.bar=42 ` newConfig = ` lxc.bar= lxc.foo = bar lxc.foo = baz # xx ` updatedConfig = ` lxc.foo = bar lxc.foo = baz ` err = ioutil.WriteFile(configPath, []byte(oldConfig), 0644) c.Assert(err, jc.ErrorIsNil) err = lxc.UpdateContainerConfig(name, newConfig) c.Assert(err, jc.ErrorIsNil) lxcConfContents, err = ioutil.ReadFile(configPath) c.Assert(err, jc.ErrorIsNil) c.Assert(string(lxcConfContents), gc.Equals, updatedConfig) }