99
callback(status.StatusProvisioningError, fmt.Sprintf("Creating container: %v", err), nil)
99
callback(status.ProvisioningError, fmt.Sprintf("Creating container: %v", err), nil)
111
111
err = manager.client.EnsureImageExists(series,
112
112
lxdclient.DefaultImageSources,
113
113
func(progress string) {
114
callback(status.StatusProvisioning, progress, nil)
114
callback(status.Provisioning, progress, nil)
117
117
err = errors.Annotatef(err, "failed to ensure LXD image")
123
123
return nil, nil, errors.Trace(err)
126
userData, err := containerinit.CloudInitUserData(instanceConfig, networkConfig)
126
// Do not pass networkConfig, as we want to directly inject our own ENI
127
// rather than using cloud-init.
128
userData, err := containerinit.CloudInitUserData(instanceConfig, nil)
152
156
logger.Infof("instance %q configured with %v network devices", name, nics)
159
// Push the required /etc/network/interfaces file to the container.
160
// By pushing this file (which happens after LXD init, and before LXD
161
// start) we ensure that we get Juju's version of ENI, as opposed to
162
// the default LXD version, which may assume it can do DHCP over eth0.
163
// Especially on a multi-nic host, it is possible for MAAS to provide
164
// DHCP on a different space to that which the container eth0 interface
165
// will be bridged, or not provide DHCP at all.
166
eni, err := containerinit.GenerateNetworkConfig(networkConfig)
168
err = errors.Annotatef(err, "failed to generate /etc/network/interfaces content")
155
172
spec := lxdclient.InstanceSpec{
157
174
Image: manager.client.ImageNameForSeries(series),
158
175
Metadata: metadata,
160
177
Profiles: profiles,
178
Files: lxdclient.Files{
180
Content: []byte(eni),
181
Path: "/etc/network/interfaces",
163
189
logger.Infof("starting instance %q (image %q)...", spec.Name, spec.Image)
164
callback(status.StatusProvisioning, "Starting container", nil)
190
callback(status.Provisioning, "Starting container", nil)
165
191
_, err = manager.client.AddInstance(spec)
170
callback(status.StatusRunning, "Container started", nil)
196
callback(status.Running, "Container started", nil)
171
197
inst = &lxdInstance{name, manager.client}